dsh-switchman 1.11.6 → 1.11.7
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.
- package/README.de.md +36 -31
- package/README.es.md +36 -31
- package/README.fr.md +36 -31
- package/README.it.md +36 -31
- package/README.ja.md +36 -31
- package/README.ko.md +36 -31
- package/README.md +37 -32
- package/README.pt.md +36 -31
- package/README.ru.md +36 -31
- package/README.zh-TW.md +36 -31
- package/README.zh.md +36 -31
- package/client.js +355 -26
- package/cordis.patch.yml +10 -10
- package/host/config.js +64 -33
- package/host/context-trim/index.js +539 -60
- package/host/context-trim/state.js +3 -2
- package/host/context-trim/surface.js +5 -1
- package/host/context-watch.js +12 -7
- package/host/intent.js +41 -4
- package/host/lang.js +4 -2
- package/host/ptc-bindings.js +510 -0
- package/host/ptc-guard.js +9 -1
- package/host/routes.js +110 -34
- package/host/teams.js +61 -15
- package/host/vision.js +24 -3
- package/index.js +5 -2
- package/package.json +1 -1
package/README.de.md
CHANGED
|
@@ -12,30 +12,27 @@
|
|
|
12
12
|
|
|
13
13
|
Wer lange mit DSH arbeitet, ärgert sich über zwei Dinge. Erstens werden Sessions mit der Zeit schwer: Die Historie bläht den Kontext auf Hunderttausende Token, das Modell vergisst, wird langsam und teuer, und ein manuelles /compact verliert Details. Zweitens erledigt das Hauptmodell alles selbst — Dateien nachschlagen, Tests laufen lassen, Daten abgleichen —, obwohl der Großteil dieser Arbeit auf ein billigeres Modell gehörte.
|
|
14
14
|
|
|
15
|
-
dsh-switchman ist ein Plugin für [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). Nach der Installation
|
|
15
|
+
dsh-switchman ist ein Plugin für [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). Nach der Installation bleibt das Hauptmodell selbst am Werk — nur eben klüger: es wählt seine Gefechte aus, delegiert Kleinkram in billige Spuren und lässt dringende oder schwere Arbeit per Intent-Routing beim passenden Modell landen, und wo es wirklich darauf ankommt, greift es selbst an; es schält Ballast ab und destilliert das Wesentliche — verdauten Gesprächsverlauf faltet es zu kompakten Zusammenfassungen, der Wasserstand überwacht jeden Ausgabenposten, und der Kontext bleibt leicht unterwegs; und wenn die Last zwei Hände übersteigt, holt es stehende Teamkollegen an Bord, die sich auf einem gemeinsamen Task-Board mit anpacken, während es sich auf Disposition und Abnahme zurückzieht. Es ist kein neues Modell, sondern ein Dispositionsregelwerk an DSH plus eine Einstellungsseite — und es tut neun Dinge:
|
|
16
16
|
|
|
17
|
-
**1. Kontext-
|
|
17
|
+
**1. Automatisches Kontext-Trimming: die Session wird länger, die Kosten bleiben flach.** Ein manuelles `/compact` wartet auf dich, verliert Details und durchschlägt den Prompt-Cache des Anbieters. Die Trim-Engine automatisiert das alles: verdaute Abschnitte der Unterhaltung werden an Leerlauf-Grenzen zu kompakten deterministischen Zusammenfassungen gefaltet (ein Side-Model schreibt sie; unter Notfalldruck wird mechanisch ohne Modellaufruf gefaltet), und jeder ausgehende Request wird fortan aus dem Fold-State neu gebaut — Zusammenfassungsblöcke vertreten die gefalteten Bereiche, der lebende Schwanz bleibt wortwörtlich stehen. Das gespeicherte Sitzungslog wird nie umgeschrieben, und der laufende Stream wird nie angetastet. Folds hängen nur an und der Neuaufbau ist deterministisch, daher bleibt der serialisierte Präfix zwischen Folds byteidentisch und der Anbieter-Cache trifft weiter; jeder interne Fehler fällt im Fail-Open zur transparenten Durchreichung zurück — nie ein kaputter Request. Drei vollautomatische Stufen (Wachstumsschranke / Druck / Notfall), plus ein Advisory-Modus, in dem das Modell selbst faltet — die Mechanik steht unten im Abschnitt „Automatisches Kontext-Trimming“.
|
|
18
18
|
|
|
19
|
-
**2.
|
|
19
|
+
**2. Kontext-Wasserstand: lange Sessions platzen nicht.** Jede Runde zählt die Session-Tokens in Echtzeit; drei Stufen schrauben sich hoch: 80k (soft, einstellbar) mahnt „zeit zu delegieren“; 100k (hard) strafft das Einzellese-Budget und lenkt auf den Abschluss; 200k (force) übergibt automatisch — das Übergabedokument wird geschrieben (das append-only Sitzungslog ist dabei die vollständige Sicherung), der Kontext komprimiert, die Session geweckt und läuft weiter, ohne dass die Aufgabe abreißt. Auch Hintergrund-Subagents, die im Moment der Übergabe noch laufen, gehen nicht verloren: id, Aufgabe und Report-Pfad landen im Übergabedokument; die fortgesetzte Session weiß, wo sie Reports abholt, und vergibt nichts doppelt; jeder Subagent trägt zusätzlich eine eigene harte Obergrenze und verlässt nach seinem HANDOFF-Summary die Bühne. Der Wasserstand liest den View nach dem Trimming — das, was das Modell wirklich sieht —, deshalb bleibt eine stark gefaltete Session nicht mehr auf den hohen Stufen hängen. Passt dir die Automatik nicht: `/ctx-pause` stoppt alle Aktionen (die Messung läuft weiter), `/ctx-resume` holt alles jederzeit zurück — nach einem Neustart kommt es auch von selbst wieder; `/ctx-handover` startet dieselbe Übergabe auf Zuruf, ohne auf die Obergrenze zu warten.
|
|
20
20
|
|
|
21
|
-
**3.
|
|
21
|
+
**3. Intent-Routing: die Nachricht kommt, das Modell rückt an seinen Platz.** „Auto (Intent-Routing)“ für die Session gewählt, stuft ein kleines Klassifikator-Modell jede Nutzernachricht ein und lässt sie beim am besten passenden Kandidaten landen — jeder Kandidat trägt eine einzeilige Fähigkeitsnotiz als Entscheidungshilfe. Der Entscheid gilt für die jeweilige Runde: Bei zu geringem Vertrauen oder noch offenem Cache-Fenster bleibt das aktuelle Modell in Verwendung (sein Prompt-Cache zahlt weiter); gewechselt wird erst, wenn das Vertrauen hoch genug ist oder das aktuelle Modell nicht unter den Kandidaten steht. Der Wechsel geschieht still auf der Aufrufebene — keine „Modell gewechselt“-Geräusche in der Session —, während ein Chip über dem Eingabefeld die aktuelle Route und das Vertrauen live zeigt. Entscheidungsmodelle wie allgemeine Chatmodelle taugen gleichermaßen als Klassifikator; Kandidaten, Schwellen und Cache-Fenster sind immer nur eine Einstellungsseite entfernt.
|
|
22
22
|
|
|
23
|
-
- **Agent-Teams**
|
|
24
|
-
- **Whitelist-Sync für Subagent-Modelle** — DSH führt eine Autorisierungs-Whitelist „Agenten dürfen Modelle für Subagents wählen“: in einem Pool gewählte, aber nicht autorisierte Routen werden bei namentlicher Vergabe abgelehnt (im Teams-Modus mit ⚠ markiert). Dieser Schalter schreibt die Vereinigung aller sechs Pools en bloc in ebendiese Whitelist — switchman ist die einzige Quelle der Wahrheit, doppelte Konfiguration entfällt. Die Whitelist gilt als Snapshot je neuer Session; der Sync wirkt nur auf danach gestartete Sessions.
|
|
23
|
+
**4. Agent Teams: vom Einzelkämpfer zum Team.** Standardmäßig aus — nach der Installation ist es schlanke Subagent-Vergabe; ein Team gibt es, wenn du eines willst. Zwei unabhängige Schalter auf der Einstellungsseite: **Agent-Teams** injiziert die Team-Doctrine (standardmäßig delegieren + gestufte Verifikation + Task-Board-Disziplin) und aktiviert DSHs Agent Teams automatisch — das Hauptmodell kann stehende Teamkollegen an Bord holen (`spawn_teammate`), Aufgaben aufs gemeinsame Task-Board legen (`team_task_*`) und Teamkollegen anschreiben. Wann ein Team gebildet wird, folgt klarer Disziplin: parallelisierbare unabhängige Teilaufgaben, voluminöse in sich geschlossene Arbeit, hoher Hauptkontext-Wasserstand, Bedarf an Rollentrennung; einmalige Einzelpunkt-Recherchen gehen weiterhin an einen Subagent. Ausgeschaltet verschwinden die Team-Klauseln spurlos, und Tools werden laufenden Sessions nie entzogen. **Subagent-Modell-Whitelist-Sync** schreibt die Union aller sechs Pools komplett in die Autorisierungs-Whitelist von DSH — switchman ist die alleinige Wahrheitsquelle, keine Doppelkonfiguration (wirksam als Snapshot je neuer Session).
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
**5. Sechs Dispatch-Pools: das richtige Modell für jede Arbeit.** Economy (Massen-Kleinkram), Mechanical (Schablonen-Umformung), Main (tägliche Codearbeit), Hard (schwere Schlussfolgerungen und große Refactorings), Vision (Bilder), Review (unabhängige Prüfung). Auf der Einstellungsseite kreuzt man Kandidaten an, ordnet Prioritäten, vergibt Noten S/A/B/C und nagelt je Route einen Reasoning-Aufwand fest — das Aufwand-Dropdown führt die Stufen, die das Modell tatsächlich beherrscht, nicht generische drei. Im Prompt jeder Runde steckt eine `[SWITCHMAN:POOLS]`-Empfehlungstabelle; nach der wird vergeben. Drei Enforcement-Modi: aus / Empfehlung / Erzwingen (Erzwingen = Modelle außerhalb der Pools werden glatt abgelehnt).
|
|
27
26
|
|
|
28
|
-
**
|
|
27
|
+
**6. Sprachpräferenzen: einmal fragen, für immer merken.** Je ein Dropdown für Antworten, Code-Kommentare und Dokumente; Geltungsbereich global oder je Projekt (`.switchman/lang.json`). Leer lassen geht auch — beim ersten Einsatz wird einmal in der Sprache deiner DSH-Oberfläche gefragt, danach hält sich jede Session daran.
|
|
29
28
|
|
|
30
|
-
**
|
|
29
|
+
**7. Oberflächensprache: das Plugin selbst spricht mit.** Oben auf der Einstellungsseite, im Bereich „Oberfläche“, sitzt das Dropdown „Oberflächensprache“ (Setting-Schlüssel `uiLocale`): Auto (folgt der Sprache der DeepSeek-Harness-App; Werkseinstellung: Vereinfachtes Chinesisch) oder jede eingebaute Oberflächensprache nach Wahl — die Optionen erscheinen stets als Eigenname der Sprache, unübersetzt. Umgeschaltet wird nur die Oberfläche des Plugins selbst (Abzeichen, Home-Panel, Einstellungsseite), nie die Sprache der DSH-App: die Auswahl ist sofortige Live-Vorschau ohne Neustart, wird nach dem Speichern gemerkt und beim nächsten Start wiederhergestellt, und jeder Fehler fällt auf die App-Sprache zurück; die Wörterbücher liegen vollständig im Plugin-Bundle, kein Download.
|
|
31
30
|
|
|
32
|
-
**
|
|
31
|
+
**8. Gestufte Verifikation: jede Änderung wird geprüft.** Änderungen über 20 Zeilen gehen an einen Tester; über 300 Zeilen oder an Kern- / Sicherheits- / Datenkonsistenz-Logik zusätzlich an einen unabhängigen Reviewer. Das Review-Modell wird am Modell des „Agents, der den Diff geschrieben hat“ verankert und möglichst vermieden; wenn der Pool es nicht hergibt, wird im Ergebnis DOWNGRADED deklariert. Ein „nutz kein Team“ genügt — sofort wieder Einzeltäter.
|
|
33
32
|
|
|
34
|
-
**
|
|
33
|
+
**9. `/vision`: reine Textmodelle kriegen trotzdem Bilder.** Kann das Hauptmodell keine Bilder lesen, lehnt DSH Bildnachrichten an der Tür ab. Bild einfügen, `/vision was ist an diesem Bild falsch` eintippen — das Bild geht an ein Modell aus dem Vision-Pool, das Urteil kommt in die laufende Session zurück. Über dem Eingabefeld steht vorab „das aktuelle Modell kann keine Bilder lesen“; wird der direkte Bildversand abgelehnt, wird die Nachricht automatisch als `/vision` umgeschrieben und erneut gesendet — kein manueller zweiter Versuch. Ohne konfigurierten Vision-Pool verweigert der Befehl und weist auf die Einstellungen.
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
Auch mit nur einem Modell lohnt sich die Installation — Wasserstandskontrolle und gestufte Verifikation hängen nicht von der Modellzahl ab; lange Single-Model-Sessions profitieren genauso.
|
|
35
|
+
Auch mit nur einem Modell lohnt sich die Installation — automatisches Trimming, Wasserstandskontrolle und gestufte Verifikation hängen nicht von der Modellzahl ab; lange Single-Model-Sessions profitieren genauso. Intent-Routing entfaltet seine Wirkung erst mit mehreren Modellkandidaten — lass es aus, bis du die Truppe erweiterst.
|
|
39
36
|
|
|
40
37
|
## Mitgelieferte Skills
|
|
41
38
|
|
|
@@ -75,7 +72,7 @@ Auch mit nur einem Modell lohnt sich die Installation — Wasserstandskontrolle
|
|
|
75
72
|
- **Dispatch-Pools** — sechs Karten in zwei Reihen zu drei: oben Economy / Mechanical / Main, unten Hard / Vision / Review. Kandidaten je Provider ankreuzen; ein Haken bei „manuelle Reihenfolge“ macht daraus eine nummerierte Prioritätsliste, sortiert mit ↑ ↓ ×; je Route lässt sich der Reasoning-Aufwand festnageln (Standard „wie Spur“). Die Zusammenfassungszeile oben aktualisiert live — im Screenshot: „4/6 Pools konfiguriert · 2 gerankt · Modus Empfehlung“.
|
|
76
73
|
- **Fähigkeits-Ranking + Enforcement-Modus** — die Vereinigung der gewählten Modelle über alle sechs Pools, nach Fähigkeit sortiert, das stärkste zuerst (im Screenshot glm-5.3 auf S und glm-5.3-flash auf A verankert), umsortier- und kürzbar; Enforcement-Modus Empfehlung / Erzwingen (Erzwingen = Modelle außerhalb der Pools werden glatt abgelehnt).
|
|
77
74
|
- **Agent-Teams** — die zwei Schalter für Team-Modus und Whitelist-Sync, beide standardmäßig aus; im Screenshot an, mit Sync-Statuszeile unter dem Schalter.
|
|
78
|
-
- **Kontext-Wasserstand** — die drei Schwellen (im Screenshot 80000 /
|
|
75
|
+
- **Kontext-Wasserstand** — die drei Schwellen (im Screenshot 80000 / 100000 / 200000), das Einzellese-Budget (3500), das Verhalten der Hard-Stufe (drosselnd durchlassen / blockieren), der Schalter für die Auto-Übergabe und die eigenen Obergrenzen der Subagents — alles in diesem Bereich. Unten die Befehlszeile: `/ctx-pause` Eingriffe pausieren · `/ctx-resume` fortsetzen · `/ctx-handover` Übergabedokument schreiben und sofort übergeben (die Session wird erst an eine Leerlauf-Grenze geführt und dann komprimiert — das Ergebnis kann ein paar Minuten dauern).
|
|
79
76
|
- **Intent-Routing** — der Hauptschalter, die Small-Model-Route des Klassifikators, der Klassifikatortyp (auto / decision / chat), die eigene Kandidatenliste (je Eintrag eine Zeile Fähigkeitsbeschreibung), Cache-Fenster / Vertrauensschwelle / Klassifikations-Timeout / Verlaufsbudget und ein optionales Fallback-Modell. Eingeschaltet erscheint in der Modellauswahl der lokalisierte Eintrag „Automatisch (Intent-Routing)“, und der Status-Chip über dem Eingabefeld zeigt Routing-Modell und Vertrauen.
|
|
80
77
|
|
|
81
78
|
4. **Prüfen** — in der Session-Kopfzeile erscheint das ⚡-Abzeichen „autonomes Team“ (daneben ◇ mit dem Modell der Session); oder das Modell einfach fragen: „Wie lautet die Überschrift des letzten Abschnitts deines System-Prompts?“ — die Antwort sollte das dsh-switchman-Regelwerk nennen.
|
|
@@ -92,19 +89,19 @@ bash <Installationsverzeichnis>/skills/db-query/scripts/setup.sh
|
|
|
92
89
|
|
|
93
90
|
Alles Folgende sind die vollständigen Werte direkt nach der Neuinstallation (maßgebliche Quelle: das zod-Schema in `host/config.js`).
|
|
94
91
|
|
|
95
|
-
**Oberfläche und Sprachen**: `uiLocale` = `auto`
|
|
92
|
+
**Oberfläche und Sprachen**: `uiLocale` = `zh` (Vereinfachtes Chinesisch; `auto` folgt der Sprache der DSH-App); `langScope` = `project`; `langConversation` = `zh-CN`; `langComments/Docs` = leer (Werkseinstellung; wenn geleert, in der ersten Session einmal gefragt, dann gemerkt; die Sprache von Kommentaren und Dokumenten folgt der Konversationssprache).
|
|
96
93
|
|
|
97
94
|
**Dispatch-Pools**: alle sechs Spuren (economy/mechanical/main/hard/vision/review) starten ohne Kandidaten (= die Standardmodelle des Systems, keine Einwirkung); manuelle Reihenfolge und gepinnter Aufwand sind aus/leer; `dispatchEnforce` = `advice` (nur Empfehlung, nichts wird erzwungen).
|
|
98
95
|
|
|
99
|
-
**Kontext-Wasserstand**: soft `80000` / hard `
|
|
96
|
+
**Kontext-Wasserstand**: soft `80000` / hard `100000` / force `200000` Token; Einzellese-Budget `3500`; Verhalten bei Budgetüberschreitung `cap` (kürzen mit Warnung); `wmAutoHandover` = an (bei force Übergabedokument schreiben + Komprimierung, automatisch); die harte Obergrenze für Subagents = an (gemeinsame 200k).
|
|
100
97
|
|
|
101
|
-
**Agent Teams**: `teamsMode` =
|
|
98
|
+
**Agent Teams**: `teamsMode` = an; `syncWhitelist` = an (die beiden Schalter sind unabhängig voneinander).
|
|
102
99
|
|
|
103
|
-
**Intent-Routing** (ab Werk unbrauchbar; nötig sind Klassifikator + mindestens ein Kandidat + der Hauptschalter): `intentEnabled` = aus (ist er aus, bleibt der Auto-Eintrag verborgen, und Sessions, die bereits Auto gewählt hatten, laufen über die Fallback-Kette); Klassifikator-Route nicht gesetzt; Klassifikatortyp `chat`; Kandidatenliste leer (die mitgelieferten Kategorien nehmen erst mit eingetragenem Modell am Routing teil); Cache-Fenster `300` s / Umschalt-Vertrauensschwelle `80` / Klassifikations-Timeout `60000` ms; Verlauf `6` Nachrichten / `2400` Zeichen; `intentContextWindow` = `
|
|
100
|
+
**Intent-Routing** (ab Werk unbrauchbar; nötig sind Klassifikator + mindestens ein Kandidat + der Hauptschalter): `intentEnabled` = aus (ist er aus, bleibt der Auto-Eintrag verborgen, und Sessions, die bereits Auto gewählt hatten, laufen über die Fallback-Kette); Klassifikator-Route nicht gesetzt; Klassifikatortyp `chat`; Kandidatenliste leer (die mitgelieferten Kategorien nehmen erst mit eingetragenem Modell am Routing teil); Cache-Fenster `300` s / Umschalt-Vertrauensschwelle `80` / Klassifikations-Timeout `60000` ms; Verlauf `6` Nachrichten / `2400` Zeichen; `intentContextWindow` = `250000`.
|
|
104
101
|
|
|
105
|
-
**Kontext-Trimming**: `trimEnabled` = an; `trimMode` = `auto`
|
|
102
|
+
**Kontext-Trimming**: `trimEnabled` = an; `trimMode` = `advisory` (Hinweise + Fold-Werkzeuge; das Session-Modell faltet selbst — für vollautomatische Folds `auto` setzen); Wachstumsschwelle `22500` + Zuwachs `45000` Tokens; Druck `45%` / Notfall `90%`; Advisory-Hinweis `50%` / `80%`; geschütztes Ende `6` Nachrichten; Fold-Takt-Obergrenze `30` pro Stunde; Nebenmodell nicht gesetzt (erbt das Session-Modell) — Details im Abschnitt „Automatisches Kontext-Trimming“ unten.
|
|
106
103
|
|
|
107
|
-
**Out-of-the-Box-Anmerkungen**: ① dass Intent-Routing ab Werk unbrauchbar ist, ist Absicht — drei Schritte zum Einschalten (Klassifikator, Kandidaten, Schalter); ② das wirksame Auto-Fenster steht ab Werk auf
|
|
104
|
+
**Out-of-the-Box-Anmerkungen**: ① dass Intent-Routing ab Werk unbrauchbar ist, ist Absicht — drei Schritte zum Einschalten (Klassifikator, Kandidaten, Schalter); ② das wirksame Auto-Fenster steht ab Werk auf 250000 — die Leitplanke garantiert 0.8×Fenster ≥ force (200000), die Kern-Komprimierlinie (200000) liegt also genau auf der Linie der weichen Übergabe (200000); ③ am spürbarsten ab Werk ist das Wasserstands-Trio: 80k mahnt zur Delegation / 100k strafft das Lesen / 200k übergibt automatisch (Dokument schreiben + Komprimierung) — ganz ohne Einstellungen.
|
|
108
105
|
|
|
109
106
|
## Automatisches Kontext-Trimming
|
|
110
107
|
|
|
@@ -113,23 +110,25 @@ Lange Sessions bleiben günstig: verarbeitete Gesprächsbereiche werden zu kompa
|
|
|
113
110
|
Automatisierungsstufen (`trimMode`):
|
|
114
111
|
|
|
115
112
|
- **`off`** — nur messen: Usage- und Cache-Hit-Sampling läuft weiter; kein Banner, keine Folds.
|
|
116
|
-
- **`advisory`** — das Session-Modell faltet selbst: die Tools `ctx_trim_fold` und `ctx_trim_status` plus der Protokollkopf werden dafür freigegeben. Erreicht der Sitzungsdruck `trimAdvisoryPercent` des effektiven Fensters, hängt die Engine einen einmaligen, angehefteten Fold-Hinweis als `user/message`-Suffix an das Ende der Live-Session-Surface an (nicht an den Systemkopf des Dispatchs) — bei Eskalation auf critical sofort erneut, unterhalb der Linie wird er entfernt.
|
|
117
|
-
- **`auto`**
|
|
113
|
+
- **`advisory`** (Standard) — das Session-Modell faltet selbst: die Tools `ctx_trim_fold` und `ctx_trim_status` plus der Protokollkopf werden dafür freigegeben. Erreicht der Sitzungsdruck `trimAdvisoryPercent` des effektiven Fensters, hängt die Engine einen einmaligen, angehefteten Fold-Hinweis als `user/message`-Suffix an das Ende der Live-Session-Surface an (nicht an den Systemkopf des Dispatchs) — bei Eskalation auf critical sofort erneut, unterhalb der Linie wird er entfernt. An der kritischen Linie führt die Engine selbst einen mechanischen Rettungs-Fold aus (90 s Abklingzeit, `trimCriticalRelief` = an).
|
|
114
|
+
- **`auto`** — alles darüber hinaus plus automatische Folds an der Leerlauf-Grenze, in drei Stufen: eine Wachstumsschwelle (Zuwachs > `trimGrowthTokens`, gemessen ab dem Tiefpunkt nach dem letzten Fold — der Anker, der die Schwelle nach Folds auf hohem View-Stand scharf hält — UND ein zusammenhängender komprimierbarer Zuwachs ≥ `trimIncrementTokens`), eine Druckstufe (`trimPressurePercent` des Kontextfensters) und eine Notfallstufe (`trimEmergencyPercent` — ein mechanischer Fold mit eigener Abklingzeit).
|
|
118
115
|
|
|
119
116
|
Alle Schlüssel liegen unter Einstellungen → dsh-switchman; Defaults aus `host/config.js`:
|
|
120
117
|
|
|
121
118
|
| Schlüssel | Standard | Bedeutung |
|
|
122
119
|
| --- | --- | --- |
|
|
123
120
|
| `trimEnabled` | `true` | Hauptschalter. AUS deaktiviert Folds und Metriken komplett (der Listener wird zum reinen Durchreichen). |
|
|
124
|
-
| `trimMode` | `
|
|
121
|
+
| `trimMode` | `advisory` | `off` nur messen / `advisory` modellgetriebene Folds / `auto` systemgetriebene Folds. |
|
|
125
122
|
| `trimGrowthTokens` | `22500` | Wachstumsschwelle: falte, wenn die ausgehende View seit dem letzten Fold so viel gewachsen ist. |
|
|
126
|
-
| `trimIncrementTokens` | `
|
|
127
|
-
| `trimPressurePercent` | `
|
|
128
|
-
| `trimEmergencyPercent` | `
|
|
129
|
-
| `trimAdvisoryPercent` | `
|
|
130
|
-
| `trimAdvisoryCriticalPercent` | `
|
|
123
|
+
| `trimIncrementTokens` | `45000` | Schwellen-Begleiter: der zusammenhängende komprimierbare Zuwachs muss ebenfalls diese Größe erreichen. |
|
|
124
|
+
| `trimPressurePercent` | `45` | Druckstufe: falte, wenn die View-Nutzung diesen Prozentsatz des Kontextfensters erreicht. |
|
|
125
|
+
| `trimEmergencyPercent` | `90` | Notfallstufe: erzwungener mechanischer Fold (kein Nebenmodell-Aufruf) bei diesem Prozentsatz. |
|
|
126
|
+
| `trimAdvisoryPercent` | `50` | Advisory-Hinweislinie: bei diesem Prozent des effektiven Fensters erinnert die Engine das Modell, sofort mit `ctx_trim_fold` zu falten (nur advisory-Modus). |
|
|
127
|
+
| `trimAdvisoryCriticalPercent` | `80` | Critical-Hinweislinie: bei Erreichen sofort erneuter Hinweis, umgeht das 10-Minuten-Throttling derselben Stufe. |
|
|
131
128
|
| `trimWindowTokens` | `0` | Effektives Fensterlimit für die Stufenberechnung: gerechnet gegen min(Modellfenster, Limit). `0` = folgt `wmForceTokens`. |
|
|
132
|
-
| `
|
|
129
|
+
| `trimCriticalRelief` | `true` | Advisory-Critical-Relief: an der Critical-Linie führt die Engine selbst eine mechanische (Emergency-artige) Faltung aus, 90 s Cooldown. |
|
|
130
|
+
| — | — | Trim-Prozente sind mit dem Kontextmesser am Eingabefeld nicht direkt vergleichbar: trim teilt den zuletzt bezahlten Prompt (max aus view/wire) durch das effektive Fenster (inkl. Limit), das Messgerät zeigt die projizierte nächste Prompt über das volle Modellfenster. |
|
|
131
|
+
| `trimProtectedTail` | `6` | Die letzten N Nachrichten werden nie gefaltet. |
|
|
133
132
|
| `trimMaxFoldsPerHour` | `30` | Fold-Takt-Obergrenze pro rollierender Stunde für Nebenmodell-Folds (Notfall-Folds ausgenommen). |
|
|
134
133
|
| `trimSideModel` | nicht gesetzt | Route des Zusammenfassungs-Nebenmodells. Leer = Provider/Modell der Session folgen, aber den Effort des Aufrufs nicht übernehmen; auch Ladder-Distillationen nutzen diese Route. Der Effort für Zusammenfassungen lässt sich separat festlegen; ohne Pin wird anhand der Modellmetadaten die niedrigste aktivierte Reasoning-Stufe gewählt, bei Modellen mit nur Ein/Aus off. Wird Reasoning nicht unterstützt oder sind keine Metadaten verfügbar, wird kein Effort gesendet und das Modell-/Adapter-Standardverhalten bleibt maßgeblich. |
|
|
135
134
|
| `trimFoldFallbackModel` | nicht gesetzt | Route, mit der der Fold den Zusammenfassungs-Versuch wiederholt; scheitert auch sie, degradiert ein Pressure-Fold zu mechanischem Folding. Leer = kein Fallback. Das Effort des manuell gewählten Fold-Fallback-Modells ist unabhängig; ohne Pin gilt dieselbe Metadaten-Empfehlung wie beim Zusammenfassungsmodell, ohne Metadaten der Modellstandard. Route mit Spielraum bei Cooldowns, Risikokontrolle und Concurrency wählen. |
|
|
@@ -138,7 +137,7 @@ Alle Schlüssel liegen unter Einstellungen → dsh-switchman; Defaults aus `host
|
|
|
138
137
|
|
|
139
138
|
**Trigger-Pfade.** Stufenprüfungen laufen an der Leerlauf-Grenze und — als Fallback für Hosts, auf denen Leerlauf-Status-Ereignisse nicht erreichbar sind — nach jedem Modell-Stream-Abschluss (auf eine Auswertung pro 60 s und Session gedrosselt). Jede Entscheidung — Folds wie No-ops gleichermaßen — wird als eine zeitgestempelte `key=value`-Zeile an `decisions.log` im Fold-Zustandsverzeichnis (siehe `trimStateDir`) angehängt und gibt Folds so eine Offline-Prüfspur; das Zeilenvokabular (`view-applied`, Fold-Entscheidungs-/Ergebniszeilen, `surface-replace`, `surface-replace skipped reason=…`) ist in [docs/context-trim.md](./docs/context-trim.md) katalogisiert.
|
|
140
139
|
|
|
141
|
-
**Leitungs-Wahrheit und stabiler Zustand.** Entscheidungszeilen tragen `view=<n>` und, sobald eine Antwort eingetroffen ist, `wire=<n>` — den echten Anbieter-Prompt (ungecachter Input + Cache-Read + Cache-Write, entnommen aus dem Usage-Event des Streams). Die View-Schätzung zählt nur das Messages-Array und liest immer um den festen Overhead kleiner als die Leitung (gemessen ≈ 17.3k: System-Prompt + Tool-Schemas + Persona); Druck- und Notfallstufe werten daher auf `max(view, wire)` aus, und nur `wire` ist eine Prompt-Größenmessung. In einem
|
|
140
|
+
**Leitungs-Wahrheit und stabiler Zustand.** Entscheidungszeilen tragen `view=<n>` und, sobald eine Antwort eingetroffen ist, `wire=<n>` — den echten Anbieter-Prompt (ungecachter Input + Cache-Read + Cache-Write, entnommen aus dem Usage-Event des Streams). Die View-Schätzung zählt nur das Messages-Array und liest immer um den festen Overhead kleiner als die Leitung (gemessen ≈ 17.3k: System-Prompt + Tool-Schemas + Persona); Druck- und Notfallstufe werten daher auf `max(view, wire)` aus, und nur `wire` ist eine Prompt-Größenmessung. In einem 200k-Fenster läuft der gesunde Sägezahn direkt nach einem Fold auf Leitung ≈ 40k ↔ 64–90k beim nächsten (≈20%–45% des Fensters), ein Fold pro ~45k Rohwachstum, wobei die Obergrenze eher von der Druckstufe als vom Fenster nahe 90k festgehalten wird. Steigt `view`, ohne dass je eine `surface-replace`-Zeile erscheint, lies die Skip-Zeilen (`incomplete-seqs`, `no-service`, `compaction-lock`).
|
|
142
141
|
|
|
143
142
|
**Host-Kompaktions-Epochen.** Fold-Verweise sind an Nachrichten-IDs und Inhalts-Hashes verankert; ersetzt der Host selbst den erneut gesendeten Verlauf, veralten sämtliche Blöcke auf einmal: keiner findet mehr seine Position, die View fällt still auf den Rohverlauf zurück (fail-open — das Entscheidungsprotokoll vermerkt `view-applied applied=0`), und das Plugin verankert seine Wachstumsbaseline bei der nächsten Anfrage auf der Sicht nach der Kompaktion. Die Host-Kompaktion ist damit die Backstop-Trimschicht; die Plugin-Folds leisten die feingranulare Arbeit innerhalb einer Host-Epoche. Manche Dispatches übergeben vollständig eingefrorene Anfrage-Arrays oder Optionsobjekte (die aktuelle Agent-Loop friert die zusammengesetzten Anfragen tief ein); für sie meldet `injectView` das Ergebnis im Entscheidungsprotokoll: `nothing-to-apply` (keine lokalisierbaren Fold-Blöcke — der Rohverlauf IST die View), `in-place`/`swapped` (der Fold-View wurde ausgeliefert) oder `none` (ein Fold existierte, aber der eingefrorene Dispatch konnte ihn nicht tragen — auf die Leitung geht der Rohverlauf). **Surface Replace ist der Auslieferungsweg, wann immer er verfügbar ist** (`surfaceFold`, standardmäßig an): an der seriellen `agent/turn-stopping`-Grenze plus einem Idle-Sweep hängt das Plugin das host-typische Shadow-Price-Messereignis und EIN `user/message`-Ersatzereignis an, das `surfaceOp {op:'replace', startSeq, endSeq}` trägt und mit `sourceEventSeqs` jeden überdeckten Oberflächen-Knoten abdeckt — derselbe Mechanismus, den die Host-Kompaktion selbst nutzt —, sodass ein committeter Fold aus der Quellschicht auf die Leitung gelangt, eingefrorene Dispatches eingeschlossen. Solange die letzten Dispatches einer Session `none` vermerken, behandelt das Plugin die View als reines Messobjekt: Der Wasserstand liest stattdessen die vom Anbieter gemeldete Zählung (force-Stufe und Auto-Übergabe arbeiten weiter), Fold-Zyklen pausieren, statt Summarizer-Aufrufe zu verbrennen, und das Trim-Banner markiert die Zeile mit `wire=raw` (folds not shipping; watermark reads the tally); Hosts ohne den Surface-Mechanismus (oder mit ausgeschaltetem Flag) behalten genau dieses alte Verhalten.
|
|
144
143
|
|
|
@@ -163,6 +162,12 @@ Alle Schlüssel liegen unter Einstellungen → dsh-switchman; Defaults aus `host
|
|
|
163
162
|
- Die Protokollzeilen (`[SWITCHMAN:LANG|POOLS|WATERMARK|TEAMS]`) sind bewusst englisch und byte-stabil — nicht lokalisieren.
|
|
164
163
|
- `npm pack --dry-run` muss die auditierte Form mit 60 Dateien / ~380 kB behalten (~1,26 MB entpackt; `docs/` ist ausgeschlossen).
|
|
165
164
|
|
|
165
|
+
## Downloads
|
|
166
|
+
|
|
167
|
+
Alle npm-Downloads seit der ersten Veröffentlichung, kumuliert — gezeichnet aus der offiziellen [npm-Downloads-API](https://api.npmjs.org/) und täglich von GitHub Actions aktualisiert ([Diagrammskript](scripts/downloads-chart.mjs)):
|
|
168
|
+
|
|
169
|
+

|
|
170
|
+
|
|
166
171
|
## License
|
|
167
172
|
|
|
168
173
|
MIT
|
package/README.es.md
CHANGED
|
@@ -12,30 +12,27 @@
|
|
|
12
12
|
|
|
13
13
|
Trabajando con DSH, tarde o temprano te topas con dos cosas: la sesión pesa cada vez más — el historial hincha el contexto hasta cientos de miles de tokens, el modelo empieza a olvidar, a ir lento y a encarecerse, y el /compact manual de por medio pierde detalles en cada compresión; y el modelo principal lo hace todo él solo — leer un archivo, lanzar un test, cotejar datos: todo lo mastica él, cuando la mayor parte de ese trabajo correspondería a un modelo barato.
|
|
14
14
|
|
|
15
|
-
dsh-switchman es un plugin para [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). Una vez instalado, el modelo principal
|
|
15
|
+
dsh-switchman es un plugin para [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). Una vez instalado, el modelo principal sigue trabajando él mismo — solo que con más criterio: elige sus batallas, manda las tareas menores a carriles baratos y deja que el enrutado por intención aterrice lo urgente o lo difícil en el modelo correcto, reservándose para sí lo que de verdad merece hacerse en persona; desecha lo hinchado y destila lo esencial — la conversación ya digerida se pliega en resúmenes compactos mientras el nivel de agua mide cada gasto, y el contexto viaja siempre ligero de equipaje; y cuando la carga supera a un solo par de manos, incorpora compañeros de equipo permanentes que se reparten el trabajo en un tablero compartido mientras él se reserva el despacho y la aceptación. No es un modelo nuevo: es un reglamento de despacho enganchado a DSH, más una página de configuración. En concreto hace nueve cosas:
|
|
16
16
|
|
|
17
|
-
**1.
|
|
17
|
+
**1. Recorte automático del contexto: la sesión se alarga, el coste se queda plano.** Un `/compact` manual te hace esperar, pierde detalle y atraviesa la caché de prompt del proveedor. El motor de recorte automatiza todo eso: los tramos ya digeridos de la conversación se pliegan en resúmenes deterministas y compactos en las fronteras de inactividad (los escribe un side model; bajo presión de emergencia el plegado es mecánico, sin llamada a modelo), y cada petición saliente se reconstruye a partir del estado de pliegue desde entonces — los bloques de resumen sustituyen a los tramos plegados, y la cola viva se conserva literal. El registro de sesión almacenado nunca se reescribe, y nada toca el flujo en pleno streaming. Los pliegues solo añaden y la reconstrucción es determinista: el prefijo serializado queda idéntico byte a byte entre pliegues y la caché del proveedor sigue acertando; cualquier fallo interno cae en fail-open hacia el paso transparente — nunca una petición rota. Tres niveles completamente automáticos (compuerta de crecimiento / presión / emergencia), más un modo advisory en el que el modelo pliega por su cuenta — la mecánica, más abajo, en «Recorte automático del contexto».
|
|
18
18
|
|
|
19
|
-
**2.
|
|
19
|
+
**2. Nivel de agua del contexto: la sesión larga no se desborda.** Cada turno contabiliza los tokens de la sesión en vivo, y tres líneas de nivel aprietan por etapas: 80k (soft, ajustable) avisa «toca delegar»; 100k (hard) recorta el presupuesto de lectura por llamada y empuja al cierre; 200k (force) lanza la entrega automática — escribe el documento de entrega (el registro de sesión de solo añadido es la copia completa), compacta el contexto y despierta la sesión para continuar, sin que el trabajo se corte. Los subagentes en segundo plano que sigan corriendo en el momento de la entrega tampoco se pierden: id, descripción de la tarea y ruta del informe quedan escritos en el documento de entrega, y la sesión que continúa sabe dónde recoger los informes en vez de volver a despachar el trabajo; cada subagente despachado lleva además su propio techo duro independiente: al alcanzarlo, termina con un resumen HANDOFF. El nivel lee la vista tras el recorte — lo que el modelo ve de verdad —, así que una sesión muy plegada ya no queda clavada en las líneas altas. Si la automatización no te encaja: `/ctx-pause` detiene todas las acciones (la medición sigue corriendo), `/ctx-resume` lo devuelve en cualquier momento — y tras reiniciar también vuelve solo; `/ctx-handover` lanza esa misma entrega a demanda, sin esperar al techo.
|
|
20
20
|
|
|
21
|
-
**3.
|
|
21
|
+
**3. Enrutado por intención: entra el mensaje, el modelo toma su puesto.** Eliges «Automático (enrutado por intención)» para la sesión y cada mensaje del usuario pasa primero por un clasificador pequeño que lo tipifica y lo deja en el mejor candidato — cada candidato lleva una nota de capacidades de una línea que orienta la elección. La decisión queda fijada por turno: si la confianza no llega o la ventana de caché sigue abierta, se mantiene el modelo actual (su caché de prompt sigue rindiendo); solo se cambia cuando la confianza sobra o el modelo actual no está entre los candidatos. El cambio ocurre en silencio en la capa de llamada — nada de ruido de «modelo cambiado» en la sesión — mientras un chip sobre el cuadro de entrada muestra la ruta y la confianza en vivo. Como clasificador valen tanto los modelos de decisión pequeños como los modelos de chat genéricos; candidatos, umbrales y ventana de caché están siempre a una página de ajustes.
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
- **Sincronizar la lista blanca de modelos de subagentes** — DSH tiene una lista blanca de autorización «permitir que los agentes elijan modelos para subagentes»: una ruta elegida en un pool pero no autorizada hace que el despacho explícito del modelo principal sea rechazado (en modo equipo, se marca con ⚠). Al encender este interruptor, la unión de los seis pools se escribe entera en esa lista blanca — switchman es la única fuente de verdad, sin configurar dos veces. La lista blanca entra en vigor según la instantánea de «nueva sesión»: la sincronización solo afecta a las sesiones abiertas a partir de entonces.
|
|
23
|
+
**4. Agent Teams: de ir por libre a llevar un equipo.** Desactivado por defecto: recién instalado solo hay despacho ligero por subagent; el equipo llega cuando lo quieres. Dos interruptores independientes en la página de ajustes: **Agent Teams** inyecta la doctrina de equipo (delegar por defecto + verificación por niveles + disciplina de tablero compartido) y activa el Agent Teams de DSH automáticamente — el modelo principal puede incorporar compañeros permanentes (`spawn_teammate`), poner trabajo en el tablero compartido (`team_task_*`) y escribirse con ellos. Cuándo formar equipo sigue una disciplina clara: subtareas independientes paralelizables, trabajo voluminoso y autocontenido, nivel de agua alto del contexto principal, necesidad de separar roles; la investigación puntual de un solo asunto sigue yendo a un subagent. Apagado, las cláusulas de equipo desaparecen sin rastro, y nunca se retiran herramientas a sesiones en marcha. **Sincronización de la whitelist de modelos de subagentes** escribe la unión de los seis pools, en bloque, en la whitelist de autorización de DSH — switchman es la única fuente de verdad, sin configurar dos veces (efectiva como instantánea por sesión nueva).
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
**5. Seis pools de despacho: a cada trabajo, su modelo.** Pool ligero (economy, tareas pequeñas en lote), mecánico (mechanical, reescrituras con plantilla), principal (main, código del día a día), de alta dificultad (hard, razonamiento difícil y refactorizaciones a gran escala), multimodal (vision, leer imágenes) y de revisión (review, verificación independiente). En la página de ajustes marcas candidatos, ordenas prioridades (con anclaje opcional a las categorías S/A/B/C) y fijas un effort de razonamiento por ruta — el desplegable de categorías sale de los niveles que ese modelo soporta de verdad, no de tres genéricos. Cada turno, el prompt del modelo principal lleva consigo una tabla de recomendaciones `[SWITCHMAN:POOLS]`, y el trabajo se despacha siguiéndola. El modo de ejecución tiene tres estados: off / advice / enforce (enforce = los modelos fuera del pool se rechazan sin más).
|
|
27
26
|
|
|
28
|
-
**
|
|
27
|
+
**6. Preferencias de idioma: pregunta una vez, lo recuerda para siempre.** Un desplegable para cada una de las tres: respuestas, comentarios de código y documentos; el ámbito puede ser global o por proyecto (`.switchman/lang.json`). No hace falta configurarlo: la primera vez que se necesite pregunta una sola vez, en el idioma de la interfaz de tu DSH, y una vez recordado, cada sesión lo respeta automáticamente.
|
|
29
28
|
|
|
30
|
-
**
|
|
29
|
+
**7. Idioma de la interfaz: el plugin también habla tu idioma.** En lo más alto de la página de ajustes aparece una nueva sección «Interfaz» con un desplegable «Idioma de la interfaz» (clave de ajuste `uiLocale`): Auto (sigue el idioma de la app de DeepSeek Harness; valor de fábrica: chino simplificado) o cualquier idioma en el que venga la interfaz del plugin, siempre con su endónimo, sin traducir. Solo cambia la interfaz del propio plugin — la insignia de la cabecera, el panel de inicio y la página de ajustes —, no el idioma de la app de DSH: la vista previa es inmediata y sin reinicio; al guardar, la elección se recuerda; el siguiente arranque la restaura; cualquier fallo vuelve al idioma de la app; y todos los diccionarios viajan dentro del bundle, sin descargas.
|
|
31
30
|
|
|
32
|
-
**
|
|
31
|
+
**8. Verificación por niveles: cambiado, comprobado.** Los cambios de más de 20 líneas pasan a verificación de un tester; los de más de 300 líneas, o que toquen lógica central / de seguridad / de consistencia de datos, pasan además a una revisión independiente de un reviewer. El modelo del reviewer se elige anclado al modelo del agente que escribió ese diff, esquivándolo cuando se puede; si en el pool no hay forma de esquivarlo, en la conclusión se declara DOWNGRADED. Dices «no uses equipos» y al instante vuelve al trabajo en solitario.
|
|
33
32
|
|
|
34
|
-
**
|
|
33
|
+
**9. `/vision`: hasta un modelo de solo texto puede con las imágenes.** Cuando el modelo principal no sabe leer imágenes, DSH rechaza en la puerta de entrada los mensajes con imágenes. Adjunta la imagen y escribe `/vision ¿qué está mal en esta imagen?` — la imagen se entrega a un modelo del pool multimodal para leerla, y la conclusión vuelve a la sesión actual. Sobre el cuadro de entrada aparece por adelantado el aviso «el modelo actual no sabe leer imágenes»; si un envío directo de imagen es rechazado, se reescribe una vez de forma automática a `/vision` y se reenvía, sin rehacer nada a mano; con el pool multimodal sin configurar, el comando se niega y da indicaciones de configuración.
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
¿Solo tienes un modelo? Sigue mereciendo la instalación — el control del nivel de agua y la verificación por niveles no dependen de cuántos modelos tengas, y una sesión larga con un solo modelo se beneficia igual.
|
|
35
|
+
¿Solo tienes un modelo? Sigue mereciendo la instalación — el recorte automático, el control del nivel y la verificación por niveles no dependen de cuántos modelos tengas, y una sesión larga con un solo modelo se beneficia igual. El enrutado por intención solo tiene sentido con varios candidatos de modelo; déjalo apagado hasta que amplíes la plantilla.
|
|
39
36
|
|
|
40
37
|
## Skills incluidas
|
|
41
38
|
|
|
@@ -75,7 +72,7 @@ La cabecera de la sesión da un feedback visual claro: la insignia ⚡ «equipo
|
|
|
75
72
|
- **Pools de despacho** — seis tarjetas en dos filas de tres: arriba ligero / mecánico / principal; abajo alta dificultad / multimodal / revisión. Cada tarjeta agrupa los modelos candidatos por proveedor; marca «orden manual» y se convierte en una lista de prioridades numerada que se reordena con ↑ ↓ ×; junto a cada ruta puedes fijar el effort de razonamiento (por defecto «seguir el carril»). La línea de resumen superior se actualiza en vivo; en la captura: «pools configurados: 4/6 · posiciones en el ranking: 2 · modo advice».
|
|
76
73
|
- **Orden por capacidad + modo de ejecución** — la unión de los modelos elegidos en los seis pools, ordenada por capacidad y con los más fuertes delante (en la captura glm-5.3 anclado en S y glm-5.3-flash anclado en A); se puede reordenar y recortar; el modo de ejecución va de advice / enforce (enforce = los modelos fuera del pool se rechazan sin más).
|
|
77
74
|
- **Equipo de agentes** — los dos interruptores, modo de equipo y sincronización de la lista blanca, vienen apagados; en la captura están encendidos, y debajo de cada uno hay una línea de estado de sincronización.
|
|
78
|
-
- **Nivel de agua del contexto** — los tres umbrales (en la captura 80000 /
|
|
75
|
+
- **Nivel de agua del contexto** — los tres umbrales (en la captura 80000 / 100000 / 200000), el presupuesto de lectura por llamada (3500), el comportamiento del umbral duro (dejar pasar limitando / bloquear), el interruptor de entrega automática y el techo independiente para subagentes: todo en esta zona. Abajo, una línea de comandos: `/ctx-pause` pausa la intervención · `/ctx-resume` la reanuda · `/ctx-handover` escribe el documento y entrega ahora mismo (conduce la sesión a la frontera de inactividad antes de compactar; el resultado puede tardar unos minutos).
|
|
79
76
|
- **Enrutado por intención** — el interruptor maestro, la ruta de modelo pequeño del clasificador, el tipo de clasificador (auto / decision / chat), la lista de candidatos independiente (cada uno con su nota de capacidades), la ventana de caché / umbral de confianza / timeout / presupuesto de historial y un modelo de respaldo opcional. Al activarlo, el selector de modelos gana la entrada localizada «Automático (enrutado por intención)» y sobre el cuadro de entrada aparece el chip con el modelo en ruta y la confianza.
|
|
80
77
|
|
|
81
78
|
4. **Verificar** — en la cabecera de la sesión aparece la insignia ⚡ «equipo autónomo» (al lado, ◇ muestra el modelo de la sesión actual); o pregúntale directamente al modelo «¿cómo se titula la última sección de tu system prompt?» — debería mencionar el reglamento de dsh-switchman.
|
|
@@ -92,19 +89,19 @@ bash <install-dir>/skills/db-query/scripts/setup.sh
|
|
|
92
89
|
|
|
93
90
|
Esto es todo el conjunto de valores tras una instalación nueva (fuente autoritativa: el esquema zod de `host/config.js`).
|
|
94
91
|
|
|
95
|
-
**Interfaz e idiomas**: `uiLocale` = `auto`
|
|
92
|
+
**Interfaz e idiomas**: `uiLocale` = `zh` (chino simplificado; `auto` sigue el idioma de la app de DSH); `langScope` = `project`; `langConversation` = `zh-CN`; `langComments/Docs` = vacíos (valor de fábrica; si se vacía, se pregunta una vez en la primera conversación y se recuerda; el idioma de comentarios y documentos sigue al de la conversación).
|
|
96
93
|
|
|
97
94
|
**Pools de despacho**: los seis carriles (economy/mechanical/main/hard/vision/review) arrancan sin candidatos (= los modelos por defecto del sistema, sin intervenir); el orden manual y el effort fijado, apagados/vacíos; `dispatchEnforce` = `advice` (solo aconseja, no obliga).
|
|
98
95
|
|
|
99
|
-
**Nivel de agua del contexto**: soft `80000` / hard `
|
|
96
|
+
**Nivel de agua del contexto**: soft `80000` / hard `100000` / force `200000` tokens; presupuesto de lectura por llamada `3500`; conducta al pasarse del presupuesto `cap` (recorta y avisa); `wmAutoHandover` = encendido (en force, escritura del documento de entrega + compactación automáticas); el techo duro de subagentes = encendido (200k compartidas).
|
|
100
97
|
|
|
101
|
-
**Agent Teams**: `teamsMode` =
|
|
98
|
+
**Agent Teams**: `teamsMode` = encendido; `syncWhitelist` = encendido (los dos interruptores son independientes entre sí).
|
|
102
99
|
|
|
103
|
-
**Enrutado por intención** (no disponible de fábrica; hacen falta clasificador + al menos un candidato + encender el interruptor maestro): `intentEnabled` = apagado (apagado, la entrada Auto queda oculta y las sesiones que ya la tenían elegida caen en la cadena de respaldo); ruta del clasificador sin configurar; tipo de clasificador `chat`; lista de candidatos vacía (las categorías preinstaladas solo entran en el enrutado cuando se les asigna un modelo); ventana de caché `300` s / umbral de confianza para el cambio `80` / timeout de clasificación `60000` ms; historial de `6` mensajes / `2400` caracteres; `intentContextWindow` = `
|
|
100
|
+
**Enrutado por intención** (no disponible de fábrica; hacen falta clasificador + al menos un candidato + encender el interruptor maestro): `intentEnabled` = apagado (apagado, la entrada Auto queda oculta y las sesiones que ya la tenían elegida caen en la cadena de respaldo); ruta del clasificador sin configurar; tipo de clasificador `chat`; lista de candidatos vacía (las categorías preinstaladas solo entran en el enrutado cuando se les asigna un modelo); ventana de caché `300` s / umbral de confianza para el cambio `80` / timeout de clasificación `60000` ms; historial de `6` mensajes / `2400` caracteres; `intentContextWindow` = `250000`.
|
|
104
101
|
|
|
105
|
-
**Recorte de contexto**: `trimEnabled` = encendido; `trimMode` = `
|
|
102
|
+
**Recorte de contexto**: `trimEnabled` = encendido; `trimMode` = `advisory` (avisos + herramientas de plegado; el modelo de la sesión se pliega solo — para el modo totalmente automático, `auto`); compuerta de crecimiento `22500` + incremento `45000` tokens; presión `45%` / emergencia `90%`; avisos advisory `50%` / `80%`; cola protegida `6` mensajes; tope de cadencia de folds `30` por hora; modelo secundario sin definir (hereda el modelo de la sesión) — detalles en la sección «Recorte automático del contexto» más abajo.
|
|
106
103
|
|
|
107
|
-
**Notas de serie**: ① que el enrutado por intención no venga disponible de serie es intencionado: tres pasos para activarlo (clasificador, candidatos, interruptor); ② la ventana efectiva de Auto vale
|
|
104
|
+
**Notas de serie**: ① que el enrutado por intención no venga disponible de serie es intencionado: tres pasos para activarlo (clasificador, candidatos, interruptor); ② la ventana efectiva de Auto vale 250000 de serie — la barrera de seguridad garantiza 0.8×ventana ≥ force (200000), así que la línea de compactación del núcleo (200000) cae justo sobre la línea de entrega suave (200000); ③ lo más perceptible de serie es el trío de niveles: 80k avisa de delegar / 100k aprieta la lectura / 200k entrega automáticamente (documento + compactación) — sin tocar ningún ajuste.
|
|
108
105
|
|
|
109
106
|
## Recorte automático del contexto
|
|
110
107
|
|
|
@@ -113,23 +110,25 @@ Las sesiones largas salen baratas: los tramos de conversación ya consumidos se
|
|
|
113
110
|
Niveles de automatización (`trimMode`):
|
|
114
111
|
|
|
115
112
|
- **`off`** — solo medir: el muestreo de uso y de aciertos de caché sigue funcionando; sin banner ni folds.
|
|
116
|
-
- **`advisory`** — el modelo de la sesión se pliega a sí mismo: se exponen las herramientas `ctx_trim_fold` y `ctx_trim_status` más la cabecera de protocolo. Cuando la presión de la sesión alcanza `trimAdvisoryPercent` de la ventana efectiva, el motor añade un aviso de plegado fijado como sufijo `user/message` al final de la surface activa de la sesión (no a la cabecera system del dispatch) — se repite de inmediato al escalar a crítico y se elimina cuando la presión baja de la línea.
|
|
117
|
-
- **`auto`**
|
|
113
|
+
- **`advisory`** (predeterminado) — el modelo de la sesión se pliega a sí mismo: se exponen las herramientas `ctx_trim_fold` y `ctx_trim_status` más la cabecera de protocolo. Cuando la presión de la sesión alcanza `trimAdvisoryPercent` de la ventana efectiva, el motor añade un aviso de plegado fijado como sufijo `user/message` al final de la surface activa de la sesión (no a la cabecera system del dispatch) — se repite de inmediato al escalar a crítico y se elimina cuando la presión baja de la línea. En la línea crítica el propio motor ejecuta un fold mecánico de alivio (enfriamiento de 90 s, `trimCriticalRelief` = encendido).
|
|
114
|
+
- **`auto`** — todo lo anterior más folds automáticos en el límite de inactividad, en tres escalones: una compuerta de crecimiento (crecimiento > `trimGrowthTokens` medido desde el mínimo tras el último plegado — el ancla que mantiene la compuerta activa tras plegados que confirman en puntos altos de la view — Y un incremento comprimible contiguo ≥ `trimIncrementTokens`), un escalón de presión (`trimPressurePercent` de la ventana de contexto) y un escalón de emergencia (`trimEmergencyPercent` — un fold mecánico con su propio enfriamiento).
|
|
118
115
|
|
|
119
116
|
Todas las claves viven en Ajustes → dsh-switchman; los valores por defecto salen de `host/config.js`:
|
|
120
117
|
|
|
121
118
|
| Clave | Por defecto | Significado |
|
|
122
119
|
| --- | --- | --- |
|
|
123
120
|
| `trimEnabled` | `true` | Interruptor maestro. Apagado desactiva folds y métricas por completo (el listener degenera en puro paso a través). |
|
|
124
|
-
| `trimMode` | `
|
|
121
|
+
| `trimMode` | `advisory` | `off` solo medir / `advisory` folds dictados por el modelo / `auto` folds dictados por el sistema. |
|
|
125
122
|
| `trimGrowthTokens` | `22500` | Compuerta de crecimiento: pliega cuando la view saliente crezca esto desde el último fold. |
|
|
126
|
-
| `trimIncrementTokens` | `
|
|
127
|
-
| `trimPressurePercent` | `
|
|
128
|
-
| `trimEmergencyPercent` | `
|
|
129
|
-
| `trimAdvisoryPercent` | `
|
|
130
|
-
| `trimAdvisoryCriticalPercent` | `
|
|
123
|
+
| `trimIncrementTokens` | `45000` | Compañera de la compuerta: el incremento comprimible contiguo también debe alcanzar este tamaño. |
|
|
124
|
+
| `trimPressurePercent` | `45` | Escalón de presión: pliega cuando el uso de la view alcance este porcentaje de la ventana de contexto. |
|
|
125
|
+
| `trimEmergencyPercent` | `90` | Escalón de emergencia: fold mecánico forzado (sin llamada al modelo secundario) a este porcentaje. |
|
|
126
|
+
| `trimAdvisoryPercent` | `50` | Línea de aviso advisory: al alcanzar este porcentaje de la ventana efectiva, el motor insta al modelo a plegar ya con `ctx_trim_fold` (solo modo advisory). |
|
|
127
|
+
| `trimAdvisoryCriticalPercent` | `80` | Línea crítica: al alcanzarla repite el aviso de inmediato, sin el límite de 10 minutos de la misma banda. |
|
|
131
128
|
| `trimWindowTokens` | `0` | Límite de ventana efectivo para el cálculo de niveles: se calcula sobre min(ventana del modelo, límite). `0` = sigue a `wmForceTokens`. |
|
|
132
|
-
| `
|
|
129
|
+
| `trimCriticalRelief` | `true` | Alivio crítico advisory: al alcanzar la línea crítica el propio motor ejecuta un plegado mecánico (estilo emergencia), con enfriamiento de 90 s. |
|
|
130
|
+
| — | — | Los porcentajes de trim no son comparables con el medidor de contexto del compositor: trim divide el último prompt pagado (max de view/wire) por la ventana efectiva (límite incluido); el medidor muestra la proyección del próximo prompt sobre la ventana completa del modelo. |
|
|
131
|
+
| `trimProtectedTail` | `6` | Los últimos N mensajes nunca se pliegan. |
|
|
133
132
|
| `trimMaxFoldsPerHour` | `30` | Tope de cadencia de folds por hora móvil para el modelo secundario (los de emergencia quedan exentos). |
|
|
134
133
|
| `trimSideModel` | sin definir | Ruta del modelo secundario que escribe los resúmenes. Vacía = seguir el provider/model de la sesión, sin heredar el effort de esa llamada; la destilación ladder también usa esta ruta. El effort del resumen admite un pin manual independiente; si no se fija, los metadatos del modelo recomiendan el nivel de reasoning habilitado más bajo; si el modelo solo tiene interruptor sí/no, se elige off. Si no admite reasoning o faltan metadatos, no se envía effort y se conserva el comportamiento predeterminado del modelo/adaptador. |
|
|
135
134
|
| `trimFoldFallbackModel` | sin definir | Ruta de reintento cuando falla el modelo secundario de resúmenes; un fold de presión degrada entonces a mecánico. Vacía = sin respaldo. El modelo de respaldo de fold elegido manualmente tiene un pin de effort independiente; si no se fija, usa la misma recomendación por metadatos que el modelo de resumen, y si faltan metadatos, el valor predeterminado del modelo. Elige una ruta con margen en cooldowns, control de riesgo y concurrencia. |
|
|
@@ -138,7 +137,7 @@ Todas las claves viven en Ajustes → dsh-switchman; los valores por defecto sal
|
|
|
138
137
|
|
|
139
138
|
**Rutas de activación.** Las comprobaciones de escalones se ejecutan en el límite de inactividad y, como respaldo para hosts donde los eventos de estado de inactividad son inalcanzables, tras cada finalización del flujo del modelo (limitadas a una evaluación cada 60 s por sesión). Cada decisión — folds y no-ops por igual — se añade como una línea `key=value` con marca de tiempo a `decisions.log` en el directorio del estado de folds (véase `trimStateDir`), dando a los folds una pista de auditoría fuera de línea; el vocabulario de filas (`view-applied`, filas de decisión/resultado de folds, `surface-replace`, `surface-replace skipped reason=…`) está catalogado en [docs/context-trim.md](./docs/context-trim.md).
|
|
140
139
|
|
|
141
|
-
**Verdad del cable y estado estacionario.** Las filas de decisión llevan `view=<n>` y, una vez que una respuesta ha llegado, `wire=<n>` — el prompt real del proveedor (entrada sin caché + lectura de caché + escritura de caché, muestreado del evento de uso del stream). La estimación de la view cuenta solo el array de mensajes y siempre lee menos que el cable por la sobrecarga fija (medida ≈ 17.3k: system prompt + esquemas de herramientas + persona), así que los escalones de presión y emergencia evalúan sobre `max(view, wire)`, y solo `wire` es una lectura del tamaño del prompt. En una ventana de
|
|
140
|
+
**Verdad del cable y estado estacionario.** Las filas de decisión llevan `view=<n>` y, una vez que una respuesta ha llegado, `wire=<n>` — el prompt real del proveedor (entrada sin caché + lectura de caché + escritura de caché, muestreado del evento de uso del stream). La estimación de la view cuenta solo el array de mensajes y siempre lee menos que el cable por la sobrecarga fija (medida ≈ 17.3k: system prompt + esquemas de herramientas + persona), así que los escalones de presión y emergencia evalúan sobre `max(view, wire)`, y solo `wire` es una lectura del tamaño del prompt. En una ventana de 200k, el diente de sierra sano marca el cable en ≈ 40k justo después de un fold ↔ 64–90k en el siguiente (≈20%–45% de la ventana), un fold por cada ~45k de crecimiento bruto, con el techo fijado cerca de 90k por el escalón de presión y no por la ventana. Si `view` sube sin que aparezca nunca una fila `surface-replace`, lee las filas de omisión (`incomplete-seqs`, `no-service`, `compaction-lock`).
|
|
142
141
|
|
|
143
142
|
**Épocas de compactación del host.** Las referencias de fold se anclan en ids de mensaje y hashes de contenido, de modo que una compactación del propio host que reemplace el historial reenviado hace envejecer el libro entero de golpe: ningún bloque localiza su posición, la vista retrocede silenciosamente al historial sin plegar (fail-open — el registro de decisiones anota `view-applied applied=0`) y el plugin reancla su línea base de crecimiento en la vista posterior a la compactación en la siguiente petición. La compactación del host es así la capa de recorte de último recurso; los folds del plugin hacen el trabajo fino dentro de una época del host. Algunos despachos entregan matrices de solicitud u objetos de opciones totalmente congelados (el bucle de agente actual congela en profundidad las peticiones ya montadas); para ellos, `injectView` informa del resultado en el registro de decisiones: `nothing-to-apply` (no hay bloques de fold localizados — el historial sin plegar ES la vista), `in-place`/`swapped` (la vista plegada viajó con la petición) o `none` (había un fold, pero el despacho congelado no podía llevarlo — por el cable va el historial sin plegar). **El reemplazo de superficie es la ruta de envío cuando está disponible** (`surfaceFold`, activado por defecto): en el límite serial `agent/turn-stopping` más un barrido de inactividad, el plugin añade el evento de medición shadow-price al estilo del host y UN reemplazo `user/message` que lleva `surfaceOp {op:'replace', startSeq, endSeq}` con `sourceEventSeqs` cubriendo cada nodo de superficie sombreado — el mismo mecanismo que usa la propia compactación del host —, de modo que un fold confirmado llega al cable desde el nivel de origen, despachos congelados incluidos. Mientras los despachos recientes de una sesión registran `none`, el plugin trata la vista como solo-medición: el nivel de agua mide en su lugar la cuenta que reporta el proveedor (el escalón force y la entrega automática siguen funcionando), los ciclos de fold se pausan en vez de quemar llamadas al resumidor, y el banner de recorte marca la línea con `wire=raw` (folds not shipping; watermark reads the tally); los hosts sin el mecanismo de superficie (o con la opción apagada) se quedan exactamente con ese comportamiento antiguo.
|
|
144
143
|
|
|
@@ -163,6 +162,12 @@ Todas las claves viven en Ajustes → dsh-switchman; los valores por defecto sal
|
|
|
163
162
|
- Las líneas de protocolo (`[SWITCHMAN:LANG|POOLS|WATERMARK|TEAMS]`) están deliberadamente en inglés y son estables byte a byte — no las localices.
|
|
164
163
|
- `npm pack --dry-run` debe mantenerse en la forma auditada de 60 archivos / ~380 kB (~1,26 MB descomprimido; `docs/` queda excluido).
|
|
165
164
|
|
|
165
|
+
## Descargas
|
|
166
|
+
|
|
167
|
+
Todas las descargas de npm desde la primera publicación, acumuladas — dibujadas a partir de la [API oficial de descargas de npm](https://api.npmjs.org/) y actualizadas a diario por GitHub Actions ([script del gráfico](scripts/downloads-chart.mjs)):
|
|
168
|
+
|
|
169
|
+

|
|
170
|
+
|
|
166
171
|
## License
|
|
167
172
|
|
|
168
173
|
MIT
|