dsh-sidepanel
yur0918/dsh-sidepanel
DSH Web UI용 Codex 스타일 오른쪽 패널입니다. 세션 산출물 탐색기(실시간 파일 트리, 스캔 포함 설정, 미리보기, 파일 위치 표시)와 모델 선택기가 있는 현재 세션 포크 사이드 채팅을 제공합니다. 사람 속도에 맞춘 예약 실행과 하단으로 스마트 스크롤도 지원합니다.
설치
dsh plugin --profile web add github:yur0918/dsh-sidepanelREADME
dsh-sidepanel
A Codex-style right side panel for the DSH (DeepSeek Harness) web UI at http://127.0.0.1:3080/: an Artifacts view and a Side chat, both bound to the current task session. Ships as a static profile plugin that auto-loads with DSH — no core code changes.
- Artifacts: folds the session log (
~/.dsh/sessions/…/session.jsonl.zstd, multi-frame zstd) and lists every file the session created or modified throughwrite/edit/str_replace_editortools — name, kind, path, size, mtime, source, change count. Search, source filter, copy path, reveal in Finder, safe text/code/Markdown/image preview, and an opt-in workspace mtime scan that catches bash-created files. - Side chat: a continuable fork subagent child (native
ctx.subagents) — inherits the session's completed-turn context and model, never touches the main transcript. SSE streaming, stop, retry, interrupted markers, replay across refreshes and DSH restarts. A persona keeps it answering directly instead of running off on tool sprees. - Panel: toggle button in the session-header utilities (top-right); dock mode appends a fourth track to the frame's inline
grid-template-columnsso the main content is squeezed, never covered; narrow viewports fall back to a shadowed overlay. Drag or ←/→ to resize; Esc closes preview → clears search → collapses the panel and restores focus. Open/width/tab/scan persist in localStorage.
Panel

(Interface sketch — layout and information hierarchy only; sample data is illustrative.)
Install
cd <this directory>
node scripts/install.mjs # idempotent: symlink + cordis.patch.yml insert row
node scripts/install.mjs --restart # also kickstart DSH so it loads immediately
curl http://127.0.0.1:3080/sidepanel/health # → {"ok":true,"addon":"dsh-sidepanel",...,"chat":true}
Enable / disable / uninstall
- Enabled = installed (insert row + symlink present).
- Disable: remove the
- id: sidepanel / name: dsh-sidepanelrow from~/.dsh/profiles/web/cordis.patch.yml, thenlaunchctl kickstart -k gui/$(id -u)/com.deepseek.dsh. - Uninstall:
node scripts/install.mjs --uninstall(removes the row and symlink, restarts DSH).
See README.zh.md for the full troubleshooting table and known limitations (Chinese).
Tests
node --test test/host.test.mjs test/safety.test.mjs test/client.test.mjs
Covers artifact attribution folding, fork seed boundary (seedLength), path containment math, real-filesystem preview safety (traversal / symlink escape / mismatched ids), multi-frame zstd, panel state sanitization and persistence, grid-track math (dock/overlay/closed), the chat state machine, and idempotent slot registration.
MIT license.
What's new in 1.1.0
- Side-chat model picker: a model button above the composer opens a listbox populated from the same LLM catalog the main chat uses (via the harness
llmservice). The current model is highlighted; "Follow main chat" restores the inherited routing. The choice persists inlocalStorage["dsh-sidepanel.v1"]. - Switching takes effect on send: the send payload carries the chosen model. The harness pins a child's routing at creation (
followupcannot change it), so a different routing transparently starts a new fork child; older side-chat exchanges are preserved and merged in replay order. - Send-to-bottom & smart scroll: after sending, the view sticks to the newest message; streaming keeps following while pinned to the bottom; scrolling up pauses auto-follow (no more yanking), showing a "Jump to latest" pill until you return to the bottom.
- New host route
GET /sidepanel/chat/models;POST /sidepanel/chat/sendaccepts an optionalmodel;/sidepanel/chat/statemerges multi-child replays and reportschildModel. - 26 unit tests (model catalog normalization, stick-mode math, persisted-choice sanitization added).
Full details: CHANGELOG-1.1.0.zh.md, UX-SUGGESTIONS.zh.md, selftest/SELFTEST.zh.md (Chinese).