dsh-switchman 1.11.4 → 1.11.6

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 CHANGED
@@ -33,7 +33,7 @@ Die Session-Kopfzeile zeigt sofort, was los ist: das ⚡-Abzeichen „autonomes
33
33
 
34
34
  **7. `/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
35
 
36
- **8. Intent-Routing: das passende Modell stellt sich von selbst ein.** Auf der Einstellungsseite gibt es eine neue Gruppe „Intent-Routing“: einen Hauptschalter (standardmäßig aus — zum Einschalten sind ein Klassifikator und mindestens ein Kandidat nötig), die Small-Model-Route des Klassifikators (Provider + Modell + optionaler Aufwand — TypeSafe-Jev-artige Entscheidungsmodelle wie allgemeine Chatmodelle funktionieren gleichermaßen, die Ausgabe wird tolerant geparst), eine Dreifachwahl des Klassifikatortyps (auto / decision / chat), eine eigene Kandidatenliste (je Kandidat Provider + Modell + optionaler Aufwand + eine Zeile Fähigkeitsbeschreibung), das Cache-Fenster in Sekunden (Standard 300, abgestimmt auf die Prompt-Caches der Anbieter von rund 5 Minuten), die Umschalt-Vertrauensschwelle (Standard 80), das Klassifikations-Timeout (Standard 60000 ms), die Anzahl der Verlaufsnachrichten (Standard 6) samt Zeichenbudget (Standard 2400) und ein optionales Fallback-Modell. In der Modellauswahl erscheint unter der Gruppe „Auto · Switchman“ der Eintrag „Auto“ (der Client rendert ihn lokalisiert — auf Deutsch „Automatisch (Intent-Routing)“); ist er gewählt, stuft der Klassifikator jede Nutzernachricht ein und der Entscheid gilt für die jeweilige Runde: Bei zu geringem Vertrauen oder noch offenem Cache-Fenster bleibt das aktuelle Modell in Verwendung (sein Cache wird weitergenutzt); 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“-Nachricht landet in der Session. Über dem Eingabefeld sitzt ein Status-Chip (bei aktivem Routing zeigt er das aktuelle Routing-Modell und das Vertrauen der letzten Entscheidung); Kandidaten und Schwellen stehen jederzeit auf der Einstellungsseite.
36
+ **8. Intent-Routing: das passende Modell stellt sich von selbst ein.** Auf der Einstellungsseite gibt es eine neue Gruppe „Intent-Routing“: einen Hauptschalter (standardmäßig aus — zum Einschalten sind ein Klassifikator und mindestens ein Kandidat nötig), die Small-Model-Route des Klassifikators (Provider + Modell + optionaler Aufwand — TypeSafe-Jev-artige Entscheidungsmodelle wie allgemeine Chatmodelle funktionieren gleichermaßen, die Ausgabe wird tolerant geparst), eine Dreifachwahl des Klassifikatortyps (auto / decision / chat), eine eigene Kandidatenliste (je Kandidat Provider + Modell + optionaler Aufwand + eine Zeile Fähigkeitsbeschreibung), das Cache-Fenster in Sekunden (Standard 300, abgestimmt auf die Prompt-Caches der Anbieter von rund 5 Minuten), die Umschalt-Vertrauensschwelle (Standard 80), das Klassifikations-Timeout (Standard 60000 ms), die Anzahl der Verlaufsnachrichten (Standard 6) samt Zeichenbudget (Standard 2400) und ein optionales Fallback-Modell (mit unabhängigem optionalem Effort-Pin; ohne Pin gilt der Standard des ausgewählten Fallback-Modells, unabhängig vom Klassifikator). In der Modellauswahl erscheint unter der Gruppe „Auto · Switchman“ der Eintrag „Auto“ (der Client rendert ihn lokalisiert — auf Deutsch „Automatisch (Intent-Routing)“); ist er gewählt, stuft der Klassifikator jede Nutzernachricht ein und der Entscheid gilt für die jeweilige Runde: Bei zu geringem Vertrauen oder noch offenem Cache-Fenster bleibt das aktuelle Modell in Verwendung (sein Cache wird weitergenutzt); 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“-Nachricht landet in der Session. Über dem Eingabefeld sitzt ein Status-Chip (bei aktivem Routing zeigt er das aktuelle Routing-Modell und das Vertrauen der letzten Entscheidung); Kandidaten und Schwellen stehen jederzeit auf der Einstellungsseite.
37
37
 
38
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.
39
39
 
@@ -102,7 +102,7 @@ Alles Folgende sind die vollständigen Werte direkt nach der Neuinstallation (ma
102
102
 
103
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` = `200000`.
104
104
 
105
- **Kontext-Trimming**: `trimEnabled` = an; `trimMode` = `auto` (vollautomatisch); Wachstumsschwelle `22500` + Zuwachs `25000` Tokens; Druck `65%` / Notfall `95%`; geschütztes Ende `10` Nachrichten; Fold-Takt-Obergrenze `30` pro Stunde; Nebenmodell nicht gesetzt (erbt das Session-Modell) — Details im Abschnitt „Automatisches Kontext-Trimming“ unten.
105
+ **Kontext-Trimming**: `trimEnabled` = an; `trimMode` = `auto` (vollautomatisch); Wachstumsschwelle `22500` + Zuwachs `25000` Tokens; Druck `65%` / Notfall `95%`; Advisory-Hinweis `65%` / `95%`; geschütztes Ende `10` Nachrichten; Fold-Takt-Obergrenze `30` pro Stunde; Nebenmodell nicht gesetzt (erbt das Session-Modell) — Details im Abschnitt „Automatisches Kontext-Trimming“ unten.
106
106
 
107
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 200000 — die Leitplanke garantiert 0.8×Fenster ≥ force (150000), die Kern-Komprimierlinie (160000) liegt also stets hinter der Linie der weichen Übergabe (150000); ③ am spürbarsten ab Werk ist das Wasserstands-Trio: 80k mahnt zur Delegation / 95k strafft das Lesen / 150k übergibt automatisch (Dokument schreiben + Komprimierung) — ganz ohne Einstellungen.
108
108
 
@@ -113,7 +113,7 @@ Lange Sessions bleiben günstig: verarbeitete Gesprächsbereiche werden zu kompa
113
113
  Automatisierungsstufen (`trimMode`):
114
114
 
115
115
  - **`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.
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
117
  - **`auto`** (Standard) — 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
118
 
119
119
  Alle Schlüssel liegen unter Einstellungen → dsh-switchman; Defaults aus `host/config.js`:
@@ -126,11 +126,13 @@ Alle Schlüssel liegen unter Einstellungen → dsh-switchman; Defaults aus `host
126
126
  | `trimIncrementTokens` | `25000` | Schwellen-Begleiter: der zusammenhängende komprimierbare Zuwachs muss ebenfalls diese Größe erreichen. |
127
127
  | `trimPressurePercent` | `65` | Druckstufe: falte, wenn die View-Nutzung diesen Prozentsatz des Kontextfensters erreicht. |
128
128
  | `trimEmergencyPercent` | `95` | Notfallstufe: erzwungener mechanischer Fold (kein Nebenmodell-Aufruf) bei diesem Prozentsatz. |
129
+ | `trimAdvisoryPercent` | `65` | Advisory-Hinweislinie: bei diesem Prozent des effektiven Fensters erinnert die Engine das Modell, sofort mit `ctx_trim_fold` zu falten (nur advisory-Modus). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | Critical-Hinweislinie: bei Erreichen sofort erneuter Hinweis, umgeht das 10-Minuten-Throttling derselben Stufe. |
129
131
  | `trimWindowTokens` | `0` | Effektives Fensterlimit für die Stufenberechnung: gerechnet gegen min(Modellfenster, Limit). `0` = folgt `wmForceTokens`. |
130
132
  | `trimProtectedTail` | `10` | Die letzten N Nachrichten werden nie gefaltet. |
131
133
  | `trimMaxFoldsPerHour` | `30` | Fold-Takt-Obergrenze pro rollierender Stunde für Nebenmodell-Folds (Notfall-Folds ausgenommen). |
132
- | `trimSideModel` | nicht gesetzt | Route des zusammenfassenden Nebenmodells. Leer = das aktuelle Session-Modell erben. |
133
- | `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. Route mit Spielraum bei Cooldowns, Risikokontrolle und Concurrency wählen. |
134
+ | `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
+ | `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. |
134
136
  | `trimStateDir` | nicht gesetzt | Überschreibt das Fold-Zustandsverzeichnis. Leer = `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | Liefert committete Folds auf die Session-Oberfläche aus (Shadow-Price-Messereignis + `surfaceOp`-Replace-Ereignispaar). OFF behält die rein gesplicte View. |
136
138
 
package/README.es.md CHANGED
@@ -33,7 +33,7 @@ La cabecera de la sesión da un feedback visual claro: la insignia ⚡ «equipo
33
33
 
34
34
  **7. `/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
35
 
36
- **8. Enrutado por intención: el modelo adecuado se elige solo.** La página de ajustes estrena un grupo «Enrutado por intención»: un interruptor maestro (apagado por defecto; para activarlo hacen falta un clasificador y al menos un candidato), la ruta de modelo pequeño del clasificador (provider + model + effort opcional — valen tanto modelos de decisión tipo TypeSafe Jev como modelos de chat genéricos, y la salida se interpreta con tolerancia), un selector de tipo de clasificador a tres bandas (auto / decision / chat), una lista de candidatos independiente (cada candidato: provider + model + effort opcional + una nota de capacidades de una línea), la ventana de caché en segundos (300 por defecto, alineada con las cachés de prompt de los proveedores, unos 5 minutos), el umbral de confianza para el cambio (80 por defecto), el timeout de clasificación (60000 ms por defecto), el número de mensajes del historial (6 por defecto) y el presupuesto de caracteres (2400 por defecto), y un modelo de respaldo opcional. En el selector de modelos aparece una entrada «Auto» dentro del grupo «Auto · Switchman» (el cliente la muestra localizada — «Automático (enrutado por intención)» en español); elegida, cada mensaje del usuario pasa por el clasificador para decidir el mejor candidato y la decisión queda fijada por ese turno: si la confianza no llega o la ventana de caché sigue abierta, se mantiene el modelo actual (reaprovechando su caché); 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 — no se inserta ningún mensaje de «modelo cambiado» en la sesión. Sobre el cuadro de entrada hay un chip de estado (con enrutado automático muestra el modelo en ruta y la confianza de la última decisión); los candidatos y los umbrales se consultan siempre en la página de ajustes.
36
+ **8. Enrutado por intención: el modelo adecuado se elige solo.** La página de ajustes estrena un grupo «Enrutado por intención»: un interruptor maestro (apagado por defecto; para activarlo hacen falta un clasificador y al menos un candidato), la ruta de modelo pequeño del clasificador (provider + model + effort opcional — valen tanto modelos de decisión tipo TypeSafe Jev como modelos de chat genéricos, y la salida se interpreta con tolerancia), un selector de tipo de clasificador a tres bandas (auto / decision / chat), una lista de candidatos independiente (cada candidato: provider + model + effort opcional + una nota de capacidades de una línea), la ventana de caché en segundos (300 por defecto, alineada con las cachés de prompt de los proveedores, unos 5 minutos), el umbral de confianza para el cambio (80 por defecto), el timeout de clasificación (60000 ms por defecto), el número de mensajes del historial (6 por defecto) y el presupuesto de caracteres (2400 por defecto), y un modelo de respaldo opcional (con un pin de effort opcional e independiente; si no se fija, se usa el valor predeterminado del modelo de respaldo seleccionado, separado del effort del clasificador). En el selector de modelos aparece una entrada «Auto» dentro del grupo «Auto · Switchman» (el cliente la muestra localizada — «Automático (enrutado por intención)» en español); elegida, cada mensaje del usuario pasa por el clasificador para decidir el mejor candidato y la decisión queda fijada por ese turno: si la confianza no llega o la ventana de caché sigue abierta, se mantiene el modelo actual (reaprovechando su caché); 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 — no se inserta ningún mensaje de «modelo cambiado» en la sesión. Sobre el cuadro de entrada hay un chip de estado (con enrutado automático muestra el modelo en ruta y la confianza de la última decisión); los candidatos y los umbrales se consultan siempre en la página de ajustes.
37
37
 
38
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.
39
39
 
@@ -102,7 +102,7 @@ Esto es todo el conjunto de valores tras una instalación nueva (fuente autorita
102
102
 
103
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` = `200000`.
104
104
 
105
- **Recorte de contexto**: `trimEnabled` = encendido; `trimMode` = `auto` (totalmente automático); compuerta de crecimiento `22500` + incremento `25000` tokens; presión `65%` / emergencia `95%`; cola protegida `10` 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.
105
+ **Recorte de contexto**: `trimEnabled` = encendido; `trimMode` = `auto` (totalmente automático); compuerta de crecimiento `22500` + incremento `25000` tokens; presión `65%` / emergencia `95%`; avisos advisory `65%` / `95%`; cola protegida `10` 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
106
 
107
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 200000 de serie — la barrera de seguridad garantiza 0.8×ventana ≥ force (150000), así que la línea de compactación del núcleo (160000) queda siempre por detrás de la línea de entrega suave (150000); ③ lo más perceptible de serie es el trío de niveles: 80k avisa de delegar / 95k aprieta la lectura / 150k entrega automáticamente (documento + compactación) — sin tocar ningún ajuste.
108
108
 
@@ -113,7 +113,7 @@ Las sesiones largas salen baratas: los tramos de conversación ya consumidos se
113
113
  Niveles de automatización (`trimMode`):
114
114
 
115
115
  - **`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.
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
117
  - **`auto`** (predeterminado) — 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
118
 
119
119
  Todas las claves viven en Ajustes → dsh-switchman; los valores por defecto salen de `host/config.js`:
@@ -126,11 +126,13 @@ Todas las claves viven en Ajustes → dsh-switchman; los valores por defecto sal
126
126
  | `trimIncrementTokens` | `25000` | Compañera de la compuerta: el incremento comprimible contiguo también debe alcanzar este tamaño. |
127
127
  | `trimPressurePercent` | `65` | Escalón de presión: pliega cuando el uso de la view alcance este porcentaje de la ventana de contexto. |
128
128
  | `trimEmergencyPercent` | `95` | Escalón de emergencia: fold mecánico forzado (sin llamada al modelo secundario) a este porcentaje. |
129
+ | `trimAdvisoryPercent` | `65` | 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). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | Línea crítica: al alcanzarla repite el aviso de inmediato, sin el límite de 10 minutos de la misma banda. |
129
131
  | `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`. |
130
132
  | `trimProtectedTail` | `10` | Los últimos N mensajes nunca se pliegan. |
131
133
  | `trimMaxFoldsPerHour` | `30` | Tope de cadencia de folds por hora móvil para el modelo secundario (los de emergencia quedan exentos). |
132
- | `trimSideModel` | sin definir | Ruta del modelo secundario que escribe los resúmenes. Vacía = heredar el modelo actual de la sesión. |
133
- | `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. Elige una ruta con margen en cooldowns, control de riesgo y concurrencia. |
134
+ | `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
+ | `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. |
134
136
  | `trimStateDir` | sin definir | Anula el directorio del estado de folds. Vacía = `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | Envía los folds confirmados a la superficie de la sesión (par de eventos de medición shadow-price + replace con `surfaceOp`). Apagado conserva la vista de solo empalme. |
136
138
 
package/README.fr.md CHANGED
@@ -33,7 +33,7 @@ L'en-tête de session donne un retour immédiat : un badge ⚡ « équipe autono
33
33
 
34
34
  **7. `/vision` : même un modèle purement textuel peut travailler avec des images.** Quand le modèle principal ne sait pas lire les images, DSH refuse les messages avec image dès l'entrée. Collez l'image, tapez `/vision où est l'erreur sur cette image`, et l'image est confiée à un modèle du pool multimodal pour lecture ; les conclusions reviennent dans la session courante. Un avertissement apparaît tôt au-dessus du champ de saisie — « le modèle courant ne sait pas lire les images » ; si un envoi d'image ordinaire est refusé, le brouillon est réécrit une fois en `/vision` et renvoyé tout seul, sans rien retaper ; sans pool multimodal configuré, la commande refuse et donne les indications de configuration.
35
35
 
36
- **8. Routage par intention : le bon modèle se choisit tout seul.** La page de réglages accueille un nouveau groupe « Routage par intention » : un interrupteur général (désactivé par défaut ; l'activer exige un classifieur et au moins un candidat), la route du petit modèle classifieur (provider + model + effort facultatif — les modèles de décision type TypeSafe Jev comme les modèles de conversation génériques conviennent, et la sortie est analysée avec tolérance), un choix du type de classifieur à trois options (auto / decision / chat), une liste de candidats indépendante (chaque candidat : provider + model + effort facultatif + une note de capacité d'une ligne), la fenêtre de cache en secondes (300 par défaut, calée sur les caches de prompt des fournisseurs, environ 5 minutes), le seuil de confiance du basculement (80 par défaut), le timeout de classification (60000 ms par défaut), le nombre de messages d'historique (6 par défaut) et le budget de caractères (2400 par défaut), et un modèle de repli facultatif. Le sélecteur de modèles gagne une entrée « Auto » dans le groupe « Auto · Switchman » (le client la rend localisée — « Automatique (routage par intention) » en français) ; une fois choisie, chaque message utilisateur passe par le classifieur pour désigner le meilleur candidat, et la décision est verrouillée pour ce tour : si la confiance manque ou que la fenêtre de cache est encore ouverte, le modèle courant reste en place (son cache est réutilisé) ; on ne bascule que lorsque la confiance est suffisante ou que le modèle courant ne fait pas partie des candidats. Le basculement se fait en silence à la couche d'appel — aucun message « modèle changé » n'est inséré dans la session. Au-dessus du champ de saisie figure une pastille d'état (en routage automatique, elle montre le modèle routé courant et la confiance de la dernière décision) ; candidats et seuils restent consultables dans la page de réglages.
36
+ **8. Routage par intention : le bon modèle se choisit tout seul.** La page de réglages accueille un nouveau groupe « Routage par intention » : un interrupteur général (désactivé par défaut ; l'activer exige un classifieur et au moins un candidat), la route du petit modèle classifieur (provider + model + effort facultatif — les modèles de décision type TypeSafe Jev comme les modèles de conversation génériques conviennent, et la sortie est analysée avec tolérance), un choix du type de classifieur à trois options (auto / decision / chat), une liste de candidats indépendante (chaque candidat : provider + model + effort facultatif + une note de capacité d'une ligne), la fenêtre de cache en secondes (300 par défaut, calée sur les caches de prompt des fournisseurs, environ 5 minutes), le seuil de confiance du basculement (80 par défaut), le timeout de classification (60000 ms par défaut), le nombre de messages d'historique (6 par défaut) et le budget de caractères (2400 par défaut), et un modèle de repli facultatif (avec un pin d'effort facultatif et indépendant ; sans pin, l'effort par défaut du modèle de repli sélectionné s'applique, indépendamment de celui du classifieur). Le sélecteur de modèles gagne une entrée « Auto » dans le groupe « Auto · Switchman » (le client la rend localisée — « Automatique (routage par intention) » en français) ; une fois choisie, chaque message utilisateur passe par le classifieur pour désigner le meilleur candidat, et la décision est verrouillée pour ce tour : si la confiance manque ou que la fenêtre de cache est encore ouverte, le modèle courant reste en place (son cache est réutilisé) ; on ne bascule que lorsque la confiance est suffisante ou que le modèle courant ne fait pas partie des candidats. Le basculement se fait en silence à la couche d'appel — aucun message « modèle changé » n'est inséré dans la session. Au-dessus du champ de saisie figure une pastille d'état (en routage automatique, elle montre le modèle routé courant et la confiance de la dernière décision) ; candidats et seuils restent consultables dans la page de réglages.
37
37
 
38
38
  Un seul modèle ? Ça vaut quand même l'installation — le contrôle du niveau d'eau et la vérification par paliers se moquent du nombre de modèles, et une longue session mono-modèle en profite tout autant.
39
39
 
@@ -102,7 +102,7 @@ Voici l'ensemble complet des valeurs juste après une installation neuve (source
102
102
 
103
103
  **Routage par intention** (indisponible par défaut ; il exige un classifieur + au moins un candidat + l'interrupteur général) : `intentEnabled` = désactivé (désactivé, l'entrée Auto reste cachée et les sessions déjà passées en Auto empruntent la chaîne de repli) ; route du classifieur non définie ; type de classifieur `chat` ; liste de candidats vide (les catégories préinstallées ne participent au routage qu'une fois un modèle renseigné) ; fenêtre de cache `300` s / seuil de confiance du basculement `80` / timeout de classification `60000` ms ; historique de `6` messages / `2400` caractères ; `intentContextWindow` = `200000`.
104
104
 
105
- **Trim de contexte** : `trimEnabled` = activé ; `trimMode` = `auto` (entièrement automatique) ; porte de croissance `22500` + incrément `25000` tokens ; pression `65%` / urgence `95%` ; queue protégée `10` messages ; plafond de cadence des folds `30` par heure ; modèle annexe non défini (hérite du modèle de la session) — détails dans la section « Trim automatique du contexte » ci-dessous.
105
+ **Trim de contexte** : `trimEnabled` = activé ; `trimMode` = `auto` (entièrement automatique) ; porte de croissance `22500` + incrément `25000` tokens ; pression `65%` / urgence `95%` ; rappels advisory `65%` / `95%` ; queue protégée `10` messages ; plafond de cadence des folds `30` par heure ; modèle annexe non défini (hérite du modèle de la session) — détails dans la section « Trim automatique du contexte » ci-dessous.
106
106
 
107
107
  **À savoir dès l'installation** : ① l'indisponibilité du routage par intention en sortie d'usine est un choix délibéré — trois étapes pour l'activer (classifieur, candidats, interrupteur) ; ② la fenêtre effective d'Auto vaut 200000 dès l'usine — le garde-fou garantit 0.8×fenêtre ≥ force (150000), si bien que la ligne de compactage cœur (160000) se situe toujours après la ligne de remise en douceur (150000) ; ③ l'effet le plus tangible dès l'usine est le trio de niveaux : 80k rappelle de déléguer / 95k resserre la lecture / 150k remet automatiquement (document + compactage) — sans aucun réglage.
108
108
 
@@ -113,7 +113,7 @@ Les longues sessions restent bon marché : les plages de conversation consommée
113
113
  Niveaux d'automatisation (`trimMode`) :
114
114
 
115
115
  - **`off`** — mesure seule : l'échantillonnage de l'usage et des hits de cache tourne toujours ; pas de bannière, pas de folds.
116
- - **`advisory`** — le modèle de session se replie lui-même : les outils `ctx_trim_fold` et `ctx_trim_status` plus l'en-tête de protocole sont exposés.
116
+ - **`advisory`** — le modèle de session se replie lui-même : les outils `ctx_trim_fold` et `ctx_trim_status` plus l’en-tête de protocole sont exposés. Quand la pression de session atteint `trimAdvisoryPercent` de la fenêtre effective, le moteur ajoute un rappel de repli épinglé sous forme de suffixe `user/message` à la fin de la surface de session active (pas à l’en-tête system du dispatch) — répété immédiatement au passage au niveau critique et supprimé dès que la pression repasse sous la ligne.
117
117
  - **`auto`** (par défaut) — tout ce qui précède, plus des folds automatiques à la frontière d'inactivité, en trois paliers : une porte de croissance (croissance > `trimGrowthTokens` mesurée depuis le point bas après le dernier pli — l'ancre qui garde la porte armée après des plis confirmés à des points hauts de la view — ET un incrément compressible contigu ≥ `trimIncrementTokens`), un palier de pression (`trimPressurePercent` de la fenêtre de contexte) et un palier d'urgence (`trimEmergencyPercent` — un fold mécanique avec son propre refroidissement).
118
118
 
119
119
  Toutes les clés vivent dans Réglages → dsh-switchman ; les valeurs par défaut viennent de `host/config.js` :
@@ -126,11 +126,13 @@ Toutes les clés vivent dans Réglages → dsh-switchman ; les valeurs par défa
126
126
  | `trimIncrementTokens` | `25000` | Compagnon de la porte : l'incrément compressible contigu doit aussi atteindre cette taille. |
127
127
  | `trimPressurePercent` | `65` | Palier de pression : on plie quand l'usage de la view atteint ce pourcentage de la fenêtre de contexte. |
128
128
  | `trimEmergencyPercent` | `95` | Palier d'urgence : fold mécanique forcé (sans appel de modèle annexe) à ce pourcentage. |
129
+ | `trimAdvisoryPercent` | `65` | Ligne de rappel advisory : à ce pourcentage de la fenêtre effective, le moteur invite le modèle à replier immédiatement via `ctx_trim_fold` (mode advisory uniquement). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | Ligne critique : l'atteindre répète le rappel immédiatement, en contournant le bridage de 10 minutes à palier égal. |
129
131
  | `trimWindowTokens` | `0` | Plafond de fenêtre effectif pour le calcul des paliers : calculé sur min(fenêtre du modèle, plafond). `0` = suit `wmForceTokens`. |
130
132
  | `trimProtectedTail` | `10` | Les N derniers messages ne sont jamais repliés. |
131
133
  | `trimMaxFoldsPerHour` | `30` | Plafond de cadence des folds par heure glissante pour le modèle annexe (les folds d'urgence en sont exemptés). |
132
- | `trimSideModel` | non définie | Route du modèle annexe qui écrit les résumés. Vide = hériter du modèle courant de la session. |
133
- | `trimFoldFallbackModel` | non définie | Route de relance quand le modèle annexe de résumé échoue ; un fold de pression dégrade alors en mécanique. Vide = pas de repli. Choisir une route avec de la marge sur cooldowns, contrôle de risque et concurrence. |
134
+ | `trimSideModel` | non définie | Route du modèle annexe qui écrit les résumés. Vide = suivre le provider/model de la session, sans hériter de l'effort de cet appel ; les distillations ladder utilisent aussi cette route. L'effort du résumé peut être fixé séparément ; sans pin, les métadonnées du modèle déterminent le niveau de reasoning activé le plus bas ; pour un modèle limité à un interrupteur on/off, choisir off. Si le reasoning n'est pas pris en charge ou si les métadonnées sont indisponibles, aucun effort n'est envoyé et le comportement par défaut du modèle/de l'adaptateur s'applique. |
135
+ | `trimFoldFallbackModel` | non définie | Route de relance quand le modèle annexe de résumé échoue ; un fold de pression dégrade alors en mécanique. Vide = pas de repli. Le modèle de repli du fold choisi manuellement a un pin d'effort indépendant ; sans pin, appliquer la même recommandation par métadonnées que pour le modèle de résumé, et en l'absence de métadonnées, le défaut du modèle. Choisir une route avec de la marge sur cooldowns, contrôle de risque et concurrence. |
134
136
  | `trimStateDir` | non défini | Redéfinit le répertoire d'état des folds. Vide = `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | Expédie les folds validés sur la surface de session (paire d'événements : mesure shadow-price + remplacement `surfaceOp`). Désactivé, la vue reste en splice seul. |
136
138
 
package/README.it.md CHANGED
@@ -33,7 +33,7 @@ L'intestazione della sessione dà un riscontro immediato: badge ⚡ «Squadra au
33
33
 
34
34
  **7. `/vision`: anche i modelli solo testo trattano le immagini.** Quando il modello principale non sa leggere le immagini, DSH rifiuta al varco i messaggi che le contengono. Alleghi l'immagine e digiti `/vision dov'è l'errore in questa immagine`: l'immagine viene affidata alla lettura di un modello del pool multimodale, e la conclusione torna nella sessione corrente. Sopra la casella di input compare in anticipo l'avviso «il modello corrente non supporta la lettura delle immagini»; se un invio diretto dell'immagine viene rifiutato, il messaggio viene riscritto una volta in `/vision` e reinviato da solo, senza dover rifare tutto a mano; senza pool multimodale configurato, il comando rifiuta e indica come configurarlo.
35
35
 
36
- **8. Instradamento per intent: il modello giusto si sceglie da sé.** La pagina delle impostazioni si arricchisce di un gruppo «Instradamento per intent»: un interruttore principale (spento per predefinito; per attivarlo servono un classificatore e almeno un candidato), la route del piccolo modello classificatore (provider + model + effort facoltativo — vanno bene sia i modelli decisionali tipo TypeSafe Jev sia i modelli di chat generici, e l'output viene letto con tolleranza), una scelta a tre vie del tipo di classificatore (auto / decision / chat), una lista di candidati indipendente (per ogni candidato: provider + model + effort facoltativo + una nota di capacità di una riga), la finestra di cache in secondi (300 per predefinito, allineata alle cache di prompt dei provider, circa 5 minuti), la soglia di confidenza per il cambio (80 per predefinito), il timeout di classificazione (60000 ms per predefinito), il numero di messaggi di cronologia (6 per predefinito) e il budget di caratteri (2400 per predefinito), più un modello di fallback facoltativo. Nel selettore dei modelli compare una voce «Auto» nel gruppo «Auto · Switchman» (il client la renderizza localizzata — «Automatico (instradamento per intent)» in italiano); una volta scelta, ogni messaggio dell'utente passa dal classificatore per eleggere il candidato migliore e la decisione resta fissata per quel turno: se la confidenza non basta o la finestra di cache è ancora aperta, resta il modello corrente (riusandone la cache); si cambia solo quando la confidenza è sufficiente o il modello corrente non è tra i candidati. Il cambio avviene in silenzio al livello di chiamata — nessun messaggio «modello cambiato» finisce nella sessione. Sopra la casella di input c'è una chip di stato (con instradamento automatico mostra il modello di instradamento corrente e la confidenza dell'ultima decisione); candidati e soglie si consultano sempre nella pagina delle impostazioni.
36
+ **8. Instradamento per intent: il modello giusto si sceglie da sé.** La pagina delle impostazioni si arricchisce di un gruppo «Instradamento per intent»: un interruttore principale (spento per predefinito; per attivarlo servono un classificatore e almeno un candidato), la route del piccolo modello classificatore (provider + model + effort facoltativo — vanno bene sia i modelli decisionali tipo TypeSafe Jev sia i modelli di chat generici, e l'output viene letto con tolleranza), una scelta a tre vie del tipo di classificatore (auto / decision / chat), una lista di candidati indipendente (per ogni candidato: provider + model + effort facoltativo + una nota di capacità di una riga), la finestra di cache in secondi (300 per predefinito, allineata alle cache di prompt dei provider, circa 5 minuti), la soglia di confidenza per il cambio (80 per predefinito), il timeout di classificazione (60000 ms per predefinito), il numero di messaggi di cronologia (6 per predefinito) e il budget di caratteri (2400 per predefinito), più un modello di fallback facoltativo (con un pin di effort facoltativo e indipendente; se non fissato, si usa l'effort predefinito del modello di fallback selezionato, separato da quello del classificatore). Nel selettore dei modelli compare una voce «Auto» nel gruppo «Auto · Switchman» (il client la renderizza localizzata — «Automatico (instradamento per intent)» in italiano); una volta scelta, ogni messaggio dell'utente passa dal classificatore per eleggere il candidato migliore e la decisione resta fissata per quel turno: se la confidenza non basta o la finestra di cache è ancora aperta, resta il modello corrente (riusandone la cache); si cambia solo quando la confidenza è sufficiente o il modello corrente non è tra i candidati. Il cambio avviene in silenzio al livello di chiamata — nessun messaggio «modello cambiato» finisce nella sessione. Sopra la casella di input c'è una chip di stato (con instradamento automatico mostra il modello di instradamento corrente e la confidenza dell'ultima decisione); candidati e soglie si consultano sempre nella pagina delle impostazioni.
37
37
 
38
38
  Un solo modello? Vale comunque la pena installarlo — il controllo del livello dell'acqua e la verifica a livelli non guardano a quanti modelli hai, e ne giovancono allo stesso modo le sessioni lunghe con un modello unico.
39
39
 
@@ -102,7 +102,7 @@ Questi sono tutti i valori così come si presentano dopo una nuova installazione
102
102
 
103
103
  **Instradamento per intent** (non disponibile per predefinito; servono classificatore + almeno un candidato + l'interruttore principale): `intentEnabled` = spento (spento, la voce Auto resta nascosta e le sessioni che l'avevano già scelta percorrono la catena di fallback); route del classificatore non impostata; tipo di classificatore `chat`; lista dei candidati vuota (le categorie preinstallate entrano nell'instradamento solo con un modello assegnato); finestra di cache `300` s / soglia di confidenza del cambio `80` / timeout di classificazione `60000` ms; cronologia di `6` messaggi / `2400` caratteri; `intentContextWindow` = `200000`.
104
104
 
105
- **Trim del contesto**: `trimEnabled` = acceso; `trimMode` = `auto` (del tutto automatico); cancello di crescita `22500` + incremento `25000` token; pressione `65%` / emergenza `95%`; coda protetta `10` messaggi; tetto di cadenza dei fold `30` all'ora; modello secondario non impostato (eredita il modello della sessione) — dettagli nella sezione «Trim automatico del contesto» più sotto.
105
+ **Trim del contesto**: `trimEnabled` = acceso; `trimMode` = `auto` (del tutto automatico); cancello di crescita `22500` + incremento `25000` token; pressione `65%` / emergenza `95%`; avvisi advisory `65%` / `95%`; coda protetta `10` messaggi; tetto di cadenza dei fold `30` all'ora; modello secondario non impostato (eredita il modello della sessione) — dettagli nella sezione «Trim automatico del contesto» più sotto.
106
106
 
107
107
  **Note di serie**: ① l'instradamento per intent non disponibile di serie è una scelta voluta — tre passi per attivarlo (classificatore, candidati, interruttore); ② la finestra effettiva di Auto vale di serie 200000 — la barriera di sicurezza garantisce 0.8×finestra ≥ force (150000), così la linea di compattazione del cuore (160000) resta sempre dopo la linea di consegna morbida (150000); ③ di serie la cosa più percettibile è il terzetto di soglie: 80k ricorda di delegare / 95k stringe la lettura / 150k consegna da sola (documento + compattazione) — senza alcuna impostazione.
108
108
 
@@ -113,7 +113,7 @@ Le sessioni lunghe restano economiche: le porzioni di conversazione già consuma
113
113
  Livelli di automazione (`trimMode`):
114
114
 
115
115
  - **`off`** — solo misura: il campionamento di uso e hit di cache continua; niente banner, niente fold.
116
- - **`advisory`** — il modello della sessione si ripiega da sé: vengono esposti gli strumenti `ctx_trim_fold` e `ctx_trim_status` più l'intestazione di protocollo.
116
+ - **`advisory`** — il modello della sessione si ripiega da sé: vengono esposti gli strumenti `ctx_trim_fold` e `ctx_trim_status` più l’intestazione di protocollo. Quando la pressione della sessione raggiunge `trimAdvisoryPercent` della finestra effettiva, il motore aggiunge un sollecito di ripiegamento fissato come suffisso `user/message` alla fine della surface attiva della sessione (non all’intestazione system del dispatch) — ripetuto immediatamente all’escalation a critical e rimosso quando la pressione rientra sotto la linea.
117
117
  - **`auto`** (predefinito) — tutto quanto sopra più fold automatici al confine di inattività, su tre scalini: un cancello di crescita (crescita > `trimGrowthTokens` misurata dal minimo post-ripiegamento dell'ultimo fold — l'ancora che mantiene il cancello armato dopo ripiegamenti confermati su punti alti della view — E un incremento comprimibile contiguo ≥ `trimIncrementTokens`), uno scalino di pressione (`trimPressurePercent` della finestra di contesto) e uno scalino di emergenza (`trimEmergencyPercent` — un fold meccanico con il proprio raffreddamento).
118
118
 
119
119
  Tutte le chiavi stanno in Impostazioni → dsh-switchman; i valori predefiniti vengono da `host/config.js`:
@@ -126,11 +126,13 @@ Tutte le chiavi stanno in Impostazioni → dsh-switchman; i valori predefiniti v
126
126
  | `trimIncrementTokens` | `25000` | Compagno del cancello: anche l'incremento comprimibile contiguo deve raggiungere questa taglia. |
127
127
  | `trimPressurePercent` | `65` | Scalino di pressione: ripiega quando l'uso della view raggiunge questa percentuale della finestra di contesto. |
128
128
  | `trimEmergencyPercent` | `95` | Scalino di emergenza: fold meccanico forzato (nessuna chiamata al modello secondario) a questa percentuale. |
129
+ | `trimAdvisoryPercent` | `65` | Linea di sollecito advisory: a questa percentuale della finestra effettiva il motore invita il modello a ripiegare subito con `ctx_trim_fold` (solo modalità advisory). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | Linea critica: al raggiungimento ripete subito il sollecito, bypassando il throttle di 10 minuti sulla stessa fascia. |
129
131
  | `trimWindowTokens` | `0` | Limite di finestra effettivo per il calcolo delle soglie: calcolato su min(finestra del modello, limite). `0` = segue `wmForceTokens`. |
130
132
  | `trimProtectedTail` | `10` | Gli ultimi N messaggi non vengono mai ripiegati. |
131
133
  | `trimMaxFoldsPerHour` | `30` | Tetto di cadenza dei fold per ora mobile per il modello secondario (quelli di emergenza ne sono esenti). |
132
- | `trimSideModel` | non impostata | Route del modello secondario che scrive i riassunti. Vuota = eredita il modello attuale della sessione. |
133
- | `trimFoldFallbackModel` | non impostata | Route di ripiego quando il modello secondario dei riassunti fallisce; un fold di pressione degrada quindi a meccanico. Vuota = nessun fallback. Scegli una route con margine su cooldown, risk control e concorrenza. |
134
+ | `trimSideModel` | non impostata | Route del modello secondario che scrive i riassunti. Vuota = seguire il provider/model della sessione, senza ereditare l'effort della chiamata; anche le ladder distillation usano questa route. L'effort del riepilogo si può fissare separatamente; senza pin, i metadati del modello scelgono il livello reasoning abilitato più basso; per i modelli con solo interruttore on/off, scegliere off. Se reasoning non è supportato o i metadati non sono disponibili, non si invia effort e si mantiene il comportamento predefinito del modello/adattatore. |
135
+ | `trimFoldFallbackModel` | non impostata | Route di ripiego quando il modello secondario dei riassunti fallisce; un fold di pressione degrada quindi a meccanico. Vuota = nessun fallback. Il modello di fallback del fold scelto manualmente ha un pin di effort indipendente; senza pin, usa la stessa raccomandazione basata sui metadati del modello di riepilogo e, se mancano metadati, il valore predefinito del modello. Scegli una route con margine su cooldown, risk control e concorrenza. |
134
136
  | `trimStateDir` | non impostata | Sostituisce la directory dello stato dei fold. Vuota = `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | Spedisce i fold confermati sulla superficie della sessione (coppia di eventi: misurazione shadow-price + replace `surfaceOp`). OFF mantiene la vista a solo splice. |
136
138
 
package/README.ja.md CHANGED
@@ -33,7 +33,7 @@ dsh-switchman は [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-har
33
33
 
34
34
  **7. `/vision`:テキスト専用モデルでも画像を扱える。** 主力モデルが画像を読めないとき、DSH は画像付きメッセージを入口で拒否する。画像を貼って `/vision この画像のどこが悪い` と打てば、画像は vision プールのモデルへ渡され、結論は現在のセッションに戻る。入力欄の上には「現在のモデルは画像を読めません」の事前表示が出る。画像を直接送って拒否されたら、自動で `/vision` に書き換えて再送するので手直しは不要。vision プールが未設定ならコマンドは拒否し、設定への案内を出す。
35
35
 
36
- **8. 意図ルーティング:最適なモデルを自動で選ぶ。** 設定ページに「意図認識」グループが増える:マスタートグル(既定オフ、有効化には分類器と候補が最低1つ必要)、分類器用の小型モデルルート(provider + model + 任意の effort。TypeSafe Jev 系の決定モデルも汎用対話モデルも使え、出力は寛容にパースされる)、分類器タイプの3択(auto / decision / chat)、独立した候補モデルリスト(各候補に provider + model + 任意の effort + 一行の能力説明)、キャッシュウィンドウ秒数(既定 300、ベンダーの prompt cache 約5分に合わせる)、切替信頼度しきい値(既定 80)、分類タイムアウト(既定 60000ms)、履歴メッセージ件数(既定 6)と文字数予算(既定 2400)、任意のフォールバックモデル。モデルセレクターの「Auto · Switchman」グループの下に「Auto」エントリが現れる(クライアントは「自動(意図認識)」とローカライズして表示);選んでおくとユーザーメッセージごとに分類器が最適な候補を判定し、判断はそのターンの間固定される:信頼度が足りない、またはまだキャッシュウィンドウ内なら現在のモデルをそのまま使い(キャッシュを再利用)、信頼度が十分高い、または現在のモデルが候補にないときだけ切り替わる。切替は呼び出し層で静かに行われ、「モデルを切り替えました」のメッセージをセッションに差し込まない。入力欄の上には状態 chip(自動ルーティング中は現在のルーティング先モデルと最後の判断の信頼度を表示)。候補としきい値はいつでも設定ページで確認できる。
36
+ **8. 意図ルーティング:最適なモデルを自動で選ぶ。** 設定ページに「意図認識」グループが増える:マスタートグル(既定オフ、有効化には分類器と候補が最低1つ必要)、分類器用の小型モデルルート(provider + model + 任意の effort。TypeSafe Jev 系の決定モデルも汎用対話モデルも使え、出力は寛容にパースされる)、分類器タイプの3択(auto / decision / chat)、独立した候補モデルリスト(各候補に provider + model + 任意の effort + 一行の能力説明)、キャッシュウィンドウ秒数(既定 300、ベンダーの prompt cache 約5分に合わせる)、切替信頼度しきい値(既定 80)、分類タイムアウト(既定 60000ms)、履歴メッセージ件数(既定 6)と文字数予算(既定 2400)、任意のフォールバックモデル(任意の effort を独立して固定でき、未設定なら選択したフォールバックモデルのデフォルトを使用。分類器の effort とは別)。モデルセレクターの「Auto · Switchman」グループの下に「Auto」エントリが現れる(クライアントは「自動(意図認識)」とローカライズして表示);選んでおくとユーザーメッセージごとに分類器が最適な候補を判定し、判断はそのターンの間固定される:信頼度が足りない、またはまだキャッシュウィンドウ内なら現在のモデルをそのまま使い(キャッシュを再利用)、信頼度が十分高い、または現在のモデルが候補にないときだけ切り替わる。切替は呼び出し層で静かに行われ、「モデルを切り替えました」のメッセージをセッションに差し込まない。入力欄の上には状態 chip(自動ルーティング中は現在のルーティング先モデルと最後の判断の信頼度を表示)。候補としきい値はいつでも設定ページで確認できる。
37
37
 
38
38
  モデルが1つでも入れる価値はある——水位制御と段階的検証はモデルの数と無関係で、単一モデルの長いセッションも同じく恩恵を受ける。
39
39
 
@@ -102,7 +102,7 @@ bash <インストールディレクトリ>/skills/db-query/scripts/setup.sh
102
102
 
103
103
  **意図認識**(既定では利用不可。分類器+候補最低1つ+マスタートグルのオンが必要):`intentEnabled` = オフ(オフの間は Auto エントリが隠れ、Auto を選んでいたセッションはフォールバックチェーンへ流れる)。分類器ルートは未設定。分類器タイプは `chat`。候補リストは空(プリセット分類はモデルを埋めないとルーティングに参加しない)。キャッシュウィンドウ `300` 秒 / 切替信頼度 `80` / 分類タイムアウト `60000` ms。履歴 `6` 件 / `2400` 文字。`intentContextWindow` = `200000`。
104
104
 
105
- **コンテキストトリム**:`trimEnabled` = オン;`trimMode` = `auto`(完全自動);成長ゲート `22500` + インクリメント `25000` トークン;圧力 `65%` / 緊急 `95%`;保護テール `10` 件;fold ペース上限は毎時 `30` 回;サイドモデルは未設定(セッションモデルを継承)——詳細は下の「自動コンテキストトリム」節で。
105
+ **コンテキストトリム**:`trimEnabled` = オン;`trimMode` = `auto`(完全自動);成長ゲート `22500` + インクリメント `25000` トークン;圧力 `65%` / 緊急 `95%`;advisory 通知 `65%` / `95%`;保護テール `10` 件;fold ペース上限は毎時 `30` 回;サイドモデルは未設定(セッションモデルを継承)——詳細は下の「自動コンテキストトリム」節で。
106
106
 
107
107
  **初期状態のポイント**:① 意図認識が既定で使えないのは意図的な設計で、有効化は3ステップ(分類器、候補、トグル)。② Auto の実効ウィンドウは既定で 200000——ガードレールにより 0.8×ウィンドウ ≥ force 段(150000)が保証され、コア圧縮線(160000)は常にスムーズ引き継ぎ線(150000)より後ろにある。③ 既定でいちばん体感できるのは水位の3点セット:80k で委譲を促し、95k で読み取りを収束させ、150k で自動引き継ぎ(文書作成+圧縮)。設定は一切不要。
108
108
 
@@ -113,7 +113,7 @@ bash <インストールディレクトリ>/skills/db-query/scripts/setup.sh
113
113
  自動化レベル(`trimMode`):
114
114
 
115
115
  - **`off`**——計測のみ:使用量とキャッシュヒットのサンプリングは動作;バナーなし、fold なし。
116
- - **`advisory`**——セッションモデルが自ら fold する:`ctx_trim_fold` と `ctx_trim_status` のツールとプロトコルヘッドを公開。
116
+ - **`advisory`**——セッションモデルが自ら fold する:`ctx_trim_fold` と `ctx_trim_status` のツールとプロトコルヘッドを公開。セッション圧力が実効ウィンドウの `trimAdvisoryPercent` に達すると、エンジンは一度限りの固定 fold 催促を `user/message` サフィックスとしてライブの session surface の末尾に追加し(dispatch の system ヘッドは変更しません)、critical へのエスカレーションで即再通知し、圧力が線を下回ると prune します。
117
117
  - **`auto`**(既定)——advisory のすべてに加え、アイドル境界での自動 fold が3段階で動く:成長ゲート(前回の折り返し後の低点から測定した成長 > `trimGrowthTokens`——高位で折り返してもゲートが有効であり続けるためのアンカー——かつ連続圧縮可能インクリメントが `trimIncrementTokens` 以上)、圧力段(コンテキストウィンドウの `trimPressurePercent`)、緊急段(`trimEmergencyPercent`——独自クールダウン付きの機械 fold)。
118
118
 
119
119
  すべてのキーは「設定 → dsh-switchman」にあり、既定値は `host/config.js` 由来:
@@ -126,11 +126,13 @@ bash <インストールディレクトリ>/skills/db-query/scripts/setup.sh
126
126
  | `trimIncrementTokens` | `25000` | ゲートの同伴条件:連続圧縮可能インクリメントもこの規模に達する必要あり。 |
127
127
  | `trimPressurePercent` | `65` | 圧力段:view 使用量がコンテキストウィンドウのこの割合に達したら fold。 |
128
128
  | `trimEmergencyPercent` | `95` | 緊急段:この割合で機械 fold を強制(サイドモデル呼び出しなし)。 |
129
+ | `trimAdvisoryPercent` | `65` | advisory 通知線:圧力が実効ウィンドウのこの割合に達すると、モデルに `ctx_trim_fold` での即時 fold を促します(advisory モードのみ)。 |
130
+ | `trimAdvisoryCriticalPercent` | `95` | critical 通知線:到達すると 10 分の同帯域スロットルを無視して即再通知。 |
129
131
  | `trimWindowTokens` | `0` | ティア計算の実効ウィンドウ上限:min(モデルウィンドウ, 上限) で計算。`0` = `wmForceTokens` に追従。 |
130
132
  | `trimProtectedTail` | `10` | 最後の N メッセージは決して fold されない。 |
131
133
  | `trimMaxFoldsPerHour` | `30` | ローリング1時間あたりのサイドモデル fold ペース上限(緊急段は対象外)。 |
132
- | `trimSideModel` | 未設定 | サマリを書くサイドモデルのルート。空欄 = セッションの現在モデルを継承。 |
133
- | `trimFoldFallbackModel` | 未設定 | サマリのサイドモデルが失敗したときに折り畳みが再試行するルート。プレッシャー段でも失敗すると機械折り畳みに縮退。空欄 = フォールバックなし。クールダウン・リスク制御・同時実行に余裕のあるルートを推奨。 |
134
+ | `trimSideModel` | 未設定 | サマリ用サイドモデルのルート。空欄 = セッションの provider/model に追従(呼び出しの effort は継承しない);ladder distillation もこのルートを使用。サマリの effort は別途手動固定でき、未設定ならモデルメタデータから有効な reasoning レベルの最小値を選ぶ。オン/オフのみのモデルは off。reasoning 非対応またはメタデータが利用できない場合は effort を送らず、モデル/アダプターのデフォルトに委ねる。 |
135
+ | `trimFoldFallbackModel` | 未設定 | サマリのサイドモデルが失敗したときに折り畳みが再試行するルート。プレッシャー段でも失敗すると機械折り畳みに縮退。空欄 = フォールバックなし。手動選択した fold フォールバックモデルの effort 固定は独立。未設定ならサマリモデルと同じメタデータ基準で推奨し、メタデータがなければそのモデルのデフォルトを使用。クールダウン・リスク制御・同時実行に余裕のあるルートを推奨。 |
134
136
  | `trimStateDir` | 未設定 | fold 状態ディレクトリの上書き。空欄 = `<dshHome>/.dsh-switchman/state/trim/`。 |
135
137
  | `surfaceFold` | `true` | コミット済みの fold をセッション表面へ出荷します(shadow-price 計量イベント + `surfaceOp` replace イベントのペア)。OFF はスプライスのみの view を維持。 |
136
138
 
package/README.ko.md CHANGED
@@ -33,7 +33,7 @@ dsh-switchman은 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harn
33
33
 
34
34
  **7. `/vision`: 텍스트 전용 모델도 이미지를 다룬다.** 주력 모델이 이미지를 못 읽으면 DSH는 이미지 포함 메시지를 입구에서 거절한다. 이미지를 붙이고 `/vision 이 이미지 어디가 잘못됐어`라고 입력하면 이미지는 vision 풀 모델에게 넘어가고 결론이 현재 세션으로 돌아온다. 입력창 위에는 '현재 모델은 이미지를 읽을 수 없음' 안내가 미리 뜬다. 이미지를 직접 보내다 거절되면 자동으로 `/vision`으로 고쳐 다시 보낸다 — 손으로 다시 할 필요 없다. vision 풀이 비어 있으면 명령은 거절하고 설정 안내를 준다.
35
35
 
36
- **8. 의도 라우팅: 알맞은 모델을 자동으로 고른다.** 설정 페이지에 '의도 인식' 그룹이 추가된다: 마스터 토글(기본 꺼짐, 켜려면 분류기와 후보 최소 1개 필요), 분류기용 소형 모델 라우트(provider + model + 선택적 effort. TypeSafe Jev 계열 결정 모델도 범용 대화 모델도 지원하며 출력은 관대하게 파싱된다), 분류기 유형 3택(auto / decision / chat), 독립 후보 모델 목록(후보마다 provider + model + 선택적 effort + 한 줄 능력 설명), 캐시 창 초(기본 300, 벤더 prompt cache 약 5분에 맞춤), 전환 신뢰도 임계값(기본 80), 분류 타임아웃(기본 60000ms), 히스토리 메시지 수(기본 6)와 문자 예산(기본 2400), 선택적 폴백 모델. 모델 선택기의 'Auto · Switchman' 그룹 아래에 'Auto' 항목이 나타난다(클라이언트는 '자동(의도 인식)'으로 현지화해 그린다). 선택해 두면 사용자 메시지마다 분류기가 가장 알맞은 후보를 판정하고 같은 턴 안에서는 결정이 고정된다: 신뢰도가 부족하거나 아직 캐시 창 안이면 현재 모델을 그대로 쓰고(캐시 재사용), 신뢰도가 충분히 높거나 현재 모델이 후보에 없을 때만 전환한다. 전환은 호출 계층에서 조용히 끝나며 세션에 '모델이 전환되었습니다' 메시지를 끼워 넣지 않는다. 입력창 위에는 상태 chip이 뜬다(자동 라우팅 중에는 현재 라우팅 모델과 마지막 판정 신뢰도 표시). 후보와 임계값은 언제든 설정 페이지에서 볼 수 있다.
36
+ **8. 의도 라우팅: 알맞은 모델을 자동으로 고른다.** 설정 페이지에 '의도 인식' 그룹이 추가된다: 마스터 토글(기본 꺼짐, 켜려면 분류기와 후보 최소 1개 필요), 분류기용 소형 모델 라우트(provider + model + 선택적 effort. TypeSafe Jev 계열 결정 모델도 범용 대화 모델도 지원하며 출력은 관대하게 파싱된다), 분류기 유형 3택(auto / decision / chat), 독립 후보 모델 목록(후보마다 provider + model + 선택적 effort + 한 줄 능력 설명), 캐시 창 초(기본 300, 벤더 prompt cache 약 5분에 맞춤), 전환 신뢰도 임계값(기본 80), 분류 타임아웃(기본 60000ms), 히스토리 메시지 수(기본 6)와 문자 예산(기본 2400), 선택적 폴백 모델(선택적 effort를 별도로 고정할 수 있으며, 미설정 시 선택한 폴백 모델의 기본 effort를 사용하고 분류기 effort와는 독립적). 모델 선택기의 'Auto · Switchman' 그룹 아래에 'Auto' 항목이 나타난다(클라이언트는 '자동(의도 인식)'으로 현지화해 그린다). 선택해 두면 사용자 메시지마다 분류기가 가장 알맞은 후보를 판정하고 같은 턴 안에서는 결정이 고정된다: 신뢰도가 부족하거나 아직 캐시 창 안이면 현재 모델을 그대로 쓰고(캐시 재사용), 신뢰도가 충분히 높거나 현재 모델이 후보에 없을 때만 전환한다. 전환은 호출 계층에서 조용히 끝나며 세션에 '모델이 전환되었습니다' 메시지를 끼워 넣지 않는다. 입력창 위에는 상태 chip이 뜬다(자동 라우팅 중에는 현재 라우팅 모델과 마지막 판정 신뢰도 표시). 후보와 임계값은 언제든 설정 페이지에서 볼 수 있다.
37
37
 
38
38
  모델이 하나뿐이어도 설치할 가치가 있다 — 수위 제어와 단계별 검증은 모델 수와 무관하고, 단일 모델의 긴 세션도 같은 혜택을 본다.
39
39
 
@@ -102,7 +102,7 @@ bash <설치-디렉터리>/skills/db-query/scripts/setup.sh
102
102
 
103
103
  **의도 인식**(기본은 사용 불가. 분류기 + 후보 최소 1개 + 마스터 토글 켜기가 필요): `intentEnabled` = 끔(꺼져 있으면 Auto 항목은 숨겨지고, Auto를 선택해 둔 세션은 폴백 체인으로 흐른다). 분류기 라우트 미설정. 분류기 유형 `chat`. 후보 목록은 빈 상태(프리셋 분류는 모델을 채워야 라우팅에 참여). 캐시 창 `300`초 / 전환 신뢰도 `80` / 분류 타임아웃 `60000`ms. 히스토리 `6`건 / `2400`자. `intentContextWindow` = `200000`.
104
104
 
105
- **컨텍스트 트림**: `trimEnabled` = 켬; `trimMode` = `auto`(완전 자동); 성장 게이트 `22500` + 증분 `25000` 토큰; 압력 `65%` / 비상 `95%`; 보호 테일 `10`건; fold 케이던스 상한 시간당 `30`회; 사이드 모델 미설정(세션 모델 상속) — 자세한 내용은 아래 "자동 컨텍스트 트림" 절에서.
105
+ **컨텍스트 트림**: `trimEnabled` = 켬; `trimMode` = `auto`(완전 자동); 성장 게이트 `22500` + 증분 `25000` 토큰; 압력 `65%` / 비상 `95%`; advisory 알림 `65%` / `95%`; 보호 테일 `10`건; fold 케이던스 상한 시간당 `30`회; 사이드 모델 미설정(세션 모델 상속) — 자세한 내용은 아래 "자동 컨텍스트 트림" 절에서.
106
106
 
107
107
  **기본 상태에서 알아둘 점**: ① 의도 인식이 기본으로 불가능한 것은 의도된 설계고, 세 단계로 켠다(분류기, 후보, 토글). ② Auto의 실효 창은 기본값이 200000이다 — 가드레일이 0.8×창 ≥ force 단계(150000)를 보장하므로, 코어 압축선(160000)은 언제나 부드러운 인계선(150000)보다 뒤에 있다. ③ 기본 상태에서 가장 체감되는 건 수위 3종 세트다: 80k에 위임 알림 / 95k에 읽기 수렴 / 150k에 자동 인계(문서 작성 + 압축) — 설정은 아무것도 필요 없다.
108
108
 
@@ -113,7 +113,7 @@ bash <설치-디렉터리>/skills/db-query/scripts/setup.sh
113
113
  자동화 수준(`trimMode`):
114
114
 
115
115
  - **`off`** — 측정만: 사용량과 캐시 히트 샘플링은 계속 돌아간다; 배너 없음, fold 없음.
116
- - **`advisory`** — 세션 모델이 스스로 fold 한다: `ctx_trim_fold`와 `ctx_trim_status` 도구와 프로토콜 헤드를 노출.
116
+ - **`advisory`** — 세션 모델이 스스로 fold 한다: `ctx_trim_fold`와 `ctx_trim_status` 도구와 프로토콜 헤드를 노출. 세션 압력이 실효 윈도의 `trimAdvisoryPercent`에 도달하면 엔진이 한 번만 고정하는 fold 권고를 `user/message` 접미사로 실시간 세션 surface 끝에 추가합니다(디스패치 system 헤드는 수정하지 않음) — critical로 상승하면 즉시 다시 알리고, 압력이 선 아래로 내려가면 prune합니다.
117
117
  - **`auto`**(기본값) — 위의 모든 것에 더해 유휴 경계에서 자동 fold가 세 단계로 동작한다: 성장 게이트(지난 접기 후 저점부터 측정한 성장 > `trimGrowthTokens` — 높은 지점에서 접은 후에도 게이트가 계속 작동하도록 유지하는 앵커 — + 연속 압축 가능 증분이 `trimIncrementTokens` 이상), 압력 단계(컨텍스트 창의 `trimPressurePercent`), 비상 단계(`trimEmergencyPercent` — 독립 쿨다운을 가진 기계 fold).
118
118
 
119
119
  모든 키는 설정 → dsh-switchman에 있고, 기본값은 `host/config.js` 기준이다:
@@ -126,11 +126,13 @@ bash <설치-디렉터리>/skills/db-query/scripts/setup.sh
126
126
  | `trimIncrementTokens` | `25000` | 게이트 동반 조건: 연속 압축 가능 증분도 이 규모에 달해야 한다. |
127
127
  | `trimPressurePercent` | `65` | 압력 단계: view 사용량이 컨텍스트 창의 이 백분율에 달하면 fold. |
128
128
  | `trimEmergencyPercent` | `95` | 비상 단계: 이 백분율에서 기계 fold 강제(사이드 모델 호출 없음). |
129
+ | `trimAdvisoryPercent` | `65` | advisory 알림 선: 압력이 실효 윈도의 이 백분율에 도달하면 모델에게 `ctx_trim_fold`로 즉시 fold할 것을 권고(advisory 모드 전용). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | critical 알림 선: 도달 시 10분 동일 밴드 스로틀을 우회해 즉시 재알림. |
129
131
  | `trimWindowTokens` | `0` | 티어 계산의 유효 윈도우 상한: min(모델 윈도우, 상한)으로 계산. `0` = `wmForceTokens`를 따름. |
130
132
  | `trimProtectedTail` | `10` | 마지막 N개 메시지는 절대 fold되지 않는다. |
131
133
  | `trimMaxFoldsPerHour` | `30` | 롤링 1시간당 사이드 모델 fold 케이던스 상한(비상 단계는 제외). |
132
- | `trimSideModel` | 미설정 | 요약을 쓰는 사이드 모델 라우트. 비어 있으면 세션의 현재 모델을 상속. |
133
- | `trimFoldFallbackModel` | 미설정 | 요약 사이드 모델 실패 시 폴드가 재시도하는 라우트. 프레셔 단계에서도 실패하면 기계 폴드로 강등. 비어 있으면 폴백 없음. 쿨다운·리스크 컨트롤·동시 실행에 여유가 있는 라우트 권장. |
134
+ | `trimSideModel` | 미설정 | 요약 side model 라우트. 비어 있으면 세션 provider/model을 따르며 호출의 effort는 상속하지 않음. ladder distillation도 이 라우트를 사용. 요약 effort는 별도로 수동 고정할 수 있으며, 고정하지 않으면 모델 메타데이터에서 사용 가능한 reasoning 단계 중 가장 낮은 단계를 선택. 켜기/끄기만 지원하는 모델은 off. reasoning 미지원 또는 메타데이터 없음이면 effort를 보내지 않아 모델/어댑터 기본 동작을 따름. |
135
+ | `trimFoldFallbackModel` | 미설정 | 요약 side model 실패 시 폴드가 재시도하는 라우트. 프레셔 단계에서도 실패하면 기계 폴드로 강등. 비어 있으면 폴백 없음. 수동으로 선택한 폴드 폴백 모델의 effort는 독립적으로 고정할 수 있으며, 미설정 시 요약 모델과 동일한 메타데이터 추천을 따르고 메타데이터가 없으면 해당 모델 기본값을 사용. 쿨다운·리스크 컨트롤·동시 실행에 여유가 있는 라우트 권장. |
134
136
  | `trimStateDir` | 미설정 | fold 상태 디렉터리 재정의. 비어 있으면 `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | 커밋된 fold를 세션 표면으로 발송(shadow-price 계량 이벤트 + `surfaceOp` replace 이벤트 쌍). OFF는 스플라이스 전용 view를 유지. |
136
138
 
package/README.md CHANGED
@@ -33,7 +33,7 @@ The session header gives at-a-glance feedback: the ⚡ "autonomous team" badge a
33
33
 
34
34
  **7. `/vision`: text-only models can still handle images.** When the main model can't read images, DSH rejects image-bearing messages at the gate. Paste the image, type `/vision what's wrong with this image`, and the image goes to a vision-pool model; the verdict comes back into the current session. A heads-up "current model can't read images" appears above the input box; when a direct image send is rejected, the message is rewritten as `/vision` and resent automatically — no manual redo; with no vision pool configured the command refuses and points to the settings.
35
35
 
36
- **8. Intent routing: the right model picks itself.** A new "Intent Routing" group on the settings page: a master switch (off by default — enabling requires a classifier and at least one candidate), the classifier's small-model route (provider + model + optional effort — TypeSafe Jev-style decision models and general chat models both work, with tolerant output parsing), a classifier type three-way choice (auto / decision / chat), an independent candidate list (each candidate: provider + model + optional effort + a one-line capability note), cache window seconds (default 300, aligned to the ~5-minute prompt caches vendors provide), a switch confidence threshold (default 80), a classification timeout (default 60000 ms), history message count (default 6) and character budget (default 2400), plus an optional fallback model. The model picker gains an "Auto" entry under the "Auto · Switchman" group (the client renders it localized — "Auto (intent routing)" in English); once selected, every user message is classified to pick the best-fitting candidate and the decision is locked for that turn: when confidence is lacking or the cache window is still open, the current model stays (its cache keeps being reused); switching happens only when confidence is high enough or the current model isn't among the candidates. The switch completes silently at the call layer — no "model switched" message is inserted into the session. A status chip sits above the input box (during auto routing it shows the current routed model and the last decision's confidence); candidates and thresholds can always be checked on the settings page.
36
+ **8. Intent routing: the right model picks itself.** A new "Intent Routing" group on the settings page: a master switch (off by default — enabling requires a classifier and at least one candidate), the classifier's small-model route (provider + model + optional effort — TypeSafe Jev-style decision models and general chat models both work, with tolerant output parsing), a classifier type three-way choice (auto / decision / chat), an independent candidate list (each candidate: provider + model + optional effort + a one-line capability note), cache window seconds (default 300, aligned to the ~5-minute prompt caches vendors provide), a switch confidence threshold (default 80), a classification timeout (default 60000 ms), history message count (default 6) and character budget (default 2400), plus an optional fallback model route with its own independent reasoning-effort pin; leaving that pin unset uses the selected fallback model's default. The model picker gains an "Auto" entry under the "Auto · Switchman" group (the client renders it localized — "Auto (intent routing)" in English); once selected, every user message is classified to pick the best-fitting candidate and the decision is locked for that turn: when confidence is lacking or the cache window is still open, the current model stays (its cache keeps being reused); switching happens only when confidence is high enough or the current model isn't among the candidates. The switch completes silently at the call layer — no "model switched" message is inserted into the session. A status chip sits above the input box (during auto routing it shows the current routed model and the last decision's confidence); candidates and thresholds can always be checked on the settings page.
37
37
 
38
38
  Worth installing even with a single model — watermark control and tiered verification don't care how many models you have, and long single-model sessions benefit just the same.
39
39
 
@@ -76,7 +76,7 @@ Worth installing even with a single model — watermark control and tiered verif
76
76
  - **Capability ranking + enforcement mode** — the union of selected models across the six pools, ranked by capability, strongest first (the shot anchors glm-5.3 at S and glm-5.3-flash at A), reorderable and removable; enforcement mode advice / force (force = out-of-pool models rejected outright).
77
77
  - **Agent teams** — the two toggles for team mode and whitelist sync, both off by default; in the shot they're on, with a sync status line beneath the toggle.
78
78
  - **Context watermark** — the three thresholds (80000 / 120000 / 150000 in the shot), the single-read budget (3000), hard-tier behavior (throttle-pass / block), the auto-handover toggle, and subagent independent caps all live here. Bottom command row: `/ctx-pause` pause intervention · `/ctx-resume` resume · `/ctx-handover` write the handover doc and compact now (it steers the session to an idle boundary before compacting — the result can take a few minutes).
79
- - **Intent Routing** — the master switch, the classifier's small-model route, the classifier type (auto / decision / chat), the independent candidate list (each with a one-line capability note), cache window / confidence threshold / classification timeout / history budget, and an optional fallback model. Once enabled, the model picker gains the localized "Auto (intent routing)" entry, and a status chip above the input box shows the routed model and confidence.
79
+ - **Intent Routing** — the master switch, the classifier's small-model route, the classifier type (auto / decision / chat), the independent candidate list (each with a one-line capability note), cache window / confidence threshold / classification timeout / history budget, and an optional fallback model with its own optional effort pin (empty = use that model's default). Once enabled, the model picker gains the localized "Auto (intent routing)" entry, and a status chip above the input box shows the routed model and confidence.
80
80
 
81
81
  4. **Verify** — the ⚡ "autonomous team" badge appears in the session header (with ◇ beside it showing the session's current model); or simply ask the model "what's the heading of the last section of your system prompt" — the answer should mention the dsh-switchman doctrine.
82
82
 
@@ -100,9 +100,9 @@ Everything below is the full set of defaults after a fresh install (authoritativ
100
100
 
101
101
  **Agent Teams**: `teamsMode` = off; `syncWhitelist` = off (the two toggles are independent of each other).
102
102
 
103
- **Intent routing** (unavailable by default; needs a classifier + at least one candidate + the master switch on): `intentEnabled` = off (while off, the Auto entry stays hidden and sessions already on Auto fall through the fallback chain); the classifier route is unset; the classifier type is `chat`; the candidate list is empty (the preset categories join routing only once given a model); cache window `300` s / switch confidence threshold `80` / classification timeout `60000` ms; history `6` messages / `2400` characters; `intentContextWindow` = `200000`.
103
+ **Intent routing** (unavailable by default; needs a classifier + at least one candidate + the master switch on): `intentEnabled` = off (while off, the Auto entry stays hidden and sessions already on Auto fall through the fallback chain); the classifier route is unset; the classifier type is `chat`; the candidate list is empty (the preset categories join routing only once given a model); cache window `300` s / switch confidence threshold `80` / classification timeout `60000` ms; history `6` messages / `2400` characters; optional `intentFallbackRoute` is unset, and its own effort is model-default when later configured; `intentContextWindow` = `200000`.
104
104
 
105
- **Context trim**: `trimEnabled` = on; `trimMode` = `auto` (fully automatic); growth gate `22500` tokens + increment `25000` tokens; pressure `65%` / emergency `95%`; protected tail `10` messages; fold cadence cap `30` per hour; side model unset (inherits the session model); **ladder folding on** — T2 distills accumulated T1 summaries (8000-token mass, ≥3 blocks), T3 distills T2 (6000-token mass, ≥2 blocks); the engine never shows the model a water level, percentage, or progress number — details in the "Automatic context trim" section below and [docs/ladder-fold.md](./docs/ladder-fold.md).
105
+ **Context trim**: `trimEnabled` = on; `trimMode` = `auto` (fully automatic); growth gate `22500` tokens + increment `25000` tokens; pressure `65%` / emergency `95%`; advisory nudge `65%` / `95%`; protected tail `10` messages; fold cadence cap `30` per hour; side model unset (follows the session provider/model, not the session call's effort); without an explicit effort pin, use the lowest enabled reasoning level from model metadata, choose `off` for toggle-only models, and omit effort when reasoning is unsupported or metadata is unavailable (model default). Ladder distillation shares that route and policy; a configured fold-fallback route has an independent effort pin with the same model-aware default. **Ladder folding on** — T2 distills accumulated T1 summaries (8000-token mass, ≥3 blocks), T3 distills T2 (6000-token mass, ≥2 blocks); the engine never shows the model a water level, percentage, or progress number — details in the "Automatic context trim" section below and [docs/ladder-fold.md](./docs/ladder-fold.md).
106
106
 
107
107
  **Out-of-the-box notes**: ① intent routing being unavailable out of the box is by design — three steps to switch it on (classifier, candidates, the master switch); ② Auto's effective window is 200000 out of the box — the guardrail guarantees 0.8×window ≥ force (150000), so the core compaction line (160000) always sits after the smooth-handover line (150000); ③ the most tangible out-of-the-box effect is the watermark trio: 80k nudges delegation / 95k tightens reading / 150k backs up and hands over automatically — no configuration needed.
108
108
 
@@ -113,7 +113,7 @@ Long sessions stay cheap: consumed conversation ranges are folded into compact d
113
113
  Automation levels (`trimMode`):
114
114
 
115
115
  - **`off`** — measure only: usage and cache-hit sampling still runs; no banner, no folds.
116
- - **`advisory`** — the session model folds itself: the `ctx_trim_fold` and `ctx_trim_status` tools plus the protocol head are exposed for it.
116
+ - **`advisory`** — the session model folds itself: the `ctx_trim_fold` and `ctx_trim_status` tools plus the protocol head are exposed for it. When session pressure reaches `trimAdvisoryPercent` of the effective window the engine appends a one-off pinned fold nudge as a `user/message` suffix to the live session surface tail (not the dispatch system head) — it is re-spoken immediately on escalation to critical and pruned once pressure falls back below the line.
117
117
  - **`auto`** (default) — everything above plus automatic folds at the idle boundary, in three tiers: a growth gate (growth > `trimGrowthTokens` measured from the last fold's post-fold low — the anchor that keeps the gate armed after folds committing at high view points — AND a contiguous compressible increment ≥ `trimIncrementTokens`; the increment floor is what actually binds), a pressure tier (`trimPressurePercent` of the context window), and an emergency tier (`trimEmergencyPercent` — a mechanical fold with its own cooldown). Pressure and emergency usage is measured on `max(view, wire)`, i.e. on the real provider prompt when it is known.
118
118
 
119
119
  All keys live in Settings → dsh-switchman; defaults from `host/config.js`:
@@ -126,11 +126,13 @@ All keys live in Settings → dsh-switchman; defaults from `host/config.js`:
126
126
  | `trimIncrementTokens` | `25000` | Gate companion: the contiguous compressible increment must also reach this size. |
127
127
  | `trimPressurePercent` | `65` | Pressure tier: fold when view usage reaches this percent of the context window. |
128
128
  | `trimEmergencyPercent` | `95` | Emergency tier: forced mechanical fold (no side-model call) at this percent. |
129
+ | `trimAdvisoryPercent` | `65` | Advisory nudge line: when pressure reaches this percent of the effective window, the engine nudges the model to fold now with `ctx_trim_fold` (advisory mode only). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | Critical nudge line: reaching it re-speaks the nudge immediately, bypassing the 10-minute same-band throttle. |
129
131
  | `trimWindowTokens` | `0` | Effective-window cap for tier math: tiers are computed against min(model window, cap). `0` = follow `wmForceTokens`. |
130
132
  | `trimProtectedTail` | `10` | The last N messages are never folded. |
131
133
  | `trimMaxFoldsPerHour` | `30` | Side-model fold cadence cap per rolling hour (emergency folds are exempt). |
132
- | `trimSideModel` | unset | Route for the summary side model. Empty = inherit the session's current model. |
133
- | `trimFoldFallbackModel` | unset | Route the fold retries on when the summary side model fails; a pressure fold then degrades to a mechanical one. Empty = no fallback leg. Pick a route with headroom on cooldowns, risk control, and concurrency limits. |
134
+ | `trimSideModel` | unset | Route for the summary side model. Empty follows the session provider/model only, not its effort. The independent effort pin defaults to the lowest enabled reasoning level from model metadata; toggle-only models use `off`, while unsupported reasoning or missing metadata omits the effort and leaves the model default. Ladder distillations share the route and policy. |
135
+ | `trimFoldFallbackModel` | unset | Route used when a summary call fails; a pressure fold then degrades to mechanical if the retry also fails. Its effort pin is independent; when unset, use the same model-aware recommendation as the summary route. Empty = no fallback leg. |
134
136
  | `trimStateDir` | unset | Fold-state directory override. Empty = `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | Ship committed folds onto the session surface (shadow-price + `surfaceOp` replace event pair). OFF keeps the splice-only view. |
136
138
 
@@ -146,7 +148,7 @@ All keys live in Settings → dsh-switchman; defaults from `host/config.js`:
146
148
 
147
149
  **The ladder (v1.11): T1/T2/T3 tiered folding.** Every raw-range fold produces a T1 block. As T1 summaries themselves accumulate (≥8000 tokens of summary mass across ≥3 blocks), the engine distills them into ONE T2 block; T2s condense into a T3 the same way — month-long sessions stop drifting upward, because the folded floor no longer grows with every fold. Consumed blocks deactivate (never deleted), so coverage stays expressible and the ledger stays inspectable. Distillation runs through the same side model, on its own 120 s cadence, mass-gated so it stays rare (each distill rewrites the wire from its anchor onward — the mass gates keep that cost rare on purpose).
148
150
 
149
- **Nothing leaks to the model.** The engine never tells the session model a water level, a fill percentage, a window size, or a growth number — judgment stays rooted in the task (a model told "you're at 20%" anchors on "looks healthy" and refuses to fold). What the model MAY see, on demand, is `ctx_trim_status`: concrete compressible ranges with their true sizes. All metering lives in `decisions.log` and the settings-page badge — human channels.
151
+ **Nothing leaks to the model.** The engine never tells the session model a water level, a fill percentage, a window size, or a growth number — judgment stays rooted in the task (a model told "you're at 20%" anchors on "looks healthy" and refuses to fold). What the model MAY see, on demand, is `ctx_trim_status`: concrete compressible ranges with their true sizes. All metering lives in `decisions.log` and the settings-page badge — human channels. The advisory-mode pressure nudge is the deliberate exception: in `advisory` mode the model drives the fold, so the engine does tell it the pressure and the fold line, on the explicit instruction channel.
150
152
 
151
153
  **Fork inheritance.** A forked session (a subagent fork) inherits the parent's fold state copy-on-fork — but only when the parent state exists and the child's history actually resolves the parent's frontier; otherwise the child starts clean. One inheritance per child, idempotent across restarts.
152
154
 
package/README.pt.md CHANGED
@@ -33,7 +33,7 @@ O cabeçalho da sessão dá um retorno imediato: badge ⚡ “Equipe autônoma
33
33
 
34
34
  **7. `/vision`: até modelo somente texto lida com imagens.** Quando o modelo principal não sabe ler imagens, o DSH recusa na entrada as mensagens que as trazem. Você anexa a imagem e digita `/vision onde está o erro nesta imagem`: a imagem é entregue à leitura de um modelo do pool multimodal, e a conclusão volta para a sessão atual. Acima da caixa de entrada aparece antes o aviso “o modelo atual não suporta leitura de imagens”; se um envio direto da imagem for recusado, a mensagem é reescrita uma vez para `/vision` e reenviada sozinha, sem precisar refazer à mão; sem pool multimodal configurado, o comando recusa e indica como configurar.
35
35
 
36
- **8. Roteamento por intenção: o modelo certo se escolhe sozinho.** A página de configurações ganha um grupo “Roteamento por intenção”: uma chave mestra (desligada por padrão; para ligar são precisos um classificador e pelo menos um candidato), a rota do modelo pequeno do classificador (provider + model + effort opcional — servem tanto modelos de decisão tipo TypeSafe Jev quanto modelos de conversa genéricos, e a saída é interpretada com tolerância), uma escolha do tipo de classificador em três opções (auto / decision / chat), uma lista de candidatos independente (cada candidato: provider + model + effort opcional + uma nota de capacidade de uma linha), a janela de cache em segundos (300 por padrão, alinhada com os caches de prompt dos provedores, cerca de 5 minutos), o limiar de confiança para a troca (80 por padrão), o timeout de classificação (60000 ms por padrão), a contagem de mensagens do histórico (6 por padrão) e o orçamento de caracteres (2400 por padrão), além de um modelo de fallback opcional. No seletor de modelos aparece uma entrada “Auto” no grupo “Auto · Switchman” (o cliente a renderiza localizada — “Automático (roteamento por intenção)” em português); escolhida, cada mensagem do usuário passa pelo classificador para eleger o melhor candidato, e a decisão fica travada por aquele turno: se a confiança não alcança ou a janela de cache ainda está aberta, o modelo atual permanece (reaproveitando o cache); só troca quando a confiança é suficiente ou o modelo atual não está entre os candidatos. A troca acontece em silêncio na camada de chamada — nenhuma mensagem de “modelo trocado” entra na sessão. Acima da caixa de entrada há um chip de status (no roteamento automático, ele mostra o modelo roteado atual e a confiança da última decisão); candidatos e limiares ficam sempre visíveis na página de configurações.
36
+ **8. Roteamento por intenção: o modelo certo se escolhe sozinho.** A página de configurações ganha um grupo “Roteamento por intenção”: uma chave mestra (desligada por padrão; para ligar são precisos um classificador e pelo menos um candidato), a rota do modelo pequeno do classificador (provider + model + effort opcional — servem tanto modelos de decisão tipo TypeSafe Jev quanto modelos de conversa genéricos, e a saída é interpretada com tolerância), uma escolha do tipo de classificador em três opções (auto / decision / chat), uma lista de candidatos independente (cada candidato: provider + model + effort opcional + uma nota de capacidade de uma linha), a janela de cache em segundos (300 por padrão, alinhada com os caches de prompt dos provedores, cerca de 5 minutos), o limiar de confiança para a troca (80 por padrão), o timeout de classificação (60000 ms por padrão), a contagem de mensagens do histórico (6 por padrão) e o orçamento de caracteres (2400 por padrão), além de um modelo de fallback opcional (com um pin de effort opcional e independente; se não for fixado, usa-se o effort padrão do modelo de fallback selecionado, separado do effort do classificador). No seletor de modelos aparece uma entrada “Auto” no grupo “Auto · Switchman” (o cliente a renderiza localizada — “Automático (roteamento por intenção)” em português); escolhida, cada mensagem do usuário passa pelo classificador para eleger o melhor candidato, e a decisão fica travada por aquele turno: se a confiança não alcança ou a janela de cache ainda está aberta, o modelo atual permanece (reaproveitando o cache); só troca quando a confiança é suficiente ou o modelo atual não está entre os candidatos. A troca acontece em silêncio na camada de chamada — nenhuma mensagem de “modelo trocado” entra na sessão. Acima da caixa de entrada há um chip de status (no roteamento automático, ele mostra o modelo roteado atual e a confiança da última decisão); candidatos e limiares ficam sempre visíveis na página de configurações.
37
37
 
38
38
  Só um modelo? Ainda vale a pena instalar — o controle do nível de água e a verificação em níveis não ligam para quantos modelos você tem, e sessões longas de modelo único se beneficiam do mesmo jeito.
39
39
 
@@ -102,7 +102,7 @@ Estes são todos os valores logo depois de uma instalação nova (fonte autorita
102
102
 
103
103
  **Roteamento por intenção** (indisponível por padrão; são precisos classificador + pelo menos um candidato + ligar a chave mestra): `intentEnabled` = desligado (desligado, a entrada Auto fica oculta e as sessões que já a tinham escolhido caem na cadeia de fallback); rota do classificador sem definir; tipo de classificador `chat`; lista de candidatos vazia (as categorias pré-instaladas só entram no roteamento com um modelo preenchido); janela de cache `300` s / limiar de confiança da troca `80` / timeout de classificação `60000` ms; histórico de `6` mensagens / `2400` caracteres; `intentContextWindow` = `200000`.
104
104
 
105
- **Trim de contexto**: `trimEnabled` = ligado; `trimMode` = `auto` (totalmente automático); portão de crescimento `22500` + incremento `25000` tokens; pressão `65%` / emergência `95%`; cauda protegida `10` mensagens; teto de cadência de folds `30` por hora; modelo secundário não definido (herda o modelo da sessão) — detalhes na seção «Trim automático do contexto» abaixo.
105
+ **Trim de contexto**: `trimEnabled` = ligado; `trimMode` = `auto` (totalmente automático); portão de crescimento `22500` + incremento `25000` tokens; pressão `65%` / emergência `95%`; avisos advisory `65%` / `95%`; cauda protegida `10` mensagens; teto de cadência de folds `30` por hora; modelo secundário não definido (herda o modelo da sessão) — detalhes na seção «Trim automático do contexto» abaixo.
106
106
 
107
107
  **Observações de fábrica**: ① o roteamento por intenção vir indisponível de fábrica é proposital — três passos para ligar (classificador, candidatos, chave); ② a janela efetiva do Auto já nasce em 200000 — o guard-rail garante 0.8×janela ≥ force (150000), então a linha de compactação do núcleo (160000) fica sempre depois da linha de entrega suave (150000); ③ o que mais se sente de fábrica é o trio de níveis: 80k lembra de delegar / 95k aperta a leitura / 150k entrega sozinho (documento + compactação) — sem nenhuma configuração.
108
108
 
@@ -113,7 +113,7 @@ Sessões longas ficam baratas: os trechos já consumidos da conversa viram resum
113
113
  Níveis de automação (`trimMode`):
114
114
 
115
115
  - **`off`** — só medição: a amostragem de uso e de acertos de cache continua rodando; sem banner, sem folds.
116
- - **`advisory`** — o modelo da sessão dobra sozinho: as ferramentas `ctx_trim_fold` e `ctx_trim_status` mais o cabeçalho de protocolo ficam expostas.
116
+ - **`advisory`** — o modelo da sessão dobra sozinho: as ferramentas `ctx_trim_fold` e `ctx_trim_status` mais o cabeçalho de protocolo ficam expostas. Quando a pressão da sessão atinge `trimAdvisoryPercent` da janela efetiva, o motor acrescenta um lembrete de dobra fixado como sufixo `user/message` ao final da surface ativa da sessão (não ao cabeçalho system do despacho) — repetido imediatamente ao escalar para crítico e removido quando a pressão volta abaixo da linha.
117
117
  - **`auto`** (padrão) — tudo isso mais folds automáticos na fronteira de ociosidade, em três degraus: um portão de crescimento (crescimento > `trimGrowthTokens` medido a partir da mínima pós-dobra do último fold — a âncora que mantém o portão armado após dobras confirmadas em pontos altos da view — E um incremento comprimível contíguo ≥ `trimIncrementTokens`), um degrau de pressão (`trimPressurePercent` da janela de contexto) e um degrau de emergência (`trimEmergencyPercent` — um fold mecânico com cooldown próprio).
118
118
 
119
119
  Todas as chaves ficam em Configurações → dsh-switchman; os padrões vêm de `host/config.js`:
@@ -126,11 +126,13 @@ Todas as chaves ficam em Configurações → dsh-switchman; os padrões vêm de
126
126
  | `trimIncrementTokens` | `25000` | Companheiro do portão: o incremento comprimível contíguo também precisa alcançar esse tamanho. |
127
127
  | `trimPressurePercent` | `65` | Degrau de pressão: dobra quando o uso da view alcança essa porcentagem da janela de contexto. |
128
128
  | `trimEmergencyPercent` | `95` | Degrau de emergência: fold mecânico forçado (sem chamada ao modelo secundário) nessa porcentagem. |
129
+ | `trimAdvisoryPercent` | `65` | Linha de lembrete advisory: ao atingir essa porcentagem da janela efetiva, o motor insta o modelo a dobrar já com `ctx_trim_fold` (somente modo advisory). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | Linha crítica: ao atingi-la, repete o lembrete de imediato, contornando o limite de 10 minutos na mesma faixa. |
129
131
  | `trimWindowTokens` | `0` | Limite de janela efetivo para o cálculo dos níveis: calculado sobre min(janela do modelo, limite). `0` = segue `wmForceTokens`. |
130
132
  | `trimProtectedTail` | `10` | As últimas N mensagens nunca são dobradas. |
131
133
  | `trimMaxFoldsPerHour` | `30` | Teto de cadência de folds por hora rolante para o modelo secundário (os de emergência ficam fora). |
132
- | `trimSideModel` | não definida | Rota do modelo secundário que escreve os resumos. Vazia = herdar o modelo atual da sessão. |
133
- | `trimFoldFallbackModel` | não definida | Rota de nova tentativa quando o modelo secundário de resumos falha; um fold de pressão degrada então para mecânico. Vazia = sem fallback. Escolha uma rota com folga em cooldowns, controle de risco e concorrência. |
134
+ | `trimSideModel` | não definida | Rota do modelo secundário que escreve os resumos. Vazia = seguir o provider/model da sessão, sem herdar o effort da chamada; a ladder distillation também usa esta rota. O effort do resumo aceita um pin manual independente; se não fixado, os metadados do modelo recomendam o nível de reasoning habilitado mais baixo; se o modelo só tiver interruptor sim/não, escolhe-se off. Se não houver suporte a reasoning ou os metadados não estiverem disponíveis, nenhum effort é enviado e prevalece o comportamento padrão do modelo/adaptador. |
135
+ | `trimFoldFallbackModel` | não definida | Rota de nova tentativa quando o modelo secundário de resumos falha; um fold de pressão degrada então para mecânico. Vazia = sem fallback. O modelo de fallback do fold escolhido manualmente tem um pin de effort independente; sem pin, usa a mesma recomendação por metadados do modelo de resumo e, sem metadados, o padrão do modelo. Escolha uma rota com folga em cooldowns, controle de risco e concorrência. |
134
136
  | `trimStateDir` | não definido | Sobrepõe o diretório do estado de folds. Vazio = `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | Envia os folds confirmados para a superfície da sessão (par de eventos: medição shadow-price + replace com `surfaceOp`). OFF mantém a view apenas com splices. |
136
138
 
package/README.ru.md CHANGED
@@ -33,7 +33,7 @@ dsh-switchman — плагин для [DeepSeek Harness](https://github.com/deep
33
33
 
34
34
  **7. `/vision`: картинки по зубам даже чисто текстовой модели.** Когда главная модель не читает изображения, DSH прямо на входе отклоняет сообщения с картинками. Прикрепите картинку и введите `/vision что не так на этой картинке` — изображение будет отдано на чтение модели из мультимодального пула, а вывод вернётся в текущую сессию. Над полем ввода заранее подсказывают: «текущая модель не умеет читать изображения»; если прямая отправка картинки отклонена, она один раз автоматически переоформляется в `/vision` и уходит повторно — вручную ничего переписывать не нужно; если мультимодальный пул не настроен, команда откажется и подскажет, что настроить.
35
35
 
36
- **8. Маршрутизация по намерению: нужная модель выбирается сама.** На странице настроек появляется раздел «Маршрутизация по намерению»: главный переключатель (по умолчанию выключен; для включения нужны классификатор и хотя бы один кандидат), маршрут маленькой модели-классификатора (provider + model + необязательный effort — подходят и решающие модели типа TypeSafe Jev, и обычные разговорные, вывод парсится нестрого), выбор типа классификатора из трёх (auto / decision / chat), независимый список моделей-кандидатов (для каждого: provider + model + необязательный effort + одна строка описания способностей), окно кэша в секундах (по умолчанию 300, подогнано под промпт-кэши поставщиков ~5 минут), порог уверенности для переключения (по умолчанию 80), тайм-аут классификации (по умолчанию 60000 мс), количество сообщений истории (по умолчанию 6) и символьный бюджет (по умолчанию 2400), а также необязательная запасная модель. В селекторе моделей под группой «Auto · Switchman» появляется вход «Auto» (клиент отрисовывает его локализованно — «Авто (маршрутизация по намерению)» на русском); после выбора классификатор оценивает каждое сообщение пользователя, и решение фиксируется на этот ход: если уверенности не хватает или окно кэша ещё открыто, текущая модель остаётся (её кэш переиспользуется); переключение происходит, только когда уверенность высока или текущей модели нет среди кандидатов. Смена проходит бесшумно на уровне вызова — в сессию не вставляется сообщение «модель переключена». Над полем ввода — чип состояния (при автороутинге он показывает текущую модель маршрута и уверенность последнего решения); кандидаты и пороги всегда можно посмотреть на странице настроек.
36
+ **8. Маршрутизация по намерению: нужная модель выбирается сама.** На странице настроек появляется раздел «Маршрутизация по намерению»: главный переключатель (по умолчанию выключен; для включения нужны классификатор и хотя бы один кандидат), маршрут маленькой модели-классификатора (provider + model + необязательный effort — подходят и решающие модели типа TypeSafe Jev, и обычные разговорные, вывод парсится нестрого), выбор типа классификатора из трёх (auto / decision / chat), независимый список моделей-кандидатов (для каждого: provider + model + необязательный effort + одна строка описания способностей), окно кэша в секундах (по умолчанию 300, подогнано под промпт-кэши поставщиков ~5 минут), порог уверенности для переключения (по умолчанию 80), тайм-аут классификации (по умолчанию 60000 мс), количество сообщений истории (по умолчанию 6) и символьный бюджет (по умолчанию 2400), а также необязательная запасная модель (с отдельной необязательной фиксацией effort; если он не задан, используется effort по умолчанию выбранной запасной модели, независимо от effort классификатора). В селекторе моделей под группой «Auto · Switchman» появляется вход «Auto» (клиент отрисовывает его локализованно — «Авто (маршрутизация по намерению)» на русском); после выбора классификатор оценивает каждое сообщение пользователя, и решение фиксируется на этот ход: если уверенности не хватает или окно кэша ещё открыто, текущая модель остаётся (её кэш переиспользуется); переключение происходит, только когда уверенность высока или текущей модели нет среди кандидатов. Смена проходит бесшумно на уровне вызова — в сессию не вставляется сообщение «модель переключена». Над полем ввода — чип состояния (при автороутинге он показывает текущую модель маршрута и уверенность последнего решения); кандидаты и пороги всегда можно посмотреть на странице настроек.
37
37
 
38
38
  Всего одна модель? Всё равно стоит поставить — контроль уровня воды и многоуровневая проверка от числа моделей не зависят, и длинная сессия на одной модели выигрывает от них ничуть не меньше.
39
39
 
@@ -102,7 +102,7 @@ bash <install-dir>/skills/db-query/scripts/setup.sh
102
102
 
103
103
  **Маршрутизация по намерению** (по умолчанию недоступна; нужны классификатор + хотя бы один кандидат + включённый главный переключатель): `intentEnabled` = выключен (пока выключен, вход Auto скрыт, а сессии, где Auto уже выбран, идут по цепочке запасных моделей); маршрут классификатора не задан; тип классификатора `chat`; список кандидатов пуст (предустановленные категории участвуют в маршрутизации, только если у них указана модель); окно кэша `300` с / порог уверенности для переключения `80` / тайм-аут классификации `60000` мс; история `6` сообщений / `2400` символов; `intentContextWindow` = `200000`.
104
104
 
105
- **Обрезка контекста**: `trimEnabled` = включено; `trimMode` = `auto` (полностью автоматически); ворота роста `22500` + прирост `25000` токенов; давление `65%` / авария `95%`; защищённый хвост `10` сообщений; потолок частоты fold-ов `30` в час; боковая модель не задана (наследует модель сессии) — подробности в разделе «Автоматическая обрезка контекста» ниже.
105
+ **Обрезка контекста**: `trimEnabled` = включено; `trimMode` = `auto` (полностью автоматически); ворота роста `22500` + прирост `25000` токенов; давление `65%` / авария `95%`; advisory-напоминания `65%` / `95%`; защищённый хвост `10` сообщений; потолок частоты fold-ов `30` в час; боковая модель не задана (наследует модель сессии) — подробности в разделе «Автоматическая обрезка контекста» ниже.
106
106
 
107
107
  **Что важно знать из коробки**: ① то, что маршрутизация по намерению недоступна из коробки, — намеренное решение; включается в три шага (классификатор, кандидаты, переключатель); ② эффективное окно Auto из коробки равно 200000 — защитная планка гарантирует 0.8×окна ≥ force (150000), поэтому линия сжатия ядра (160000) всегда стоит после линии плавной передачи (150000); ③ заметнее всего из коробки троица уровней: 80k напоминает делегировать / 95k ужимает чтение / 150k сам передаёт управление (документ + сжатие) — без каких-либо настроек.
108
108
 
@@ -113,7 +113,7 @@ bash <install-dir>/skills/db-query/scripts/setup.sh
113
113
  Уровни автоматизации (`trimMode`):
114
114
 
115
115
  - **`off`** — только измерения: сэмплирование расхода и попаданий кэша продолжается; без баннера и без fold-ов.
116
- - **`advisory`** — модель сессии сворачивает сама: ей открываются инструменты `ctx_trim_fold` и `ctx_trim_status` плюс заголовок протокола.
116
+ - **`advisory`** — модель сессии сворачивает сама: ей открываются инструменты `ctx_trim_fold` и `ctx_trim_status` плюс заголовок протокола. Когда давление сессии достигает `trimAdvisoryPercent` эффективного окна, движок добавляет закреплённое напоминание свернуть контекст в виде суффикса `user/message` в конец активной поверхности сессии (не в system-заголовок dispatch-а) — повторяет сразу при переходе в critical и удаляет, когда давление опускается ниже линии.
117
117
  - **`auto`** (по умолчанию) — всё вышеперечисленное плюс автоматические fold-ы на границе простоя, тремя ступенями: ворота роста (рост > `trimGrowthTokens`, отсчитываемый от низшей точки после последнего fold-а — этот якорь сохраняет ворота взведёнными после fold-ов, фиксирующихся на высоких точках view — И непрерывный сжимаемый прирост ≥ `trimIncrementTokens`), ступень давления (`trimPressurePercent` окна контекста) и аварийная ступень (`trimEmergencyPercent` — механический fold с собственным охлаждением).
118
118
 
119
119
  Все ключи живут в разделе Настройки → dsh-switchman; значения по умолчанию — из `host/config.js`:
@@ -126,11 +126,13 @@ bash <install-dir>/skills/db-query/scripts/setup.sh
126
126
  | `trimIncrementTokens` | `25000` | Спутник ворот: непрерывный сжимаемый прирост тоже должен достичь этого размера. |
127
127
  | `trimPressurePercent` | `65` | Ступень давления: fold, когда использование view достигает этого процента окна контекста. |
128
128
  | `trimEmergencyPercent` | `95` | Аварийная ступень: принудительный механический fold (без вызова боковой модели) на этом проценте. |
129
+ | `trimAdvisoryPercent` | `65` | Линия advisory-напоминания: при достижении этой доли эффективного окна движок предлагает модели немедленно сложить контекст через `ctx_trim_fold` (только режим advisory). |
130
+ | `trimAdvisoryCriticalPercent` | `95` | Критическая линия: при её достижении напоминание повторяется сразу, минуя 10-минутный троттлинг той же полосы. |
129
131
  | `trimWindowTokens` | `0` | Эффективный лимит окна для расчёта уровней: считается от min(окно модели, лимит). `0` = следует за `wmForceTokens`. |
130
132
  | `trimProtectedTail` | `10` | Последние N сообщений никогда не сворачиваются. |
131
133
  | `trimMaxFoldsPerHour` | `30` | Потолок частоты fold-ов боковой модели за скользящий час (аварийные не в счёт). |
132
- | `trimSideModel` | не задан | Маршрут боковой модели, пишущей резюме. Пусто = унаследовать текущую модель сессии. |
133
- | `trimFoldFallbackModel` | не задан | Маршрут повторной попытки, если боковая модель резюме не сработала; pressure-fold затем деградирует до механического. Пусто = без резерва. Выбирайте маршрут с запасом по кулдаунам, риск-контролю и параллелизму. |
134
+ | `trimSideModel` | не задан | Маршрут боковой модели, пишущей резюме. Пусто = следовать provider/model сессии, не наследуя effort вызова; этот маршрут также используют ladder distillation. Effort резюме можно закрепить отдельно; без фиксации метаданные модели определяют минимальный доступный уровень reasoning, а для моделей только с переключателем вкл./выкл. выбирается off. Если reasoning не поддерживается или метаданные недоступны, effort не отправляется и сохраняется поведение модели/адаптера по умолчанию. |
135
+ | `trimFoldFallbackModel` | не задан | Маршрут повторной попытки, если боковая модель резюме не сработала; pressure-fold затем деградирует до механического. Пусто = без резерва. У вручную выбранной запасной модели fold-а независимый effort; если он не задан, применяется та же рекомендация по метаданным, что для модели резюме, а при отсутствии метаданных — умолчание самой модели. Выбирайте маршрут с запасом по кулдаунам, риск-контролю и параллелизму. |
134
136
  | `trimStateDir` | не задан | Переопределяет каталог состояния fold-ов. Пусто = `<dshHome>/.dsh-switchman/state/trim/`. |
135
137
  | `surfaceFold` | `true` | Доставляет зафиксированные fold-ы на поверхность сессии (пара событий: учёт shadow-price + replace с `surfaceOp`). OFF оставляет view только со сплайсами. |
136
138