# dsh-agent-lang

[![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)

[简体中文](README.md) | [English](README_EN.md) | 日本語 | [한국어](README_KO.md)

> エージェント言語制御 —— [DeepSeek Harness (DSH)](https://www.npmjs.com/package/@deepseek-ai/dsh) のモデル出力における**ツール説明・モデルの思考・回答**の3チャネルをそれぞれ設定可能:GUI言語に従う / 指定言語で強制 / オフ。ワンクリックで全同期・全オフにも対応。デフォルトはツール説明チャネルのみ有効です。

## なぜ必要か

DSH のツール呼び出しには必須の `description` 引数があり、それがそのまま UI の呼び出しカードラベルとして表示されます。しかしツールスキーマ内のこのフィールドの説明は英語の文言と英語の例("5-10 words … Examples: 'Count TODO markers…'")で書かれているため、GUI の言語に関係なくモデルは常に英語で書いてしまいます。

本プラグインは**プロンプト側だけ**を変更します。グローバルな動的 runtime-context ディレクティブを 1 件登録し、現在の GUI 表示言語を伝えて、すべてのツール呼び出しの description をその言語で書くよう指示します。preset・persona・ツールスキーマは一切変更しません(それらはアップグレードで上書きされるデプロイ資産です)。

## 対応範囲

| モード / preset | 対応 | 備考 |
|---|---|---|
| `standard` | ✅ | |
| `ptc`(旧称 `code`) | ✅ | `run_code` の `description` も対象 |
| `cordis`(Creation モード) | ✅ | |
| ユーザー preset(`ptc-cordis`、dsh-gitbash-shell の gitbash 系を含む) | ✅ | ホスト面での登録により、封鎖されていないすべての preset に適用 |
| `minimal` | ❌(設計上) | minimal は complete な persona を持ち runtime context を抑制するため、プロンプトが完全に封鎖されています。プロンプトレベルのプラグインでは侵入不可能です |

## 仕組み

- **検出順序**(auto モード):設定 → 全般 → 言語での**明示的な選択** > ブラウザーから報告された現在の言語。**英語も通常のターゲット言語です**(v0.3.0 以降)——モデルによっては思考・回答で多言語が混在するため、英語の明示的指定も同様に補正します。完全に未検出の場合のみ注入しません。
- **注入チャネル**:`systemPrompt.context()` —— サンドボックス/承認ポリシーと同じ、リクエストごとに再評価される runtime-context スナップショット。リクエスト末尾近くに描画されるため、ツールスキーマの英語ガイダンスを新しい情報が上書ちます。GUI 言語の切り替えは**次のリクエストから即時反映**されます。
- **設定カード**:設定 → プラグイン に本プラグインのカードが現れます(ホスト側でサービス中の設定名前空間とカードが自動ペアリング)。動作切り替え(GUI言語に従う / BCP 47 タグによる強制(`zh`、`ja` など)/ オフ)と検出チェーンの表示が可能です。

## インストール

```bash
dsh plugin --profile web add dsh-agent-lang
```

ピュア JS、ビルドなし、インストール依存なし(schemastery は peer として profile 経由で解決)。インストール後、DSH を再起動してください。

## 検証

1. インストールして DSH を再起動し、**一度ハードリフレッシュ**(⌘/Ctrl+Shift+R、下記の既知の境界 #1 を参照);
2. `~/.dsh/settings.yaml` に `agent-lang:` セクション(`uiLocale`)が現れる;
3. minimal 以外の任意のモードで新規セッションを実行 → ツール呼び出しカードの description が GUI 言語になる;
4. 設定 → 全般 → 言語 を切り替える → 次のリクエストから description が追随;
5. 設定 → プラグイン → ツール説明言語カードで動作を切り替えテスト。

## 既知の境界

- **新規インストール/更新後の初回起動はハードリフレッシュが一度必要**(2026-08-31 実機検証):初回ページロードがクライアントモジュールテーブルの再構築と重なると、新規パッケージが一時的に除外される場合があります(設定カードが出ないが、`settings.yaml` への報告は残る)。ハードリフレッシュで復旧。通常の再起動では再現しません。
- **minimal モード**:プロンプトが封鎖されているため影響しません(上表参照)。
- **ブラウザーページがない場合**(純 CLI デプロイなど):検出チェーンは「明示的な選択」のみ。設定で言語を選択したことがなければ注入しません。
- **複数ブラウザー/リモートページ**:GUI 言語はグローバルの単一値で、最後に開いたページの報告が優先されます。
- サブエージェント / workflow のモデルにも同じディレクティブが見えます(それらの description も UI に表示されるため、意味的に一貫しています)。

## ライセンス

MIT
