dsh-switchman 1.11.3 → 1.11.4

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.md CHANGED
@@ -72,7 +72,7 @@ Worth installing even with a single model — watermark control and tiered verif
72
72
 
73
73
  - **Interface** — the plugin's own UI language. The dropdown in the shot sits at English — a live preview of switching; the shipped default is Auto (follows the DSH app language). Picking a language flips the whole page on the spot and is remembered after save; switch back to Auto anytime.
74
74
  - **Languages** — the languages of agent output. The scope in the shot is "Global (this profile)" (per-project works too, each reading `.switchman/lang.json`); the reply / code comments / documents dropdowns in the shot all sit at English, each displayed as "endonym (tag)" — e.g. "English (en)" — with a "current: …" status line beneath each. Leaving all three unset is fine too: asked once on first use, remembered from then on.
75
- - **Dispatch pools** — six cards in two rows of three: economy, mechanical, main on top; hard, vision, review below. Tick candidate models grouped by provider; tick "manual order" and a card becomes a numbered priority list reorderable with ↑ ↓ ×; every route can pin a thinking effort (default "follow lane"). The summary line at the top updates live — in the shot: "4/6 pools configured · 2 ranked · mode advice".
75
+ - **Dispatch pools** — six cards in two rows of three: economy, mechanical, main on top; hard, vision, review below. Tick candidate models grouped by provider; tick "manual order" and a card becomes a numbered priority list reorderable with ⤒ (Move to top), ↑, ↓, ×; every route can pin a thinking effort (default "follow lane"). The summary line at the top updates live — in the shot: "4/6 pools configured · 2 ranked · mode advice".
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).
package/README.zh.md CHANGED
@@ -72,7 +72,7 @@ dsh-switchman 是一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepse
72
72
 
73
73
  - **界面**——插件自己的界面语言。图中「自动」即跟随 DSH 应用语言;选具体语言则当场整页切换,保存后记住,随时切回「自动」。
74
74
  - **语言**——智能体产出物的语言。作用域图中为「全局(本 profile)」(也可按项目,各自读 `.switchman/lang.json`);回复 / 代码注释 / 文档三个下拉图中都定在简体中文,每项下方有「当前:…」状态行。全不设也行,首次用到问一次、记住即用。
75
- - **派发池**——六张卡片两行三列:上排轻量、机械、主力,下排高难、多模态、复审。卡片按供应商分组勾候选模型;勾上「手动序」变成编号优先列表,用 ↑ ↓ × 调顺序;每条路线可钉思考强度(默认「跟随泳道」)。顶部汇总行实时更新,图中即「已配置 4/6 池 · 排名 2 项 · 模式 建议」。
75
+ - **派发池**——六张卡片两行三列:上排轻量、机械、主力,下排高难、多模态、复审。卡片按供应商分组勾候选模型;勾上「手动序」变成编号优先列表,用 ⤒(一键登顶)、↑、↓、× 调顺序;每条路线可钉思考强度(默认「跟随泳道」)。顶部汇总行实时更新,图中即「已配置 4/6 池 · 排名 2 项 · 模式 建议」。
76
76
  - **能力排序 + 执行模式**——六池选中模型的并集按能力排序、最强在前(图中 glm-5.3 锚 S 档、glm-5.3-flash 锚 A 档),可调序、可删减;执行模式建议 / 强制(强制 = 池外模型直接拒绝)。
77
77
  - **智能体团队**——团队模式与白名单同步两个开关,默认全关;图中为开启状态,开关下方有同步状态行。
78
78
  - **上下文水位**——三档阈值(图中 80000 / 120000 / 150000)、单次读取预算(3000)、硬档行为(限流放行 / 拦截)、自动交接开关、子智能体独立上限,都在这区。底部一行命令:`/ctx-pause` 暂停干预 · `/ctx-resume` 恢复 · `/ctx-handover` 立即交接(它会把会话引导到空闲边界再压缩,结果可能要等几分钟)。
package/client.js CHANGED
@@ -845,6 +845,7 @@ window.__ModuleLoader__.load({
845
845
  '开启后按列表顺序派发(首个即首选);未开启按能力排序自动排。',
846
846
  poolManualSelected: '已选 · 派发优先序',
847
847
  poolManualAddable: '可添加',
848
+ poolMoveTop: '登顶',
848
849
  poolMoveUp: '上移',
849
850
  poolMoveDown: '下移',
850
851
  poolRemoveOne: '移除',
@@ -1113,6 +1114,7 @@ window.__ModuleLoader__.load({
1113
1114
  'When on, dispatch follows the listed order (head = first choice); when off, lanes are ordered by capability automatically.',
1114
1115
  poolManualSelected: 'Selected · dispatch priority',
1115
1116
  poolManualAddable: 'Add models',
1117
+ poolMoveTop: 'Move to top',
1116
1118
  poolMoveUp: 'Move up',
1117
1119
  poolMoveDown: 'Move down',
1118
1120
  poolRemoveOne: 'Remove',
@@ -1397,6 +1399,7 @@ window.__ModuleLoader__.load({
1397
1399
  poolManualHelp: '開啟後按清單順序派發(首個即首選);未開啟按能力排序自動排。',
1398
1400
  poolManualSelected: '已選 · 派發優先序',
1399
1401
  poolManualAddable: '可新增',
1402
+ poolMoveTop: '登頂',
1400
1403
  poolMoveUp: '上移',
1401
1404
  poolMoveDown: '下移',
1402
1405
  poolRemoveOne: '移除',
@@ -1644,6 +1647,7 @@ window.__ModuleLoader__.load({
1644
1647
  poolManualHelp: 'オンにするとリストの順序でディスパッチします(先頭=第一候補)。オフなら能力順で自動的に並びます。',
1645
1648
  poolManualSelected: '選択済み · ディスパッチ優先順',
1646
1649
  poolManualAddable: 'モデルを追加',
1650
+ poolMoveTop: '先頭へ',
1647
1651
  poolMoveUp: '上へ',
1648
1652
  poolMoveDown: '下へ',
1649
1653
  poolRemoveOne: '削除',
@@ -1875,6 +1879,7 @@ window.__ModuleLoader__.load({
1875
1879
  poolManualHelp: '켜면 목록 순서대로 디스패치합니다(맨 앞이 제1순위). 끄면 능력 순으로 자동 정렬됩니다.',
1876
1880
  poolManualSelected: '선택됨 · 디스패치 우선순위',
1877
1881
  poolManualAddable: '모델 추가',
1882
+ poolMoveTop: '맨 위로',
1878
1883
  poolMoveUp: '위로',
1879
1884
  poolMoveDown: '아래로',
1880
1885
  poolRemoveOne: '제거',
@@ -2105,6 +2110,7 @@ window.__ModuleLoader__.load({
2105
2110
  poolManualHelp: 'Ein: Der Versand folgt der gelisteten Reihenfolge (oben = erste Wahl); aus: Lanes werden automatisch nach Fähigkeit sortiert.',
2106
2111
  poolManualSelected: 'Ausgewählt · Dispatch-Priorität',
2107
2112
  poolManualAddable: 'Modelle hinzufügen',
2113
+ poolMoveTop: 'Ganz nach oben',
2108
2114
  poolMoveUp: 'Nach oben',
2109
2115
  poolMoveDown: 'Nach unten',
2110
2116
  poolRemoveOne: 'Entfernen',
@@ -2338,6 +2344,7 @@ window.__ModuleLoader__.load({
2338
2344
  poolManualHelp: 'Activado, el despacho sigue el orden de la lista (el primero es la primera opción); desactivado, los carriles se ordenan automáticamente por capacidad.',
2339
2345
  poolManualSelected: 'Seleccionados · prioridad de despacho',
2340
2346
  poolManualAddable: 'Añadir modelos',
2347
+ poolMoveTop: 'Mover al principio',
2341
2348
  poolMoveUp: 'Subir',
2342
2349
  poolMoveDown: 'Bajar',
2343
2350
  poolRemoveOne: 'Quitar',
@@ -2572,6 +2579,7 @@ window.__ModuleLoader__.load({
2572
2579
  poolManualHelp: 'Activé, le dispatch suit l’ordre affiché (la tête = premier choix) ; désactivé, les couloirs sont ordonnés par capacité automatiquement.',
2573
2580
  poolManualSelected: 'Sélectionnés · priorité de dispatch',
2574
2581
  poolManualAddable: 'Ajouter des modèles',
2582
+ poolMoveTop: 'Placer en tête',
2575
2583
  poolMoveUp: 'Monter',
2576
2584
  poolMoveDown: 'Descendre',
2577
2585
  poolRemoveOne: 'Retirer',
@@ -2806,6 +2814,7 @@ window.__ModuleLoader__.load({
2806
2814
  poolManualHelp: 'Attivo, il dispatch segue l’ordine elencato (il primo della lista = prima scelta); spento, le corsie vengono ordinate per capacità automaticamente.',
2807
2815
  poolManualSelected: 'Selezionati · priorità di dispatch',
2808
2816
  poolManualAddable: 'Aggiungi modelli',
2817
+ poolMoveTop: 'Porta in cima',
2809
2818
  poolMoveUp: 'Sposta su',
2810
2819
  poolMoveDown: 'Sposta giù',
2811
2820
  poolRemoveOne: 'Rimuovi',
@@ -3040,6 +3049,7 @@ window.__ModuleLoader__.load({
3040
3049
  poolManualHelp: 'Ligado, o despacho segue a ordem listada (o primeiro = primeira escolha); desligado, as faixas são ordenadas por capacidade automaticamente.',
3041
3050
  poolManualSelected: 'Selecionados · prioridade de despacho',
3042
3051
  poolManualAddable: 'Adicionar modelos',
3052
+ poolMoveTop: 'Mover para o topo',
3043
3053
  poolMoveUp: 'Mover para cima',
3044
3054
  poolMoveDown: 'Mover para baixo',
3045
3055
  poolRemoveOne: 'Remover',
@@ -3274,6 +3284,7 @@ window.__ModuleLoader__.load({
3274
3284
  poolManualHelp: 'Включено — диспетчеризация идёт по списку (голова списка = первый выбор); выключено — полосы упорядочиваются по силе автоматически.',
3275
3285
  poolManualSelected: 'Выбрано · приоритет диспетчеризации',
3276
3286
  poolManualAddable: 'Добавить модели',
3287
+ poolMoveTop: 'В начало',
3277
3288
  poolMoveUp: 'Выше',
3278
3289
  poolMoveDown: 'Ниже',
3279
3290
  poolRemoveOne: 'Убрать',
@@ -4613,6 +4624,7 @@ window.__ModuleLoader__.load({
4613
4624
  onToggleManual,
4614
4625
  onSetEffort,
4615
4626
  onMove,
4627
+ onMoveTop,
4616
4628
  onRemove,
4617
4629
  onSelectAll,
4618
4630
  onClear,
@@ -4774,6 +4786,20 @@ window.__ModuleLoader__.load({
4774
4786
  h(
4775
4787
  'div',
4776
4788
  { style: STYLE.rankActions },
4789
+ h(
4790
+ 'button',
4791
+ {
4792
+ type: 'button',
4793
+ onClick: () => {
4794
+ onMoveTop(index);
4795
+ },
4796
+ disabled: !editable || index === 0,
4797
+ title: t('poolMoveTop'),
4798
+ 'aria-label': t('poolMoveTop'),
4799
+ style: STYLE.iconButton,
4800
+ },
4801
+ '⤒',
4802
+ ),
4777
4803
  h(
4778
4804
  'button',
4779
4805
  {
@@ -5268,6 +5294,18 @@ window.__ModuleLoader__.load({
5268
5294
  })));
5269
5295
  }
5270
5296
 
5297
+ /** Manual order: move the route at index to the head of the
5298
+ * pool in one step (boundary-guarded: a no-op when already first). */
5299
+ function movePoolRouteToTop(field, index) {
5300
+ const pool = values[field];
5301
+ if (index <= 0 || index >= pool.length) return;
5302
+ const next = [pool[index], ...pool.slice(0, index), ...pool.slice(index + 1)];
5303
+ edit(field, next.map((route) => ({
5304
+ provider: route.provider,
5305
+ model: route.model,
5306
+ })));
5307
+ }
5308
+
5271
5309
  /** Manual order: remove the route at index. */
5272
5310
  function removePoolRoute(field, index) {
5273
5311
  const next = [...values[field]];
@@ -6383,6 +6421,9 @@ window.__ModuleLoader__.load({
6383
6421
  onMove: (index, delta) => {
6384
6422
  movePoolRoute(field, index, delta);
6385
6423
  },
6424
+ onMoveTop: (index) => {
6425
+ movePoolRouteToTop(field, index);
6426
+ },
6386
6427
  onRemove: (index) => {
6387
6428
  removePoolRoute(field, index);
6388
6429
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-switchman",
3
- "version": "1.11.3",
3
+ "version": "1.11.4",
4
4
  "description": "Autonomous Agent Teams doctrine for the four shipped DeepSeek Harness presets, plus language preferences, dispatch pools with model ranking, and context watermark control.",
5
5
  "license": "MIT",
6
6
  "keywords": [