dsh-autotier 0.2.2 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/AGENTS.md +52 -23
  2. package/CHANGELOG.md +44 -0
  3. package/{README.es.md → README-es.md} +94 -13
  4. package/{README.hi.md → README-hi.md} +93 -14
  5. package/{README.pt.md → README-pt.md} +96 -16
  6. package/{README.zh.md → README-zh.md} +83 -11
  7. package/README.md +110 -18
  8. package/cordis.patch.yml +2 -2
  9. package/lib/client.js +72 -40
  10. package/lib/client.js.map +1 -1
  11. package/lib/index.js +233 -66
  12. package/lib/typert.host.js +1 -1
  13. package/lib/types/client/TierSettingsCard.d.ts +14 -12
  14. package/lib/types/client/TierSettingsCard.d.ts.map +1 -1
  15. package/lib/types/client/index.d.ts +5 -4
  16. package/lib/types/client/index.d.ts.map +1 -1
  17. package/lib/types/client/remote.d.ts +12 -12
  18. package/lib/types/config.d.ts +20 -9
  19. package/lib/types/config.d.ts.map +1 -1
  20. package/lib/types/index.d.ts +11 -8
  21. package/lib/types/index.d.ts.map +1 -1
  22. package/lib/types/judge.d.ts +17 -0
  23. package/lib/types/judge.d.ts.map +1 -1
  24. package/lib/types/preflight.d.ts +21 -1
  25. package/lib/types/preflight.d.ts.map +1 -1
  26. package/lib/types/routing.d.ts.map +1 -1
  27. package/lib/types/schema.d.ts +44 -2
  28. package/lib/types/schema.d.ts.map +1 -1
  29. package/lib/types/selection.d.ts +36 -10
  30. package/lib/types/selection.d.ts.map +1 -1
  31. package/lib/types/service.d.ts +16 -9
  32. package/lib/types/service.d.ts.map +1 -1
  33. package/lib/types/settings.d.ts +44 -0
  34. package/lib/types/settings.d.ts.map +1 -0
  35. package/lib/types/typert.host.d.ts +12 -12
  36. package/lib/types/wire.d.ts +24 -24
  37. package/lib/types/wire.d.ts.map +1 -1
  38. package/lib/{wire-BpKSOHgo.js → wire-BxsY8BiN.js} +22 -20
  39. package/package.json +62 -56
  40. package/src/client/TierSettingsCard.tsx +25 -12
  41. package/src/client/index.ts +29 -16
  42. package/src/config.ts +70 -12
  43. package/src/index.ts +23 -19
  44. package/src/judge.ts +30 -2
  45. package/src/preflight.ts +68 -1
  46. package/src/routing.ts +11 -0
  47. package/src/schema.ts +48 -9
  48. package/src/selection.ts +54 -20
  49. package/src/service.ts +20 -18
  50. package/src/settings.ts +80 -0
  51. package/src/wire.ts +19 -20
package/AGENTS.md CHANGED
@@ -12,13 +12,21 @@ records repo-local decisions.
12
12
  `sessionProjections` and `sandboxPolicy` are read with `ctx.get()` and degrade
13
13
  when absent.
14
14
  - `src/schema.ts` — the Schemastery schema and the raw (partial) config
15
- interfaces it resolves. Kept free of executable logic so a schema module never
16
- mixes function values into its declarations (the plugin-doctor K4 rule).
15
+ interfaces it resolves, plus the `VolatileConfig` face the Loader hands
16
+ `apply`. Kept free of executable logic so a schema module never mixes function
17
+ values into its declarations (the plugin-doctor K4 rule).
17
18
  - `src/config.ts` — the explicit `resolveConfig` judge (no hidden `?? default`
18
- in callers) and the resolved interfaces. Object defaults are COMPLETE objects;
19
- the adapter-owned effort vocabulary is `off | low | high | max` (there is no
20
- `medium`).
21
- - `src/service.ts` — `ctx.autotier` (`status()` and the live settings scope).
19
+ in callers) and the resolved interfaces. It accepts BOTH config faces (plain
20
+ data and the Loader's `Volatile` references) and is the plugin's only
21
+ cross-field judge: Schemastery cannot express those rules and is all the Host
22
+ validates a form write against, so mount and every live update route through
23
+ here. Object defaults are COMPLETE objects; the adapter-owned effort
24
+ vocabulary is `off | low | high | max` (there is no `medium`).
25
+ - `src/service.ts` — `ctx.autotier` (`status()` and `reconfigure()`, which the
26
+ settings binding calls to swap the live policy).
27
+ - `src/settings.ts` — the host settings seam: claims the instance's Plugins-page
28
+ policy (`ctx.settings.configure({ auto: false })`) and re-resolves the routing
29
+ policy on every `loader/volatile-update`.
22
30
  - `src/types.ts` — shared vocabulary (tier ids, effort ids, routing modes,
23
31
  scenarios, route/status shapes).
24
32
  - `src/wire.ts` — the `tier` Remote wire vocabulary: `TierStatus` (the public
@@ -34,15 +42,22 @@ records repo-local decisions.
34
42
  `/tier` read; `agents` is read optionally through the injected resolver.
35
43
  - `src/client/` — browser half: `$mount`s the Remote contribution, registers the
36
44
  composer pill into `conversation.input.left` (id `tier-pill`) and the Settings
37
- card into `settings.plugins.tab` (id `autotier`), with a pure presenter
45
+ card into `plugins.item` (id `autotier`), with a pure presenter
38
46
  (`present.ts`), inline scoped stylesheet (`styles.ts`), and en/zh dictionaries
39
47
  (`locales.ts`). The slot registry is read through a local structural
40
- `SlotsFace` (its owning package differs across host lines).
41
- - `tests/` — vitest over the REAL published `0.1.5-rc.1` host packages
42
- (`Context`, `SessionStore`, `SystemPrompt`, `ToolRuntime`, `CommandRuntime`,
43
- in-memory `SettingsProvider`) plus one real Loader composition. The browser
44
- half is covered through its pure units (wire codecs, presenter, dictionaries)
45
- and the `tier` service through a real mount with a scripted `agents` face.
48
+ `SlotsFace` (its owning package differs across host lines). The browser half
49
+ needs no `configForms` entry: the Host generates the config form for the
50
+ `autotier` row from its `Config` schema, and this card is the dedicated
51
+ runtime surface (routing mode, live landings, catalog).
52
+ - `tests/` — vitest over the REAL published `0.1.7-alpha.1` host packages
53
+ (`Context`, `SessionStore`, `SystemPrompt`, `ToolRuntime`, `CommandRuntime`)
54
+ plus one real Loader composition. The `settings` service is the one stand-in:
55
+ the host's real `SettingsForms` binds to `configEditor`, `profileContext` and
56
+ the Loader's fiber graph, none of which this plugin consumes, while the
57
+ plugin's contract with it is only `configure({ auto })` and
58
+ `loader/volatile-update`. The browser half is covered through its pure units
59
+ (wire codecs, presenter, dictionaries) and the `tier` service through a real
60
+ mount with a scripted `agents` face.
46
61
 
47
62
  ## Hard rules applied here
48
63
 
@@ -59,15 +74,27 @@ records repo-local decisions.
59
74
  - **Guard is defence in depth**: it never weakens `dsh-defend`, the approval
60
75
  service or the sandbox policy. A guard that throws escalates the call instead
61
76
  of allowing it.
62
- - **Fail loud**: invalid configuration throws at mount or at the settings write,
77
+ - **Fail loud**: invalid configuration throws at mount, and a live update the
78
+ cross-field judge refuses keeps the last good policy and logs — configuration
63
79
  never silently disables routing.
80
+ - **One cross-field judge**: Schemastery cannot express this plugin's cross-field
81
+ rules and is all the Host validates a settings-form write against, so
82
+ `resolveConfig` is the only judge and both paths (mount, live update) call it.
83
+ `.volatile()` sits on each top-level Config section — never inside an array,
84
+ dict or union, which Schemastery forbids — and `routingMode` stays plain
85
+ because the per-session override is its runtime switch.
64
86
  - **Model-visible ⟺ logged**: the only model-visible content is the `/tier`
65
- output and the guard's corrective denial. No custom session event is appended
66
- (that vocabulary is fail-closed on `0.1.2-alpha.1` and later); the trail is the
67
- plugin logger plus the live `autotier/tier-changed` bus event, and the sole
68
- append is the `plan/mode` fallback when the plan-mode service is absent.
87
+ output and the guard's corrective denial. The judge's own model call carries a
88
+ producer-owned source kind (`dsh-autotier`, declared by module augmentation in
89
+ `src/judge.ts`); there is no shared `kind: 'plugin'` catch-all, and the session
90
+ format's row admission rejects that retired wrapper. No custom session event is
91
+ appended (that vocabulary is fail-closed on `0.1.2-alpha.1` and later); the
92
+ trail is the plugin logger plus the live `autotier/tier-changed` bus event, and
93
+ the sole append is the `plan/mode` fallback when the plan-mode service is
94
+ absent.
69
95
  - **Registration is an effect**: every listener, command, tool, service and
70
- settings namespace rides the plugin fiber and disappears on dispose.
96
+ page-policy claim rides the plugin fiber and disappears on dispose. (There is
97
+ no settings namespace to release any more: the Host owns the form.)
71
98
 
72
99
  ## Config
73
100
 
@@ -95,8 +122,10 @@ with the shell's platform modules (`react`, `react/jsx-runtime`, the
95
122
  pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm pack`. The
96
123
  plain `typecheck` resolves the local harness checkout's type faces through
97
124
  tsconfig `paths` (four levels up to `D:\deepseek-harness`); `typecheck:ci`
98
- resolves the npm-published `0.1.5-rc.1` faces (no paths) and is what CI runs —
99
- keep both green.
125
+ resolves the npm-published `0.1.7-alpha.1` faces (no paths) and is what CI runs —
126
+ keep both green. Both rulers must be on the SAME host line: this plugin's
127
+ settings seam exists only from `0.1.6-alpha.2` on, so a green checkout ruler with
128
+ a stale published pin would prove nothing.
100
129
 
101
130
  ## Release
102
131
 
@@ -108,8 +137,8 @@ and creates the GitHub Release from the CHANGELOG section.
108
137
 
109
138
  ## Docs
110
139
 
111
- - Five-language READMEs (`README.md`, `README.zh.md`, `README.es.md`,
112
- `README.pt.md`, `README.hi.md`) — keep all five in sync; the English file is
140
+ - Five-language READMEs (`README.md`, `README-zh.md`, `README-es.md`,
141
+ `README-pt.md`, `README-hi.md`) — keep all five in sync; the English file is
113
142
  the source of truth.
114
143
  - GitHub topics mirror `package.json` keywords.
115
144
  - `THIRD_PARTY_NOTICES.md` records the MIT-licensed guard-rule port from
package/CHANGELOG.md CHANGED
@@ -5,6 +5,50 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.5] - 2026-09-22
11
+
12
+ ### Changed
13
+
14
+ - **Adapted to the `0.1.7-alpha.1` host. This is a breaking adaptation: the older lines are dropped.** The `0.1.6`-generation harness replaced the settings *provider* seam with `SettingsForms`, so `ctx.settings.register(ns, schema, { base, validate })` and the `settings/updated` event no longer exist on any published line that ships the new service. Configuration is now read from the row's own volatile references: each top-level `Config` section is declared `.volatile()`, the plugin claims its Plugins-page policy with `ctx.settings.configure({ auto: false })`, and a live edit re-resolves the routing policy on `loader/volatile-update`. `.volatile()` cannot sit inside an array, dict or union, so it is applied per top-level section rather than per nested field. `routingMode` stays plain on purpose: it is the composition default, and the runtime switch remains the per-session override written by `/tier`, the composer pill and the card. Cross-field validation is unchanged in kind but moved owner: `.check()` does not exist in the pinned Schemastery, so `resolveConfig` — still the single judge at mount — now also runs on every live update and keeps the last good policy when it refuses a value.
15
+ - The `@deepseek-ai/dsh-settings-file` test dependency is gone (the package was deleted upstream); the composition suite provides the `settings` service through the Loader runner instead, since the real `SettingsForms` injects `configEditor` and `profileContext` from the launcher.
16
+ - External-change detection in `SelectionSync` is now a re-read comparison rather than a subscription. `settings/updated` is gone, so `observeExternalSelection()` reads `agentDefaultModel.currentSelection()` and delegates every live session when it differs from the value this plugin last wrote. It runs immediately before a tier is mirrored, so a user's model pick is still never overwritten by a routing decision; before this plugin's first write nothing is delegated, because at that point "not ours" describes the composition default rather than an override.
17
+ - The `@deepseek-ai/dsh-*` dev/test pins are unified onto the published `0.1.7-alpha.1` line (the frozen `0.1.5-rc.3` line still carries the removed `SettingsProvider` contract, so it cannot type-check this plugin's settings seam). This also settles the previous mixed line, where most pins sat on `0.1.5-rc.2` and two on `0.1.6-alpha.2`. `@deepseek-ai/cordis` moves to `^4.0.3` (4.0.2 does not export `Volatile`), `@deepseek-ai/schemastery` to `^3.18.3` (3.18.2 has neither `.volatile()` nor `Volatile<`), and `@deepseek-ai/cosmokit ^1.8.4` is added as a peer/dev dependency for `Volatile`/`isVolatile`; `@deepseek-ai/cordis-plugin-loader` moves to `^1.0.4`, which is the first version declaring `loader/volatile-update`.
18
+ - The declared host range gains the `0.1.7` line (`>=0.1.7-0 <0.2.0`). This is a correctness fix, not a widening: a semver range whose only prerelease comparator sits on an earlier version tuple does not admit a later alpha, so `engines.dsh` and every peer range previously excluded the very host this release targets.
19
+ - The strict Typert codecs are single-face. The protocol declares exactly `create(): TypertSchema`, the typert-loader enforces it, and nothing reads the `schema` property the codec used to carry alongside it — so the dual-face shape was dead weight that still looked supported. `scripts/verify-artifacts.mjs` now asserts `create()` is present and `schema` is absent.
20
+
21
+ ### Fixed
22
+
23
+ - The judge's model call no longer uses the removed `kind: 'plugin'` message-source catch-all. `MessageSourceMap` is a merge-extensible sum type with no shared plugin kind, and the session format's physical-row admission rejects `kind === 'plugin'` outright. The call now declares its own `dsh-autotier` kind by module augmentation in `src/judge.ts`, with a bounded `notice` summary so the durable log says why an extra model call happened (`tool-jobs` is the upstream precedent).
24
+ - The integration suite runs on the new host contract: the in-memory `SettingsProvider` subclasses are replaced by a real cordis `Service` stand-in that implements `configure`, the settings-namespace assertions become live-update assertions, `settings/updated` emissions become re-read comparisons, and the duplicate-service remount assertion tracks cordis 4.0.3's wording.
25
+
26
+ ### Removed
27
+
28
+ - The `validateConfig` save-time hook. It is no longer wired to anything (the Host has no validate hook to attach it to) and remains exported only as a deprecated alias of `resolveConfig` for existing importers.
29
+
30
+ ## [0.2.3] - 2026-09-12
31
+
32
+ ### Changed
33
+
34
+ - The default cheap and vision tiers now land on `deepseek-flash` (the 0.1.6 catalogue id, image-capable) instead of the removed `deepseek-v4-flash*` ids — a behavior change: image turns no longer fail with `UNSUPPORTED_CONTENT` on hosts with the new catalogue, and the vision tier is genuinely multimodal again.
35
+ - The mount now fails loudly when a default tier model id is missing from a new-generation host catalogue (a missing id used to degrade silently to a text-only passthrough); hosts whose catalogue predates `deepseek-flash` keep the documented degradation and skip the check.
36
+ - The card moved from the Settings → Plugins tab to the Plugins page (`plugins.item`, Official group) with a `summary` one-liner and a `page` form, and reads the shell's current session from the main-view retention — the removed `SessionListState.current` no longer leaves the selector permanently disabled.
37
+ - Declared `dsh.manifestVersion: 1` and the `engines.dsh` range; the peer range now also admits the 0.1.6 line.
38
+
39
+ ### Fixed
40
+
41
+ - The strict Typert codecs now carry the `create()` factory the 0.1.6-alpha.2 typert-loader requires, so the plugin tree boots on the new line (the dual-face codec keeps the rc.2 `schema` field too).
42
+ - Per-agent routing state is backfilled synchronously on `agent/created`, so the first request of a turn no longer pays the lazy-init path.
43
+
44
+ ## [0.2.3] - 2026-09-12
45
+
46
+ ### Changed
47
+
48
+ - Rename the four translated READMEs to `README-<lang>.md`. npm selects the package-page readme as the first markdown file matching its `{README,README.*}` glob (`@npmcli/package-json`, publish path), and that glob order puts `README.<lang>.md` ahead of `README.md` — so npm was serving the Simplified-Chinese file for every package of this family (measured on 15/15 sampled packages). The new names sit outside the glob, so the English source is served again. No content changed: the four renames are byte-identical (verified by content hash) and `check:readmes` still passes. Takes effect from the next release; an already-published version cannot gain a corrected readme retroactively.
49
+ - `scripts/check-readme-sync.mjs` now fails when the package root holds more than one npm-visible `README*.md` (it mirrors npm's `{README,README.*}` glob plus the markdown test), so the regression cannot return silently.
50
+ - Pin the `@deepseek-ai/dsh-*` dev/test dependencies to the published `0.1.5-rc.2` line and record `0.1.5-rc.2` in `dshWorkshop.compatibility.dshVersions`; the monthly Compat workflow now runs against `0.1.5-rc.2`. The peer range `>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0` is unchanged, so no supported host line is dropped.
51
+
8
52
  ## [0.2.2] - 2026-09-10
9
53
 
10
54
  ### Changed
@@ -4,10 +4,13 @@
4
4
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
5
5
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
6
6
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-autotier.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
7
+ [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-en.svg)](https://dsh.market/)
7
8
  [![Node](https://img.shields.io/badge/node-%5E22.19.0%20%7C%7C%20%3E%3D24.0.0-brightgreen.svg)](#)
8
9
  [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-autotier/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-autotier/actions)
9
10
  [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-autotier?label=version)](https://github.com/PerryLink/dsh-autotier/releases)
10
11
 
12
+ [English](README.md) | [简体中文](README-zh.md) | **Español** | [Português](README-pt.md) | [हिन्दी](README-hi.md)
13
+
11
14
  Enrutamiento automático por niveles de modelo para DeepSeek Harness: entra una
12
15
  instrucción del usuario y sale una decisión de nivel — sin cambiar de modelo a
13
16
  mano.
@@ -27,13 +30,27 @@ strong con un TTL de retorno.
27
30
 
28
31
  | Harness | Estado |
29
32
  |---|---|
30
- | `@deepseek-ai/dsh` `0.1.2-rc.1` | compatible; el flujo compat instala esta línea de extremo a extremo |
31
- | `@deepseek-ai/dsh` `0.1.5-rc.1` | compatible; verificada de extremo a extremo (perfil real, fila en `--dump-config`, smoke keyless) y en la matriz compat |
32
- | `@deepseek-ai/cordis` `^4.0.2`, `@deepseek-ai/schemastery` `^3.18.2` | base de peers |
33
+ | `@deepseek-ai/dsh` `0.1.2-rc.1` | ya no compatible; esa línea es anterior al contrato `SettingsForms` al que apunta ahora el plugin |
34
+ | `@deepseek-ai/dsh` `0.1.5-rc.2` | ya no compatible; el contrato `settings.register` / `settings/updated` que expone fue eliminado aguas arriba |
35
+ | `@deepseek-ai/dsh` `0.1.6-alpha.2` | ya no compatible; la misma eliminación, primera línea con `SettingsForms` |
36
+ | `@deepseek-ai/dsh` `0.1.7-alpha.1` | **requerida**; verificada contra el checkout correspondiente (`typecheck`) y los paquetes publicados (`typecheck:ci`, 214 pruebas) |
37
+ | `@deepseek-ai/cordis` `^4.0.3`, `@deepseek-ai/cosmokit` `^1.8.4`, `@deepseek-ai/schemastery` `^3.18.3` | base de peers |
33
38
 
34
- Los rangos de peers nombran ambas líneas publicadas (`>=0.1.2-rc.1 <0.2.0 ||
35
- >=0.1.5-alpha.1 <0.2.0`), porque un rango cuyo único comparador de prerelease
39
+ Los rangos de peers nombran las cuatro líneas publicadas (`>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0`), porque un rango cuyo único comparador de prerelease
36
40
  está en una tupla anterior no admite un alpha posterior. Se refrescan por ola.
41
+ El rango declarado es deliberadamente más amplio que el verificado: documenta lo
42
+ que acepta el manifiesto, no lo que se ha probado.
43
+
44
+ **Esta versión es una adaptación rompiente.** El host de la generación `0.1.6`
45
+ eliminó la costura de *provider* de settings sobre la que se construyó este
46
+ plugin: el paquete `@deepseek-ai/dsh-settings-file` ya no existe,
47
+ `ctx.settings` es ahora `SettingsForms` (un proyector schema→formulario, sin
48
+ `register`), y `settings/updated` tampoco existe. Ninguna superficie compartida
49
+ permite que un plugin observe el documento de ajustes de otro, así que ninguna
50
+ versión de este plugin puede soportar ambos contratos a la vez. La configuración
51
+ fluye ahora por el mecanismo de configuración volátil del host; el **modo de
52
+ enrutado por sesión** —el ajuste que realmente cambia el comportamiento en
53
+ tiempo de ejecución— no cambia.
37
54
 
38
55
  El plugin vive solo en el plano host y no necesita un preset propio: la fila host
39
56
  se aplica a todas las sesiones. Una sección de prompt en *tu* preset es opcional
@@ -127,12 +144,12 @@ repositorio documenta las mismas claves en línea.
127
144
  | `tiers.strong.followSession` | `false` | `false` = el effort de este nivel anula el de la sesión. |
128
145
  | `tiers.strong.fallback` | `[]` | Aterrizajes provider/model ordenados si el nivel no está disponible. |
129
146
  | `tiers.cheap.provider` | `deepseek-official` | Provider del nivel de implementación. |
130
- | `tiers.cheap.model` | `deepseek-v4-flash` | Id de catálogo del modelo cheap. |
147
+ | `tiers.cheap.model` | `deepseek-flash` | Id de catálogo del modelo cheap. |
131
148
  | `tiers.cheap.effort` | `low` | Vocabulario del adaptador `off` \| `low` \| `high` \| `max`. |
132
149
  | `tiers.cheap.followSession` | `true` | `true` = hereda el effort de la sesión y gana la elección explícita. |
133
150
  | `tiers.cheap.fallback` | `[]` | Aterrizajes provider/model ordenados si el nivel no está disponible. |
134
151
  | `tiers.vision.provider` | `deepseek-official` | Provider para turnos con imágenes. |
135
- | `tiers.vision.model` | `deepseek-v4-flash-vision-exp` | El único modelo del catálogo con modalidad de imagen. |
152
+ | `tiers.vision.model` | `deepseek-flash` | El único modelo del catálogo con modalidad de imagen. |
136
153
  | `intent.ruleThreshold` | `0.7` | Confianza a partir de la cual la capa de reglas decide sola. |
137
154
  | `intent.attemptBand.enabled` | `false` | Empezar la banda media en cheap y escalar ante una señal. |
138
155
  | `intent.attemptBand.tauLow` | `0.45` | Límite inferior de la banda attempt-first. |
@@ -160,9 +177,19 @@ repositorio documenta las mismas claves en línea.
160
177
  | `escalation.signature` | `true` | Contar recurrencias de la misma firma en vez de cada fallo. |
161
178
  | `routingMode` | `auto` | `auto` \| `strong` \| `cheap` \| `delegated` \| `off`. |
162
179
 
163
- Todas las claves se pueden editar en caliente desde el namespace de settings
164
- `autotier` (`$DSH_HOME/settings.yaml`); una escritura que viole un requisito
165
- cruzado se rechaza al guardar y la última política válida sigue vigente.
180
+ Todas las claves también se pueden editar en caliente desde la tarjeta del
181
+ plugin en la página Plugins: el Host valida el valor nuevo contra el schema y lo
182
+ confirma con `loader/volatile-update`, y este plugin vuelve a juzgar toda la
183
+ configuración con el mismo juez de campos cruzados que usa al montar. Un valor
184
+ que viole un requisito cruzado (dos tiers aterrizando en la misma ruta, un par de
185
+ histéresis que no frena el parpadeo, una regla sin pattern ni tool) deja la
186
+ última política válida enrutando en lugar de instalar algo inenrutable.
187
+
188
+ `routingMode` es la única clave que **no** es en caliente: es el valor por
189
+ defecto de la composición, y el interruptor en tiempo de ejecución es la
190
+ anulación por sesión que escriben `/tier`, la píldora del compositor y el
191
+ selector de la tarjeta. Hacerla en caliente también daría a un mismo
192
+ comportamiento dos dueños.
166
193
 
167
194
  ## Herramientas y superficies
168
195
 
@@ -177,8 +204,10 @@ cruzado se rechaza al guardar y la última política válida sigue vigente.
177
204
 
178
205
  ## Permisos y datos
179
206
 
180
- - **Ficheros** — el plugin no lee ni escribe nada salvo a través del servicio
181
- compartido de settings (el namespace `autotier`).
207
+ - **Ficheros** — el plugin no lee ningún fichero ni escribe ninguno. La
208
+ configuración es del Host: un valor guardado en la página Plugins lo persiste
209
+ el Host en el parche del perfil activo, y este plugin solo lee la instantánea
210
+ viva que se le entrega.
182
211
  - **Red** — el único tráfico saliente es la llamada al juez, que pasa por la ruta
183
212
  normal de `ctx.llm` y el provider configurado.
184
213
  - **Registro de sesión** — el plugin no añade eventos de sesión propios. El rastro
@@ -229,7 +258,7 @@ cruzado se rechaza al guardar y la última política válida sigue vigente.
229
258
  ```bash
230
259
  pnpm install
231
260
  pnpm run typecheck # contra las caras de tipo del checkout local del harness
232
- pnpm run typecheck:ci # contra las caras publicadas 0.1.5-rc.1 (lo que ejecuta CI)
261
+ pnpm run typecheck:ci # contra las caras publicadas 0.1.7-alpha.1 (lo que ejecuta CI)
233
262
  pnpm test
234
263
  pnpm run build
235
264
  pnpm run verify:self-contained
@@ -256,3 +285,55 @@ PerryLink. Issues y pull requests en
256
285
 
257
286
  Apache-2.0. Véase [LICENSE](./LICENSE) y
258
287
  [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md).
288
+
289
+ ## PerryLink DSH Plugin Family
290
+
291
+ This project is one of the **45 DeepSeek Harness plugins** maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
292
+
293
+ | Plugin | One-liner |
294
+ |---|---|
295
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
296
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
297
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
298
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
299
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
300
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
301
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
302
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | |
303
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
304
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
305
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) | |
306
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
307
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
308
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
309
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics for DeepSeek Harness. | |
310
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
311
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
312
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
313
+ | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | Laya typed decisions (`noul`/`choice`/`score`) as a first-class Cordis service and model-visible tools | |
314
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
315
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
316
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
317
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
318
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
319
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | |
320
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
321
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
322
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
323
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
324
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
325
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
326
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
327
+ | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | One-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card | |
328
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
329
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | |
330
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
331
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
332
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
333
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
334
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
335
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
336
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
337
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
338
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools | |
339
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
@@ -4,10 +4,13 @@
4
4
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
5
5
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
6
6
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-autotier.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
7
+ [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-en.svg)](https://dsh.market/)
7
8
  [![Node](https://img.shields.io/badge/node-%5E22.19.0%20%7C%7C%20%3E%3D24.0.0-brightgreen.svg)](#)
8
9
  [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-autotier/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-autotier/actions)
9
10
  [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-autotier?label=version)](https://github.com/PerryLink/dsh-autotier/releases)
10
11
 
12
+ [English](README.md) | [简体中文](README-zh.md) | [Español](README-es.md) | [Português](README-pt.md) | **हिन्दी**
13
+
11
14
  DeepSeek Harness के लिए स्वचालित मॉडल-स्तर रूटिंग: एक उपयोगकर्ता निर्देश अंदर
12
15
  आता है, एक स्तर-निर्णय बाहर आता है — मॉडल हाथ से बदलने की ज़रूरत नहीं।
13
16
 
@@ -25,14 +28,25 @@ DeepSeek Harness के लिए स्वचालित मॉडल-स्
25
28
 
26
29
  | Harness | स्थिति |
27
30
  |---|---|
28
- | `@deepseek-ai/dsh` `0.1.2-rc.1` | संगत; compat वर्कफ़्लो इस लाइन को end-to-end इंस्टॉल करता है |
29
- | `@deepseek-ai/dsh` `0.1.5-rc.1` | संगत; end-to-end सत्यापित (वास्तविक profile, `--dump-config` पंक्ति, keyless smoke) और compat मैट्रिक्स में |
30
- | `@deepseek-ai/cordis` `^4.0.2`, `@deepseek-ai/schemastery` `^3.18.2` | peer आधार |
31
+ | `@deepseek-ai/dsh` `0.1.2-rc.1` | अब समर्थित नहीं; वह लाइन उस `SettingsForms` अनुबंध से पुरानी है जिस पर यह प्लगइन अब लक्ष्य करता है |
32
+ | `@deepseek-ai/dsh` `0.1.5-rc.2` | अब समर्थित नहीं; उसका `settings.register` / `settings/updated` अनुबंध upstream में हटा दिया गया |
33
+ | `@deepseek-ai/dsh` `0.1.6-alpha.2` | अब समर्थित नहीं; वही हटाव, `SettingsForms` वाली पहली लाइन |
34
+ | `@deepseek-ai/dsh` `0.1.7-alpha.1` | **आवश्यक**; मेल खाते checkout (`typecheck`) और प्रकाशित पैकेजों (`typecheck:ci`, 214 टेस्ट) दोनों पर सत्यापित |
35
+ | `@deepseek-ai/cordis` `^4.0.3`, `@deepseek-ai/cosmokit` `^1.8.4`, `@deepseek-ai/schemastery` `^3.18.3` | peer आधार |
31
36
 
32
- peer ranges दोनों प्रकाशित लाइनें स्पष्ट रूप से लिखती हैं (`>=0.1.2-rc.1 <0.2.0
33
- || >=0.1.5-alpha.1 <0.2.0`), क्योंकि जिस range का एकमात्र prerelease comparator
37
+ peer ranges चारों प्रकाशित लाइनें स्पष्ट रूप से लिखती हैं (`>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0`), क्योंकि जिस range का एकमात्र prerelease comparator
34
38
  पुराने tuple पर हो वह बाद के alpha को स्वीकार नहीं करता। हर प्रकाशन-लहर पर
35
- रिफ़्रेश होता है।
39
+ रिफ़्रेश होता है। घोषित range जानबूझकर सत्यापित range से व्यापक है: यह दर्ज करती
40
+ है कि manifest क्या स्वीकार करता है, यह नहीं कि क्या परखा गया।
41
+
42
+ **यह रिलीज़ एक breaking adaptation है।** `0.1.6` पीढ़ी के होस्ट ने वह settings
43
+ *provider* सीवन हटा दिया जिस पर यह प्लगइन बना था: `@deepseek-ai/dsh-settings-file`
44
+ पैकेज अब मौजूद नहीं है, `ctx.settings` अब `SettingsForms` है (schema→form
45
+ प्रोजेक्टर, जिसमें `register` नहीं है), और `settings/updated` भी नहीं है। कोई
46
+ साझा सतह ऐसी नहीं है जो एक प्लगइन को दूसरे प्लगइन का settings दस्तावेज़ देखने
47
+ दे, इसलिए इस प्लगइन का कोई संस्करण दोनों अनुबंध एक साथ सहन नहीं कर सकता।
48
+ कॉन्फ़िगरेशन अब होस्ट के volatile-config तंत्र से बहती है; **प्रति-सत्र रूटिंग
49
+ मोड** — वही सेटिंग जो रनटाइम पर व्यवहार बदलती है — अपरिवर्तित है।
36
50
 
37
51
  यह प्लगइन केवल host plane पर रहता है और अपना preset नहीं माँगता: host पंक्ति
38
52
  हर सत्र पर लागू होती है। *आपके* preset में एक प्रॉम्प्ट खंड वैकल्पिक है और
@@ -106,8 +120,9 @@ dsh plugin --profile web add .
106
120
  dsh plugin --profile web remove dsh-autotier
107
121
  ```
108
122
 
109
- पंक्ति, उसका settings namespace, उसका कमांड, उसके टूल और सभी listeners
110
- प्लगइन के साथ हट जाते हैं; settings दस्तावेज़ के बाहर कुछ नहीं लिखा जाता।
123
+ पंक्ति, उसका कमांड, उसके टूल और सभी listeners प्लगइन के साथ हट जाते हैं।
124
+ Plugins पेज से सहेजी गई कॉन्फ़िगरेशन सक्रिय profile patch में रहती है और उस
125
+ profile की है, इस प्लगइन की नहीं; पंक्ति हटाने पर वह वहीं अछूती रहती है।
111
126
 
112
127
  ## कॉन्फ़िगरेशन
113
128
 
@@ -123,12 +138,12 @@ dsh plugin --profile web remove dsh-autotier
123
138
  | `tiers.strong.followSession` | `false` | `false` = इस स्तर का effort सत्र के effort को ओवरराइड करता है। |
124
139
  | `tiers.strong.fallback` | `[]` | स्तर अनुपलब्ध होने पर क्रमबद्ध provider/model लैंडिंग। |
125
140
  | `tiers.cheap.provider` | `deepseek-official` | कार्यान्वयन स्तर का provider। |
126
- | `tiers.cheap.model` | `deepseek-v4-flash` | cheap मॉडल की कैटलॉग id। |
141
+ | `tiers.cheap.model` | `deepseek-flash` | cheap मॉडल की कैटलॉग id। |
127
142
  | `tiers.cheap.effort` | `low` | एडाप्टर शब्दावली `off` \| `low` \| `high` \| `max`। |
128
143
  | `tiers.cheap.followSession` | `true` | `true` = सत्र का effort विरासत में लें, जिससे स्पष्ट चयन जीते। |
129
144
  | `tiers.cheap.fallback` | `[]` | स्तर अनुपलब्ध होने पर क्रमबद्ध provider/model लैंडिंग। |
130
145
  | `tiers.vision.provider` | `deepseek-official` | चित्र वाले turn का provider। |
131
- | `tiers.vision.model` | `deepseek-v4-flash-vision-exp` | कैटलॉग का एकमात्र image-सक्षम मॉडल। |
146
+ | `tiers.vision.model` | `deepseek-flash` | कैटलॉग का एकमात्र image-सक्षम मॉडल। |
132
147
  | `intent.ruleThreshold` | `0.7` | जिस आत्मविश्वास से नियम-परत अकेले निर्णय लेती है। |
133
148
  | `intent.attemptBand.enabled` | `false` | मध्य पट्टी को cheap पर शुरू कर संकेत मिलने पर बढ़ाना। |
134
149
  | `intent.attemptBand.tauLow` | `0.45` | attempt-first पट्टी की निचली सीमा। |
@@ -156,9 +171,18 @@ dsh plugin --profile web remove dsh-autotier
156
171
  | `escalation.signature` | `true` | हर विफलता के बजाय समान हस्ताक्षर की पुनरावृत्ति गिनें। |
157
172
  | `routingMode` | `auto` | `auto` \| `strong` \| `cheap` \| `delegated` \| `off`। |
158
173
 
159
- सभी कुंजियाँ `autotier` settings namespace (`$DSH_HOME/settings.yaml`) से
160
- लाइव भी बदली जा सकती हैं; क्रॉस-फ़ील्ड शर्त तोड़ने वाला लेखन सहेजने के समय
161
- अस्वीकार हो जाता है और अंतिम वैध नीति लागू रहती है।
174
+ सभी कुंजियाँ Plugins पेज पर इस प्लगइन के कार्ड से लाइव भी बदली जा सकती हैं:
175
+ होस्ट नया मान schema के विरुद्ध जाँचता है और उसे `loader/volatile-update` से
176
+ कमिट करता है, फिर यह प्लगइन पूरी कॉन्फ़िगरेशन को उसी क्रॉस-फ़ील्ड जज से दोबारा
177
+ आँकता है जो माउंट के समय चलता है। क्रॉस-फ़ील्ड शर्त तोड़ने वाला मान (दो tiers
178
+ एक ही रूट पर, झूला रोक न पाने वाला hysteresis युग्म, बिना pattern और बिना tool
179
+ वाला नियम) अंतिम वैध नीति को चालू रहने देता है, बजाय किसी अनरूटेबल चीज़ को
180
+ लागू करने के।
181
+
182
+ `routingMode` अकेली ऐसी कुंजी है जो लाइव **नहीं** है: वह composition का
183
+ डिफ़ॉल्ट है, और रनटाइम स्विच वह प्रति-सत्र override है जो `/tier`, composer
184
+ pill और कार्ड का सेलेक्टर लिखते हैं। उसे भी लाइव बनाने से एक ही व्यवहार के दो
185
+ मालिक हो जाते।
162
186
 
163
187
  ## टूल और सतहें
164
188
 
@@ -225,7 +249,7 @@ dsh plugin --profile web remove dsh-autotier
225
249
  ```bash
226
250
  pnpm install
227
251
  pnpm run typecheck # स्थानीय harness checkout के type faces के विरुद्ध
228
- pnpm run typecheck:ci # प्रकाशित 0.1.5-rc.1 faces के विरुद्ध (CI यही चलाता है)
252
+ pnpm run typecheck:ci # प्रकाशित 0.1.7-alpha.1 faces के विरुद्ध (CI यही चलाता है)
229
253
  pnpm test
230
254
  pnpm run build
231
255
  pnpm run verify:self-contained
@@ -252,3 +276,58 @@ PerryLink. Issues और pull requests:
252
276
 
253
277
  Apache-2.0. देखें [LICENSE](./LICENSE) और
254
278
  [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md)।
279
+
280
+ **लागू DSH संस्करण:** `dsh-v0.1.7-alpha.1` (यह बिल्ड जिस होस्ट रिलीज़ को लक्षित करता है) पर सत्यापित; आवश्यक `>=0.1.7-alpha.1 <0.2.0`।
281
+
282
+ ## PerryLink DSH Plugin Family
283
+
284
+ This project is one of the **45 DeepSeek Harness plugins** maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
285
+
286
+ | Plugin | One-liner |
287
+ |---|---|
288
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
289
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
290
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
291
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
292
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
293
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
294
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
295
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | |
296
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
297
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
298
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) | |
299
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
300
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
301
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
302
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics for DeepSeek Harness. | |
303
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
304
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
305
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
306
+ | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | Laya typed decisions (`noul`/`choice`/`score`) as a first-class Cordis service and model-visible tools | |
307
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
308
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
309
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
310
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
311
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
312
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | |
313
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
314
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
315
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
316
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
317
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
318
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
319
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
320
+ | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | One-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card | |
321
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
322
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | |
323
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
324
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
325
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
326
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
327
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
328
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
329
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
330
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
331
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools | |
332
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
333
+