English · 简体中文
Gives dsh agents a persistent evolution memory and a native bridge to the
EvoMap network: behind each prompt it injects one reusable strategy
that fits, reports back to the network how that strategy fared, and adds evolver_* tools
and /evolver-* commands.
The plugin is published on npm as @evomap/dsh-evolver.
Each dsh profile loads its own plugins, so install it into every profile you use (dst
runs dsh-tui):
dsh plugin --profile dsh-tui add -w @evomap/dsh-evolver@latest
dsh plugin --profile web add -w @evomap/dsh-evolver@latest
dsh plugin --profile headless add -w @evomap/dsh-evolver@latestRestart dsh afterwards. Run the same command again to update: @latest makes pnpm move
past the version already in the profile's lockfile.
Install from the app's plugin market, on any platform:
- Open the plugin market in DSH Desktop and go to Sources.
- Choose Add source, enter
https://evomap.ai/dsh/catalog-source.json, and select it. - Find Evolver under Installable and choose Install.
The market installs the latest release from npm. To update, uninstall it under Installed and install it again.
The desktop profile belongs to the app, so the npm dsh will not touch it.
Windows: open the terminal inside DSH Desktop and run
dsh plugin add -w @evomap/dsh-evolver@latestmacOS: run the app's bundled CLI with the app's own pnpm, passing the same
minimumReleaseAge=0 the app uses so a fresh release is not held back:
APP="/Applications/DSH Desktop.app/Contents"
SHIM=$(mktemp -d)
printf '#!/bin/sh\nexec node "%s/Resources/app/node_modules/pnpm/bin/pnpm.cjs" --config.minimumReleaseAge=0 "$@"\n' "$APP" > "$SHIM/pnpm"
chmod +x "$SHIM/pnpm"
PATH="$SHIM:$PATH" CI=true ELECTRON_RUN_AS_NODE=1 "$APP/MacOS/DSH Desktop" \
"$APP/Resources/app/lib/desktop-cli.js" \
plugin --profile desktop add -w @evomap/dsh-evolver@latest </dev/nullRestart DSH Desktop afterwards. If pnpm stops with Ignored build scripts: koffi, set
koffi: true under allowBuilds in ~/.dsh/profiles/desktop/pnpm-workspace.yaml and run
the command again.
A profile installed from github:EvoMap/evolver-dsh-plugin keeps that source when you run
add again. Remove it first, then add the npm package. For example:
dsh plugin --profile dsh-tui remove @evomap/dsh-evolver
dsh plugin --profile dsh-tui add -w @evomap/dsh-evolver@latestLocal memory works without an account. Network reuse runs through the local Evolver Proxy, which the plugin sets up on its own once per dsh process, in the background:
evolvermissing, or older than 2.0.39: it runsnpm install -g @evomap/evolver@latest, thenevolver lifecycle start(orrestartafter an upgrade).evolvercurrent but its Proxy not answering: it runsevolver lifecycle start.
What it did, or why it could not (for example a global npm install without write permission), reaches the agent as a one-time notice. To finish connecting:
- Open the claim link the Proxy writes to
~/.evomap/claim_urlwhile signed in to evomap.ai. - Run
/evolver-statusin dsh to confirm the Proxy and node.
Network recall needs @evomap/evolver 2.0.39 or newer. The evidence on reuse reports
reaches the Hub only through a Proxy newer than 2.0.42; an older one drops it, and the Hub
counts those reports as unevidenced.
Every strategy injected into a turn is reported through the Proxy's
POST /asset/reuse-result as {asset_id, outcome, task_id, reason, evidence}. The Hub
weighs each report by its evidence:
| Report | When | task_id |
evidence |
|---|---|---|---|
| Turn end | the turn ends | dsh:<session>:<turn> |
tier L1 when the turn ran a test, build, lint or type check, else none; applied; check {kind, passed, fail_then_pass} of the last check; aborted; stage: immediate |
| Correction | the next prompt says the answer did not hold, or approves it | …:correction |
tier: L3, applied, stage: correction |
| Retention | the next session in the same project finds the turn's edits kept or reverted | …:retention |
tier: L2, applied, stage: retention |
evolver_asset_reuse_result |
the model reports on its own | the model's own | tier: L5, applied, stage: immediate |
appliedcompares the strategy's numbered steps with the turn's shell commands, touched paths, the code its edits wrote (200,000 characters a turn, kept in memory only) and the final answer:usedwhen half the steps show up,partialwhen fewer do,unusedwhen none do. A turn that left nothing to compare, or a strategy without numbered steps, is sent as tiernonewithapplied: partial, which weighs nothing either way, and its reason saysapplied: unknown.- Checks are
bashcommands that run tests, builds, linters or type checkers. A check fails on an error result or on failure output, since a failing run piped throughtailstill exits zero.fail_then_passcompares commands with output pipes (| tail -9) and redirects (2>&1) removed. - The outcome follows the last check; without one it follows how the turn ended.
- Delivery. Reports wait in
~/.evolver/state/reports-outbox.jsonand are retried at every turn end, follow-up prompt and session start for 8 days. A report is settled once the Hub answers it,duplicate_reportand ineligible (same_owner,daily_cap) ones included. One the Hub refuses as invalid (terminal: true, orhub 400/hub 422from an older Proxy) is settled as rejected and never resent.hub 404,hub 5xxand network failures are retried. /evolver-statuslists the Hub's verdict (eligible,counted,weight) on recent reports and the reason for each rejected one. Reports with evidence are also written to the local root event log once.- Reasons name the turn, the applied verdict and the check kind, never the prompt, a command, code or a diff, and the prompt loses keys and tokens before recall sends it.
Node.js 22.13+, dsh 0.1.5+.
Settings and their defaults are in src/config.js.
npm ci
npm testMIT © EvoMap.
