dsh-session-pilot
Pilot your DeepSeek Harness conversations from inside a conversation: new_conversation, rename_session, list_sessions, read_session, archive_session model tools plus official-slot UI actions
- Stars
- 0
- Language
- TypeScript
- Created
- Sep 10, 2026
- Updated
- Sep 10, 2026
Introduction
dsh-session-pilot
Manage conversations from inside a conversation, for DeepSeek Harness — model and human can both create, rename, list, read, and archive sessions mid-chat.
Five model tools (the agent tidies sessions while chatting):
| Tool | What it does |
|---|---|
new_conversation | Spin a drifted topic or a well-scoped task off into a brand-new sidebar conversation with a complete, self-contained first user message |
rename_session | Rename a conversation (defaults to the current one) |
list_sessions | List conversations by recent activity (title, running state, directory); pass query to content-search messages |
read_session | Read a compact transcript of one conversation (latest user/assistant text messages, bounded) |
archive_session | Archive a conversation out of its workspace's session list (durable log retained) |
Two official-slot buttons (no DOM injection):
- Session-header "+ New chat" — one click to a blank conversation in the current workspace
- Per-assistant-message "⧉" — carry the message text as a bounded context excerpt into a fresh conversation
Official paths only: the Host half reuses the Web UI's own sessionController / sessionQuery / workspaceRegistry seams; the UI uses only official slots (conversation.session.header.actions, conversation.chat.assistant-actions). Bilingual UI (zh/en) through dsh-client-locale.
Install
dsh plugin add dsh-session-pilot
Restart dsh. The model then sees five tools, the session header gains a "+ New chat" button, and every finalized assistant message gains a "⧉" action.
Usage
- New conversation: say "spin this task off into a new conversation" — the model calls
new_conversationwith a self-contained briefing as the first message. - Session housekeeping: "rename this conversation to X", "list my recent conversations", "what did we discuss in session X", "archive session X".
- Header button: click "+ New chat" to open a blank conversation in the same workspace.
- Message action: click "⧉" on an assistant message — the plugin wraps its text (bounded to 4000 chars) as a
<quoted-context>excerpt for the new conversation's first user message.
Why not subagent / fork
| Existing capability | Difference |
|---|---|
subagent | A temporary child that reports back to save this conversation's context — not a user-visible independent conversation |
Message fork (official / dsh-turn-fork) | Forks carry the history prefix; new_conversation starts zero-history conversations carrying only the first message you write |
| Sidebar "+" | Blank conversations only, user-driven; this plugin lets the model and message-level actions create conversations too, optionally seeded |
Official read-only tool-session-query package (opt-in) | Event-level read-only queries; this plugin adds writes (create/rename/archive) and a compact housekeeping view |
Closest community plugins (survey, 2026-09)
| Plugin | Overlap | Key difference |
|---|---|---|
ltxlong/dsh-session-kit | Day-to-day session management, archive management | It is pure UI (session management menus, archive list/restore/delete/preview, local memory, compaction config, topic navigation) with no model tools; every management action here is a model-callable tool, plus new-conversation creation. The two coexist: it owns the interface, this plugin lets the agent act |
lesterq/dsh-session-manager | Session delete/archive/move | Also a UI operations panel (no model tools); this plugin has the agent act directly in conversation |
yangYzc/dsh-plugin-quote-reply | Its "reply in new window" also creates a session with a quote | It is selection-based quoting into a composer draft (you send manually); this plugin carries a whole message as the first admitted user message (the new conversation starts immediately). It also has no model tool and creates client-side (no sessionController workspace attach) |
bpc-oss/dsh-fork-to-preset | Header button creates a session | Fork semantics: inherits completed turns into another preset; this plugin starts zero-history |
qwert702/dsh-context-compressor | Switches to a fresh session | Auto-triggered context compression; this plugin is deliberate, topic-driven creation |
weibaohui/dsh-tasks, DSH Automation Center | New session per run | Cron-driven, not in-conversation |
No plugin ships this tool family — letting the model create, rename, and organize user-visible top-level conversations; that gap is this plugin's core.
Design notes
- One transaction:
new_conversationand the HTTP route sharecreateSessionPilot— resolve the source session's workspace (direct attachment), callsessionController.create(the Host attaches the workspace), then optionallyrenameandprompt(mode: 'queue', forwardingexec.signal). Created conversations are ordinary durable Sessions. - Workspace and preset inheritance: the new conversation lands in the source's workspace, falls back to the source
cwd, and (tool path) inherits the source's latestagent-preset/selected. - Reads through their own seams:
list_sessionsusessessionController.list/search;read_sessionusessessionQuery.readSession(live-preferred, cold persistence reads) plusreadTitle, with bounded message projection (≤600 chars per message, ≤100 messages, ≤12000 chars total). - HTTP trust fence: the route accepts loopback Origin/Host only (same convention as
dsh-turn-fork),application/json, bodies ≤ 64 KiB. - Cross-version: written against the
0.1.5-rc.1API (peer deps) and verified on the0.1.2-alpha.4runtime;promptalways passesmode: 'queue'explicitly to satisfy both versions'SessionPromptRequest.
Known Limitations and Deferred Work
- Text-only excerpts — images and tool-call blocks of an assistant message are not carried; re-reference files with
@in the new conversation. - Route path skips preset inheritance — UI-created conversations use the deployment's default agent preset (reading the source preset route-side needs an extra inspect, deferred).
- No in-plugin unarchive — archiving only detaches a session from its workspace list (the log is retained); restoring happens in the workspace UI.
read_sessionskips tool events — it projects user/assistant text only; use the officialtool-session-querypackage for tool-call details.- No undo for creation — a created conversation is an ordinary session; archive it with
archive_sessionor from the session list.
Development
pnpm install
pnpm run typecheck
pnpm test # build + node --test
Layout mirrors dsh-turn-fork: src/index.ts (Host), src/client/ (Client), src/shared.ts (shared value contracts), scripts/dsh-client-preset.ts (client bundle preset vendored from the dsh repository, MIT).