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.

Effort Memory — DSH Plugin for DeepSeek Harness
← Plugins
E

dsh-effort-memory

Effort Memory

Host-only DSH plugin: remember the reasoning effort that was last in effect per (provider, model) and restore it when a session switches back

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

npx -y @deepseek-ai/dsh plugin --profile web add github:cup113/dsh-effort-memory#4a5ae490f97245946f4cbad6e14c5f813f5e8734
READMECompatibilityVersions

Compatibility and provenance

Effort Memory is published as dsh-effort-memory and currently resolves to version 0.1.0. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
any
Release source
github
Registry updated
9/22/2026

Versions

0.1.0stable
9/22/2026

Related plugins

Loading related plugins…

Latest
0.1.0
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
any
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
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in

Related plugins

More verified plugins in models-usage.

Usage@linxin666/dsh-usageUsage statistics plugin for the dsh web GUI: per-provider balance and coding-plan quota detection plus a live token usage ledger, with a compact price glance card above the sidebar's Settings rowClient Ui Model Capabilities@linxin666/dsh-client-ui-model-capabilitiesPer-model capability declarations (image input and reasoning efforts) for custom pi-ai providers, edited in place on the Models settings cards; writes the official llm-pi-ai settings namespace, no DSH source changes.Plugin@opencode2dsh/dsh-pluginFree OpenCode Zen models for DeepSeek Harness (DSH): native dsh-llm adapter plugin, no API key.Deepseek Web Logindsh-deepseek-web-loginUnofficial DSH plugin: use chat.deepseek.com web models as a DSH LLM provider (browser login capture + PoW solving + SSE streaming + prompting-based tool calls), provider route deepseek-web

README

dsh-effort-memory

An out-of-tree DeepSeek Harness (DSH) plugin that remembers the reasoning effort last actually in effect for each (provider, model) route and restores it when a session switches back to that model.

Why

The composer's model seat renders the effort from the durable modelSelection projection. Picking a different model sends that model's own defaultEffort (dsh-client-ui-model-selection/lib/client.js:427,883), and the host resolver materializes the adapter default when a caller omits an effort (dsh-llm/lib/index.js:2116-2130). So a model switch always lands on the new model's default, and the level chosen on the model being left is not restored on return.

This plugin closes that gap by re-issuing exactly one selection through the same public command interface the GUI calls — it appends no session events itself, registers no service, and writes no settings.

Behavior

  1. The memory key is (provider, model); the value is the effort id that was last in effect on that route.
  2. On a route change A -> B, the plugin remembers A's effort, then:
    • if B has a remembered effort and B currently advertises it, it re-issues one selection through ctx.sessionController.selectModel(...), so the session's durable selection becomes { B, that effort };
    • otherwise it does nothing and B keeps its own default. This is deliberate: a first visit to a never-used model lands on that model's default.
  3. A target model that declares no reasoning capability (resolved reasoning missing, or reasoningEfforts: false in settings) gets no reasoningEffort and no error.
  4. A remembered effort the target no longer advertises (for example rewritten by dsh-custom-reasoning-effort) falls back to the model's default silently, with no retry.
  5. Effort-only changes on the model already selected are never touched.

Design constraints

  • Host half only. No client.js, no slot, no React, no UI.
  • One lever. ctx.sessionController.selectModel — the same public command interface the GUI calls. The plugin never appends session events itself and never rewrites in-memory selection state.
  • Capability first. ctx.llm.resolveModelInfo(provider, model) is consulted before any re-issue, because selectModel throws UNSUPPORTED_REASONING_EFFORT for a level the target does not advertise.
  • Loop-safe. Only a route change can trigger a re-issue, only when the event's effort differs from the remembered one, and the re-issue keeps the same route — so the event it produces cannot re-enter the rule as a change.
  • Replay-safe. Constructor seeds (replay, fork, resume) never publish on the session/event firehose; a seq < session.firstLiveSeq guard is kept as belt-and-braces.
  • No services, no settings, no retries. Any failure is logged and skipped; nothing is ever surfaced to the user.
  • Zero runtime dependencies. defineDomain/domainTable are identity wrappers and the runtime calls only valueSchema.parse(raw), so the domain spec is declared inline; a link: install does not install a linked package's own dependencies, so a bare import of zod or @deepseek-ai/dsh-storage-domain would not resolve.

Persistence

  • Domain effort_memory, table efforts, key JSON.stringify([provider, model]), record { reasoningEffort }.
  • The domain name must match UNIT_NAME_RE = /^[a-z][a-z0-9_]*$/, which forbids the hyphen — hence the domain is effort_memory while the package, the bundle patch row id, and the exported plugin name all stay effort-memory.
  • With the base storage stack mounted, the single-layout document lands at $DSH_HOME/storages/effort_memory.json and survives restarts.
  • Without ctx.storageDomain, memory degrades to a process-local Map (a warning is logged at apply time) and is lost on restart.

Install

From a checkout, by path:

dsh plugin --profile <name> add link:<absolute path to this repository>

Directly from GitHub:

dsh plugin --profile <name> add github:cup113/dsh-effort-memory

dsh plugin forwards to pnpm in the profile directory and then reconciles dsh.profile.bundles: a dependency resolving to a package that declares dsh.bundle joins the layer stack automatically. A new bundle row and its Node ESM module are both loaded at boot, so restart dsh after installing or after editing index.js.

Layout

PathRole
index.jsHost half: event listener, service calls, storage memory (apply, inject, name)
decide.jsPure rules: route keys, effort normalization, the decision table
cordis.patch.ymlThe one bundle row (id: effort-memory, name: dsh-effort-memory)
test/Test suites: pure layer, packaging parity, and an integration test
_verify/Harness used against a live DSH: a dynamic host probe, a multi-frame session-log extractor, a mutation check

Only the root files listed in files are the bundle; test/ and _verify/ are inert to the Loader.

Tests

node test/all.mjs

Twenty assertions: the pure decision table, packaging parity (bundle row id, package name, storage-domain name), and an integration suite that drives the real apply() against a fake Cordis context — listener shape, event ordering, the re-issue loop breaker, replay-seed rejection, and the storage-less fallback. CI runs the same entry on Node 20 and 22.

node --test is deliberately not used: it runs each file in a child process with piped stdio, which a confined sandbox refuses.

_verify/mutation-check.mjs proves the decision assertions are not vacuous: with the restore branch removed from decide.js, the canonical assertion flips.

Known limitations

  1. One settings write per switch is performed by the public selectModel path itself (agentDefaultModel.saveSelection → settings.replace('agent-default-model', …)). This plugin adds no settings namespace and no settings write of its own.
  2. Memory is global per (provider, model) — shared by every session and workspace, as specified.
  3. The plugin acts on every live session whose route changes, subagent sessions included. Restricting to root sessions would require an extra agents dependency.
  4. Without sessionProjections, the first event observed for an existing session can only establish the baseline, so that session's first switch after a restart may not be restored.
  5. A stale remembered level is kept in the domain (harmless): if a model's effort table later regains that level, it will be restored again.
  6. Single-process visibility only; domain/changed does not cross processes.

License

MIT © 2026 Jason Li