DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Tab Plan Toggle — DSH Plugin for DeepSeek Harness
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
T

dsh-tab-plan-toggle

Tab Plan Toggle

Toggle DeepSeek Harness plan mode with Tab in the composer

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:sujalmandal/dsh-tab-plan-toggle#f49a3fc95f59a32123121b6ea9dcc89efa7d5b24
READMECompatibilityVersions

Compatibility and provenance

Tab Plan Toggle is published as dsh-tab-plan-toggle and currently resolves to version 0.1.1. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
web
Release source
github
Registry updated
9/24/2026

Versions

0.1.1stable
9/24/2026
0.1.0stable
9/24/2026

Related plugins

Loading related plugins…

Latest
0.1.1
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
web
License
MIT
Source
github
GitHub
★ 0
Weekly downloads
0
Last push
9/24/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in developer-tools.

Web App@deepseek-ai/dsh-web-appThe dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)Sdk Minimal@deepseek-ai/dsh-sdk-minimalThe standalone minimal SDK profile bundle: JSON-RPC, one DeepSeek adapter, persistent shell, and JSONL sessionsSdk App@deepseek-ai/dsh-sdk-appThe dsh SDK profile bundle: stdio JSON-RPC serving and process lifecycle over dsh-baseSubagent Codex@deepseek-ai/dsh-subagent-codexOne-shot Codex subagent provider over the official app-server protocol

README

dsh-tab-plan-toggle

Toggle DeepSeek Harness plan mode with Tab while the composer textarea has focus.

PressResult
Tab (composer focused, plan mode off)plan mode on
Tab (composer focused, plan mode on)plan mode off

Install

dsh plugin --profile web add dsh-tab-plan-toggle
dsh web

Straight from the repository, before (or instead of) a registry release:

dsh plugin --profile web add git+https://github.com/sujalmandal/dsh-tab-plan-toggle.git

Verify the row is composed before restarting:

dsh --profile web --dump-config   # look for "# == dsh-tab-plan-toggle"

How it works

composer Tab keydown ──rpc /dsh-tab-plan-toggle──▶ host half
                                                    │
      ctx.get('agentPresets').serviceFor(agent,'planMode')
                                                    │
      target = !(pending ?? active)  ─────────────────┘
      planMode.set(agent, target)
  • The host half calls the plan-mode service, so entering and leaving produce the same narration notice as /plan — with no command/run row added to the conversation.
  • Plan mode lives inside an agent preset's isolate realm on dsh web, so a host row can only reach it through agentPresets.serviceFor(agent, 'planMode'). When that service is unavailable the plugin falls back to appending plan/mode to the session log.
  • pending from planMode.get() is the service's queued target, so it counts as the effective state: a second press reverses a queued change instead of becoming a no-op.
  • Each entry acts only for the composer it is mounted in: the guard resolves the composer holding this entry's marker and requires the focused editor to sit inside it.
  • The 0.1.0 guard asked only whether the focused element sat in some [data-input-scroll], so with another conversation's entry still mounted, one press toggled both conversations.

Guards

Tab is only intercepted when all of these hold:

  • no ⌘/Ctrl/Alt/Shift, and no IME composition in flight;
  • the focused element is the composer's editor — its Lexical contenteditable host, or a TEXTAREA — and it sits inside [data-input-scroll];
  • that editor belongs to the same composer as this entry's marker, so other conversations' composers cannot match;
  • no suggestion menu is open ([data-trigger-menu] absent): inside the / or @ menu, Tab means Browse folder.

Everywhere else Tab keeps its normal behaviour.

Troubleshooting

SymptomCheck
Tab does nothingThe composer's editor is Lexical's contenteditable host, not a TEXTAREA — a guard that requires TEXTAREA can never match. Verify the editor reports isContentEditable. Also confirm the entry's marker sits inside the same composer card as the editor.
Tab toggles another conversationFixed in 0.1.1. On 0.1.0 each mounted composer added its own document keydown listener and any focused composer satisfied every one of them, so one press toggled every open conversation.
Tab still dead after an upgradeOnly one dsh-tab-plan-toggle row in --dump-config. Two mounts means two handlers, and Tab toggles twice — a net no-op.
… is not iterable in the browser consoleAn older build read session.events; the Session API exposes snapshotEvents(). Upgrade.
Tab hijacks other editorsThe guard requires the editor to sit inside [data-input-scroll]; report the app surface if it does not.

License

MIT