dsh-switchman 1.11.6 → 1.11.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +36 -31
- package/README.es.md +36 -31
- package/README.fr.md +36 -31
- package/README.it.md +36 -31
- package/README.ja.md +36 -31
- package/README.ko.md +36 -31
- package/README.md +37 -32
- package/README.pt.md +36 -31
- package/README.ru.md +36 -31
- package/README.zh-TW.md +36 -31
- package/README.zh.md +36 -31
- package/client.js +355 -26
- package/cordis.patch.yml +10 -10
- package/host/config.js +64 -33
- package/host/context-trim/index.js +539 -60
- package/host/context-trim/state.js +3 -2
- package/host/context-trim/surface.js +5 -1
- package/host/context-watch.js +12 -7
- package/host/intent.js +41 -4
- package/host/lang.js +4 -2
- package/host/ptc-bindings.js +510 -0
- package/host/ptc-guard.js +9 -1
- package/host/routes.js +110 -34
- package/host/teams.js +61 -15
- package/host/vision.js +24 -3
- package/index.js +5 -2
- package/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -12,30 +12,27 @@
|
|
|
12
12
|
|
|
13
13
|
DSHで長く作業していると、悩みが2つ出てくる。1つはセッションの肥大化。履歴がコンテキストを数十万トークンまで膨らませ、モデルは忘れ始め、遅くなり、高くつき、手動の /compact は細部を失う。もう1つは主力モデルが何でも自分でやること。ファイルを追い、テストを回し、データを突き合わせる——その大半は実は安いモデルに任せるべき仕事だ。
|
|
14
14
|
|
|
15
|
-
dsh-switchman は [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH
|
|
15
|
+
dsh-switchman は [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)のプラグインだ。入れても主モデルは引き続き自分で作業する——ただし以前より賢く:軽い雑務は安いレーンへ丸投げし、急ぎや難物は意図ルーティングが適材のモデルへ着地させ、本当に主モデルの出番となるところだけ自分の手を動かす;余分は削ぎ落とし、本質だけを残す——消化済みの会話履歴はコンパクトな要約へ折り畳まれ、水位計が常に出納を見張って、コンテキストは軽装のまま;手が回らなくなれば常駐のチームメイトを呼んで共有タスクボードで分担させ、自分は指揮と検収へ回る。新しいモデルではない。DSHに取り付けるディスパッチ規程と設定ページであり、9つのことを行う:
|
|
16
16
|
|
|
17
|
-
**1.
|
|
17
|
+
**1. 自動コンテキストトリム:セッションは長くなるが、コストは横ばいのまま。** 手動の `/compact` は人間を待つし、細部を失い、ベンダーのプロンプトキャッシュも突き抜ける。トリムエンジンはその全部を自動化する:消化し終えた会話区間はアイドル境界でコンパクトな決定論的サマリへ折り畳まれ(執筆はサイドモデル;緊急圧力下ではモデルなしの機械的折り畳み)、以後すべての送信リクエストは折り畳み状態から再構築される——サマリブロックが旧区間の代役を務め、活動尾部は一字一句そのまま。保存されたセッションログは一バイトも書き換えず、ストリーミングの最中に手を出すこともない。折り畳みは追記のみで再構築は決定論的だから、折り畳みの間は直列化プレフィックスがバイト単位で不変で、ベンダーキャッシュも当たり続ける。内部障害はすべて fail-open で透過パススルーへ退避——壊れたリクエストは決して出さない。全自動の3段階(成長ゲート/圧力/緊急)に加え、モデル自身が折り畳む advisory 段階もある——機構の詳細は末尾の「自動コンテキストトリム」の節へ。
|
|
18
18
|
|
|
19
|
-
**2.
|
|
19
|
+
**2. コンテキスト水位:長いセッションを破裂させない。** 毎ターンリアルタイムでセッショントークンを数え、3本の水位線が段階的に締め上げる:80k(soft、調整可)は「そろそろ委譲を」、100k(hard)は1回の読み取り予算を引き締めて収束へ導き、200k(force)で自動引き継ぎ——引き継ぎドキュメントを書き(追加型のセッションログ自体が完全なバックアップ)、コンテキストを圧縮し、セッションを起こして継続する。タスクは切れない。引き継ぎの瞬間に走っているバックグラウンドのサブエージェントも失われない:id・タスク・レポートパスを引き継ぎドキュメントに書き込み、再開したセッションはどこでレポートを受け取るか分かっていて、同じ仕事を二度投げない。各サブエージェントも独立のハード上限を持ち、到達したら HANDOFF サマリを書いて退場する。水位が読むのはトリム後の view——モデルが実際に見るもの——なので、激しく折り畳まれたセッションが高水位に釘付けされることはない。自動介入が合わなければ:`/ctx-pause` で全動作を停止(計測は継続)、`/ctx-resume` でいつでも復帰——再起動後も勝手に戻ってくる。`/ctx-handover` は満水位を待たず、同じ引き継ぎをオンデマンドで起こす。
|
|
20
20
|
|
|
21
|
-
**3.
|
|
21
|
+
**3. 意図ルーティング:メッセージが入ると、モデルが自然に持ち場に着く。** セッションに「Auto(意図ルーティング)」を選ぶと、ユーザーメッセージの毎一件をまず分類器の小モデルが型判定し、最も適した候補へ着地させる——各候補には一行の能力メモが付き、判定の参考になる。判断はそのターンで固定:信頼度が足りない、またはキャッシュウィンドウがまだ開いている間は現行モデルを維持し(プロンプトキャッシュが効き続ける)、信頼度が十分か現行モデルが候補にいないときだけ切り替わる。切替は呼び出し層で静かに完了し、セッションに「モデルを切替」のノイズを残さない。入力欄上のチップが現在のルートと信頼度をリアルタイム表示。分類器には決定系の小モデルも汎用チャットモデルも使え、候補・閾値・キャッシュウィンドウはいつでも設定ページで調整できる。
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
- **サブエージェントモデルのホワイトリスト同期**——DSH には「エージェントにサブエージェントのモデル選択を許可する」認可リストがある:プールで選んだのに認可されていないルートは、名指しでの発令が拒否される(チームモードでは ⚠ 表示)。このトグルを入れると、6プールの和集合がまるごとそのリストへ書き込まれる——switchman が唯一の情報源になり、二重管理は不要。リストは「新規セッション」単位のスナップショットで効き、同期はそれ以降に開いたセッションにだけ効く。
|
|
23
|
+
**4. Agent Teams:単独作業からチーム運用へ。** 既定はオフ——インストール直後は軽量なサブエージェント委譲のまま、チームは望むときに。設定ページの独立トグル二つ:**エージェントチーム** を入れるとチーム規程(デフォルト委譲+段階的検証+共有タスクボードの規律)を注入し、DSH の Agent Teams を自動で有効化——主モデルは常駐のチームメイトを引け(`spawn_teammate`)、共有タスクボードに仕事を置け(`team_task_*`)、チームメイトとメッセージを交わせる。チームを組むべき場面は規律で決まる:並列化できる独立サブタスク、量が多く自己完結した作業、主コンテキスト水位が高い、役割分離の必要——単発の一点調査は引き続きサブエージェントへ。オフに戻せばチーム条項は跡形なく消え、実行中のセッションからツールを引き上げることもない。**サブエージェントモデルのホワイトリスト同期** は6プールの和集合を丸ごと DSH の認可ホワイトリストへ書き込む——switchman が唯一の情報源になり、二重管理は不要(新規セッション単位のスナップショットで効く)。
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
**5. 6つのディスパッチプール:仕事に合ったモデルを。** economy(小口の雑務のバッチ)、mechanical(テンプレート化された書き換え)、main(日常のコーディング)、hard(難問推論と大規模リファクタリング)、vision(画像)、review(独立検証)。設定ページで候補にチェックを付け、優先順を決め、S/A/B/C のグレードを付け、さらにルートごとに思考強度をピン留めできる——強度のドロップダウンはそのモデルが実際に対応するレベルから立ち上がり、汎用の3段ではない。主モデルの毎ターンのプロンプトには必ず `[SWITCHMAN:POOLS]` 推薦表が載り、表に従って投げる。実行モードは3態:オフ / アドバイス / 強制(強制=プール外のモデルは即拒否)。
|
|
27
26
|
|
|
28
|
-
**
|
|
27
|
+
**6. 言語設定:一度聞けば、ずっと守る。** 返信・コードコメント・ドキュメントの3言語にそれぞれドロップダウンが1つ。スコープはグローバルまたはプロジェクト単位(`.switchman/lang.json`)。未設定のままでもよい——初回使用時に DSH インターフェースの言語で一度だけ尋ね、覚えれば以後すべてのセッションが守る。
|
|
29
28
|
|
|
30
|
-
**
|
|
29
|
+
**7. インターフェース言語:プラグイン自身もあなたの言葉で。** 設定ページ最上部の「インターフェース」領域にある「インターフェース言語」ドロップダウン(設定キー `uiLocale`):自動(DeepSeek Harness アプリの言語に追従。出荷時既定は簡体字中国語)または内蔵のインターフェース言語から任意に選択——選択肢は常にその言語の原語名のまま、翻訳しない。切り替わるのはプラグイン自身のインターフェース(バッジ・ホームパネル・設定ページ)だけで、DSH アプリの言語は動かさない:選択はその場でプレビュー、再起動不要、保存後に記憶し次回起動時に復元、失敗時はすべてアプリの言語へフォールバックする。辞書はすべてプラグインバンドルに内蔵、ダウンロード不要。
|
|
31
30
|
|
|
32
|
-
**
|
|
31
|
+
**8. 段階的検証:直したら必ず検査する。** 20行超の変更は tester へ。300行超、またはコア / セキュリティ / データ整合性に触れる変更は、さらに reviewer の独立再審へ。再審モデルは「その diff を書いたエージェント」のモデルを錨に選び、極力避ける。プール内で避けきれない場合は、結論の中で DOWNGRADED と宣言される。「チームは使うな」の一言で即座に単独へ戻る。
|
|
33
32
|
|
|
34
|
-
**
|
|
33
|
+
**9. `/vision`:テキスト専用モデルでも画像を扱える。** 主力モデルが画像を読めないとき、DSH は画像付きメッセージを入口で拒否する。画像を貼って `/vision この画像のどこが悪い` と打てば、画像は vision プールのモデルへ渡され、結論は現在のセッションに戻る。入力欄の上には「現在のモデルは画像を読めません」の事前表示が出る。画像を直接送って拒否されたら、自動で `/vision` に書き換えて再送するので手直しは不要。vision プールが未設定ならコマンドは拒否し、設定への案内を出す。
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
モデルが1つでも入れる価値はある——水位制御と段階的検証はモデルの数と無関係で、単一モデルの長いセッションも同じく恩恵を受ける。
|
|
35
|
+
モデルが1つでも入れる価値はある——自動トリム・水位制御・段階的検証はモデルの数と無関係で、単一モデルの長いセッションも同じく恩恵を受ける。意図ルーティングは複数のモデル候補があって初めて意味を持つので、戦力を増やすまではオフのままで。
|
|
39
36
|
|
|
40
37
|
## 同梱スキル
|
|
41
38
|
|
|
@@ -75,7 +72,7 @@ dsh-switchman は [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-har
|
|
|
75
72
|
- **ディスパッチプール**——六枚のカードが三列二段(上段 economy・mechanical・main、下段 hard・vision・review)。カードはプロバイダーごとに候補モデルにチェックを付ける。「手動順」にチェックすると番号付きの優先リストになり、↑ ↓ × で並べ替える。各ルートには思考強度をピン留めできる(既定「レーンに追従」)。最上部の集計行はリアルタイムに更新され、図では「4/6 プール構成済み ・ 順位 2 件 ・ モード アドバイス」。
|
|
76
73
|
- **能力順位 + 実行モード**——6プールの選択モデルの和集合を能力順に並べ、最強を先頭に(図では glm-5.3 を S、glm-5.3-flash を A に錨付き)。並べ替え・削減は自由。実行モードはアドバイス / 強制(強制=プール外のモデルを即拒否)。
|
|
77
74
|
- **エージェントチーム**——チームモードとホワイトリスト同期の2つのトグル。既定は両方オフ。図ではオンで、トグルの下に同期状態行がある。
|
|
78
|
-
- **コンテキスト水位**——3段の閾値(図で 80000 /
|
|
75
|
+
- **コンテキスト水位**——3段の閾値(図で 80000 / 100000 / 200000)、1回の読み取り予算(3500)、hard 段の挙動(絞って通す / ブロック)、自動引き継ぎトグル、サブエージェントの独立上限——すべてこの領域にある。最下部のコマンド行:`/ctx-pause` 介入を一時停止 ・ `/ctx-resume` 再開 ・ `/ctx-handover` すぐ引き継ぎ(セッションをアイドル境界まで導いてから圧縮するため、結果には数分かかることがある)。
|
|
79
76
|
- **意図認識**——マスタートグル、分類器用小型モデルルート、分類器タイプ(auto / decision / chat)、独立候補リスト(各項目に一行の能力説明)、キャッシュウィンドウ / 信頼度しきい値 / 分類タイムアウト / 履歴予算、任意のフォールバックモデル。有効にするとモデルセレクターに「自動(意図認識)」エントリが現れ、入力欄の上に現在のルーティング先モデルと信頼度の chip が表示される。
|
|
80
77
|
|
|
81
78
|
4. **確認**——セッションヘッダーに ⚡「自律チーム」バッジ(隣の ◇ に現在セッションのモデル)。あるいはモデルに「あなたのシステムプロンプトの最終段落の見出しは何か」と尋ねる——答えに dsh-switchman の規程が出てくれば正しい。
|
|
@@ -92,19 +89,19 @@ bash <インストールディレクトリ>/skills/db-query/scripts/setup.sh
|
|
|
92
89
|
|
|
93
90
|
以下は新規インストール直後の全デフォルト値(権威ソース:`host/config.js` の zod スキーマ)。
|
|
94
91
|
|
|
95
|
-
**インターフェースと言語**:`uiLocale` = `auto
|
|
92
|
+
**インターフェースと言語**:`uiLocale` = `zh`(簡体字中国語。`auto` は DSH アプリの言語に追従)、`langScope` = `project`、`langConversation` = `zh-CN`、`langComments/Docs` = 空(出荷時既定。空にした場合は初回のセッションで一度尋ねて記憶。コメントとドキュメントの言語は会話の言語に追従)。
|
|
96
93
|
|
|
97
94
|
**ディスパッチプール**:6本のレーン(economy/mechanical/main/hard/vision/review)の候補はすべて空(=システム既定のモデルを使い、介入しない)。手動順と effort のピン留めはすべてオフ/空。`dispatchEnforce` = `advice`(アドバイスのみで強制はしない)。
|
|
98
95
|
|
|
99
|
-
**コンテキスト水位**:soft `80000` / hard `
|
|
96
|
+
**コンテキスト水位**:soft `80000` / hard `100000` / force `200000` トークン。1回の読み取り予算 `3500`。予算超過時の挙動 `cap`(切り詰め+警告)。`wmAutoHandover` = オン(force 段で引き継ぎドキュメント作成+圧縮を自動実行)。サブエージェントのハード上限 = オン(200k を共有)。
|
|
100
97
|
|
|
101
|
-
**Agent Teams**:`teamsMode` =
|
|
98
|
+
**Agent Teams**:`teamsMode` = オン。`syncWhitelist` = オン(両者は互いに独立)。
|
|
102
99
|
|
|
103
|
-
**意図認識**(既定では利用不可。分類器+候補最低1つ+マスタートグルのオンが必要):`intentEnabled` = オフ(オフの間は Auto エントリが隠れ、Auto を選んでいたセッションはフォールバックチェーンへ流れる)。分類器ルートは未設定。分類器タイプは `chat`。候補リストは空(プリセット分類はモデルを埋めないとルーティングに参加しない)。キャッシュウィンドウ `300` 秒 / 切替信頼度 `80` / 分類タイムアウト `60000` ms。履歴 `6` 件 / `2400` 文字。`intentContextWindow` = `
|
|
100
|
+
**意図認識**(既定では利用不可。分類器+候補最低1つ+マスタートグルのオンが必要):`intentEnabled` = オフ(オフの間は Auto エントリが隠れ、Auto を選んでいたセッションはフォールバックチェーンへ流れる)。分類器ルートは未設定。分類器タイプは `chat`。候補リストは空(プリセット分類はモデルを埋めないとルーティングに参加しない)。キャッシュウィンドウ `300` 秒 / 切替信頼度 `80` / 分類タイムアウト `60000` ms。履歴 `6` 件 / `2400` 文字。`intentContextWindow` = `250000`。
|
|
104
101
|
|
|
105
|
-
**コンテキストトリム**:`trimEnabled` = オン;`trimMode` = `auto
|
|
102
|
+
**コンテキストトリム**:`trimEnabled` = オン;`trimMode` = `advisory`(通知+fold ツールでモデルが自ら折り畳む。完全自動は `auto`);成長ゲート `22500` + インクリメント `45000` トークン;圧力 `45%` / 緊急 `90%`;advisory 通知 `50%` / `80%`;保護テール `6` 件;fold ペース上限は毎時 `30` 回;サイドモデルは未設定(セッションモデルを継承)——詳細は下の「自動コンテキストトリム」節で。
|
|
106
103
|
|
|
107
|
-
**初期状態のポイント**:① 意図認識が既定で使えないのは意図的な設計で、有効化は3ステップ(分類器、候補、トグル)。② Auto の実効ウィンドウは既定で
|
|
104
|
+
**初期状態のポイント**:① 意図認識が既定で使えないのは意図的な設計で、有効化は3ステップ(分類器、候補、トグル)。② Auto の実効ウィンドウは既定で 250000——ガードレールにより 0.8×ウィンドウ ≥ force 段(200000)が保証され、コア圧縮線(200000)はスムーズ引き継ぎ線(200000)上に位置する。③ 既定でいちばん体感できるのは水位の3点セット:80k で委譲を促し、100k で読み取りを収束させ、200k で自動引き継ぎ(文書作成+圧縮)。設定は一切不要。
|
|
108
105
|
|
|
109
106
|
## 自動コンテキストトリム
|
|
110
107
|
|
|
@@ -113,23 +110,25 @@ bash <インストールディレクトリ>/skills/db-query/scripts/setup.sh
|
|
|
113
110
|
自動化レベル(`trimMode`):
|
|
114
111
|
|
|
115
112
|
- **`off`**——計測のみ:使用量とキャッシュヒットのサンプリングは動作;バナーなし、fold なし。
|
|
116
|
-
- **`advisory
|
|
117
|
-
- **`auto
|
|
113
|
+
- **`advisory`**(既定)——セッションモデルが自ら fold する:`ctx_trim_fold` と `ctx_trim_status` のツールとプロトコルヘッドを公開。セッション圧力が実効ウィンドウの `trimAdvisoryPercent` に達すると、エンジンは一度限りの固定 fold 催促を `user/message` サフィックスとしてライブの session surface の末尾に追加し(dispatch の system ヘッドは変更しません)、critical へのエスカレーションで即再通知し、圧力が線を下回ると prune します。圧力が臨界線に達すると、エンジン自身が機械的な救済 fold を 1 回実行します(90 秒クールダウン、`trimCriticalRelief` = オン)。
|
|
114
|
+
- **`auto`**——advisory のすべてに加え、アイドル境界での自動 fold が3段階で動く:成長ゲート(前回の折り返し後の低点から測定した成長 > `trimGrowthTokens`——高位で折り返してもゲートが有効であり続けるためのアンカー——かつ連続圧縮可能インクリメントが `trimIncrementTokens` 以上)、圧力段(コンテキストウィンドウの `trimPressurePercent`)、緊急段(`trimEmergencyPercent`——独自クールダウン付きの機械 fold)。
|
|
118
115
|
|
|
119
116
|
すべてのキーは「設定 → dsh-switchman」にあり、既定値は `host/config.js` 由来:
|
|
120
117
|
|
|
121
118
|
| キー | 既定値 | 意味 |
|
|
122
119
|
| --- | --- | --- |
|
|
123
120
|
| `trimEnabled` | `true` | マスタースイッチ。OFF で fold とメトリクスを完全停止(リスナーは純パススルーに退化)。 |
|
|
124
|
-
| `trimMode` | `
|
|
121
|
+
| `trimMode` | `advisory` | `off` 計測のみ / `advisory` モデル駆動 fold / `auto` システム駆動 fold。 |
|
|
125
122
|
| `trimGrowthTokens` | `22500` | 成長ゲート:前回の fold 以降にアウトバウンド view がこれだけ増えたら fold。 |
|
|
126
|
-
| `trimIncrementTokens` | `
|
|
127
|
-
| `trimPressurePercent` | `
|
|
128
|
-
| `trimEmergencyPercent` | `
|
|
129
|
-
| `trimAdvisoryPercent` | `
|
|
130
|
-
| `trimAdvisoryCriticalPercent` | `
|
|
123
|
+
| `trimIncrementTokens` | `45000` | ゲートの同伴条件:連続圧縮可能インクリメントもこの規模に達する必要あり。 |
|
|
124
|
+
| `trimPressurePercent` | `45` | 圧力段:view 使用量がコンテキストウィンドウのこの割合に達したら fold。 |
|
|
125
|
+
| `trimEmergencyPercent` | `90` | 緊急段:この割合で機械 fold を強制(サイドモデル呼び出しなし)。 |
|
|
126
|
+
| `trimAdvisoryPercent` | `50` | advisory 通知線:圧力が実効ウィンドウのこの割合に達すると、モデルに `ctx_trim_fold` での即時 fold を促します(advisory モードのみ)。 |
|
|
127
|
+
| `trimAdvisoryCriticalPercent` | `80` | critical 通知線:到達すると 10 分の同帯域スロットルを無視して即再通知。 |
|
|
131
128
|
| `trimWindowTokens` | `0` | ティア計算の実効ウィンドウ上限:min(モデルウィンドウ, 上限) で計算。`0` = `wmForceTokens` に追従。 |
|
|
132
|
-
| `
|
|
129
|
+
| `trimCriticalRelief` | `true` | advisory critical relief:critical 線に達するとエンジン自身が機械的(emergency 相当)fold を 1 回実行、クールダウンは 90 秒。 |
|
|
130
|
+
| — | — | trim のパーセントは入力欄のコンテキストメーターと直接比較できません:trim は最後に支払った prompt(max(view, wire))を実効ウィンドウ(上限込み)で割り、メーターは次の prompt の推定量をモデルの全ウィンドウで割った値を表示します。 |
|
|
131
|
+
| `trimProtectedTail` | `6` | 最後の N メッセージは決して fold されない。 |
|
|
133
132
|
| `trimMaxFoldsPerHour` | `30` | ローリング1時間あたりのサイドモデル fold ペース上限(緊急段は対象外)。 |
|
|
134
133
|
| `trimSideModel` | 未設定 | サマリ用サイドモデルのルート。空欄 = セッションの provider/model に追従(呼び出しの effort は継承しない);ladder distillation もこのルートを使用。サマリの effort は別途手動固定でき、未設定ならモデルメタデータから有効な reasoning レベルの最小値を選ぶ。オン/オフのみのモデルは off。reasoning 非対応またはメタデータが利用できない場合は effort を送らず、モデル/アダプターのデフォルトに委ねる。 |
|
|
135
134
|
| `trimFoldFallbackModel` | 未設定 | サマリのサイドモデルが失敗したときに折り畳みが再試行するルート。プレッシャー段でも失敗すると機械折り畳みに縮退。空欄 = フォールバックなし。手動選択した fold フォールバックモデルの effort 固定は独立。未設定ならサマリモデルと同じメタデータ基準で推奨し、メタデータがなければそのモデルのデフォルトを使用。クールダウン・リスク制御・同時実行に余裕のあるルートを推奨。 |
|
|
@@ -138,7 +137,7 @@ bash <インストールディレクトリ>/skills/db-query/scripts/setup.sh
|
|
|
138
137
|
|
|
139
138
|
**トリガーパス。** 段階チェックはアイドル境界で走り、アイドル状態イベントが届かないホストへのフォールバックとして、各モデルストリーム完了後にも走る(セッションごとに 60 秒につき 1 回の評価へスロットル)。すべての決定——fold も no-op も同様に——は、fold 状態ディレクトリ(`trimStateDir` を参照)内の `decisions.log` へ タイムスタンプ付きの 1 行の `key=value` として追記され、fold にオフラインの監査証跡を与える;行の語彙(`view-applied`、fold の決定/結果行、`surface-replace`、`surface-replace skipped reason=…`)は [docs/context-trim.md](./docs/context-trim.md) に一覧化されています。
|
|
140
139
|
|
|
141
|
-
**回線の真実と定常状態。** 決定行は `view=<n>` を持ち、応答が着地した後は `wire=<n>` も持つ——実際のプロバイダプロンプト(非キャッシュ入力 + キャッシュ読み取り + キャッシュ書き込み、ストリームの usage イベントからサンプリング)である。view の推定はメッセージ配列だけを数えるため、固定オーバーヘッド(実測 ≈ 17.3k:システムプロンプト + ツールスキーマ + persona)の分だけ常に回線より小さく読める。したがって圧力段と緊急段は `max(view, wire)` で評価し、プロンプトサイズの計測となるのは `wire` だけである。
|
|
140
|
+
**回線の真実と定常状態。** 決定行は `view=<n>` を持ち、応答が着地した後は `wire=<n>` も持つ——実際のプロバイダプロンプト(非キャッシュ入力 + キャッシュ読み取り + キャッシュ書き込み、ストリームの usage イベントからサンプリング)である。view の推定はメッセージ配列だけを数えるため、固定オーバーヘッド(実測 ≈ 17.3k:システムプロンプト + ツールスキーマ + persona)の分だけ常に回線より小さく読める。したがって圧力段と緊急段は `max(view, wire)` で評価し、プロンプトサイズの計測となるのは `wire` だけである。200k ウィンドウでは、健全なノコギリ波は fold 直後に回線 ≈ 40k ↔ 次の fold で 64–90k(ウィンドウの ≈20%–45%)を往復し、生の成長 ~45k ごとに fold 1 回、天井はウィンドウではなく圧力段によって 90k 付近に固定される。`surface-replace` 行が一度も現れないのに `view` が上昇する場合は、スキップ行(`incomplete-seqs`, `no-service`, `compaction-lock`)を読む。
|
|
142
141
|
|
|
143
142
|
**ホスト圧縮エポック。** fold の参照はメッセージ id と内容ハッシュにアンカーされるため、ホスト側の圧縮が再送履歴を置き換えると帳簿全体が一度に老化します。すべてのブロックが位置を特定できなくなり、view は元の履歴へ静かにフォールバックし(fail-open —— 決定ログには `view-applied applied=0` が記録されます)、プラグインは次のリクエストで成長ベースラインを圧縮後のビューに再アンカーします。ホスト圧縮は最後のバックストップとなるトリム層であり、プラグインの fold は単一ホストエポック内のきめ細かい作業を担います。 一部のディスパッチは、完全に凍結されたリクエスト配列やオプションオブジェクトを渡されます(現在のエージェントループは組み立て済みリクエストをディープフリーズします)。そのようなディスパッチについて、`injectView` は結果を決定ログに報告します:`nothing-to-apply`(位置特定できた fold ブロックがない——生履歴こそが view)、`in-place`/`swapped`(fold 済み view は出荷済み)、または `none`(fold は存在したが凍結されたディスパッチでは運べなかった——回線には生履歴が流れる)。**Surface replace は利用可能なときの出荷経路です**(`surfaceFold`、デフォルトで有効):直列の `agent/turn-stopping` 境界にアイドルスイープを加えた時点で、プラグインはホスト式の shadow-price 計量イベントと、`surfaceOp {op:'replace', startSeq, endSeq}` を運ぶ 1 件の `user/message` 置換イベントを追記します。`sourceEventSeqs` は影となる表面ノードをすべてカバーします——ホスト自身の圧縮と同じ機構なので、コミット済みの fold はソース層から回線へ届き、凍結ディスパッチも例外ではありません。セッションの最近のディスパッチが `none` を記録している間、プラグインは view を計測専用と扱います:水位は代わりにプロバイダ報告の集計を測り(force 段階と自動引き継ぎは働き続け)、fold サイクルはサマライザ呼び出しを空焼きせず一時停止し、トリムバナーは当該行に `wire=raw`(folds not shipping; watermark reads the tally)の印を付けます。surface 機構を持たないホスト(またはフラグが off の場合)は、まさにこの従来動作を保ちます。
|
|
144
143
|
|
|
@@ -163,6 +162,12 @@ bash <インストールディレクトリ>/skills/db-query/scripts/setup.sh
|
|
|
163
162
|
- プロトコル行(`[SWITCHMAN:LANG|POOLS|WATERMARK|TEAMS]`)は意図的に英語のままバイト安定——ローカライズしない。
|
|
164
163
|
- `npm pack --dry-run` は監査済みの 60 ファイル / ~380 kB の形状を保つこと(展開後 ~1.26 MB、`docs/` は含まれない)。
|
|
165
164
|
|
|
165
|
+
## ダウンロード
|
|
166
|
+
|
|
167
|
+
初回リリースからの npm 累計ダウンロード数です。公式の [npm downloads API](https://api.npmjs.org/) から描画し、GitHub Actions が毎日自動更新します([グラフ生成スクリプト](scripts/downloads-chart.mjs)):
|
|
168
|
+
|
|
169
|
+

|
|
170
|
+
|
|
166
171
|
## License
|
|
167
172
|
|
|
168
173
|
MIT
|
package/README.ko.md
CHANGED
|
@@ -12,30 +12,27 @@
|
|
|
12
12
|
|
|
13
13
|
DSH로 오래 일하면 귀찮은 일이 두 가지 생긴다. 첫째, 세션이 길어질수록 무거워진다. 히스토리가 컨텍스트를 수십만 토큰까지 밀어 올리면 모델은 까먹기 시작하고, 느려지고, 비싸진다. 수동 /compact 은 디테일을 잃는다. 둘째, 주력 모델이 뭐든 직접 한다. 파일을 뒤지고, 테스트를 돌리고, 데이터를 맞춰 보는 일 — 그 대부분은 사실 싼 모델에게 맡겨야 할 일이다.
|
|
14
14
|
|
|
15
|
-
dsh-switchman은 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH) 플러그인이다.
|
|
15
|
+
dsh-switchman은 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH) 플러그인이다. 설치해도 주 모델은 여전히 직접 일한다 — 다만 그저 더 현명해질 뿐: 가벼운 잡일은 값싼 차선으로 넘기고, 급한 일이나 어려운 일은 의도 라우팅이 알맞은 모델에 착지시키며, 정말 주 모델이 나설 부분만 직접 손을 쓴다; 부풀린 것은 덜어내고 본질만 남긴다 — 소화된 대화 구간은 컴팩트한 요약으로 접히고 수위계가 지출을 항상 지켜보니 컨텍스트는 늘 가벼운 채; 한 쌍의 손으로 감당하기 어려워지면 상주 팀원을 불러 공유 태스크보드에서 나눠 일하게 하고, 자신은 지휘와 검수로 물러난다. 새 모델이 아니다. DSH에 얹는 디스패치 규정과 설정 화면이며, 아홉 가지 일을 한다:
|
|
16
16
|
|
|
17
|
-
**1. 컨텍스트
|
|
17
|
+
**1. 자동 컨텍스트 트림: 세션은 길어지는데 비용은 그대로.** 수동 `/compact`는 사람을 기다리고, 디테일을 잃고, 벤더의 프롬프트 캐시까지 뚫어버린다. 트림 엔진은 이 모두를 자동화한다: 소화가 끝난 대화 구간은 유휴 경계에서 컴팩트한 결정론적 요약으로 접힌다(작성은 사이드 모델; 긴급 압박 시에는 모델 없는 기계적 접기), 이후 모든 발신 요청은 접기 상태에서 재구성된다 — 요약 블록이 옛 구간을 대신하고, 살아 있는 꼬리는 그대로 보존된다. 저장된 세션 로그는 한 바이트도 고치지 않고, 스트리밍 도중에 손대지도 않는다. 접기는 추가 전용이고 재구성은 결정론적이라, 접기 사이 직렬화 접두어는 바이트 단위로 불변이며 벤더 캐시도 계속 적중한다. 내부 장애는 모두 fail-open으로 투명 패스스루로 물러난다 — 깨진 요청은 결코 내보내지 않는다. 완전 자동 3단계(성장 게이트 / 압력 / 긴급)에, 모델이 스스로 접는 advisory 단계까지 — 메커니즘은 맨 아래 '자동 컨텍스트 트림' 절에.
|
|
18
18
|
|
|
19
|
-
**2.
|
|
19
|
+
**2. 컨텍스트 수위: 긴 세션도 터지지 않게.** 매 턴 세션 토큰을 실시간으로 세고 세 단계 수위선이 순서대로 조인다: 80k(soft, 조정 가능)은 '이제 위임할 때', 100k(hard)은 1회 읽기 예산을 조이고 마무리로 유도하며, 200k(force)은 자동 인계다 — 인계 문서를 적고(추가 전용 세션 로그가 그대로 완전한 백업이다), 컨텍스트를 압축하고, 세션을 깨워 이어 달린다. 태스크는 끊기지 않는다. 인계 순간에 돌고 있던 백그라운드 서브에이전트도 잃지 않는다: id, 태스크, 보고서 경로를 인계 문서에 적어 두어 재개된 세션은 어디서 보고를 받을지 알고 중복 발령하지 않는다. 서브에이전트마다 독립 하드 상한도 있어 도달하면 HANDOFF 요약을 쓰고 퇴장한다. 수위가 읽는 것은 트림 후 view — 모델이 실제로 보는 것 — 이라서, 접힘이 많은 세션이 높은 수위선에 못 박히지 않는다. 자동 개입이 손에 안 맞으면: `/ctx-pause`로 모든 동작을 멈추고(측정은 계속), `/ctx-resume`으로 언제든 복구 — 재시작 후에도 저절로 돌아온다. `/ctx-handover`는 만수위를 기다리지 않고 같은 인계를 직접 시작한다.
|
|
20
20
|
|
|
21
|
-
**3.
|
|
21
|
+
**3. 의도 라우팅: 메시지가 들어오면 모델이 알아서 자리를 잡는다.** 세션에 'Auto(의도 라우팅)'을 고르면 사용자 메시지 하나하나를 분류기 소형 모델이 먼저 판별해 가장 알맞은 후보에 착지시킨다 — 후보마다 한 줄 능력 메모가 붙어 판단에 참고가 된다. 결정은 그 턴에 고정된다: 신뢰도가 부족하거나 캐시 창이 아직 열어 있으면 현행 모델을 유지하고(프롬프트 캐시가 계속 먹힌다), 신뢰도가 충분하거나 현행 모델이 후보에 없을 때만 바뀐다. 전환은 호출 계층에서 조용히 끝나 세션에 '모델 전환' 소음을 남기지 않는다. 입력창 위 칩이 현재 라우트와 신뢰도를 실시간 표시. 분류기로는 결정형 소형 모델이든 범용 채팅 모델이든 다 되고, 후보·임계값·캐시 창은 언제든 설정 화면에서 조정한다.
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
- **서브에이전트 모델 화이트리스트 동기화** — DSH에는 '에이전트가 서브에이전트 모델을 고르도록 허용' 인가 화이트리스트가 있다: 풀에서 골랐지만 인가되지 않은 루트는 지명 발령이 거절된다(팀 모드에서는 ⚠ 표시). 이 토글을 켜면 6개 풀의 합집합이 통째로 그 화이트리스트에 기록된다 — switchman이 유일한 원천이 되어 이중 설정이 없어진다. 화이트리스트는 '새 세션' 스냅샷으로 적용되고, 동기화는 그 이후에 새로 연 세션에만 적용된다.
|
|
23
|
+
**4. Agent Teams: 혼자 일하던 데서 팀 운영으로.** 기본은 꺼져 있다 — 설치 직후는 가벼운 서브에이전트 위임 그대로, 팀은 원할 때 꾸린다. 설정 화면의 독립 토글 두 개: **에이전트 팀**을 켜면 팀 규정(기본 위임 + 단계별 검증 + 공유 태스크보드 규율)을 주입하고 DSH의 Agent Teams를 자동으로 켠다 — 주 모델은 상주 팀원을 뽑고(`spawn_teammate`), 공유 태스크보드에 일을 올리고(`team_task_*`), 팀원과 메시지를 주고받는다. 팀을 꾸릴 때는 명확한 규율이 있다: 병렬화 가능한 독립 서브태스크, 양이 많고 자립적인 작업, 높은 주 컨텍스트 수위, 역할 분리 필요 — 단발성 단일 조사는 여전히 서브에이전트로. 토글을 끄면 팀 조항은 흔적 없이 사라지고, 돌고 있는 세션에서 도구를 걷어 가지도 않는다. **서브에이전트 모델 화이트리스트 동기화**는 6개 풀의 합집합을 통째로 DSH 인가 화이트리스트에 기록한다 — switchman이 유일한 원천이 되어 이중 설정이 사라진다(새 세션 스냅샷 기준으로 적용).
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
**5. 6개 디스패치 풀: 일에 맞는 모델.** economy(잔일 배치), mechanical(템플릿 개작), main(일상 코딩), hard(고난도 추론과 대규모 리팩터링), vision(이미지), review(독립 검증). 설정 페이지에서 후보에 체크하고, 우선순위를 정하고, S/A/B/C 등급을 매기고, 루트별로 추론 강도를 고정할 수도 있다 — 강도 드롭다운은 그 모델이 실제 지원하는 수준에서 오고, 범용 3단이 아니다. 주 모델의 매 턴 프롬프트에는 항상 `[SWITCHMAN:POOLS]` 추천표가 실리고, 표대로 발령한다. 실행 모드는 세 가지: 끔 / 조언 / 강제(강제 = 풀 밖 모델은 즉시 거절).
|
|
27
26
|
|
|
28
|
-
**
|
|
27
|
+
**6. 언어 기본 설정: 한 번 물으면 평생 기억.** 답장, 코드 주석, 문서 세 가지 언어에 각각 드롭다운 하나. 범위는 전역 또는 프로젝트별(`.switchman/lang.json`). 안 두어도 된다 — 처음 쓸 때 DSH 인터페이스 언어로 한 번 물어보고, 기억하면 이후 모든 세션이 따른다.
|
|
29
28
|
|
|
30
|
-
**
|
|
29
|
+
**7. 인터페이스 언어: 플러그인도 당신 말을 쓴다.** 설정 페이지 맨 위 '인터페이스' 영역의 '인터페이스 언어' 드롭다운(설정 키 `uiLocale`): 자동(DeepSeek Harness 앱 언어를 따름. 출고 기본값은 중국어 간체) 또는 내장 인터페이스 언어 중 아무거나 직접 선택 — 옵션은 항상 그 언어의 원명 그대로, 번역하지 않는다. 바뀌는 건 플러그인 자신의 인터페이스(배지, 홈 패널, 설정 페이지)뿐이고 DSH 앱 언어는 건드리지 않는다: 선택 즉시 미리보기, 재시작 불필요, 저장 후 기억하고 다음 실행 때 복원, 실패 시 모두 앱 언어로 되돌아간다. 사전은 전부 플러그인 번들에 내장, 다운로드 불필요.
|
|
31
30
|
|
|
32
|
-
**
|
|
31
|
+
**8. 단계별 검증: 고치면 반드시 검사.** 20줄 넘는 변경은 tester에게. 300줄 초과, 또는 코어 / 보안 / 데이터 일관성 로직을 건드린 변경은 reviewer 독립 재검까지. 재검 모델은 '그 diff를 쓴 에이전트'의 모델을 앵커로 골라 최대한 피하고, 풀 안에서 피할 수 없으면 결론에 DOWNGRADED를 명시한다. "팀 쓰지 마" 한마디면 즉시 혼자 일하는 모드로 돌아간다.
|
|
33
32
|
|
|
34
|
-
**
|
|
33
|
+
**9. `/vision`: 텍스트 전용 모델도 이미지를 다룬다.** 주력 모델이 이미지를 못 읽으면 DSH는 이미지 포함 메시지를 입구에서 거절한다. 이미지를 붙이고 `/vision 이 이미지 어디가 잘못됐어`라고 입력하면 이미지는 vision 풀 모델에게 넘어가고 결론이 현재 세션으로 돌아온다. 입력창 위에는 '현재 모델은 이미지를 읽을 수 없음' 안내가 미리 뜬다. 이미지를 직접 보내다 거절되면 자동으로 `/vision`으로 고쳐 다시 보낸다 — 손으로 다시 할 필요 없다. vision 풀이 비어 있으면 명령은 거절하고 설정 안내를 준다.
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
모델이 하나뿐이어도 설치할 가치가 있다 — 수위 제어와 단계별 검증은 모델 수와 무관하고, 단일 모델의 긴 세션도 같은 혜택을 본다.
|
|
35
|
+
모델이 하나뿐이어도 설치할 가치가 있다 — 자동 트림, 수위 제어, 단계별 검증은 모델 수와 무관하고, 단일 모델의 긴 세션도 같은 혜택을 본다. 의도 라우팅은 모델 후보가 여럿일 때만 의미가 있으니, 전력을 늘리기 전까지는 꺼두자.
|
|
39
36
|
|
|
40
37
|
## 번들 스킬
|
|
41
38
|
|
|
@@ -75,7 +72,7 @@ dsh-switchman은 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harn
|
|
|
75
72
|
- **디스패치 풀** — 두 줄에 세 장씩 여섯 카드(위 economy/mechanical/main, 아래 hard/vision/review). 카드는 공급자별로 묶은 후보 모델에 체크. '수동 순서'에 체크하면 번호 매긴 우선 목록이 되고 ↑ ↓ ×로 순서를 정한다. 루트별로 추론 강도를 고정할 수 있다(기본 '레인 따름'). 맨 위 요약 줄은 실시간 갱신되고 그림에서는 '4/6 풀 구성됨 · 순위 2건 · 모드 조언'.
|
|
76
73
|
- **능력 순위 + 실행 모드** — 6개 풀에서 선택한 모델의 합집합을 능력순으로, 최강이 맨 앞(그림에서 glm-5.3은 S, glm-5.3-flash는 A에 고정). 순서 조정과 삭제가 가능하다. 실행 모드는 조언 / 강제(강제 = 풀 밖 모델 즉시 거절).
|
|
77
74
|
- **에이전트 팀** — 팀 모드와 화이트리스트 동기화 두 토글. 기본은 둘 다 꺼짐. 그림에서는 켜져 있고 토글 아래에 동기화 상태 줄이 있다.
|
|
78
|
-
- **컨텍스트 수위** — 3단 임계값(그림에서 80000 /
|
|
75
|
+
- **컨텍스트 수위** — 3단 임계값(그림에서 80000 / 100000 / 200000), 1회 읽기 예산(3500), hard 단계 동작(조여 통과 / 차단), 자동 인계 토글, 서브에이전트 독립 상한이 모두 이 영역에 있다. 맨 아래 명령 줄: `/ctx-pause` 개입 일시정지 · `/ctx-resume` 재개 · `/ctx-handover` 즉시 인계 문서를 작성하고 압축(세션을 유휴 경계로 이끈 뒤 압축하므로 결과까지 몇 분 걸릴 수 있다).
|
|
79
76
|
- **의도 인식** — 마스터 토글, 분류기용 소형 모델 라우트, 분류기 유형(auto / decision / chat), 독립 후보 목록(항목마다 한 줄 능력 설명), 캐시 창 / 신뢰도 임계값 / 분류 타임아웃 / 히스토리 예산, 선택적 폴백 모델. 켜면 모델 선택기에 '자동(의도 인식)' 항목이 생기고 입력창 위에 현재 라우팅 모델과 신뢰도 chip이 표시된다.
|
|
80
77
|
|
|
81
78
|
4. **확인** — 세션 헤더에 ⚡ '자율 팀' 배지(옆 ◇에 현재 세션 모델)가 뜬다. 또는 모델에게 '너의 시스템 프롬프트 마지막 단락 제목이 뭐야?'라고 물어보라 — 답에 dsh-switchman 규정이 언급되어야 한다.
|
|
@@ -92,19 +89,19 @@ bash <설치-디렉터리>/skills/db-query/scripts/setup.sh
|
|
|
92
89
|
|
|
93
90
|
다음은 새로 설치한 직후의 전체 기본값이다(권위 있는 출처: `host/config.js`의 zod 스키마).
|
|
94
91
|
|
|
95
|
-
**인터페이스와 언어**: `uiLocale` = `
|
|
92
|
+
**인터페이스와 언어**: `uiLocale` = `zh`(중국어 간체. `auto`는 DSH 앱 언어를 따름), `langScope` = `project`, `langConversation` = `zh-CN`, `langComments/Docs` = 빈 값(출고 기본값. 비우면 첫 세션에서 한 번 물어보고 기억한다. 주석과 문서 언어는 대화 언어를 따른다).
|
|
96
93
|
|
|
97
94
|
**디스패치 풀**: 여섯 레인(economy/mechanical/main/hard/vision/review)의 후보는 모두 빈 상태로 시작한다(= 시스템 기본 모델을 쓰고 개입하지 않음). 수동 순서와 effort 고정은 모두 끔/빈 값. `dispatchEnforce` = `advice`(조언일 뿐 강제하지 않음).
|
|
98
95
|
|
|
99
|
-
**컨텍스트 수위**: soft `80000` / hard `
|
|
96
|
+
**컨텍스트 수위**: soft `80000` / hard `100000` / force `200000` 토큰. 1회 읽기 예산 `3500`. 예산 초과 동작 `cap`(잘라내고 경고). `wmAutoHandover` = 켬(force 단계에서 인계 문서 작성 + 압축 자동 실행). 서브에이전트 하드 상한 = 켬(200k 공유).
|
|
100
97
|
|
|
101
|
-
**Agent Teams**: `teamsMode` =
|
|
98
|
+
**Agent Teams**: `teamsMode` = 켬. `syncWhitelist` = 켬(두 토글은 서로 독립적).
|
|
102
99
|
|
|
103
|
-
**의도 인식**(기본은 사용 불가. 분류기 + 후보 최소 1개 + 마스터 토글 켜기가 필요): `intentEnabled` = 끔(꺼져 있으면 Auto 항목은 숨겨지고, Auto를 선택해 둔 세션은 폴백 체인으로 흐른다). 분류기 라우트 미설정. 분류기 유형 `chat`. 후보 목록은 빈 상태(프리셋 분류는 모델을 채워야 라우팅에 참여). 캐시 창 `300`초 / 전환 신뢰도 `80` / 분류 타임아웃 `60000`ms. 히스토리 `6`건 / `2400`자. `intentContextWindow` = `
|
|
100
|
+
**의도 인식**(기본은 사용 불가. 분류기 + 후보 최소 1개 + 마스터 토글 켜기가 필요): `intentEnabled` = 끔(꺼져 있으면 Auto 항목은 숨겨지고, Auto를 선택해 둔 세션은 폴백 체인으로 흐른다). 분류기 라우트 미설정. 분류기 유형 `chat`. 후보 목록은 빈 상태(프리셋 분류는 모델을 채워야 라우팅에 참여). 캐시 창 `300`초 / 전환 신뢰도 `80` / 분류 타임아웃 `60000`ms. 히스토리 `6`건 / `2400`자. `intentContextWindow` = `250000`.
|
|
104
101
|
|
|
105
|
-
**컨텍스트 트림**: `trimEnabled` = 켬; `trimMode` = `
|
|
102
|
+
**컨텍스트 트림**: `trimEnabled` = 켬; `trimMode` = `advisory`(알림 + fold 도구로 모델이 스스로 접음. 완전 자동은 `auto`); 성장 게이트 `22500` + 증분 `45000` 토큰; 압력 `45%` / 비상 `90%`; advisory 알림 `50%` / `80%`; 보호 테일 `6`건; fold 케이던스 상한 시간당 `30`회; 사이드 모델 미설정(세션 모델 상속) — 자세한 내용은 아래 "자동 컨텍스트 트림" 절에서.
|
|
106
103
|
|
|
107
|
-
**기본 상태에서 알아둘 점**: ① 의도 인식이 기본으로 불가능한 것은 의도된 설계고, 세 단계로 켠다(분류기, 후보, 토글). ② Auto의 실효 창은 기본값이
|
|
104
|
+
**기본 상태에서 알아둘 점**: ① 의도 인식이 기본으로 불가능한 것은 의도된 설계고, 세 단계로 켠다(분류기, 후보, 토글). ② Auto의 실효 창은 기본값이 250000이다 — 가드레일이 0.8×창 ≥ force 단계(200000)를 보장하므로, 코어 압축선(200000)은 부드러운 인계선(200000) 바로 위에 놓인다. ③ 기본 상태에서 가장 체감되는 건 수위 3종 세트다: 80k에 위임 알림 / 100k에 읽기 수렴 / 200k에 자동 인계(문서 작성 + 압축) — 설정은 아무것도 필요 없다.
|
|
108
105
|
|
|
109
106
|
## 자동 컨텍스트 트림
|
|
110
107
|
|
|
@@ -113,23 +110,25 @@ bash <설치-디렉터리>/skills/db-query/scripts/setup.sh
|
|
|
113
110
|
자동화 수준(`trimMode`):
|
|
114
111
|
|
|
115
112
|
- **`off`** — 측정만: 사용량과 캐시 히트 샘플링은 계속 돌아간다; 배너 없음, fold 없음.
|
|
116
|
-
- **`advisory`** — 세션 모델이 스스로 fold 한다: `ctx_trim_fold`와 `ctx_trim_status` 도구와 프로토콜 헤드를 노출. 세션 압력이 실효 윈도의 `trimAdvisoryPercent`에 도달하면 엔진이 한 번만 고정하는 fold 권고를 `user/message` 접미사로 실시간 세션 surface 끝에 추가합니다(디스패치 system 헤드는 수정하지 않음) — critical로 상승하면 즉시 다시 알리고, 압력이 선 아래로 내려가면 prune합니다.
|
|
117
|
-
- **`auto`**
|
|
113
|
+
- **`advisory`**(기본값) — 세션 모델이 스스로 fold 한다: `ctx_trim_fold`와 `ctx_trim_status` 도구와 프로토콜 헤드를 노출. 세션 압력이 실효 윈도의 `trimAdvisoryPercent`에 도달하면 엔진이 한 번만 고정하는 fold 권고를 `user/message` 접미사로 실시간 세션 surface 끝에 추가합니다(디스패치 system 헤드는 수정하지 않음) — critical로 상승하면 즉시 다시 알리고, 압력이 선 아래로 내려가면 prune합니다. 압력이 임계선에 닿으면 엔진이 직접 기계 구제 fold를 한 번 실행합니다(90초 쿨다운, `trimCriticalRelief` = 켬).
|
|
114
|
+
- **`auto`** — 위의 모든 것에 더해 유휴 경계에서 자동 fold가 세 단계로 동작한다: 성장 게이트(지난 접기 후 저점부터 측정한 성장 > `trimGrowthTokens` — 높은 지점에서 접은 후에도 게이트가 계속 작동하도록 유지하는 앵커 — + 연속 압축 가능 증분이 `trimIncrementTokens` 이상), 압력 단계(컨텍스트 창의 `trimPressurePercent`), 비상 단계(`trimEmergencyPercent` — 독립 쿨다운을 가진 기계 fold).
|
|
118
115
|
|
|
119
116
|
모든 키는 설정 → dsh-switchman에 있고, 기본값은 `host/config.js` 기준이다:
|
|
120
117
|
|
|
121
118
|
| 키 | 기본값 | 의미 |
|
|
122
119
|
| --- | --- | --- |
|
|
123
120
|
| `trimEnabled` | `true` | 마스터 스위치. 끄면 fold와 메트릭이 완전히 정지한다(리스너는 순수 패스스루로 퇴화). |
|
|
124
|
-
| `trimMode` | `
|
|
121
|
+
| `trimMode` | `advisory` | `off` 측정만 / `advisory` 모델 주도 fold / `auto` 시스템 주도 fold. |
|
|
125
122
|
| `trimGrowthTokens` | `22500` | 성장 게이트: 지난 fold 이후 아웃바운드 view가 이만큼 자라면 fold. |
|
|
126
|
-
| `trimIncrementTokens` | `
|
|
127
|
-
| `trimPressurePercent` | `
|
|
128
|
-
| `trimEmergencyPercent` | `
|
|
129
|
-
| `trimAdvisoryPercent` | `
|
|
130
|
-
| `trimAdvisoryCriticalPercent` | `
|
|
123
|
+
| `trimIncrementTokens` | `45000` | 게이트 동반 조건: 연속 압축 가능 증분도 이 규모에 달해야 한다. |
|
|
124
|
+
| `trimPressurePercent` | `45` | 압력 단계: view 사용량이 컨텍스트 창의 이 백분율에 달하면 fold. |
|
|
125
|
+
| `trimEmergencyPercent` | `90` | 비상 단계: 이 백분율에서 기계 fold 강제(사이드 모델 호출 없음). |
|
|
126
|
+
| `trimAdvisoryPercent` | `50` | advisory 알림 선: 압력이 실효 윈도의 이 백분율에 도달하면 모델에게 `ctx_trim_fold`로 즉시 fold할 것을 권고(advisory 모드 전용). |
|
|
127
|
+
| `trimAdvisoryCriticalPercent` | `80` | critical 알림 선: 도달 시 10분 동일 밴드 스로틀을 우회해 즉시 재알림. |
|
|
131
128
|
| `trimWindowTokens` | `0` | 티어 계산의 유효 윈도우 상한: min(모델 윈도우, 상한)으로 계산. `0` = `wmForceTokens`를 따름. |
|
|
132
|
-
| `
|
|
129
|
+
| `trimCriticalRelief` | `true` | advisory critical relief: critical 선에 도달하면 엔진이 직접 기계적(emergency 방식) fold을 1회 수행, 쿨다운 90초. |
|
|
130
|
+
| — | — | trim 백분율은 입력창의 컨텍스트 미터와 직접 비교할 수 없습니다: trim은 마지막 실제 결제 prompt(max(view, wire))를 실효 윈도우(상한 포함)로 나누고, 미터는 다음 prompt의 추정치를 모델 전체 윈도우로 나눈 값을 표시합니다. |
|
|
131
|
+
| `trimProtectedTail` | `6` | 마지막 N개 메시지는 절대 fold되지 않는다. |
|
|
133
132
|
| `trimMaxFoldsPerHour` | `30` | 롤링 1시간당 사이드 모델 fold 케이던스 상한(비상 단계는 제외). |
|
|
134
133
|
| `trimSideModel` | 미설정 | 요약 side model 라우트. 비어 있으면 세션 provider/model을 따르며 호출의 effort는 상속하지 않음. ladder distillation도 이 라우트를 사용. 요약 effort는 별도로 수동 고정할 수 있으며, 고정하지 않으면 모델 메타데이터에서 사용 가능한 reasoning 단계 중 가장 낮은 단계를 선택. 켜기/끄기만 지원하는 모델은 off. reasoning 미지원 또는 메타데이터 없음이면 effort를 보내지 않아 모델/어댑터 기본 동작을 따름. |
|
|
135
134
|
| `trimFoldFallbackModel` | 미설정 | 요약 side model 실패 시 폴드가 재시도하는 라우트. 프레셔 단계에서도 실패하면 기계 폴드로 강등. 비어 있으면 폴백 없음. 수동으로 선택한 폴드 폴백 모델의 effort는 독립적으로 고정할 수 있으며, 미설정 시 요약 모델과 동일한 메타데이터 추천을 따르고 메타데이터가 없으면 해당 모델 기본값을 사용. 쿨다운·리스크 컨트롤·동시 실행에 여유가 있는 라우트 권장. |
|
|
@@ -138,7 +137,7 @@ bash <설치-디렉터리>/skills/db-query/scripts/setup.sh
|
|
|
138
137
|
|
|
139
138
|
**트리거 경로.** 단계 검사는 유휴 경계에서 돌아가고, 유휴 상태 이벤트가 도달하지 않는 호스트를 위한 폴백으로 각 모델 스트림 완료 후에도 돌아간다(세션당 60초에 한 번 평가로 스로틀링). 모든 결정 — fold든 no-op든 마찬가지 — 는 fold 상태 디렉터리(`trimStateDir` 참조) 안의 `decisions.log`에 한 줄의 `key=value`(타임스탬프 포함)로 추가되어 fold에 오프라인 감사 추적을 제공한다; 행 어휘(`view-applied`, fold 결정/결과 행, `surface-replace`, `surface-replace skipped reason=…`)는 [docs/context-trim.md](./docs/context-trim.md)에 정리되어 있다.
|
|
140
139
|
|
|
141
|
-
**회선의 진실과 정상 상태.** 결정 행은 `view=<n>`를 담고, 응답이 도착한 뒤에는 `wire=<n>`도 담는다 — 실제 프로바이더 프롬프트(비캐시 입력 + 캐시 읽기 + 캐시 쓰기, 스트림의 usage 이벤트에서 샘플링)이다. view 추정은 messages 배열만 세므로 고정 오버헤드(실측 ≈ 17.3k: 시스템 프롬프트 + 도구 스키마 + persona)만큼 항상 회선보다 작게 읽힌다. 따라서 압력 단계와 비상 단계는 `max(view, wire)`로 평가하며, 프롬프트 크기 측정은 `wire`뿐이다.
|
|
140
|
+
**회선의 진실과 정상 상태.** 결정 행은 `view=<n>`를 담고, 응답이 도착한 뒤에는 `wire=<n>`도 담는다 — 실제 프로바이더 프롬프트(비캐시 입력 + 캐시 읽기 + 캐시 쓰기, 스트림의 usage 이벤트에서 샘플링)이다. view 추정은 messages 배열만 세므로 고정 오버헤드(실측 ≈ 17.3k: 시스템 프롬프트 + 도구 스키마 + persona)만큼 항상 회선보다 작게 읽힌다. 따라서 압력 단계와 비상 단계는 `max(view, wire)`로 평가하며, 프롬프트 크기 측정은 `wire`뿐이다. 200k 창에서 건강한 톱니파는 fold 직후 회선 ≈ 40k ↔ 다음 fold에서 64–90k(창의 ≈20%–45%)를 오가고, 원시 성장 ~45k마다 fold가 한 번 일어나며, 상한은 창이 아니라 압력 단계에 의해 90k 근처로 고정된다. `surface-replace` 행이 한 번도 나타나지 않는데 `view`가 오르면, 스킵 행(`incomplete-seqs`, `no-service`, `compaction-lock`)을 읽어라.
|
|
142
141
|
|
|
143
142
|
**호스트 압축 에포크.** fold 참조는 메시지 id와 내용 해시에 고정되므로, 호스트 자체의 압축이 재전송 기록을 대체하면 장부 전체가 한꺼번에 노후됩니다. 모든 블록이 위치를 찾지 못하고, view는 조용히 원본 기록으로 폴백하며(fail-open — 결정 로그에 `view-applied applied=0`가 기록됨), 플러그인은 다음 요청에서 성장 기준선을 압축 후 뷰에 다시 고정합니다. 호스트 압축이 최후의 트림 계층이고, 플러그인 fold는 하나의 호스트 에포크 안에서 세밀한 작업을 담당합니다. 일부 디스패치는 완전히 동결된 요청 배열이나 옵션 객체를 건네받습니다(현재 에이전트 루프는 조립된 요청을 딥프리즈합니다). 이런 디스패치에 대해 `injectView`는 결과를 결정 로그에 보고합니다: `nothing-to-apply`(위치를 찾은 fold 블록이 없음 — 원본 기록이 곧 view임), `in-place`/`swapped`(fold된 뷰를 실어 보냄), 또는 `none`(fold가 존재했지만 동결된 디스패치는 그것을 실을 수 없음 — 회선에는 원본 기록이 흐름). **Surface replace는 사용 가능할 때의 발송 경로입니다**(`surfaceFold`, 기본값 켬): 직렬 `agent/turn-stopping` 경계에 유휴 스윕을 더한 시점에, 플러그인은 호스트 방식의 shadow-price 계량 이벤트와 `surfaceOp {op:'replace', startSeq, endSeq}`를 실은 단 한 건의 `user/message` 치환 이벤트를 덧붙입니다. `sourceEventSeqs`는 가려진 표면 노드 전부를 커버합니다 — 호스트 자체 압축이 쓰는 바로 그 메커니즘이라, 커밋된 fold는 소스 계층에서 회선까지 도달하며 동결 디스패치도 예외가 아닙니다. 세션의 최근 디스패치가 `none`을 기록하는 동안, 플러그인은 view를 계측 전용으로 취급합니다: 수위는 대신 프로바이더가 보고한 집계를 재고(force 단계와 자동 인계는 계속 동작하며), fold 사이클은 요약기 호출을 태우지 않고 일시 중지하며, 트림 배너는 해당 줄에 `wire=raw`(folds not shipping; watermark reads the tally) 표식을 붙입니다. surface 메커니즘이 없는 호스트(또는 플래그가 꺼진 경우)는 정확히 이 구동 동작을 유지합니다.
|
|
144
143
|
|
|
@@ -163,6 +162,12 @@ bash <설치-디렉터리>/skills/db-query/scripts/setup.sh
|
|
|
163
162
|
- 프로토콜 행(`[SWITCHMAN:LANG|POOLS|WATERMARK|TEAMS]`)은 의도적으로 영어 그대로 바이트 안정으로 둔다 — 현지화하지 않는다.
|
|
164
163
|
- `npm pack --dry-run`은 감사된 60 파일 / ~380 kB 형태를 유지해야 한다(~1.26 MB 해제, `docs/`는 제외된다).
|
|
165
164
|
|
|
165
|
+
## 다운로드
|
|
166
|
+
|
|
167
|
+
첫 출시 이후의 npm 누적 다운로드 수입니다. 공식 [npm downloads API](https://api.npmjs.org/)에서 그려지며 GitHub Actions가 매일 자동 갱신합니다 ([차트 스크립트](scripts/downloads-chart.mjs)):
|
|
168
|
+
|
|
169
|
+

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