Codex-style side chat + selection annotations for DSH web.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-sidenote
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:g-yixuan/dsh-sidenote
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README

Install
dsh plugin --profile web add dsh-sidenote
One step, no prerequisites. Then click "Side" in the session header, or just select any reply text.
For local development, mount with dsh plugin --profile web add link:<repo path> (client changes hot-reload; host changes need a dsh web restart).
Side chat — side questions never derail the main thread
Fork the current session (full history snapshot, no compression) into an independent side session living in the right-hand panel:
- Three entries — the header "Side" button, the right-sidebar guide, and the
/sideslash command; - The same rendering material as the main chat: tool cards, thinking previews, task cards, model/permission switching,
@references, image attachments; - Answer approvals and questions right inside the panel — no jumping back to the main view; a toast lets you know when a reply lands;
- Inherited history folds into a summary card; fold and scroll state survive reloads;
Alt+Jhops focus between main and side.

Selection annotations — turn "this bit is off" into model context
- Select text in an assistant reply → popover → note editor, with numbered badges anchored at the right gutter;
- Adding to the main conversation or a side chat saves the same controlled annotation object, with shared chip previews, individual removal and clear-all. Quotes and notes stay complete, with zero draft pollution; quote-only messages are supported;
- Click outside a new note editor or press Enter to save; Escape cancels. Main-to-side waits for the chosen tab’s actual child session. Escape cancels that wait; a failed handoff keeps the note open for retry;
- Submissions use the host’s native input, retaining
@references, image attachments and queue/steer arbitration. Only a durable message or authoritative queue occurrence in the target session marks that batch as sent and produces the annotated trace label; - Saved annotations are isolated by target session. A storage warning explains memory-only operation when persistence is unavailable. Failures retain quotes and body; additions or edits during admission stay active for the next message.
- Side assistant bodies support local selections, paragraphs, lists and code. Their single action adds to that side chat, including selections in inherited history. Streaming replies, cross-message selections, reasoning and controls are excluded. Badges and highlights stay within the source transcript; folding the source keeps its quotes in the chip.
- Saved annotations survive reload. When the host restores a native tab, it rebinds the original child. If the sidebar is not restored, use Reopen in
/sideto recover that child and its annotations. A new fork has its own independent annotation list.
| Selection popover | Annotation editor |
|---|---|
![]() |
![]() |
Reflow — side-lane findings come home
- One click sends a side-chat conclusion back to the main session as a Q&A pair (the answer and the question it answers) — a controlled chip above the main composer that rides along with your next message;
@-mentioning a side chat works too; - "Save as session" promotes a side chat into the session list; recently closed ones reopen from the
/sidepopup.

| Collapsed state (inherited-history card + action row) | Side slash menu |
|---|---|
![]() |
![]() |
| Badge + annotation chip | Sent-message trace |
|---|---|
![]() |
![]() |
Compatibility
Exact combinations are listed in the compatibility policy: 0.1.7 is maintained, 0.1.5 has extended maintenance, three 0.1.1/0.1.2 legacy combinations are frozen with required validation, and the exact 0.2.0-rc.2 release has been admitted to maintained support. Unlisted combinations are unverified; engine ranges do not imply that every version inside them is supported.
The header's Compatibility status can inspect, recheck and export current integration state. Waiting services do not mean incompatibility. Restricted operations retain body, attachments and quotes. Unreadable host versions stay unknown; exports exclude user text, credentials and local paths.
Native hosting needs no BS; legacy hosts need their listed BS combination. Native page kinds allow one tab per pane, with multiple panes through splitting. Normal entries focus an existing tab; after closing, /side reopens the original child. Other BS coexistence combinations and future multiple behavior require independent validation.
Design notes
- A real fork, not a summary: the side session is a genuine DSH session (full history snapshot) with the same capabilities as the main one — not a one-shot Q&A.
- List hygiene: side sessions are archived out of the session list; your list stays clean.
- An accumulative annotation workflow: select repeatedly, stack notes, edit, remove, send them together — not a one-off quote.
Development
| Command | What it does |
|---|---|
pnpm typecheck |
tsc --noEmit |
pnpm test |
vitest unit tests (run build first) |
pnpm build |
type declarations + tsdown (host ESM + client CJS bundle, purity gates) |
pnpm test:mount |
real dsh web + seeded session + Playwright mounting and interaction checks (BS_VERSION/DSH_CMD version matrix) |
Contributing
Bug reports, feature ideas, reproductions, documentation, and code are welcome. Start with the issue chooser or contributing guide. English and Chinese are both welcome.
Maintainers: see repository maintenance and the release guide.
License
MIT
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8670
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8670
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 4631
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
ccch1mneyyy/dsh-TUI★ 4484
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 4133
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1453
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.






Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.