A mid-run steer input for DeepSeek Harness Web: while the agent works, an input bar appears above the composer to inject modification requests into the next decision via agent.steer(), without stopping the conversation. Drafts persist per session, unread injected messages can be recalled from the bubble, and an optional guiding prefix is supported.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:xiaosurongjia/dsh-improved-inline-edit
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
Your agent is halfway through a task — and you just had a thought. Don't stop it. Just talk.
Ever been watching DSH (DeepSeek Harness) grind through a long task and thought: "Wait, wrong direction!" "Skip that, check this first!" "Change this part, then continue!" — and then had to either wait it out, or kill the conversation and lose all progress?
dsh-improved-inline-edit exists for exactly that moment. It makes "interrupt" and "continue" compatible: while the agent is running, a steer strip appears above the composer. Type your request, hit send, and the message is seamlessly injected into the agent's next decision step via the official agent.steer() mechanism — the conversation keeps going, the task keeps running, nothing is lost.
✨ Feature Highlights
| Feature | What it does |
|---|---|
| 🎯 True mid-run steering | Not a new message that derails the flow — injected straight into the running agent's next decision (official agent.steer()), so it continues with your request in mind |
| 👻 Visible only while running | The strip appears only while the agent is working; it auto-disappears when the run ends — zero UI clutter when idle |
| 📝 Auto-growing input | A textarea that wraps and grows with your content (capped at 140px) — long requests are never truncated to one line, typing feels natural |
| 🐋 100-phrase Deep pool | Status copy rotates as the agent works (dsh-deep-verbs style): Deep diving… Deep fermenting… — click to toggle EN/ZH. Even busywork can be playful |
| 📐 Pixel-aligned with the composer | The strip is the exact same width as the bottom composer, left-aligned — three clean layers: status / steer / main input |
| 🔘 A send button that makes room | Theme-brand solid round button + white ➤ (rotated 90° up). After sending it slides left smoothly to make room for the ✓, then glides back 2 s later |
| 🪶 Zero intrusion | Touches no @deepseek-ai/dsh-* source; assembled via standard bundle patch + slot injection, clean to remove |
🖥 What it looks like
[⚡ Deep diving...] [─────────────────────────────] [➤]
↑ status copy ↑ steer input ↑ theme-brand round button
(click to toggle EN/ZH) (grows with content) (slides left after send)
- Left: rotating deep-status phrase — click to switch language
- Middle: a textarea that wraps and auto-grows with multi-line content
- Right: the send button — after sending, a ✓ (green) / ✗ (red) appears to its right as the button slides left, then returns
🚀 Install
# Run inside the plugin directory (auto-detects the profile)
.\install.ps1
# Or specify manually
.\install.ps1 -PluginSource <plugin dir> -ProfileDir <profile dir>
The installer:
- Junction-links the package into the profile's
node_modules(same convention as other dsh plugins — saves disk space) - Registers one
insertrow in the profile'scordis.patch.yml - Verifies
exports['./client']resolves through the DSH client module system
⚠️ After installing, fully restart DSH (end the process, not close the window), then refresh the page.
🕹 Usage
- Let an agent run (send a message)
- The steer strip appears above the composer
- Type your request (multi-line supported), press Enter or click ➤
- The agent continues on your request — the conversation never stopped
⚙️ How it works
┌───────────────── Browser (client) ─────────────────┐
│ conversation.input.dock slot │
│ ┌────────────────────────────────────────────┐ │
│ │ ⚡ Deep diving… [input] [➤] [√] │ │
│ └────────────────────────────────────────────┘ │
│ │ same-origin fetch POST /dsh-improved-inline-edit/api/steer
└────────▼───────────────────────────────────────────┘
┌────────────── Host (Node) ─────────────────────────┐
│ ctx.webServer route → ctx.agents.get(sessionId) │
│ → agent.steer(userMessage) │
│ (injects into the running agent's next-step inbox)│
└────────────────────────────────────────────────────┘
- Host half (
index.js): registersPOST /dsh-improved-inline-edit/api/steer, builds a standard user message, and callsagent.steer(). - Client half (
client.js): registers the strip on theconversation.input.dockslot and calls the host API via same-originfetch.
📊 Honest take: strengths & limitations
✅ Strengths
- No interruption, no lost progress: the fundamental difference from "stop and start over" — invaluable for long-running tasks
- Takes effect immediately:
steer()drops the message into the agent's decision queue, so it's seen on the very next step - Zero learning curve: it's just an input box — if you can type, you can steer
- Lightweight & auditable: pure JS, no build deps, no official-source edits;
index.js+client.jstogether are under 400 lines
⚠️ Limitations (be aware)
- Requires a running agent: the strip only appears while
session.running— no entry point when idle (a deliberate design choice for zero UI clutter; if you'd like an always-visible mode, open an issue!) - Depends on
steer()semantics: what's injected is a user message; whether the agent adopts it depends on the model and the current task context — it provides steering/interruption, not a hard override - Targets DSH Web: the client uses the Web slot system (
dsh.client.platform: web) - Browser API dependency: client uses browser globals (
fetch,localStorage, …); no non-browser host support
🤝 Why it deserves a ⭐
- Solves a real pain: anyone running long tasks on DSH has hit the "want to interrupt but can't stop" wall
- Obsessed with detail: silky button animation, auto-growing input, 100 playful phrases — small plugin, polished feel
- Clean & auditable: clear two-half structure, readable and reviewable
- Actively maintained: issues & PRs welcome — roadmap includes an always-visible mode, customizable phrase pools, and multi-session support
If you find it useful, a ⭐ is the best encouragement 🚀
License
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.