Repository navigation
Releases: ninipa/oh-my-dsh-slim
Release list
v0.6.3
[0.6.3] — host-row ownership: restore web_fetch, stop copying host prose
The declarative port rebuilt the agent plane row by row, and one copied value
changed meaning in the process: a preset row is a definition, not a patch. On
0.1.x, tool-web: { fetch: false } was inert — the host plane's own fetch:true
row won and production ran with web_fetch (measured 18 → 2 web_search calls
per librarian research run). On 0.2.0 the same value became effective, so every
0.6.x preset session silently lost web_fetch in web mode.
tool-webdeclaresfetch: trueagain, restoring the effective 0.5.3
behavior;web_searchis unaffected.plan-modeno longer ships a frozen copy of the host's prompt. The mounted
definition reads the current section from the installeddsh-basebase patch
(the host rewrote a sentence of it after 0.5.3); the shipped string remains
only as the baseline for hosts whose base patch cannot be read.- New host-row audit (
scripts/audit-host-rows.mjs, run by T0 whenever a
reference host is installed): every preset row sharing an id with the host's
base bundle must match it unless listed with a reason; rows the host hands to
the agent plane must be composed or listed as a deliberate absence; the
inherited plan-mode text must stay byte-identical to the host's own parse.
T0 also pins the two intent values, so the dead 0.5.3 declaration cannot come
back unnoticed. - The web host smoke composes bundles like a real profile (dsh-base, then
dsh-web-app, then this package). The earlier shape wrote the base rows into
the profile root, where they outranked every bundle patch — so dsh-web-app's
disabled: trueentries never landed and the plane split this preset depends
on was not exercised. The smoke now asserts the host'stool-webrow stays
off and that the preset's row yields bothweb_searchandweb_fetch.
v0.6.2 — plugin settings page on the DSH 0.2 desktop
Host range: >=0.2.0-rc.2 <0.3.0-0 (tested: DSH 0.2.0-rc.2). DSH ≤0.1.5 users stay on oh-my-dsh-slim@0.5.3.
dsh plugin --profile <profile> add oh-my-dsh-slim@0.6.2Install, update and remove are dsh plugin; the desktop App manages its own profile through its
plugin manager. Restart DSH after installing or updating — plugin code mounts once per host
process. Then pick 极简角色委派 in Settings → Agent Presets.
Changes — plugin settings page on the DSH 0.2 desktop
- The configuration card registers into the settings shell's
settings.section
slot, the convention the DSH 0.2 desktop renders (its own General/Models pages
and third-party cards such as dsh-better-sidebar use it). The former
plugins.itemregistration is not rendered by that UI, so the card had no
visible entry. - Verified on an isolated DSH 0.2.0-rc.2 host with the plugin market installed:
the settings navigation shows the 极简角色委派 page. - The card opens expanded: on this host it is a settings page, so the content is visible
on entry instead of behind an extra click. Primitive lookups tolerate host generations
that rename or drop components (an unknown name renders nothing instead of crashing the
section), and the model catalog is probed defensively because 0.2 provides no nested
remote.sessionservice.
v0.6.1 — DSH 0.2 declarative line
Host range: >=0.2.0-rc.2 <0.3.0-0 (tested: DSH 0.2.0-rc.2). DSH ≤0.1.5 users stay on oh-my-dsh-slim@0.5.3.
dsh plugin --profile <profile> add oh-my-dsh-slim@0.6.1Install, update and remove are dsh plugin; the desktop App manages its own profile through its
plugin manager. Restart DSH after installing or updating — plugin code mounts once per host
process. Then pick 极简角色委派 in Settings → Agent Presets.
Changes — continuable tool-filter fix
Released as 0.6.1; the contributor's 0.6.1-native.1/2/3 labels were pre-release iterations of
this same release. Independently reproduced on an isolated DSH 0.2.0-rc.2 host installed through
plain npm/CLI: preset roster and settings entry, /omds HTTP list/create/set-default plus restart
persistence, 101 tests, and both installed-host smokes.
Second review follow-up:
- Fix
/omdsroute ownership: call the exported native connection registration method with the injected companion child as explicit owner, preserving the host authentication fence, RPC protocol and route cleanup. The formerrpc.handlecaptured a provider context withoutwebServerinjection. - Add focused transport lifecycle tests and opt-in full web-composition HTTP smoke; the former base-only smoke called profile endpoints directly and did not validate the transport layer.
- Give the unchanged preset/profile-registry plugins exported package subpaths and keep only the companion on the package-root entry. rc.2 client-module discovery rejects multiple path-based Loader sources for one
dsh.clientpackage during a full web restart; explicit non-client subpaths avoid duplicate client ownership without changing plugin implementations. - Pin development-only
semverand require its npm-acceptance cross-check on clean checkouts; remove remaining canonical-repository fork wording.
First PR review follow-up (same unreleased version):
-
Admit the bounded DSH 0.2 compatibility line instead of pinning rc.2; only rc.2 is currently host-tested.
-
Raise the runtime host floor to rc.2 with actionable guidance for older hosts before native registry access.
-
Replace development-branch installation examples with pinned official release instructions, explicitly pending publication.
-
Vendor byte-verified upstream baseline fixtures so tests work without Git history; preserve all historical archives.
-
Fix unknown tool names surviving the background delegation path: rc.2
startContinuablecarries the filter underspec.request.toolFilter, not on the top-level spec. Filter both direct and nested request shapes without mutating stock requests or removing valid restrictions. -
Correct the restrictable-tool lookup to the real rc.2
tools.view(scope).restrictableNamesAPI. The former nonexistenttools.restrictableNames()call silently disabled filtering, and the test double incorrectly supplied it. -
Extend actual rc.2 stock-tool execution regressions (direct and injected scopes, foreground and background starts) to exercise unknown
skillentries in both allow and deny lists, plus actual ToolRuntime view/restrict execution and empty-allow preservation. The original native.2 acceptance did not cover this nested filter path; its successful smoke tests were not live delegation acceptance. -
Verified 89/89 regressions with zero skipped. Isolated installed-ASAR smoke passes five explicit sentinels, including
NATIVE_TOOL_FILTER_START_PASS, exercising the real installed ToolRuntime restriction API and scoped adapter request. This does not invoke a live provider. -
The user installed native.3, retested a Chinese todo-page task without delegation instructions, and accepted the desktop result as successful. This is user acceptance, not a full tool-trace audit or live MCP validation. The implementation checks did not modify desktop files.
v0.5.3 — refuse DSH 0.1.6+: 0.1.7 replaced directory agent presets
[0.5.3] — 2026-09-28
Supported DSH: 0.1.2-rc.1 … 0.1.5-rc.2 — both host lines are verified end to end.
DSH 0.1.6 and newer are refused (see below): 0.1.7 replaced directory agent presets with
declarative ones, which this release does not implement yet.
Upgrading requires a DSH restart (plugin code mounts once per host process).
Changed
- DSH 0.1.6 and newer are refused up front (ceiling added). DSH 0.1.7 replaced directory agent
presets with declarative ones declared by plugin bundles, and the host design explicitly
rejected keeping both sources ("preset 不再有独立路径"). This preset line delivers a directory
preset, so on such a host it would install cleanly and then never appear — a silent no-op. The
host gate now carries a ceiling beside its floor — the whole 0.1.6 line is refused, prereleases
included, since it was never verified: plugin rows refuse to mount, the seeder seeds nothing and
leaves existing files untouched, and the reason plus the fix appears on the
oh-my-dsh-slim-compat settings page.engines.dshand the optional peer ranges were
tightened to match. A release for the declarative preset model is in development; compatibility
probing on a newer host can setOMDS_ALLOW_NEW_HOST=1.
Fixed
- A prerelease → release upgrade now re-seeds the bundled preset directory. The seeder decided
with its owncompareVersionsthat parsed only major.minor.patch, so a marker left at<v>-0by
a local transition package compared EQUAL to the released<v>and the "up to date" branch won.
On 2026-09-18 that was cosmetic (the directory's code was byte-identical to the release; only its
docs and version strings lagged), but an rc→final step that carries changes would have left the
preset directory silently on the older plugin code while the package reported the new version.
The decision now uses the prerelease-awarecompareSemverthe seeder already imports for the DSH
floor, andtest-preset-seedercovers the prerelease case.
v0.5.2 — effort levels are adapter-owned: any model-declared level saves
[0.5.2] — 2026-09-18
Supported DSH: 0.1.2-rc.1 … 0.1.5-rc.2 — both host lines are verified end to end
(the 0.1.5 line re-verified on rc.2; no host-facing contract changed in this release).
Upgrading requires a DSH restart (plugin code mounts once per host process).
Fixed
- A reasoning-effort level a model genuinely declares can now be saved. The settings card
derives the effort dropdown from the live model catalog, while the configuration paths
validated the value against a fixed vocabulary (none/off/low/medium/high/max) — so a level
outside that list (e.g.xhigh, whichintelalloc/gpt-5.6-soldeclares) was selectable in the
GUI but rejected on save witheffort is invalid, and on the bundled profile the host's
settings schema rejected it the same way.
Changed
- Effort values are shape-checked, not vocabulary-checked. Effort ids are adapter-owned and
open-ended, so the writers now reject only malformed tokens; the question "does this model
accept this level" moved to where it can actually be answered —llm.resolveModelat the first
delegation, which fails with a readable error naming the model's declared levels and adapter
default. Unavailable metadata (provider not imported, model unknown, host still starting) fails
open and is re-checked later, so a configuration stays readable and writable offline and on
another machine.
v0.5.1 — DSH 0.1.5 support, configuration migration
[0.5.1] — 2026-09-10
Supported DSH: 0.1.2-rc.1 … 0.1.5-rc.1 — both host lines are verified end to end.
Upgrading requires a DSH restart (plugin code mounts once per host process).
Added
- One-click migration for custom configurations on DSH 0.1.5. DSH 0.1.3-alpha.2 renamed the
persona configuration field (text→prefix). A configuration directory copied before that
change carries the old field alone, and DSH 0.1.5 rejects the whole preset mount. The settings
card now flags such a configuration and rewrites the row in place — the original
agent.cordis.ymlis kept as a backup beside it, and re-running the migration is a no-op. scripts/run-real-models.mjs: one-command real-model acceptance whose model is a flag
(--provider/--model/--effort);scripts/probe-omds-web.mjs: web-mode transport probe;
scripts/test-omds-rpc.mjs: transport unit test.
Fixed
- DSH 0.1.5: the preset could not mount at all. The persona row now carries both the
text
andprefixkeys, so one preset artifact serves the 0.1.2 and 0.1.5 host lines; previously
every new 0.1.5 session failed its preset mount. - DSH 0.1.5: the settings card's configuration list is back. The card's
/omdschannel was
registered through an API that 0.1.5 resolves differently, so it silently never appeared — the
card still rendered (with working model pickers) while reporting "Failed to read the
configuration list" and disabling save. - Coded profile-API errors now reach the card as their real message (name conflicts and
stale-revision conflicts included) instead of an opaque envelope parse failure.
v0.5.0 — targets DSH 0.1.2-rc.1, strict delegation discipline, old-host guards
⚠️ DSH version requirement
- Requires DSH 0.1.2-rc.1 (latest). DSH changed substantially in 0.1.2, so oh-my-dsh-slim 0.5.0 is NOT compatible with older DSH releases — on DSH 0.1.1 or below, stay on 0.4.0.
- Upgrading requires a DSH restart (plugin code mounts once per host process; new sessions alone do not pick it up).
- On an older host the upgrade is harmless by design: the seeder detects the mismatch, leaves your existing preset directory untouched (fully usable), and shows a notice under Settings → Plugins → oh-my-dsh-slim-compat. The preset plugins refuse to mount half-working with a readable error.
What's new
- Targets DSH 0.1.2: adapted to the removal of
registerContinuableSetup(agent/created observer rework), retired the preset's ownweb_fetchlayer and theweb-fetch-gateplugin (the host shipsweb_fetchwith SSRF protection), and the settings card now reads its model list from the host's remote model catalog. - Stricter delegation discipline, from real-session observations (multi-model GUI runs): delegation ownership rule (
self-first/delegate-first, no overlapping re-work inside a running lane's scope), foreground runs only on explicit user request, end the turn with a brief status note after dispatching background lanes, treat interim reports as "not settled". - Delegation lifecycle driven by live host events: the early-close ledger updates synchronously from
agent/inbox/inserted(host vocabularyagent-messagerelay vssubagent-settlednotice) with settled-child tombstones; the render scan remains only for cold recovery. - Orchestrator persona aligned with oh-my-opencode-slim 2.2.18: Todo continuity, Scope check before writing (compare running-lane scopes before dispatching writers or editing locally; interrupt is not rollback; a cancelled generation does not cancel required validation), a Delegation contract (every delegation names a validation owner and scope), a Verify step (reconcile all writer lanes before final validation; reuse still-valid evidence), and a Communication section (clarity over assumptions, concise execution, no flattery, honest pushback).
- Effort dropdown scoped to the selected model's declared reasoning efforts (from the host model catalog): unsupported levels are hidden, explicit mismatches warn inline and block save (the DeepSeek adapter accepts
off/low/high/max;mediumis rejected upstream). - Old-host compatibility guards:
engines.dshplus optional locksteppeerDependencieson every touched@deepseek-ai/dsh-*package; the seeder stays fully inert below the floor (existing preset untouched, settings channel alive, notice page shown); the preset plugins fail fast instead of mounting half-working. - Host-contract probe battery (
scripts/run-host-probes.mjs): 8 probes / 9 phases against a real DSH host with the real preset mounted — zero model calls, no credentials; the standing smoke after every DSH upgrade (scripts/TEST-INVENTORY.mdpins the host facts).
Fixed
- Same-turn overlapping re-work after delegation: the "Decision point" reminder could be read as a license to redo the delegated scope while the lane ran; it now ends the turn ("keep this turn only to dispatch further independent lanes — do not redo the delegated scope yourself"), and the persona's Scope check forbids overlapping work explicitly.
- Foreground slips: the
run_in_backgroundparameter schema carried the host stock wording ("Set false when your next action depends on it"), which intermittently pulled models into foreground runs against the discipline; the schema now repeats the strict rule and is guarded by unit tests. - GUI-TEST-TASKS.md rewritten as a user-facing self-test list (T1–T7 scenarios with prompts and expected behavior; T3 uses the bundled
examples/omo-probe-baseline).
Verification
- T0 static validation green across the three distribution copies; 13 unit suites green (including the new host-version gate, seeder old-host scenarios, and per-model effort regression); L1 host-contract battery 9/9 on a real DSH 0.1.2-rc.1 host with the guarded plugins; GUI acceptance T1–T7 all pass after a host restart (routing, background dispatch, end-turn discipline, settle integration, oracle/designer routing).
Docs
- Usage: README.md / 中文
- Changelog: CHANGELOG.md
v0.4.0 — multi-preset: named configuration profiles
What's new
- Multiple named configurations (multi-preset) — the settings card's top row is now a Delegation configuration dropdown managing named configurations; each configuration is a real native agent preset created through the seeder's
/omdsprofile RPCs (profile-list/profile-create/profile-save/profile-set-default):- "+ New configuration" edits an in-place draft copied from the configuration being edited; nothing is persisted until Save, which asks for a display name only (the internal id is derived from the name and never changes).
- A saved configuration materializes as
$DSH_HOME/.agent-presets/profile-<prefix>-<hash>/(whole-directory copy of the bundled preset) plus its ownprofile.jsonsnapshot — configurations are isolated from each other and from the bundled one (config-loader reads its own directory; the three preset plugins needed zero changes). - Set as default for new sessions writes DSH's native agent-presets default setting — the same write the Agent preset picker performs, so the card and the picker always agree; only new sessions are affected.
- Failure safety: creation that fails validation/writing rolls the copied directory back; saves carry an
expectedRevisionfence so concurrent writers cannot silently overwrite each other.
- Profile RPC endpoints and card helpers unit-tested end to end (
test-profile-rpc.mjs, client-card roster/validation/serialization/adapter/sentinel tests, config-loader snapshot isolation) plus a real-host standing-mount smoke with two profiles.
Fixed
- A profile created FROM another profile silently inherited the bundled defaults except the edited field — the create snapshot now serializes against the new profile's own base (bundled defaults), with a regression test asserting the old behavior drops inherited fields.
- Settings card opened on the bundled profile instead of the new-session default — it now opens on the new-session default once the roster is loaded, never overriding a manual selection.
- The bundled profile had no "Set as default for new sessions" entry — the action now appears for every non-default profile (including the bundled one), never for the new-config draft.
- Redundant selected-name badge beside the dropdown removed.
Verification
- Full unit battery green; T0 static validation green across the three distribution copies (dev root / publish staging / npm preset); real-host smoke (three presets standing-mounted, A/B snapshots isolated) PASS; upgrade-guard probe PASS; zh/en locale keys symmetric.
Docs
- Usage: README.md (configuration → multiple configurations) / 中文
- Changelog: CHANGELOG.md
v0.3.5 — fix: bounded shell probes (zsh -lic hang)
What's new
- Fixed: preset could hang at load when zsh is installed. All five preset plugins resolve the host DSH install by probing
npm root -g, falling back tozsh -lic "npm root -g". A login+interactive zsh sources the user's shell config and can hang — reported on Linux (zsh 5.5.1): the 极简角色委派 preset mode became unusable while standard mode kept working, and uninstalling zsh "fixed" it. The probes only run inside the preset plugins, so standard mode was never affected. - Every probe is now bounded (2 s timeout, child killed on expiry), silent on stderr (the
/bin/sh: zsh: 未找到命令noise when zsh is absent is gone), and the zsh fallback only runs when plainnpm root -gfails (first success wins). Same hardening for thecommand -v dshprobe and the shipped diagnostic scripts.
Verification
- Timeout mechanism: a hung child is killed at ~2 s (
ETIMEDOUT). - T0 gained a static guard enforcing bounded probes for all five plugins; full unit battery green; three-way distribution sync verified.
Docs
- Changelog: CHANGELOG.md
v0.3.4 — effort 'none' mode for effort-less models + fixer description
What's new
effort: "none"— per-role opt-out of thereasoningEffortparameter (settings card + schema + runtime). Local LLMs (e.g. Llama/Qwen) that reject thereasoningEffortrequest field now work: picknonein the settings card (or set"effort": "none"in the config JSON) and the parameter is omitted entirely — deliberately distinct fromoff, which still sendsreasoningEffort: "off"(explicitly disabling reasoning on models that support it).temperatureinjection is unaffected; shipped defaults are unchanged (high). Reported as issue #2.- Fixer card description updated: 定向修复 → 代码实现、修复与重构 / "Targeted fixes" → "Code implementation, fixes, and refactoring" — the role covers bounded implementation, bug fixes and refactoring.
- GUI wording: 思考档 → 思考强度; the effort select no longer shows a placeholder option and always displays a real value (
none | off | low | medium | high | max).
Verification
- Unit tests: effort runtime (
noneomitsreasoningEffort, keeps role temperature), settings-schema acceptance ofnone, GUI write-plan (set / no-op / reset), client-card — all green; T0 static validation (three-way distribution sync) green. - Production GUI acceptance confirmed:
noneoption, inline explanation, save round-trip.
Docs
- README (en/zh): effort vocabulary incl.
none; zh known-limits parity (early close). - Full changelog: CHANGELOG.md