dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Kidai-ClipBoard (纪代剪贴板, KCB) — 跨会话剪贴板 + 会话预设:复制内容随时回填当前会话,把会话存为预设供下一步分支,支持右侧停靠侧栏、文件夹树与标签体系。
A global advanced clipboard for DeepSeek Harness — save inputs and whole sessions, branch & continue in a brand-new session with one click. 简体中文 · English
Conversations, commands and snippets are scattered across sessions. KCB brings "grab the draft, snapshot the session, fork-continue from a snapshot, paste back into the composer" into a single floating window — no more scrolling chat history, no more copying long texts.
Ready to use — after restarting DSH, open it from the "Auto Clipboard" launcher at the bottom of the sidebar.
# Local dev install (or install through its own marketplace)
dsh plugin --profile desktop add file:D:\path\to\kidai-clipboard
# or GitHub:
dsh plugin --profile desktop add git+https://github.com/NokorinNishikino/Kidai-Clipboard.git
Restart DSH to activate.
dsh plugin --profile desktop remove kidai-clipboard
Or remove the dependency and bundle declaration from profiles/desktop/package.json, then delete node_modules/kidai-clipboard.
kidai-clipboard; brand Kidai-ClipBoard, short KCB$DSH_HOME/kidai-clipboard/store.json (schema 1, atomic writes)| Part | File | Role |
|---|---|---|
| Host half | lib/index.js | webServer routes GET/PUT /kidai-clipboard/state + /ping; JSON validation & atomic persistence |
| Client half | lib/client.js | floating-window UI, capture/paste/fork logic, folder tree, tag management (ModuleLoader format) |
| Composition | cordis.patch.yml | single loader row mounts the host; dsh.client declaration feeds the browser module manifest |
| Slots | — | sidebar.footer.action / shell.overlay / conversation.chat.assistant-actions / kidai-hub.tabs / settings.section |
settings.window.dock: "right"; right edge pinned, drag the left edge to resize (min 280); released automatically on collapse/close; when docked the panel is flat and seamless (no shadow, no own top border — its top edge sits flush under the conversation divider)#kidai-clipboard-dock-inset → [data-conversation-scroll]{margin-right:Npx!important} (never inline styles — DSH's re-render wipes inline properties React doesn't know, which used to leave content hidden under the panel after switching sessions); collapsed state insets the 42px pill; dragging follows the pointer and eases into the dock position on release via .kidc_snapBackrequestAnimationFrame), the workspace linkage is throttled to ~90 ms, and the panel content is hidden behind a live-size placeholder screen; everything is committed once on releasesettings.ui.resizeHandle = corner (default, bottom-right) or edge (a full-height column on the window's left border; the left edge follows the pointer while the right edge stays put) — use edge when other plugins cover the bottom-right cornersettings.ui.actionBar = bottom (default, a bottom row: new input / save snapshot / grab draft) or left (a vertical column on the panel's left edge)settings.window.pillTop remembers its vertical position (absent = conversation top); a ≥3px displacement counts as a drag, otherwise as a click (click is decided on pointerup, so no stale state can swallow the next click); dragging >24px away from the right edge means "leave the dock" → dock: null and the window expands floating at that spotkidai-snapshot-guard — status chips (stats + version) → horizontal tabs (General / Session capture / Data / About) → card content; SettingsPanel({ layout }) renders a left brand rail (168px) in hub mode and a horizontal brand head in classic (settings fallback) modedraggable + dragstart/dragover/drop, the entry id travels via dataTransfer). Onto a folder row → set folderId; onto another entry → insert before/after depending on which half of the card the pointer is in, adopting that entry's folderId, then re-number order (0..n-1) for every entry in that container; onto empty space → folderId = null. Sort order: pinned → order → most recently updated. Every drop handler calls stopPropagation, otherwise the parent (folder row / list root) steals the highlightprefs.folderEditor holds the target id; the modal edits the name and picks a colour from PALETTE (null = none); Enter saves, Esc closesremote.session.follow + reverse page (slim events), storing sessionId / lastSeq / transcript / agentPreset / cwdturn/end events; choosing turn N sets atSeq to that event's seq and records turnCount / totalTurns, trimming records and the transcript to matchfollow page first, then walks back with session.page({throughSeq}) (scroll-to-top does the same; browsing is capped at 20000 events, independent of the max-records setting) and tops up before savingctx.sessions.fork({sessionId, atSeq}) — cuts at the chosen turn first, falls back to the last completed turn, then to a transcript pastescripts/smoke-*.mjs (host routes / contract / slot behaviour); scripts/verify-*.mjs (real composition / capture checks)sessions/conversation/remote.session (shows a hint when unavailable)node scripts/sync-install.mjs to sync into the profile, then restartMIT