# 変更履歴

- [English / 中文](./CHANGELOG.md)
- [日本語](./CHANGELOG.ja.md)
- [한국어](./CHANGELOG.ko.md)

`@hytime/dsh-thinking-effort` の公開バージョンごとの機能、修正、ユーザーへの影響を記録します。

バージョン番号は [Semantic Versioning](https://semver.org/) に従います。

## [Unreleased]

## [0.3.12] - 2026-10-31

### 互換性

- 最新のバージョンマップ上限を `0.2.3-0` に拡張しました。`0.2.1-rc.5` のプラグイン利用 API は `0.2.1-rc.4` から変わっておらず、Chat の推論本文 Slot に追加された `rawText` は本プラグインが使用しません。`0.2.2-alpha.2` でも設定コントローラー、`configForms`、`plugin-compatibility` は互換です。モデルディレクトリの利用面（`directoryFor`、store、`load`、`select`、`{ lastUsed, next }` 投影）は維持され、追加された badge/`resolveText` は公式セレクター UI のみで使われます。pi-ai の `supportsMidConvoEffort: 'withhold'` は設定可能なフィールドを増やさず、各ゲートの offer 集合は 19/4/7/1/0、プラグインの 18 フィールドも引き続き利用できます。ロケールに ja/es/fr/de/ru/pt が追加され、本プラグインは登録済みの ja を重複登録しません。
- DSH 0.2.2-alpha.2 のモデル選択契約に対応しました。`agent/request` では推論強度を変更できなくなったため、`agent.model.select()` を提供する Host では `agent/created` 時に Subagent の既定強度を記録し、旧 Host では `agent/request` をフォールバックとして使用します。Cordis peer 範囲に DSH 0.2.2-alpha.2 が使う `4.0.6-alpha.1` も含めました。
- pi-ai の route-level 既定値は `defaultContextWindow` が 262144 から 1000000、`defaultMaxTokens` が 32768 から 128000 に変わりました。本プラグインの編集対象はモデルに明示された `contextWindow` のみで、これらのルート既定値を設定へ書き戻しません。

## [0.3.11] - 2026-10-20

### 修正

- 親セッションから継承したレベルが既に含まれるリクエストで、Subagent の既定レベルが無視されていた問題を修正しました。従来は既存のレベルをすべて明示指定とみなしてそのまま返していたため、親セッションでレベルが選ばれ、同じルートを使う Subagent は設定値を使いませんでした。既定レベルが未設定の場合は引き続きリクエストに手を加えません。

### ドキュメント

- 「制限事項」に、レベルの値がトークン予算とは限らない旨を追記しました。ゲートウェイによってはプロンプト指示として扱い、`high` / `max` / `xhigh` を同じ挙動に畳み込み、`medium` を何も述べないものとして扱い、パラメーターが無い場合に独自の既定値へフォールバックします。そのようなゲートウェイでは、`off` に `none` を入れて初めて思考が無効になります。

## [0.3.10] - 2026-10-14

### 修正

- 公開セッション投影を提供するホストでは、モデル選択の投影が一時的に欠けても確定済みの選択を保持します。Composer が全体の既定モデルに戻って推論段階が切り替わり、段階操作が別のモデルに送信される問題を修正しました。明示的なモデル切り替えは即時に反映されます。

## [0.3.9] - 2026-10-09

### 変更

- 「モデル能力と段階」パネルは保存後にページ上部へ強制スクロールしなくなりました。保存がトリガーする再読み込みで現在のモデル一覧をマウントしたまま保つため（ローディングプレースホルダーは初回読み込み時、まだ何も読み込まれていない場合のみ表示）、スクロール位置と編集済みの行がその場に留まります。
- 成功通知はページタイトル行にインラインで埋め込む形から、設定パネルの右上に固定されるバッジに変更しました。`position: sticky` を使っているため、横方向はパネル内に留まり、縦方向はビューポート上部に固定され、パネル内をどこまでスクロールしても常に表示されます。約 3 秒で自動的に消え（いずれかの項目を編集すると通知が消えるため、再保存すると再表示されてカウントダウンがリセットされます）、コンテンツのレイアウトはずれません。
- コンテキスト長の入力欄で `k`（大文字小文字を問わない）を 1024 倍として使えるようになりました。たとえば `64k` は `65536` です。保存される値は引き続き整数で、検証メッセージもこれに合わせて更新しました。

### 修正

- モデル選択パネルを初めて開くときの位置ずれ（一瞬だけ誤った位置に描画される）を修正しました。パネルを開くと、レイアウトに参加していたトリガーが絶対配置のパネルに置き換わりますが、位置決めの effect が `useEffect` だったため、ブラウザが初期の `left: 0` フレームを描画した後に測定と補正オフセットの書き込みが行われていました。`useLayoutEffect` に変更し、描画前に測定します。2 回目以降は測定結果が既にあるため、これまでも通常は再現しませんでした。
- 狭い画面（スマートフォンの縦向き）で設定カードが枠からはみ出し、横にドラッグしないと全体を読めない問題を修正しました。レイアウトがすべてインライン `style` で書かれており、インラインスタイルはメディアクエリを持てないため、固定幅と複数列グリッドが狭い画面で再配置されませんでした。設定ページのレイアウトを `settings.module.css` に移し、`dsh-web-mobile` と同じブレークポイントで再配置します。≤1023px でバッジ領域の固定トラックを解除し、≤767px で対になったフィールドを 1 列にして 1M スイッチを独立した行に移し、≤480px でラベルとコントロールをすべて縦に積み、136/140/180px の下限と 154px のバッジトラックを解放します。カードを 280px 幅に固定して実測すると、以前はみ出していたコンテキスト長行と入力能力行がはみ出さなくなり、320px 以上は変更前と同じです。本プラグイン自身のクラスにのみ作用し、`!important` は使っていないため、コア UI を書き換える `dsh-web-mobile` などと衝突しません。

## [0.3.8] - 2026-10-07

### 互換性

- バージョンマップの最新ウィンドウの上界を `0.2.1-0` から `0.2.2-0` に広げ、DSH `0.1.7` から `0.2.1` までが検証済みの同一ウィンドウに収まるようにしました。`0.2.1-alpha.1` は `0.2.0-rc.2` に対して、このプラグインが読むすべての API をファイル単位で照合済みです。設定コントローラー、`configForms`、`plugin-compatibility`、ロケールパック、モデルディレクトリ、`conversation.input.model` シート契約（依然 `{ locked }`）、`modelDirectories` / `remote.session` の両面はいずれもバイト単位で同一で、pi-ai は 0.87.1 のままで各ゲートの offer 集合も変わりません（completions 19 / responses 4 / anthropic 7 / bedrock 1、追加された `mistral-conversations` は依然 0 フィールド）。このリリースの破壊的変更もこのプラグインには届きません。`./invariant` エントリを一切インポートせず、入力欄統計拡張も登録せず、サブパス指定子ではなくパッケージルート指定子として構成されているためです（新しい規則で `package.json` を読むのはパッケージルート指定子だけです）。以前は `0.2.1` がどのウィンドウにも入らず（未マップ）、プラグインは動作を続けるものの実行中のホストが報告する能力に従う形へ縮退していました。現在は `0.1.7` と同じ検証済みの経路を通ります。

### 変更

- リポジトリのツールチェーンを npm から pnpm へ移行しました。`package-lock.json` を削除し、`pnpm-lock.yaml` と `pnpm-workspace.yaml` をコミット対象に変更しました。CI と公開 workflow は `pnpm install --frozen-lockfile`、`pnpm run ...`、`pnpm pack`、`pnpm audit` を使い、`setup-node` のキャッシュは `pnpm` に切り替えました。lockfile キャッシュと監査ゲートは変更していません。workflow ガードの `test:release` も Pull Request 段階の CI に加わり、公開 workflow の構造アサーションがマージ前に検査されます。

### セキュリティ

- 移行後に pnpm で監査をやり直し、`source-map-js` を 1.2.1 から 1.2.2 へ引き上げ（開発依存 `jsdom` が推移的に取り込みます）、`vitest` を 3.2.7 から 4.1.11 へ上げました。後者は `tinypool` に依存しなくなり、critical 2 件を解消します。`pnpm audit --audit-level high` は現在 0 件です。`undici` は移行前から 7.30.0 で、今回は変更していません。いずれも devDependencies であり、公開パッケージの実行時依存グラフ（`schemastery` と `yaml` のみ）には入りません。任意の `--provenance` と OIDC 公開経路は pnpm 11 がネイティブに実装しており、workflow でも維持しています。

## [0.3.7] - 2026-10-01

### 修正

- Composer の思考パネルが狭い画面で画面外に位置する問題を修正しました。パネルはトリガーの右端に固定されて 336px 左へ展開するため、スマートフォンではモデルボタンが画面左端に接しているとパネルの大半が画面外に出て、スライダーが実質タップできませんでした。CSS の `min(336px, 100vw - 32px)` は幅を制限しても開始位置は制限できません。パネルを開くときにトリガーの実際の位置を一度測定するようにしました。元のアンカー位置が画面に収まる場合はそのまま維持し（デスクトップの挙動は完全に不変）、収まらない場合のみパネルを `[16px, ビューポート幅 - 16px]` の範囲にクランプし、ウィンドウのリサイズとページのスクロール時に再計算します。

### セキュリティ

- 開発依存の `jsdom` が推移的に取り込む `undici` を 7.29.0 から 7.30.0 に引き上げ、`npm audit` が報告していた高深刻度の項目（TLS 証明書検証のバイパス GHSA-w293-vg96-wgc3 など、2026-09-29 の一連の勧告）を解消しました。これらは devDependencies であり、公開パッケージの実行時依存グラフ（`schemastery` と `yaml` のみ）には入らないため、プラグイン利用者への露出はありません。ただし CI の `npm audit --audit-level=high` は `quality` ジョブ内にあり、`publish` がこれに依存するため、未修正のままだと次回のリリースがブロックされます。`@vitest/mocker` の moderate 2 件は残りますが、修正には `vitest@5`（破壊的変更）が必要なため今回の範囲外です。

### 互換性

- バージョンマップの最新ウィンドウの上界を `0.1.8-0` から `0.2.1-0` に広げ、DSH `0.1.7` から `0.2.0` までが検証済みの同一ウィンドウに収まるようにしました。`0.2.0-rc.2` は `0.2.0-rc.1` に対して、このプラグインが依存する API をファイル単位で照合済みです。設定コントローラー、`configForms`、`plugin-compatibility`、ロケールパック、モデルディレクトリはバイト単位で同一で、pi-ai の `compatProfile` も変わっていません。このリリースが追加した `mistral-conversations` プロトコルは `COMPAT_GATES` で 0 フィールドしか提供せず、`llm-pi-ai` の `PROTOCOLS` にも含まれないため、設定されたルートがこれを名指しすることはできず、プラグインの 18 フィールド集合は影響を受けません。以前は `0.2.0` がどのウィンドウにも入らず（未マップ）、プラグインは動作を続けるものの実行中のホストが報告する能力に従う形へ縮退していました。現在は `0.1.7` と同じ検証済みの経路を通ります。

## [0.3.6] - 2026-09-29

### 追加

- DSH `0.1.3-alpha.2` は 3 つのゲートウェイ互換フィールド——`thinkingTokenBudgetField`（completions）、数値型の `vllmPriority`（completions）、`supportsMaxOutputTokens`（Responses）——を追加しました。プラグインは他の compat フィールドと同様にこれらを公開して書き込むようになり、`0.1.3-alpha.2` 以降で設定できるスカラーフィールドは 15 個から 18 個になりました。`supportsMaxOutputTokens` は Responses プロトコルでのみ提供されるため、`openai-completions` はすべてのフィールドを提供しなくなりました（それ以外の 17 個に対応します）。
- 設定ページの書き込みは、DSH `0.1.7` 以降では `ctx.configForms` の公式な直列化書き込みキューと revision フェンスを通るようになりました。従来パネルは「競合後に読み直して一度だけ再試行する」処理を自前で持っていましたが、公式フォームサービス自体が直列キュー・バージョンフェンス・拒否後の読み直しを備えているため、最初の書き込みはパネルがマウント時に読んだ revision で自らフェンスすることはなくなりました（フォームは自身が追跡する revision でフェンスします）。ただし再構築にはフォームスナップショットが持たない完全な記述子（在庫の `value.providers`、編集可能な compat フィールドの `schema`）が必要なため、書き込みが拒否された場合は引き続き読み直して一度だけ再構築します。`0.1.0-rc.7` から `0.1.6` までの古いホストにはこのサービスがないため、従来の `describe` / `mutate` 経路のままで挙動は一切変わりません（既存の競合再試行を含む）。新しい経路で書き込みが拒否された場合、UI には汎用の「保存に失敗しました」という文言が表示されます。フォームの `mutate` は真偽値しか返さず、そのまま提示できるホストのメッセージが存在しないためです。理由を捏造したり成功を装ったりするより、失敗をそのまま報告するほうが誠実です。


### 互換性

- `peerDependencies` に `@deepseek-ai/dsh >=0.1.0-rc.7`（既存の `engines.dsh` と同じ範囲）を `optional` 付きで宣言しました。これが DSH ランタイムに読まれる唯一のバージョン互換宣言です。`dsh-app-boot` の `evaluatePluginCompatibility` は `@deepseek-ai/dsh` / `@deepseek-ai/dsh-*` 形式の peer だけを検査し、非互換なら起動経路で例外を投げます。従来このプラグインには該当する peer が無く、この検査は `undefined` を返していました（＝バージョン宣言が実質存在しない状態）。`optional` はこの判定を弱めません（判定関数は `peerDependenciesMeta` を読みません）が、これが無いと npm が DSH CLI の依存ツリー全体を解決しようとし、実測で 300 秒を超えて停止しました。

### ドキュメント

- Composer 座席の優先度の記述を修正しました。`conversation.input.model` は単一スロットで、勝者は優先度の**昇順**で最初のエントリです。したがって `priority: -10` は公式のモデルセレクターを**意図的に上書きする**ものであり、譲るものではありません。従来のコメントと README は逆の方向を述べており、動作は常に正しかったため、誤ったコメントに従って優先度が変更されないよう文言だけを修正しました。

## [0.3.5] - 2026-09-27

### 修正

- 推理等級のスライダーが 1 回のドラッグで 1 段階しか動かせない問題を修正しました。公式モデルディレクトリの `select()` は `async` 関数で、最初の `await` より前に同期的に状態を `selecting` にします。パネルはこれを「処理中」と見なしてネイティブの range を無効化し、以後ブラウザはそのドラッグの残りの入力を報告しませんでした。サービスは連続選択のために設計されています（`select()` ごとに generation を取得し最新の応答のみが反映され、成功時・失敗時の両方で `pending` がクリアされます）ので、連続的なコントロールを無効化していたのは UI 層のセマンティクスの取り違えです。スライダーが無効化されるのは、パネルがロックされた場合か `select` が存在しない場合のみで、離散的なコントロール（モデル行とその選択肢）は従来どおりの処理中状態を維持します。スライダーは制御された入力なので、位置はディレクトリストアの `pending`（`select()` が同期的に書き込む、ホストが受け付けたが未確認の選択）を読み、早いディレクトリでは `current` にフォールバックします。前半だけの修正ではドラッグ中にスライダーがホストの古い値へ戻ってしまいます。パネルは `pending` を読むだけで書き込まず、ホストストアのビューであり続けます。

## [0.3.4] - 2026-09-26

### 修正

- 前バージョンで導入した保存リトライが並行変更を破棄する問題を修正しました。issue #16 のために追加した「競合後のリトライ」は書き込み操作をそのまま再送していましたが、モデルの推論強度・能力の書き込みはパネルを開いた時点のスナップショットから再構築した `models` 配列全体を運びます。競合の間に別の書き込みが同じ配列を変更していた場合（ホストによる既定強度の補完がモデルを追加した、別ウィンドウが同じルートの兄弟モデルを編集したなど）、リトライは古い配列で文書を上書きし、相手の結果を黙って削除または巻き戻していました——元の「書き込み拒否」より悪い結果です。リトライは単一パスへの書き込み（provider / モデルの compat 単一フィールド、OpenCode セッションのスイッチ、`subagentEffort`）だけをそのまま再送し、コンテナ全体を運ぶ書き込みは再試行時に読み直したセクションから再構築しなければならないようにしました。再構築後に書き込み対象のモデルが存在しない場合は、成功を装わず競合として報告します。

### 修正

- 設定ページの保存が古い revision によって恒久的に塞がれる問題を修正しました（issue #16）。パネルはマウント時に一度だけ revision を読み、自身の書き込みが成功したときだけ更新していました。外部からの書き込み（既定モデルの切り替え、ホストによる既定強度の補完、別ウィンドウ）は同期されないため、パネルを開いた後にどこかで一度書き込まれると、以降の「変更を保存」はすべて `dsh-settings` にバージョン競合として拒否され、パネルは読み直しませんでした。ユーザーからは「設定が二度と保存できない」ように見えます。競合と判定された書き込みは、そのセクションを読み直して一度だけ再試行するようにしました。単一パスへの書き込み（provider / モデルの compat 単一フィールド、OpenCode セッションのスイッチ、`subagentEffort`）はそのまま再送し、`models` 配列全体を運ぶ書き込みは再試行時に読み直したセクションから再構築するため、並行した変更が上書きされることはありません。二度目も競合した場合はそのまま報告し、競合が続く場合に無限に再試行しません。
- 思考強度を `off` だけにしたとき「変更を保存」を押しても何の反応もない問題を修正しました（issue #15）。この構成は `validateLevels()` に拒否されます（ホスト側も `off` だけを宣言したモデルを拒否します）が、拒否はページタイトルの直下、つまりページ最上部にしかバナーを描画せず、下のモデルカードで操作しているユーザーには見えませんでした。ボタンの状態も変わらず、進行表示も出ず、リクエストも送信されないため「ボタンが効かない」と判断するしかありませんでした。保存ボタンは検証に失敗したとき無効になり、理由（「推論強度を少なくとも 1 つ選択してください」など）をボタンのすぐ下に表示します。書き込み経路とボタンの表示可否は同一の検証関数を共有するため、「保存できるか」について食い違いません。
- 中国語 UI でモデルメニューのプロバイダー見出しが英語で表示される問題を修正しました（issue #17）。見出しはプロバイダーが登録した `displayName` をそのまま描画しており、`deepseek-account` は英語の `DeepSeek Account` を登録しているため、プラグインが DSH に代わって英語化している状態でした。サインイン済みアカウントのルートはプロバイダー id でローカライズ名に対応付けます（zh `DeepSeek 账号`、en `DeepSeek Account`、ja `DeepSeek アカウント`、ko `DeepSeek 계정`）。DSH 標準のモデルメニューと同じ規則です。その他のプロバイダー（ユーザーが宣言したゲートウェイを含む）は登録名のまま表示されます。
- モデル席のパネルとモデルメニューが半透明で、下の文字がそのまま透ける問題を修正しました（issue #14）。どちらも `--dsw-specific-menu` を使用していましたが、このトークンは DSH コアの 58% 半透明のメニュー材質であり、コアは常に `--dsw-menu-backdrop-filter` と組み合わせて使います。単独で使うと下地がないため、パネルの後ろにある強度ラベルがそのまま透けて見えていました。不透明でテーマに追従する表面トークン `--dsw-alias-bg-layer-1`（パネル）と `--dsw-alias-bg-layer-2`（その上に浮くメニュー）に変更しました。どちらも対応するすべての DSH リリース（0.1.0-rc.7 以降）で `body` に宣言されているため、ぼかし効果やコア内部の属性に依存しません。
- 推理等級の目盛りがスライダーと一致せず、スライダーも両端まで到達できない問題を修正しました。目盛り行は従来 flex で等分され、点（pip）は `i/(n-1)` で配置されていたため、最初と最後の目盛りは半段ずつ内側にずれていました。両者は同じ分数を読み、絶対配置になりました。また、ネイティブ range の thumb はトラック内に収まらなければならず、中心が「thumb 半分の幅」から「幅 − thumb 半分の幅」までしか動けないため、thumb はトラックの両端に届きませんでした（実測で中心のずれは −3.5〜−21.5px）。トラック、フィル、目盛り行をすべて thumb の半分だけ内側に寄せ、ずれは 1px 以内になりました。内縮には padding ではなく margin を使います。絶対配置の子要素の `left: N%` の基準は包含ブロックの padding box であり、親の padding では動かないため、padding では各目盛りが自分の点から 2〜3px ずれたままでした。両端の目盛りは各自的��外を向いた辺」で対応する点の外側に固定し、テキストは内側へ広げます。端の点は 9px（18px の thumb の半分、ブラウザ側の下限）しか内側にないのに対し、「Max」の半幅は 12.2px なので中央揃えではコンテンツ領域を 3.2px 超えます。パネル自身の余白はこの比較では相殺され、文字を小さくしても 9.6px が必要で、ホストが定義する最小段を下回ります。
- モデルメニューのグループ見出しが吸着中に透け、グループ展開時に行末のシェブロンがずれる問題を修正しました。見出しはそもそも吸着せず、長いリストをスクロールするとプロバイダ名が消えていました。さらに `background` ショートハンドが不透明な塗りつぶしを白 8% のトークン（`#ffffff14`）で置き換えていたため、下の選択肢が透けていました。見出しはメニュー自身の余白だけオフセットして吸着するようになり（`top: 0` は scrollport、つまりメニューの padding box に留まるため、余白部分が覆われずに残る）、hover 色は塗りつぶしを置き換えるのではなく `background-image` で上に重ねます。グループを展開するとリストが伸び、Windows のクラシックスクロールバーがレイアウト幅を取ってコンテンツボックスが狭くなり、全行のシェブロンが左へずれていましたが、`scrollbar-gutter: stable` で幅を固定しました。メニューはホストのスクロールバートークンも採用し、スクロールバーのつまみがページのものではなくメニューの一部として読めるようになりました。
- コンポーザーの座面パネルとモデルメニューを DSH 全体のデザインに合わせました。パネルの余白は公式のコンポーザー浮動層と同じ 12px とし、二つの浮動層はどちらも `--dsw-radius-lg` で丸めます（従来は 8px と 6px で、6px はホストの角丸の段階にありません）。メニューとパネルは同じ余白トークンを読みます。絶対配置の子要素の inset は親の padding box を基準に解決されるため、従来の 16px ではメニューがコンテンツの外縁より 4px 内側にありました。パネルの文字��さはホストのコンテンツスケール（`dsh-client-ui-theme` が `body` で宣言）を読むため、設定の文字サイズに従います。メニューのセルは 34px の中央揃え行、グループ見出しは 16px の行高さに対して 11px・ウェイト 500 で、公式モデルメニューに揃っています。モデル��のフォーカス枠は `:focus-within` からボタンの `:focus-visible` だけに絞りました（前者はマウス操作でも発生し、行全体��枠で囲まれて入力欄のように見えたため）。モデル行のシェブロンは二段目メニューを開いている間に上向きに反転します。

## [0.3.3] - 2026-09-23

### 修正

- 新機能のボタン スタイルを修正しました。起動時の確認ダイアログの 3 つのボタンと設定ページの「旧データを再スキャン」が、テーマ未適用の既定ボタンとして描画され、隣接する同等のボタンと明らかに異なっていました。これらは本プラグイン自身のボタン プリミティブ（高さ 28px、角丸 8px、重み付け: 移行が塗りつぶしの主アクション、「今後表示しない」が通常、「後で」が枠線なし）を使うようになり、確認ダイアログは DSH 自身のダイアログ表現（角丸 24px、ぼかしマスク、同じタイトル階層）に揃え、候補行は等幅フォントで出所ラベルを併記します。

## [0.3.2] - 2026-09-23

### 変更

- 公開前の互換マトリクスに `dsh-v0.1.7-alpha.1`（entry-config 設定モデル）を 5 つ目の公式 capability representative として追加しました。0.1.7 のルートでは、プラグインが実際にロードされること、設定セクションが公開されること、およびホストの 3 つの挙動（`llm-pi-ai` の `providers` が volatile のままであること、パス書き込みがユーザーの生レイヤーから導出されること、既定値の補完自身の書き込みがディスクに反映されること）を検証します。
- 0.1.7 で既定値の補完が書き戻せなかった問題を修正しました。このリリースは設定変更イベントを書き込みトランザクションの内部で発火するため、リスナーから書き込むと Host に `HMR transactions cannot be nested` として拒否され、そのトランザクションのコンテキストは `AsyncLocalStorage` によって遅延実行にも伝播します。補完はプラグイン適用時に作成した実行コンテキストから書き込むようになったため、モデルを追加しても再起動なしで既定の推論強度が入ります。
- 既定値の補完はユーザーレイヤーだけに書き込むようになりました。コンポジションのベースやスキーマ既定値だけが供給するモデルは補完されません（0.1.7 の entry-config 設定サービスでは解決済みサブツリーがそのままディスクに書かれるため、それらを補完すると `input`、`compat`、`headers`、`thinkingBudgets`、`defaultContextWindow` などのスキーマ既定値が設定ドキュメントに固定されます）。スキップした件数は Host ログに出力されます。

### 追加

- 設定ページに「セッション値ジェネレーター」カードを追加しました。UI から `opencodeSession.format` のすべてのフィールド（生成モード、タイムスタンプの取得元、テンプレート / 式 / スクリプトのパス、検証用正規表現、検証失敗時の動作）を読み書きできるため、設定ドキュメントを手で編集する必要はありません。カードは現在のモードで使うフィールドだけを表示し、書き込み前に検証します。不正な正規表現、空のテンプレート / 式 / スクリプト、相対スクリプトパス、解析できない式や存在しない名前を参照する式は、理由付きで拒否されます。これらの値はホスト側で黙ってフォールバックするため（正規表現は「検証なし」、それ以外は派生値）、UI で見えないままだと誤解を招きます。式の検証はホストと同じ解析コードを共有します。書き込みはフィールド単位で行われるため、同じ namespace の他の設定を上書きしません。

- DSH 0.1.7 の entry-config 設定モデルに対応しました。プラグインがルート `.volatile()` の `Config` を公開するようになり、このリリースで設定フォームが表示されるようになります（以前は 0.1.7 で `register is missing` により読み込みに失敗していました）。`0.1.7` 以降の設定セクションは Loader エントリ ID の `thinking-effort`、`0.1.0-rc.7` から `0.1.6` までは登録済み namespace の `dsh-thinking-effort` のままで、Client は実行中の Host が公開している方を解決します。`subagentEffort` は本プラグイン自身の設定セクションへ移りました。0.1.7 では旧 `llm-pi-ai` の場所が読み書きどちらもできません（この schema は `providers` しか宣言しないため、他のパスへの書き込みはバッチ全体が拒否され、ユーザーレイヤーからも未宣言のキーが落とされます）。そのためアップグレード前に設定した既定値は未設定として表示され、プラグインの設定カードで選び直す必要があります。古いスナップショットをインポートすると、このキーは `llm-pi-ai` からプラグイン自身のセクションへ移行され、同じバッチの providers も取り込めるようになります。設定は `~/.dsh/settings.yaml` ではなく現在の profile の `cordis.patch.yml` に保存されます（`0.1.7` は旧ファイルをリネームしてインポートを試みますが、このセクションではそのインポートは警告付きで拒否され、値は `settings.yaml.imported` にだけ残ります）。

- 旧データの自動検出と移行を追加しました。DSH 0.1.7 は `settings.yaml` の名前を変更して一度だけ取り込みますが、以前のバージョンのプラグインはそのリリースで読み込みに失敗していたため、それまで設定した思考強度とモデルスイッチは `settings.yaml.imported` にだけ残っています。プラグインは起動時にこのファイル（およびまだ名前が変更されていない `settings.yaml` と、稼働中の `llm-pi-ai` ユーザーレイヤー）をスキャンし、移行できる項目を見つけると設定ページの上で確認を表示し、あなたが承認してから旧データの値をプラグイン自身の設定セクションへ書き込みます。移行はまだ設定していない値だけを補い、上書きは決してしません。書き込む前にその時点の設定を「設定のバックアップとプロファイル」のロールバック枠（`autoBackup`、`sourceProfile: migration`）へ保存し、スナップショットと移行値は同じ書き込みバッチでディスクに書かれるため、「スナップショットだけがあって移行がない」中間状態は生じません。「今後表示しない」を選んだ後は、旧データが変化したときだけ再び確認します。

### 修正

- 実際のホストでのみ表面化する 2 つの問題を修正しました。移行成功後に確認ダイアログが閉じない問題（ホストが反映する前の読み取りが確認を再表示し、再表示後はポーリングしなくなるため、古い候補と有効なボタンが画面に残り続けました）、および再起動時に移行済みの値を再度提示する問題（プラグイン自身のセクションが公開される前にスキャンしたため、`declared()` から見たユーザーレイヤーが空になり、全体が未移行とみなされました）。
## [0.3.1] - 2026-09-19

### 追加

- 設定可能な OpenCode セッション Header 生成器（`opencodeSession.format`）を追加しました。スイッチを有効にして `format` 未設定の場合、Host は OpenCode Zen の正規形を持つ決定論的な `ses_` 値を送信します：`ses_` + 16 進 12 桁（セッションごとに 1 回鋳造する 48 ビットのミリ秒タイムスタンプ）+ Base62 14 桁（正規化した DSH セッション ID の 80 ビット SHA-256 ダイジェスト）。同じ DSH セッション内で値は一定で、別セッション（各 subagent 実行を含む）ごとに異なり、14 桁の接尾辞は DSH 再起動後も安定します。上流の形式変更に対応するため、`ses-derive` / `passthrough` / `template` / `expression` / `script` の 4 モード、`time: firstUse | hash` のタイムスタンプ由来、`validate` / `onInvalid` の検証を設定ドキュメントだけで変更でき、コード変更や再ビルドは不要です。
- provider/model 単位の `user-agent` 上書き（`opencodeSession.userAgent`）を追加しました。`llm-pi-ai` アダプターが帰属 `user-agent` を強制し、provider 設定値を削除するため、このプラグインは送信直前の最後のレイヤーでヘッダーを書き換えます。ルート単位の `enabled`、モデル単位のトグル、任意のルート別 `value`（マスター値より優先）に対応し、既定は無効で、一致しないリクエストは DSH の帰属ヘッダーのままです。

### 変更

- `x-opencode-session` の既定値が「生の DSH セッション ID」から「上流準拠の派生 `ses_` 値」に変わりました。旧動作が必要な場合は `format: { mode: passthrough }` を明示的に設定してください。

### セキュリティ

- 設定スナップショットの読み込みでは、provider の `baseURL`、`apiKeyEnv`、`headers` と `opencodeSession.format.script` を既定で適用しないようにしました。これらはローカル環境の接続設定であり、他人のファイルを読み込んでもリクエスト先を変更したり、Host が実行するローカルモジュールを指定したりできません。プレビューにはスキップした項目数が表示され、既定で無効かつ毎回リセットされる opt-in スイッチを提供します（issue #11）。

## [0.3.0] - 2026-09-16

### 追加

- 「設定のバックアップとプロファイル」を追加しました。`llm-pi-ai` と `dsh-thinking-effort` の 2 つの namespace のユーザーレイヤーを JSON ファイルとして書き出し、別のマシンや再インストール後に読み込んで復元できます。設定ページ内で名前付きプロファイルを複数保存して切り替えることもできます。読み込みは追加 / 上書き / 削除の件数プレビューを表示し、既定は「マージ」（ファイルにない provider は保持）で、プレビューで「置換」（ファイルの内容を優先）に切り替えられます。最初の書き込み前にはロールバック用の読み込み前スナップショットを自動保存し、再起動が必要な適用では対象の namespace を表示します。既存の Settings チャネルを再利用するため、新しい Remote Settings と旧来の `connection.api.settings` の両方で動作し、依存関係の追加はありません。

### 変更

- 互換層のバージョン上限を `<0.1.6-0` から `<0.1.7-0` へ引き上げました。公開済みの DSH `0.1.6-alpha.1` を項目ごとに確認したところ、既存の modern 能力範囲（modern Settings transport、`describe()` が返す `user` 生レイヤー、15 個のゲートウェイ互換フィールド、外部 language pack、任意の takeover）に収まるため、未マップ扱いではなくなりました。
- 公開前の互換マトリクスは最新の capability representative を `dsh-v0.1.5-rc.2` から `dsh-v0.1.6-alpha.1` へ更新し、`dsh-v0.1.0-rc.7`、`dsh-v0.1.1-rc.2`、`dsh-v0.1.3-alpha.2` とともにビルドして公式インストールと実互換チェックを実行します。実ブラウザ DOM プローブは `0.1.6-alpha.1` で実行されます。

## [0.2.4] - 2026-09-11

### 修正

- プロバイダーを折りたたんだときに「モデル能力と档位」ページのゲートウェイ互換性の詳細パネルと保存ボタンが残って表示される問題を修正しました。互換パネルもモデル行と同じ `providerOpen` ゲートに従い、プロバイダーを折りたたむとパネル全体が非表示になります。未保存の互換性ドラフトは再展開時に復元され、失われません（[#7](https://github.com/hytime/dsh-thinking-effort/issues/7)）。
- 互換層のバージョンマップが公開済みの DSH `0.1.5` をカバーするようになりました。`0.1.5-rc.1` / `0.1.5-rc.2` は既存の modern 能力範囲（modern Settings transport、15 個のゲートウェイ互換フィールド、外部 language pack、任意の takeover）に含まれ、未知のバージョンとして扱われなくなります。最新範囲より新しいリリースは未マップのままで、ホストが実際に公開する能力に従い、ランタイム能力検出へフォールバックするため、takeover が黙って無効化されることはありません。
- 公開前の互換マトリクスに 4 つ目の公式代表 `dsh-v0.1.5-rc.2` を追加し、`dsh-v0.1.0-rc.7`、`dsh-v0.1.1-rc.2`、`dsh-v0.1.3-alpha.2` とともにビルドして公式インストールと実互換チェックを実行します。実ブラウザ DOM プローブは最新の代表で実行し、新しいホストのオンボーディング（ワークスペースダイアログが表示されない場合がある）にも適応させました（[#9](https://github.com/hytime/dsh-thinking-effort/issues/9)）。

## [0.2.3] - 2026-09-09

### 変更

- OpenCode セッション Header スイッチはトグル時に即保存するようになりました。スイッチを切り替えるとすぐに `dsh-thinking-effort` Settings namespace へ書き込まれ、別途保存ボタンを押す必要はありません。保存ボタンと未保存マーカーは UI から削除され、モデルを開き直すと永続化された値が表示されます。

## [0.2.2] - 2026-09-09

### 追加

- モデル単位の OpenCode セッション Header スイッチを追加しました。既定では無効で、正確な `provider/model` だけに現在の DSH `sessionId` を `x-opencode-session` として動的に送信します。固定値は保存せず、同じルートの GPT など他モデルにも継承しません。既存の `x-opencode-session` は保持され、上書きされません。この設定は新しい Remote Settings と旧来の `connection.api.settings` の両方の Settings transport に対応します。
- Sub2API/CPA の転送、静的 route Header の制限、`api` プロトコルを変更しないこと、Host の再起動と Web ページ更新の要件を文書化しました。

### 修正

- 公開パッケージは実行時に `@deepseek-ai/dsh-settings` に依存しなくなりました。Host はホストが提供する Settings の `installSection` または旧版 `register` を直接使用します。これにより、`autoInstallPeers: false` の DSH profile で Cordis ランタイムが二重になり、peer 解決に失敗することを回避します。

## [0.2.1] - 2026-09-08

### 追加

- Web runtime が `modelDirectories` を提供する場合、Composer に任意の `seat` を登録し、現在の `provider/model` に対する Host 解決済み `reasoning.efforts` を離散的な推論強度として表示します。`defaultEffort` がないモデルでは「モデルの既定値に従う」を選択でき、Host の light/dark theme token に追従します。
- 中英韓日の Settings、Composer、モデルグループ折りたたみ、モデル検索画面のスクリーンショットギャラリーを追加しました。

### 互換性と UI

- 公式 DSH の最新互換性代表を `dsh-v0.1.3-alpha.2` に更新し、modern capability の範囲を `<0.1.4-0` まで拡張しました。
- Settings の switch、モデル編集行、light/dark theme、未選択の推論マーカー、既定値追従状態を改善しました。

## [0.2.0] - 2026-09-04

### 追加

- `supportsStore`、`thinkingFormat`、`supportsThinkingTokenBudget` など、一般的なスカラーのゲートウェイ互換フィールドを個別に設定して自動継承できるようにし、意味ごとにグループ化して既定で折りたたみました。

## [0.1.14] - ゲートウェイ capability mapping と optional takeover

### 公開互換性マトリックス

| 順序 | 公式 DSH representative | version |
| --- | --- | --- |
| 1 | `dsh-v0.1.0-rc.7` | `0.1.0-rc.7` |
| 2 | `dsh-v0.1.1-rc.2` | `0.1.1-rc.2` |
| 3 | `dsh-v0.1.2-alpha.3` | `0.1.2-alpha.3` |

### 変更

- `version-map.ts` で DSH Runtime の transport、Gateway compat フィールド、takeover transport の capability mapping を統一し、rc7 は `supportsDeveloperRole`/`maxTokensField` に非対応、rc8 以降は対応することを明記しました。
- rc7、rc2、alpha3 の 3 つの capability composition representative を個別にロードし、実際の互換性を検証するテストを追加しました。
- オプションの `dsh-llm-openai-completions` takeover に対応しました。Gateway compat に対応する runtime で、対象がカスタム OpenAI 互換の思考ゲートウェイであり、transport が有効な場合だけ適用されます。
- provider のグローバル `compat` 既定値と単一モデルの上書きを追加しました。カタログモデルは `modelOverrides.<model>.compat`、`models[]` エントリは `models[].compat` を使用します。モデル層は書かれたフィールドだけを provider に対して上書きし、`Auto` は現在の層のフィールドを削除して provider の継承へ戻します。同じルート（provider）に非空の `models[]` と非空の `modelOverrides` が同時に存在する場合は無効な設定です。公式 schema はこの無効な設定を拒否し、プラグインは異常なデータに対して fail closed します。カタログ/modelOverrides と `models[]` の両方で Settings の単一モデル編集に対応し、`models[]` の保存は配列インデックス path op ではなく、他のモデル、未知フィールド、他の compat フィールドを保持する `providers.<route>.models` 全体の 1 回の配列 set を使用します。
- これらの compat 値はコントロールプレーン設定だけを行い、外部 transport は実装しません。

## [0.1.13] - 互換性範囲による検証

### 変更

- 互換アダプターのバージョン診断をリリース単位の列挙から範囲判定へ変更し、公開前 workflow は各範囲から公式代表バージョンを 1 つだけ選ぶようにしました。

## [0.1.12] - 公式 alpha.3 互換性検証

### 変更

- 公式 DSH の互換性検証基準を `dsh-v0.1.2-alpha.3` に更新し、旧 rc7 tag を公式の `dsh-v0.1.0-rc.7` に修正しました。Host/Client の実行動作は変更ありません。

## [0.1.11] - TypeScript ビルド移行とバージョン互換性

### 変更

- Host と Client のランタイムコードを TypeScript に移行し、ビルド済みの `lib/index.js`、`lib/client.js` と宣言ファイルを公開します。動作と Settings データ形式は互換です。
- 互換アダプターは明示的なバージョン metadata またはテスト入力に対応しますが、現在の DSH には公開された semver metadata 契約がないため、実行時の capability detection を権威あるソースとします。未知の有効なバージョンは検出した能力に従って動作し、新旧の Settings API をサポートします。
- 未知のバージョンでも必要な capability があれば動作を継続します。能力が不足する場合は関連機能を利用不可のままにし、対応していない `ja/ko` locale も非表示にします。


### 修正

- クライアントのトップレベルではバージョン間で安定したサービス（`slots`、`connection`、`locale`）だけをハード注入し、新しい DSH では `ctx.get` と `internal/service` を使ってオプションの Remote Settings service を検出し、旧版では引き続き `connection.api.settings` にフォールバックします。
- Remote provider のない旧版でも、オプションの Remote 検出によって pending にはなりません。
- 外部 locale catalog を持たない古い DSH では、未登録エラーを避けるため設定ページで利用できない `ja/ko` を非表示にします。

## [0.1.9] - 新しい DSH Remote への互換対応

### 修正

- DSH `0.1.2-alpha.1` の `ctx.remote.settings` に対応し、旧版の `connection.api.settings` もフォールバックとして維持。
- 新しい直接 `ClientResult` と旧 RPC ラッパー応答の Settings 読み書きを統一。
- DSH の language-pack 動的登録に合わせ、日本語と韓国語の対応説明を更新。

## [0.1.8] - Subagent 推論強度の注入修正

### 修正

- `agent/request` をグローバルリスナーとして登録し、Subagent のリクエストを確実に処理するよう修正。
- `llm-pi-ai` 設定 namespace の遅延登録時に `subagentEffort` が古いキャッシュになる問題を修正し、リクエストごとに現在値を読み取るよう変更。
- グローバルイベント登録と設定のリアルタイム読み取りを検証する Host 回帰テストを追加。

## [0.1.7] - 日本語と韓国語のローカライズ

### 追加

- 設定ページに `日本語` と `한국어` を追加し、中文と English も継続してサポート。
- 4 つの locale 辞書をビルドスクリプトで検証し、クライアント bundle に生成。
- 日本語と韓国語の README、INSTALL、CHANGELOG を追加し、4 言語の相互リンクを提供。


### 互換性

- パッケージと設定ページのバージョン表示を `0.1.7` に更新。
- Host の動作、`thinking-effort` の Cordis composition と設定 Slot ID、ランタイム ID は変更なし。
- 日本語と韓国語の切り替えには DSH コアのグローバル locale ID が必要です。現在の標準 DSH ではこの 2 つの選択項目は使用できません。

## [0.1.6] - 英語ドキュメントを既定の入口に変更

- `README.md` と `INSTALL.md` を既定の英語ドキュメント入口に変更。
- 中国語ドキュメントを `README.zh.md` と `INSTALL.zh.md` に分離し、明示的なリンクで切り替え。
- npm パッケージのファイル一覧を新しいドキュメント名に更新。

## [0.1.5] - 設定ページのバージョン表示と中英 UI

### 追加

- 設定ページ右下に低コントラストのバージョン表示を追加。
- DSH の保存済み locale、ブラウザ言語、中国語フォールバックに対応した中文と English の設定ページを追加。
- locale 辞書を `src/locales/zh.json` と `src/locales/en.json` に分離し、公開前に bundle へ生成。

### 修正

- settings schema 検証に失敗する可能性があった配列インデックス形式のモデル設定書き込みを修正。
- ルート単位で `models` と `modelOverrides` を更新する際、未編集のモデルフィールドを保持。
- 複数ルートでの一括プリセットによる値の上書きを修正。
- 設定ページ更新後に Subagent のカスタム送信値が失われる問題を修正。
- カスタム値を対象モデルが対応する DSH 標準レベルへマッピング。


### 互換性

- npm、ブラウザ loader、Host、Client の ID を `@hytime/dsh-thinking-effort` に統一。
- Cordis composition と設定 Slot ID は `thinking-effort` のまま維持。

### ドキュメント

- 公式 DSH CLI によるインストール、更新、削除、旧パッケージ移行、検証手順を追加。

## [0.1.4] - ランタイム ID の統一と設定修正

- モデルレベル、プリセット、Subagent のカスタムマッピングを修正。
- scoped Client bundle と DSH loader の登録 ID の不一致を修正。
- 公式プラグインのライフサイクルと旧パッケージ移行を文書化。

## [0.1.3] - scoped ブラウザ bundle の登録修正

- `__ModuleLoader__.load` の登録 ID を `dsh-thinking-effort` から `@hytime/dsh-thinking-effort` へ変更。
- scoped npm パッケージのインストール後に Web ページがプラグインをロードできない問題を修正。
- ブラウザ bundle 登録 ID の回帰テストを追加。

## [0.1.2] - scoped npm パッケージへ移行

- npm パッケージ名を `@hytime/dsh-thinking-effort` に変更。
- `cordis.patch.yml` の bundle 名を scoped パッケージ名へ更新。
- README と INSTALL のインストール、mount、削除コマンドを更新。

## [0.1.1] - 初回公開準備

- repository、homepage、bugs、public access を含む npm メタデータを整備。
- 使用例、クイックスタート、制限、トラブルシューティングを含む README を更新。
- GitHub と npm のインストール手順を追加。

## [0.1.0] - 初回リリース

- `reasoningEfforts` がないサードパーティモデルへ `off`、`high`、`max` を追加。
- モデルごとにレベルとゲートウェイ送信値を編集できる設定ページを追加。
- `high` を `ultra` などのゲートウェイ固有値へマッピング。
- 一括推論強度プリセットを追加。
- Subagent の既定の推論強度を設定可能に。
