dsh-manage-session 0.0.0-stage → 0.2.3
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/CHANGELOG.ja.md +188 -0
- package/CHANGELOG.ko.md +189 -0
- package/CHANGELOG.md +261 -0
- package/INSTALL.ja.md +164 -0
- package/INSTALL.ko.md +164 -0
- package/INSTALL.md +164 -0
- package/INSTALL.zh.md +164 -0
- package/LICENSE +21 -0
- package/README.en.md +63 -0
- package/README.ja.md +63 -0
- package/README.ko.md +61 -0
- package/README.md +96 -3
- package/cordis.patch.yml +11 -0
- package/dsh.plugin.json +22 -0
- package/lib/client.js +1393 -0
- package/lib/index.d.ts +1117 -0
- package/lib/index.js +2111 -0
- package/package.json +121 -6
- package/screenshots.json +3 -0
- package/src/client/card.tsx +153 -0
- package/src/client/health-panel.tsx +397 -0
- package/src/client/history-panel.tsx +319 -0
- package/src/client/host-api.ts +177 -0
- package/src/client/index.ts +234 -0
- package/src/client/locales.ts +203 -0
- package/src/client/panel.tsx +118 -0
- package/src/config.ts +33 -0
- package/src/host/health/attribution.ts +118 -0
- package/src/host/health/cache.ts +97 -0
- package/src/host/health/decode.ts +307 -0
- package/src/host/health/gates.ts +331 -0
- package/src/host/health/lossless.ts +128 -0
- package/src/host/health/repair.ts +217 -0
- package/src/host/health/scan.ts +156 -0
- package/src/host/history/archive-source.ts +202 -0
- package/src/host/history/archive.ts +191 -0
- package/src/host/history/purge.ts +323 -0
- package/src/index.ts +504 -0
package/CHANGELOG.ja.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# 変更履歴
|
|
2
|
+
|
|
3
|
+
## 0.1.0-alpha.6
|
|
4
|
+
|
|
5
|
+
### 修正 —— アイコンとラベルの間隔を詰め、狭いサイドバーで隣を潰さない
|
|
6
|
+
|
|
7
|
+
- **間隔 8px → 4px**: 🧭 と「セッションスチュワード」の間を実測に基づいて詰めました(ユーザー指摘
|
|
8
|
+
「icon と文字の間隔を小さく」)。あわせて自前の左右パディングを `0 12px 0 10px` →
|
|
9
|
+
`0 10px 0 8px` にし、隣の「検索」ピルと揃えました。
|
|
10
|
+
- **自分が縮む**: `.dss_entryWrap` を `flex:none` → `flex:0 1 auto; min-width:0` に変更し、
|
|
11
|
+
外側の左マージンを `8px → 6px`。以前は一切譲らなかったため不足分がすべて検索ピルに乗り、
|
|
12
|
+
相手のラベルを一文字に潰していました。現在は不足分を自分で引き受けます(ラベルは省略記号で終端)。
|
|
13
|
+
- **レール寸法は 28×28 に戻す**: レールの内容ボックスは 36px しかなく(56px レール − 左右 10px)、
|
|
14
|
+
36×36 のコントロール 2 個は入りません(実測 36+28=64px、14px はみ出し)。
|
|
15
|
+
28+28=56px とし、変更前の 32+28=60px より狭くしました。
|
|
16
|
+
- **協調の境界は不変**: あくまで自身の CSS のみを変更し、検索インデックスの値を参照せず、
|
|
17
|
+
インストール有無も仮定しません。
|
|
18
|
+
|
|
19
|
+
## 0.1.0-alpha.5
|
|
20
|
+
|
|
21
|
+
### 変更 —— サイドバー入口にラベルを付け、「検索インデックス」と同一行で調和
|
|
22
|
+
|
|
23
|
+
- **入口に名前が付きました**: フッター入口は 28x28 のアイコン丸ボタン(🧭)だけで、何の入口か伝わりませんでした。
|
|
24
|
+
ワイド表示では 42px の行コントロール **🧭 セッションスチュワード** になり、隣の「検索」ピルと
|
|
25
|
+
同じ高さ・同じ角丸(12px)・同じ文字サイズになります。
|
|
26
|
+
- **同一行のジオメトリ協調**: 検索入口側が `flex:1;min-width:0` を宣言して行全体を占有しなくなったため、
|
|
27
|
+
2 つの入口は `sidebar.footer.action` の兄弟要素として同じ行に並びます。本入口はワイド時に
|
|
28
|
+
`margin-left:8px` で間隔を空けます(公式 `ui-settings-general` の `.triggerRow{gap:8px}` に対応)。
|
|
29
|
+
相手プラグインの存在は知らず、値も参照しません —— 協調は各自の CSS 内だけで完結します。
|
|
30
|
+
- **レール表示への退避**: `wide=false` では `.dss_footerEntryRail`(36x36 の円、ラベルなし)になり、
|
|
31
|
+
Figma のレール仕様(56px レール / 10px パディング / 36x36 コントロール)と公式レールコントロールに一致します。
|
|
32
|
+
ラベルはワイド時のみ表示されます。
|
|
33
|
+
- **コピーの帰属修正**: コンポーネント内にハードコードされていた `'会话管家'` のフォールバックを削除し、
|
|
34
|
+
入口のラベルはパネル見出しと同じ出所(辞書 `panel.title`)になりました。
|
|
35
|
+
|
|
36
|
+
## 0.1.0-alpha.4
|
|
37
|
+
|
|
38
|
+
設定カードにドロワー形態を復元:従来は裸の行だけで、「プラグイン」設定セクション内の他プラグインと揃っていなかった。
|
|
39
|
+
|
|
40
|
+
### 修正
|
|
41
|
+
|
|
42
|
+
- **設定カードにドロワーの外殻が無い(重要)**:DSH の「プラグイン」設定セクション
|
|
43
|
+
(`dsh-client-ui-settings-plugins`)が行うのはただ一つ——settings 名前空間ごとに
|
|
44
|
+
`settings.plugin.item` を配ること:
|
|
45
|
+
|
|
46
|
+
renderSlot('settings.plugin.item', {}, { entryKey: ns })
|
|
47
|
+
|
|
48
|
+
外殻は**一切提供されない**。カードのタイトル・説明・開閉はすべてプラグイン自身の持ち物である。
|
|
49
|
+
本プラグインは裸の行しか描画していなかったため、二点が崩れていた:
|
|
50
|
+
1. セクション内の他プラグインの「折りたたみドロワー」と形態が揃わない;
|
|
51
|
+
2. `card.title`(セッション管家)と `card.desc`(履歴ファイル · 健康チェック)が
|
|
52
|
+
**定義されているのに一度も描画されない**死んだ文言になっていた——これが「欠けていたドロワー項目」。
|
|
53
|
+
|
|
54
|
+
ヘッダー(タイトル + 説明 + chevron、ブロック全体がクリック可能)を復元し、
|
|
55
|
+
本体は既定で折りたたむ(同セクションの他カードと同じ)。`aria-expanded` は開閉状態を反映する。
|
|
56
|
+
- **設定サービスが使えないときの挙動**:以前はカード全体が「設定サービスが利用できません」の一行に
|
|
57
|
+
退化し、**タイトルごと消えていた**。現在はドロワーヘッダーは通常どおり描画し、
|
|
58
|
+
理由は本体にのみ示す——このプラグインがセクションから完全に消えることはない。
|
|
59
|
+
|
|
60
|
+
### 変更
|
|
61
|
+
|
|
62
|
+
- 開閉の切替と chevron の回転は `prefers-reduced-motion` に従う。
|
|
63
|
+
|
|
64
|
+
## 0.1.0-alpha.3
|
|
65
|
+
|
|
66
|
+
健康チェック結果のキャッシュ:パネルを閉じて開き直すとゼロ遅延で内容が出て、処置後は該当行だけが更新される。
|
|
67
|
+
|
|
68
|
+
### 追加
|
|
69
|
+
|
|
70
|
+
- **健康チェック結果のキャッシュ(プロセス内)**:一度の完全スキャン(分割で語料を走り切る)の結果を
|
|
71
|
+
ホストプロセスに保持し、パネルを開き直すとキャッシュをそのまま描画する(全量再スキャンしない)。
|
|
72
|
+
キャッシュは**語料を一周し切ったときだけ**成立する——途中でパネルを閉じても、
|
|
73
|
+
半端な結果が完全な結論のふりをすることはない。
|
|
74
|
+
- **`resume` は純粋な読み取り**:`session-health-scan` に `resume: true` を追加。**キャッシュを読むだけでスキャンしない**。
|
|
75
|
+
パネルはマウント時にこれで一度だけゼロコストで探り、命中すれば内容を出し、外れれば何もしない
|
|
76
|
+
(マウント即重作業は前版で指摘された点)。同時に現在の語料総数も返す。
|
|
77
|
+
- **生成時刻と更新入口**:命中時は「結果はキャッシュ · N 分前」を表示し、「更新」を用意する
|
|
78
|
+
(強制的に全量再スキャン)。古い結果がスキャン直後のふりをすることはない。
|
|
79
|
+
- **語料変化の通知**:キャッシュ時の語料総数と現在が食い違うとき
|
|
80
|
+
「語料が変化しました(a → b)。更新を推奨」と表示。この突き合わせはディレクトリ列挙だけで安い
|
|
81
|
+
——だからキャッシュ失効戦略そのものにはならない。
|
|
82
|
+
|
|
83
|
+
### 変更
|
|
84
|
+
|
|
85
|
+
- **単条の書き戻し**:単一セッションの健康チェックと可逆処置の後は再スキャンに頼らない——
|
|
86
|
+
処置は既に `after` を再計算しているので、それをそのままキャッシュへ書き戻す。
|
|
87
|
+
パネルが一覧へ戻ったとき、その行は既に最新の段階になっている
|
|
88
|
+
(回復した行は消える。「問題のみ列挙」と一致)。
|
|
89
|
+
- キャッシュは**ディスクに書かない**:DSH 再起動で失効する。永続化には失効戦略が必要で、
|
|
90
|
+
失効判定のコスト(語料の列挙、ログの mtime/size 照合)は再スキャン自体に近い。本スライスは YAGNI。
|
|
91
|
+
|
|
92
|
+
### テスト
|
|
93
|
+
|
|
94
|
+
- `tests/cache.spec.ts` を新規追加(19 件):成立規則(未走破 / 走破 / 空語料 / 途中中断 / `clear`)、
|
|
95
|
+
単条書き戻しの全分岐(追加 / 置換 / 回復で除去 / no-op)、そして `handleMethod` の配線
|
|
96
|
+
(`resume` はスキャンしない、分割走破後の命中、`onlyProblems=false` はキャッシュを汚さない、
|
|
97
|
+
処置後書き戻しのオブジェクト同一性、cache 無しのランタイムでも動作)。
|
|
98
|
+
|
|
99
|
+
## 0.1.0-alpha.2
|
|
100
|
+
|
|
101
|
+
処置(処方)の判定と提示の修正:「判定不能」のゲートに処方せず、処置後の結論を明示する。
|
|
102
|
+
|
|
103
|
+
### 修正
|
|
104
|
+
|
|
105
|
+
- **`skipped` への誤処方(重要)**:`prescribe()` は従来 `level !== 'ok'` で投影キャッシュの隔離要否を
|
|
106
|
+
判定していたため、「本ゲートは判定不能」も「投影キャッシュ未整合」と見なされ、
|
|
107
|
+
自身の根拠と矛盾する処方を出し、**存在しない**記録の隔離を提案していた。
|
|
108
|
+
共有述語 `isActionable()`(`warn` / `fail` のみ処置可能)を抽出して一本化。
|
|
109
|
+
`gates.ts` の段階基準と `repair.ts` の処置基準がこれで同一の意味になる。
|
|
110
|
+
- **「四門全緑」の誤報**:処置項目が無いとき固定で「四門全緑」と表示していた。
|
|
111
|
+
ゲートが `skipped`(判定不能であり緑ではない)のときこの文言は成立しない。
|
|
112
|
+
「処置項目なし(N ゲートは判定不能、異常ではない):<ゲート id 一覧>」に変更。
|
|
113
|
+
- **処置後も異常と表示され、処置が効いたか分からない**:パネルは「処置前 / 処置後」の段階のみを
|
|
114
|
+
描画していたため、両方が異常のとき「処置失敗」と「処置が病巣と無関係」を区別できなかった。
|
|
115
|
+
ホストに `assessRepair({ before, after, repair })` を追加し、5 段階のいずれかと人向け説明を返す:
|
|
116
|
+
`nothing-to-do`(四門全緑)/ `repaired`(回復)/ `repaired-with-residual`(キャッシュは隔離したが
|
|
117
|
+
キャッシュと無関係の異常が残存、例:セッションログの open step)/
|
|
118
|
+
`not-applicable`(現在の異常に可逆処置項目が無い)/ `failed`(処置自体の失敗)。
|
|
119
|
+
パネルは段階ごとの配色で結論バナーを描画する。
|
|
120
|
+
|
|
121
|
+
### 説明
|
|
122
|
+
|
|
123
|
+
- **処置能力は不変**:「投影キャッシュ記録の隔離のみ、コピー後に移動、セッションログは改変しない」。
|
|
124
|
+
今回は**判定**と**提示**のみを修正した。典型例は「`cold-read` のみ異常
|
|
125
|
+
(セッションに未決済の open step がある)」——これは本来本プラグインが修復すべき異常ではなく、
|
|
126
|
+
現在は `not-applicable` と明示して理由を説明する。黙って「処置後も異常」とは表示しない。
|
|
127
|
+
|
|
128
|
+
### テスト
|
|
129
|
+
|
|
130
|
+
- `tests/repair.spec.ts` を新規追加(12 件):`isActionable` の 4 段階、`prescribe` が空の処方を
|
|
131
|
+
出さないこと、`assessRepair` の 5 段階判定の分岐を網羅。
|
|
132
|
+
|
|
133
|
+
## 0.1.0-alpha.1
|
|
134
|
+
|
|
135
|
+
健康チェックパネルの判定とフィードバックの修正:「注意」の全件誤報を解消し、スキャン進捗と行内の理由を追加。
|
|
136
|
+
|
|
137
|
+
### 修正
|
|
138
|
+
|
|
139
|
+
- **「注意」の全件誤報(重要)**:`lossless-json` / `projection-cache` / `cold-read` の 3 ゲートが
|
|
140
|
+
**判定不能**のとき(コールドセッションにホット投影が無い、キャッシュ記録が未生成、
|
|
141
|
+
ログに turn/end が無い)に `warn` を返していたため、**未ロードの全セッションが常に「注意」**
|
|
142
|
+
となり、本当のシグナルがノイズに埋もれていた。
|
|
143
|
+
中性段階 `skipped`(パネル表記は「未チェック」)を追加し、「観測不能」を担わせ、
|
|
144
|
+
**総合判定には寄与させない**。
|
|
145
|
+
固定した基準:`warn` = 異常現象を観測(根拠あり)/`skipped` = 観測不能・判定不能(根拠なし)。
|
|
146
|
+
実測:30 セッションが「30×注意」→「26 正常 / 3 注意 / 1 異常」。
|
|
147
|
+
- **一覧行に原因が出ない**:結果一覧は総合段階のみを描画し、行同士が区別できなかった。
|
|
148
|
+
非 ok の「ゲート·段階」要約(例 `可接続性·注意`)を行内に表示し、個別に開く必要をなくした。
|
|
149
|
+
|
|
150
|
+
### 追加
|
|
151
|
+
|
|
152
|
+
- **スキャン進捗**:`session-health-scan` が `offset` による分割呼び出しに対応し `total` を返す。
|
|
153
|
+
パネルは小バッチで連続呼び出しし、**実進捗**(`n/total · 経過 Xs`)を自前で累積する。
|
|
154
|
+
分母が未取得の初回は不確定アニメーション。ホストは無状態のままで、同期ループの非同期化は不要。
|
|
155
|
+
- **処置のビジー表示**:可逆処置ボタンにスピナーを追加し、無効状態を維持。
|
|
156
|
+
|
|
157
|
+
### 変更
|
|
158
|
+
|
|
159
|
+
- **タブ名変更**:`病案室` → `養老院`(英語 `Records Room` → `Retirement Home`)。
|
|
160
|
+
「健康チェック / 処方 / 退院」のメタファーと統一。
|
|
161
|
+
|
|
162
|
+
## 0.1.0-alpha.0
|
|
163
|
+
|
|
164
|
+
最初の alpha 版:セッション・スチュワード(履歴ファイル + 健康チェック)。
|
|
165
|
+
|
|
166
|
+
### 追加
|
|
167
|
+
|
|
168
|
+
- **セッション履歴ファイル(カルテ室)**:`dsh-session-search-toggle` から公式アーカイブ集合の読み取りとクリーンアップの実装を移入し、
|
|
169
|
+
挙動は移行前と等価(バックアップ + 同一ディレクトリへの一時書き込み + アトミック置換。明示的な編集モードでのみクリーンアップを許可)。
|
|
170
|
+
差分:一覧の取得元を**公式アーカイブ集合の真値**(registry 優先、ストレージファイルにフォールバック)に変更。独立インデックスは検索インデックスパッケージとともに離れたため。
|
|
171
|
+
タイトルなどのメタデータはベストエフォート(`sessionQuery` のタイトルスナップショット → プロジェクションキャッシュの title → 空)。
|
|
172
|
+
- **健康チェック(健診 → 処方 → 退院)**:独立にテスト可能な四つのゲート
|
|
173
|
+
(`log-integrity` / `projection-cache` / `lossless-json` / `cold-read`)を備え、
|
|
174
|
+
統一の出力 `{ id, level, evidence, attribution, detail }`、集約結果は `SessionHealthReport`。
|
|
175
|
+
- **帰属インデックス**:profile の `node_modules/<pkg>/lib/*.js` を静的に走査して「プロジェクション key → パッケージ名」を構築し、
|
|
176
|
+
失敗したゲートを具体的なプラグインとフィールドパスに紐付ける。走査できない場合は正直に `unknown` と表示する。
|
|
177
|
+
- **可逆的な処方**:破損したプロジェクションキャッシュのレコードを隔離(先にコピーでバックアップし、`.quarantine-<ts>` へ移動)+ コマンド一覧。
|
|
178
|
+
**禁止**事項:セッションログの書き換え、履歴データの変更、フィールドの暗黙的な破棄。
|
|
179
|
+
- **二つの feature gate**:`historyFiles` / `healthCheck`。オフのときは対応するサブドメイン全体が登録されず(明示的な disabled エラー)、
|
|
180
|
+
クライアントも対応するタブを描画しない。
|
|
181
|
+
- **ルート**:`/session-steward/api/*`。メソッド名は一律 `session-*` で、検索インデックスの `/switch-search/api` の `index-*` とは完全に分離。
|
|
182
|
+
|
|
183
|
+
### 既知の制限
|
|
184
|
+
|
|
185
|
+
- `lossless-json` ゲートは、ホストが `sessionProjections`(ホット状態)を公開している場合にのみ確定判定を下せる。
|
|
186
|
+
取得できないときは正直に `warn` へ降格し、推測はしない。
|
|
187
|
+
- 健康スキャンは既定で直近 30 件の非健康セッションのみを列挙する(`limit` の上限は 200)。全件走査は既定の挙動としない。
|
|
188
|
+
- クライアントパネルは最小実装(一覧 + 詳細 + 三ステップのボタン)で、仮想スクロールと一括操作は未実装。
|
package/CHANGELOG.ko.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# 변경 이력
|
|
2
|
+
|
|
3
|
+
## 0.1.0-alpha.6
|
|
4
|
+
|
|
5
|
+
### 수정 — 아이콘과 레이블 간격 축소, 좁은 사이드바에서 이웃을 밀어내지 않음
|
|
6
|
+
|
|
7
|
+
- **간격 8px → 4px**: 🧭 와 「세션 스튜어드」 사이를 실측에 따라 좁혔습니다(사용자 피드백
|
|
8
|
+
「icon 과 글자 간격을 작게」). 아울러 자체 좌우 패딩을 `0 12px 0 10px` →
|
|
9
|
+
`0 10px 0 8px` 로 맞춰 옆의 「검색」 필과 동일하게 했습니다.
|
|
10
|
+
- **스스로 줄어듭니다**: `.dss_entryWrap` 을 `flex:none` → `flex:0 1 auto; min-width:0` 으로 바꾸고
|
|
11
|
+
바깥 왼쪽 여백을 `8px → 6px`. 이전에는 전혀 양보하지 않아 부족분이 전부 검색 필에 얹혔고,
|
|
12
|
+
상대 레이블을 한 글자로 만들었습니다. 이제는 부족분을 스스로 떠안습니다(레이블은 말줄임표로 끝맺음).
|
|
13
|
+
- **레일 치수는 28×28 로 복귀**: 레일 내용 상자는 36px 뿐이라(56px 레일 − 좌우 10px)
|
|
14
|
+
36×36 컨트롤 두 개는 들어가지 않습니다(실측 36+28=64px, 14px 넘침).
|
|
15
|
+
28+28=56px 로 하여 변경 전의 32+28=60px 보다 좁혔습니다.
|
|
16
|
+
- **협조 경계는 그대로**: 오직 자체 CSS 만 바꾸고, 검색 인덱스의 값을 참조하지 않으며,
|
|
17
|
+
설치 여부도 가정하지 않습니다.
|
|
18
|
+
|
|
19
|
+
## 0.1.0-alpha.5
|
|
20
|
+
|
|
21
|
+
### 변경 — 사이드바 진입점에 레이블 추가, 「검색 인덱스」와 같은 행에서 조화
|
|
22
|
+
|
|
23
|
+
- **진입점에 이름이 생겼습니다**: 하단 진입점은 28x28 아이콘 원형 버튼(🧭)뿐이어서 무엇인지 알 수 없었습니다.
|
|
24
|
+
넓은 사이드바에서는 42px 행 컨트롤 **🧭 세션 스튜어드**가 되어, 옆의 「검색」 필과 같은 높이 ·
|
|
25
|
+
같은 모서리 반경(12px) · 같은 글자 크기를 씁니다.
|
|
26
|
+
- **같은 행의 지오메트리 협조**: 검색 진입점이 `flex:1;min-width:0`을 선언해 행 전체를 차지하지 않게 되어,
|
|
27
|
+
두 진입점은 `sidebar.footer.action`의 형제 요소로 같은 행에 놓입니다. 이 진입점은 넓은 모드에서
|
|
28
|
+
`margin-left:8px`로 간격을 만듭니다(공식 `ui-settings-general`의 `.triggerRow{gap:8px}`에 대응).
|
|
29
|
+
상대 플러그인의 존재를 알지도, 값을 참조하지도 않습니다 — 협조는 각자의 CSS 안에서만 일어납니다.
|
|
30
|
+
- **레일 표시로의 축소**: `wide=false`에서는 `.dss_footerEntryRail`(36x36 원, 레이블 없음)이 되어
|
|
31
|
+
Figma 레일 규격(56px 레일 / 10px 패딩 / 36x36 컨트롤)과 공식 레일 컨트롤에 맞춥니다.
|
|
32
|
+
레이블은 넓은 모드에서만 나타납니다.
|
|
33
|
+
- **문구 소유권 수정**: 컴포넌트에 하드코딩된 `'会话管家'` 폴백을 제거하고, 진입점 레이블을
|
|
34
|
+
패널 제목과 같은 출처(사전 `panel.title`)로 옮겼습니다.
|
|
35
|
+
|
|
36
|
+
## 0.1.0-alpha.4
|
|
37
|
+
|
|
38
|
+
설정 카드에 서랍(드로어) 형태를 복원: 이전에는 맨 행만 있어 「플러그인」 설정 섹션의 다른 플러그인과 일치하지 않았다.
|
|
39
|
+
|
|
40
|
+
### 수정
|
|
41
|
+
|
|
42
|
+
- **설정 카드에 드로어 외피가 없음(중요)**: DSH 의 「플러그인」 설정 섹션
|
|
43
|
+
(`dsh-client-ui-settings-plugins`)이 하는 일은 단 하나——settings 네임스페이스별로
|
|
44
|
+
`settings.plugin.item` 을 배포하는 것:
|
|
45
|
+
|
|
46
|
+
renderSlot('settings.plugin.item', {}, { entryKey: ns })
|
|
47
|
+
|
|
48
|
+
외피는 **전혀 제공되지 않는다**. 카드의 제목·설명·펼침/접힘은 모두 플러그인 자신의 소유다.
|
|
49
|
+
이 플러그인은 맨 행만 렌더링했기 때문에 두 가지가 어긋났다:
|
|
50
|
+
1. 섹션 안 다른 플러그인의 「접이식 드로어」와 형태가 맞지 않음;
|
|
51
|
+
2. `card.title`(세션 스튜어드)과 `card.desc`(이력 파일 · 상태 점검)가
|
|
52
|
+
**정의만 되고 한 번도 렌더링되지 않는** 죽은 문구가 됨——이것이 「빠진 드로어 항목」.
|
|
53
|
+
|
|
54
|
+
이제 헤더(제목 + 설명 + chevron, 블록 전체 클릭 가능)를 복원하고
|
|
55
|
+
본문은 기본적으로 접힌다(같은 섹션의 다른 카드와 동일). `aria-expanded` 는 펼침 상태를 반영한다.
|
|
56
|
+
- **설정 서비스를 쓸 수 없을 때의 동작**: 이전에는 카드 전체가 「설정 서비스를 사용할 수 없음」 한 줄로
|
|
57
|
+
퇴화하며 **제목까지 사라졌다**. 이제는 드로어 헤더를 정상적으로 렌더링하고
|
|
58
|
+
사유는 본문에만 표시한다——이 플러그인이 섹션에서 완전히 사라지지 않는다.
|
|
59
|
+
|
|
60
|
+
### 변경
|
|
61
|
+
|
|
62
|
+
- 펼침 전환과 chevron 회전은 `prefers-reduced-motion` 을 따른다.
|
|
63
|
+
|
|
64
|
+
## 0.1.0-alpha.3
|
|
65
|
+
|
|
66
|
+
상태 점검 결과 캐시: 패널을 닫았다 열면 지연 없이 내용이 나오고, 처치 후에는 그 행만 갱신된다.
|
|
67
|
+
|
|
68
|
+
### 추가
|
|
69
|
+
|
|
70
|
+
- **상태 점검 결과 캐시(프로세스 내)**: 한 번의 완전 스캔(분할로 말뭉치를 끝까지 도는 것) 결과를
|
|
71
|
+
호스트 프로세스에 보관하고, 패널을 다시 열면 캐시를 그대로 렌더링한다(전량 재스캔 없음).
|
|
72
|
+
캐시는 **말뭉치를 한 바퀴 다 돌았을 때만** 성립한다——중간에 패널을 닫아도
|
|
73
|
+
반쪽 결과가 완전한 결론인 척하지 않는다.
|
|
74
|
+
- **`resume` 은 순수 읽기**: `session-health-scan` 에 `resume: true` 를 추가. **캐시만 읽고 스캔하지 않는다**.
|
|
75
|
+
패널은 마운트 시 이것으로 한 번만 무비용 탐색하고, 적중하면 내용을 내고 빗나가면 아무것도 하지 않는다
|
|
76
|
+
(마운트 즉시 중작업은 이전 버전에서 지적된 지점). 동시에 현재 말뭉치 총수를 돌려준다.
|
|
77
|
+
- **생성 시각과 갱신 입구**: 적중 시 「결과는 캐시 · N분 전」을 표시하고 「새로 고침」을 제공한다
|
|
78
|
+
(강제 전량 재스캔). 오래된 결과가 방금 스캔한 척하지 않는다.
|
|
79
|
+
- **말뭉치 변화 알림**: 캐시 시점의 말뭉치 총수와 현재가 다르면
|
|
80
|
+
「말뭉치가 변했습니다(a → b). 새로 고침을 권장」을 표시. 이 대조는 디렉터리 열거만 하므로 저렴하다
|
|
81
|
+
——따라서 캐시 무효화 전략 자체가 되지는 않는다.
|
|
82
|
+
|
|
83
|
+
### 변경
|
|
84
|
+
|
|
85
|
+
- **단건 되쓰기**: 단일 세션 상태 점검과 가역 처치 후에는 재스캔에 의존하지 않는다——
|
|
86
|
+
처치는 이미 `after` 를 재계산하므로 그것을 그대로 캐시에 되쓴다.
|
|
87
|
+
패널이 목록으로 돌아왔을 때 그 행은 이미 최신 단계다
|
|
88
|
+
(회복된 행은 사라진다. 「문제만 나열」과 일치).
|
|
89
|
+
- 캐시는 **디스크에 쓰지 않는다**: DSH 재시작 시 무효. 영속화에는 무효화 전략이 필요하고,
|
|
90
|
+
무효 판정 비용(말뭉치 열거, 로그 mtime/size 대조)은 재스캔 자체에 가깝다. 이번 슬라이스는 YAGNI.
|
|
91
|
+
|
|
92
|
+
### 테스트
|
|
93
|
+
|
|
94
|
+
- `tests/cache.spec.ts` 신규 추가(19건): 성립 규칙(미완주 / 완주 / 빈 말뭉치 / 중도 중단 / `clear`),
|
|
95
|
+
단건 되쓰기의 모든 분기(추가 / 교체 / 회복으로 제거 / no-op), 그리고 `handleMethod` 배선
|
|
96
|
+
(`resume` 은 스캔하지 않음, 분할 완주 후 적중, `onlyProblems=false` 는 캐시를 오염시키지 않음,
|
|
97
|
+
처치 후 되쓰기의 객체 동일성, cache 없는 런타임에서도 동작).
|
|
98
|
+
|
|
99
|
+
## 0.1.0-alpha.2
|
|
100
|
+
|
|
101
|
+
처치(처방)의 판정과 표시 수정: 「판정 불가」 게이트에 처방하지 않고, 처치 후의 결론을 명시한다.
|
|
102
|
+
|
|
103
|
+
### 수정
|
|
104
|
+
|
|
105
|
+
- **`skipped` 에 대한 오처방(중요)**: `prescribe()` 는 기존에 `level !== 'ok'` 로 프로젝션 캐시
|
|
106
|
+
격리 여부를 판단했기 때문에, 「이 게이트는 판정 불가」도 「프로젝션 캐시 미정합」으로 간주되어
|
|
107
|
+
자신의 근거와 모순되는 처방을 내고 **존재하지 않는** 기록의 격리를 제안했다.
|
|
108
|
+
공유 술어 `isActionable()`(`warn` / `fail` 만 처치 가능)을 추출해 일원화했다.
|
|
109
|
+
`gates.ts` 의 단계 기준과 `repair.ts` 의 처치 기준이 이제 같은 의미가 된다.
|
|
110
|
+
- **「사문 전록」 오탐**: 처치 항목이 없을 때 고정으로 「사문 전록(四門全綠)」을 표시했다.
|
|
111
|
+
게이트가 `skipped`(판정 불가이며 녹색이 아님)일 때 이 문구는 성립하지 않는다.
|
|
112
|
+
「처치 항목 없음(N 게이트 판정 불가, 이상 아님): <게이트 id 목록>」으로 변경했다.
|
|
113
|
+
- **처치 후에도 이상으로 표시되어 처치가 효과가 있었는지 알 수 없음**: 패널은 「처치 전 / 처치 후」의
|
|
114
|
+
단계만 렌더링했기 때문에 둘 다 이상일 때 「처치 실패」와 「처치가 병소와 무관」을 구분할 수 없었다.
|
|
115
|
+
호스트에 `assessRepair({ before, after, repair })` 를 추가해 5단계 중 하나와 사람용 설명을 반환한다:
|
|
116
|
+
`nothing-to-do`(사문 전록) / `repaired`(회복) / `repaired-with-residual`(캐시는 격리했으나
|
|
117
|
+
캐시와 무관한 이상이 잔존, 예: 세션 로그의 open step) /
|
|
118
|
+
`not-applicable`(현재 이상에 가역 처치 항목이 없음) / `failed`(처치 자체의 실패).
|
|
119
|
+
패널은 단계별 배색으로 결론 배너를 렌더링한다.
|
|
120
|
+
|
|
121
|
+
### 설명
|
|
122
|
+
|
|
123
|
+
- **처치 능력은 불변**: 「프로젝션 캐시 기록의 격리만, 복사 후 이동, 세션 로그는 개서하지 않음」.
|
|
124
|
+
이번에는 **판정**과 **표시**만 수정했다. 대표적 사례는 「`cold-read` 만 이상
|
|
125
|
+
(세션에 미결제 open step 이 있음)」——이는 본래 이 플러그인이 복구할 대상이 아니며,
|
|
126
|
+
이제는 `not-applicable` 로 명시하고 사유를 설명한다. 조용히 「처치 후에도 이상」으로
|
|
127
|
+
표시하지 않는다.
|
|
128
|
+
|
|
129
|
+
### 테스트
|
|
130
|
+
|
|
131
|
+
- `tests/repair.spec.ts` 신규 추가(12건): `isActionable` 의 네 단계, `prescribe` 가 빈 처방을 내지
|
|
132
|
+
않음, `assessRepair` 5단계 판정의 분기를 커버.
|
|
133
|
+
|
|
134
|
+
## 0.1.0-alpha.1
|
|
135
|
+
|
|
136
|
+
상태 점검 패널의 판정과 피드백 수정: 「주의」 전량 오탐을 해소하고 스캔 진행률과 행 내 사유를 추가.
|
|
137
|
+
|
|
138
|
+
### 수정
|
|
139
|
+
|
|
140
|
+
- **「주의」 전량 오탐(중요)**: `lossless-json` / `projection-cache` / `cold-read` 세 게이트가
|
|
141
|
+
**판정 불가**일 때(콜드 세션에 핫 프로젝션이 없음, 캐시 기록 미생성, 로그에 turn/end 없음)
|
|
142
|
+
`warn` 을 반환하여 **로드되지 않은 모든 세션이 항상 「주의」** 가 되고 실제 신호가 노이즈에
|
|
143
|
+
묻혔다. 중립 단계 `skipped`(패널 표기는 「미점검」)를 추가하여 「관측 불가」를 담당하게 하고
|
|
144
|
+
**총합 판정에 기여하지 않게** 했다.
|
|
145
|
+
고정한 기준: `warn` = 이상 현상을 관측(근거 있음) / `skipped` = 관측·판정 불가(근거 없음).
|
|
146
|
+
실측: 30개 세션이 「30×주의」 → 「26 정상 / 3 주의 / 1 이상」.
|
|
147
|
+
- **목록 행에 사유 미표시**: 결과 목록이 총합 단계만 렌더링해 행끼리 구분되지 않았다.
|
|
148
|
+
비정상(non-ok) 「게이트·단계」 요약(예 `연결성·주의`)을 행 안에 표시하여 개별로 열 필요를 없앴다.
|
|
149
|
+
|
|
150
|
+
### 추가
|
|
151
|
+
|
|
152
|
+
- **스캔 진행률**: `session-health-scan` 이 `offset` 분할 호출을 지원하고 `total` 을 반환한다.
|
|
153
|
+
패널은 소배치로 연속 호출해 **실제 진행률**(`n/total · 경과 Xs`)을 자체 누적한다.
|
|
154
|
+
분모를 아직 받지 못한 첫 회차는 불확정 애니메이션. 호스트는 무상태를 유지하며
|
|
155
|
+
동기 루프를 비동기로 바꿀 필요가 없다.
|
|
156
|
+
- **처치 비지 표시**: 가역 처치 버튼에 스피너를 추가하고 비활성 상태를 유지.
|
|
157
|
+
|
|
158
|
+
### 변경
|
|
159
|
+
|
|
160
|
+
- **탭 이름 변경**: `病案室` → `養老院`(영어 `Records Room` → `Retirement Home`).
|
|
161
|
+
「상태 점검 / 처방 / 퇴원」 메타포와 통일.
|
|
162
|
+
|
|
163
|
+
## 0.1.0-alpha.0
|
|
164
|
+
|
|
165
|
+
첫 번째 alpha 버전: 세션 스튜어드(히스토리 파일 + 상태 점검).
|
|
166
|
+
|
|
167
|
+
### 추가
|
|
168
|
+
|
|
169
|
+
- **세션 히스토리 파일(기록 보관소)**: `dsh-session-search-toggle`에서 공식 아카이브 집합의 읽기 및 정리 구현을 이관했으며,
|
|
170
|
+
동작은 이관 전과 동등합니다(백업 + 동일 디렉터리 임시 쓰기 + 원자적 교체; 명시적 편집 모드에서만 정리 허용).
|
|
171
|
+
차이점: 목록 출처가 **공식 아카이브 집합 진값**으로 변경되었습니다(registry 우선, 스토리지 파일 폴백). 독립 인덱스가 검색 인덱스 패키지와 함께 떠났기 때문입니다;
|
|
172
|
+
제목 등 메타데이터는 최선 노력 방식입니다(`sessionQuery` 제목 스냅샷 → 프로젝션 캐시 title → 비어 있음).
|
|
173
|
+
- **상태 점검(점검 → 처방 → 퇴원)**: 독립적으로 테스트 가능한 네 개의 gate
|
|
174
|
+
(`log-integrity` / `projection-cache` / `lossless-json` / `cold-read`),
|
|
175
|
+
통일된 출력 `{ id, level, evidence, attribution, detail }`; `SessionHealthReport`로 집계됩니다.
|
|
176
|
+
- **귀속 인덱스**: 프로필의 `node_modules/<pkg>/lib/*.js`를 정적 스캔하여 「프로젝션 key → 패키지 이름」을 구축하고,
|
|
177
|
+
실패한 gate를 구체적인 플러그인과 필드 경로로 되돌려 지목합니다; 찾지 못하면 사실대로 `unknown`으로 표기합니다.
|
|
178
|
+
- **되돌릴 수 있는 처방**: 손상된 프로젝션 캐시 레코드 격리(먼저 복사 백업, 그다음 `.quarantine-<ts>`로 이동) + 명령 목록.
|
|
179
|
+
세션 로그 재작성, 히스토리 데이터 변경, 필드 무단 삭제는 **금지**합니다.
|
|
180
|
+
- **두 개의 feature gate**: `historyFiles` / `healthCheck`, 꺼지면 해당 하위 도메인 전체가 등록되지 않고(명시적 disabled 오류),
|
|
181
|
+
클라이언트도 해당 탭을 렌더링하지 않습니다.
|
|
182
|
+
- **라우트**: `/session-steward/api/*`, 메서드 이름은 일괄 `session-*`이며, 검색 인덱스의 `/switch-search/api`의 `index-*`와 완전히 격리됩니다.
|
|
183
|
+
|
|
184
|
+
### 알려진 제한
|
|
185
|
+
|
|
186
|
+
- `lossless-json` gate는 호스트가 `sessionProjections`(핫 상태)를 노출해야 확정 판정을 내릴 수 있습니다;
|
|
187
|
+
얻지 못하면 사실대로 `warn`으로 강등하며, 추측하지 않습니다.
|
|
188
|
+
- 상태 스캔은 기본적으로 최근 30개의 비정상 세션만 나열하며(`limit` 상한 200), 전체 라이브러리 순회를 기본 동작으로 삼지 않습니다.
|
|
189
|
+
- 클라이언트 패널은 최소 구현(목록 + 상세 + 3단계 버튼)이며, 가상 스크롤과 일괄 작업은 구현하지 않았습니다.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0-alpha.6
|
|
4
|
+
|
|
5
|
+
### 修复 —— 图标与文案间距收紧;窄栏下不再挤掉邻居
|
|
6
|
+
|
|
7
|
+
- **间距 8px → 4px**:`🧭` 与「会话管家」之间的空隙按实测收紧(用户反馈「icon 文字间隔小点」)。
|
|
8
|
+
同时把自身内边距从 `0 12px 0 10px` 收到 `0 10px 0 8px`,与相邻「搜索」胶囊的左右内边距一致。
|
|
9
|
+
- **自己会缩,不再把邻居挤扁**:`.dss_entryWrap` 由 `flex:none` 改为 `flex:0 1 auto; min-width:0`,
|
|
10
|
+
外层前距 `8px → 6px`。它此前从不让位,缺口全落在搜索胶囊上,把对方标签挤成一个字;
|
|
11
|
+
现在空间不足时先由自己承担(标签带省略号收尾)。
|
|
12
|
+
- **轨道尺寸回到 28×28**:轨道内容盒只有 36px(56px 轨道 − 2×10px 内边距),两个入口同处一行装不下
|
|
13
|
+
两个 36px 控制盒(实测 36+28=64px,溢出 14px)。取 28+28=56px,比改动前的 32+28=60px 还窄。
|
|
14
|
+
- **协同边界未变**:依旧只动自己的 CSS,不引用搜索索引任何值,也不假设其是否安装;
|
|
15
|
+
两者都装时整行自然宽度 217px,单独存在时各占整行。
|
|
16
|
+
|
|
17
|
+
## 0.1.0-alpha.5
|
|
18
|
+
|
|
19
|
+
### 变更 —— 侧边栏入口带文案,与「搜索索引」同行自适应
|
|
20
|
+
|
|
21
|
+
- **入口有名字了**:脚部入口原先是 28×28 的单个图标圆钮(🧭),既没有文案,也说不清点开是什么。
|
|
22
|
+
宽栏下改为 42px 行控件:**🧭 会话管家**,与相邻的「搜索」胶囊同高、同圆角(12px)、同字号。
|
|
23
|
+
- **同一行的几何协同**:搜索入口声明 `flex:1;min-width:0` 后不再独占整行,两个入口作为
|
|
24
|
+
`sidebar.footer.action` 的兄弟项共处一行;本入口在宽栏加 `margin-left:8px` 让出间距
|
|
25
|
+
(对照官方 `ui-settings-general` 的 `.triggerRow{gap:8px}`)。本插件不知道对方是否存在、也不引用对方任何值——
|
|
26
|
+
协同只发生在各自的 CSS 上。
|
|
27
|
+
- **收起轨道退化**:`wide=false` 时按钮走 `.dss_footerEntryRail`(36×36 圆、不带文案),与 Figma 轨道规范
|
|
28
|
+
(56px 轨道 / 10px 内边距 / 36×36 控制盒)及官方轨道控件一致;文案与宽栏同条件出现。
|
|
29
|
+
- **文案归属修正**:组件里硬编码的 `'会话管家'` 兜底已删除,入口文案与面板标题同源(字典 `panel.title`),
|
|
30
|
+
词典仍是唯一出处。
|
|
31
|
+
|
|
32
|
+
### 变更 —— 一个动词拆成两个:「取消归档状态」与「清理归档文件」
|
|
33
|
+
|
|
34
|
+
**问题不是措辞,是语义**。此前面板只有一个操作,按钮却叫「删除选中」——
|
|
35
|
+
它既不是删除(一个字节都没删),也不只做一件事(改了数组,就宣称「删除」)。
|
|
36
|
+
于是同一个动作被叫成三个名字(删除 / 清理 / 移除),玩家和实现者对不上。
|
|
37
|
+
|
|
38
|
+
现在拆成两个**独立路由、独立按钮、独立确认弹窗**的操作:
|
|
39
|
+
|
|
40
|
+
| | 取消归档状态 | 清理归档文件 |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| 路由 | `session-history-prune` | **`session-history-purge`**(新增) |
|
|
43
|
+
| 改什么 | 只改 `global.archivedSessionIds` | 删磁盘实体 **+** 改两处 id |
|
|
44
|
+
| 磁盘文件 | 原样不动 | **消失** |
|
|
45
|
+
| 会话去向 | 回到侧边栏原工作区 | 从世界上消失 |
|
|
46
|
+
| 可逆 | ✅ 重启即生效 | ❌ **不可逆** |
|
|
47
|
+
|
|
48
|
+
「清理归档文件」一次动 4 处:
|
|
49
|
+
|
|
50
|
+
1. `~/.dsh/sessions/<工作区>/<会话id>/` —— **整个目录**。实测 3 个目录里同时存在
|
|
51
|
+
`session.jsonl.zstd` 与旧格式 `session.v3.jsonl.zstd`,只删当前格式那份会留下垃圾。
|
|
52
|
+
2. `~/.dsh/storages/session_projcache/sessions/<会话id>.json` —— 逐条投影缓存。
|
|
53
|
+
> 注意另有一个 `storages/session_projcache.json`(整份布局,99.4 MB,最后写入停留在
|
|
54
|
+
> 09-11):那是布局迁移留下的**化石**,宿主早已不写它,本插件也不碰它。
|
|
55
|
+
> 活的投影缓存是 `session_projcache/sessions/`(实测 143.4 MB / 275 条,今天仍在写)。
|
|
56
|
+
3. `workspace.json` → `global.archivedSessionIds`
|
|
57
|
+
4. `workspace.json` → `tables.workspaces.*.sessionIds`
|
|
58
|
+
|
|
59
|
+
**清理必须连带取消归档**:文件删了、id 还留在数组里就是僵尸归档 ——
|
|
60
|
+
侧边栏看不见它,一旦被取消归档又会冒出一个打不开的空会话。
|
|
61
|
+
|
|
62
|
+
**执行顺序是「先改文件、后删实体」**:改文件是原子的且可整体中止
|
|
63
|
+
(存储文件不可用时**一个字节都不删**);反过来先删实体再改文件,中途失败会留下僵尸 id。
|
|
64
|
+
|
|
65
|
+
**破坏性操作的护栏**:
|
|
66
|
+
|
|
67
|
+
- 缺 `dshHome` 直接拒绝执行 —— 不接受猜测的路径;
|
|
68
|
+
- 删除前用 `isSafeChild` 断言目标是预期 root 的**指定层数**子项
|
|
69
|
+
(拼错一层就是删掉整个 `sessions` 根);
|
|
70
|
+
- 逐条独立,失败只记不抛,返回 `failures` 明细,面板逐条列出;
|
|
71
|
+
- 沿用一个写入口 `editWorkspaceDocument`(备份 + 同目录临时写入 + 原子改名)。
|
|
72
|
+
|
|
73
|
+
### 变更 —— 体积按「勾选单元」算,不给总量
|
|
74
|
+
|
|
75
|
+
单条会话的占用差异极大(实测:某条投影缓存 23.47 MB 而转录只有 0.07 MB;
|
|
76
|
+
也有 0 字节的)。因此:
|
|
77
|
+
|
|
78
|
+
- **每一行**显示自己的 `转录 6.2 MB · 缓存 2.3 MB`;
|
|
79
|
+
- 列表头显示 `共 72 条 · 占 98.6 MB`;
|
|
80
|
+
- 按钮显示**所选小计**:`清理归档文件 (3) · 释放 38.2 MB`;
|
|
81
|
+
- 确认弹窗逐条列体积 + 合计。
|
|
82
|
+
|
|
83
|
+
### 修复 —— 养老院清理后「没反应」:读的人和写的人不是同一份数据
|
|
84
|
+
|
|
85
|
+
**症状**:编辑模式勾选归档会话 → `confirm` → 提示清理成功,但列表**一条没少**、
|
|
86
|
+
面板也没有任何可见变化,看起来完全没生效。
|
|
87
|
+
|
|
88
|
+
**根因**:两个路由各认一份数据,且**互不相通**。
|
|
89
|
+
|
|
90
|
+
| 路由 | 认的那份 |
|
|
91
|
+
|---|---|
|
|
92
|
+
| `session-history-prune` | 存储文件 `~/.dsh/storages/workspace.json` 的 `global.archivedSessionIds`(备份 + 原子替换) |
|
|
93
|
+
| `session-history-list` | **宿主内存 `workspaceRegistry.archivedSessionIds` 优先**(只有文件读不到才回退) |
|
|
94
|
+
|
|
95
|
+
`registry` 是宿主**启动时**载入的快照,直接编辑文件不会回写它。于是:
|
|
96
|
+
|
|
97
|
+
- 文件真的在瘦身(实测 166 → 159 → 151 → 103 → 72 → 71,每次确认都留下 `.bak-*` 备份);
|
|
98
|
+
- 列表却永远返回同一批 —— 用户按同一顺序勾选,每次都在删「列表里的头几条」,
|
|
99
|
+
而列表压根不变,所以观感是「点了确认,什么都没发生」。
|
|
100
|
+
|
|
101
|
+
**修法**:让列表与 prune **同源**。
|
|
102
|
+
|
|
103
|
+
- `readArchiveSet` 改为**存储文件优先**,`registry` 退居文件缺失时的兜底;
|
|
104
|
+
registry 仍被读取,但只作为诊断面(`registryIds`)返回。
|
|
105
|
+
- `session-history-list` 新增 `pendingRestart`:registry 里**有**、文件里**没有**的 id 数
|
|
106
|
+
—— 即「已清理落盘、但本进程仍生效」的悬挂项。面板据此显示黄色提示,
|
|
107
|
+
并标出列表总条数,让「少了一条」肉眼可验。
|
|
108
|
+
- `pruneHistory` 增加**写后校验**:写回后重新读文件确认目标 id 确实消失,
|
|
109
|
+
否则如实报错,不再出现「面板说成功、文件其实没变」。
|
|
110
|
+
|
|
111
|
+
### 已知风险 —— 宿主会把整份内存快照写回,清理可能被「复活」
|
|
112
|
+
|
|
113
|
+
存储层(`dsh-storage-json`)是**全量重写、内存为准**:每次写都用内存状态
|
|
114
|
+
`serialize` 整份文档覆盖文件,且没有独立的关停 flush。所以清理之后、重启之前,
|
|
115
|
+
**任何一次归档或工作区改动都会把旧的 `archivedSessionIds` 整份写回**,本次清理归零。
|
|
116
|
+
|
|
117
|
+
这不是本插件的 bug(官方没有 unarchive 端点,文件是唯一可写面),
|
|
118
|
+
但必须让用户知道 —— 已在 confirm 弹窗与成功提示里写明:**清理后请立刻重启 DSH**。
|
|
119
|
+
|
|
120
|
+
## 0.1.0-alpha.4
|
|
121
|
+
|
|
122
|
+
设置卡补回抽屉形态:此前只剩裸行,在「插件」设置分区里与其它插件不一致。
|
|
123
|
+
|
|
124
|
+
### 修复
|
|
125
|
+
|
|
126
|
+
- **设置卡缺少抽屉外壳(重要)**:DSH 的「插件」设置分区(`dsh-client-ui-settings-plugins`)
|
|
127
|
+
只做一件事——按 settings 命名空间分发 `settings.plugin.item`:
|
|
128
|
+
|
|
129
|
+
renderSlot('settings.plugin.item', {}, { entryKey: ns })
|
|
130
|
+
|
|
131
|
+
它**不提供任何外壳**:卡片的标题、说明、展开/收起全归插件自己所有。
|
|
132
|
+
本插件此前只渲染了裸行,于是有两处不对:
|
|
133
|
+
1. 在分区里与其它插件的「可折叠抽屉」形态不一致;
|
|
134
|
+
2. `card.title`(会话管家)与 `card.desc`(历史文件 · 健康检查)**定义了却从未被渲染**,
|
|
135
|
+
成了死文案——这正是「漏加的抽屉项」。
|
|
136
|
+
|
|
137
|
+
现在补回头部(标题 + 说明 + chevron,整块可点切换),主体默认收起,
|
|
138
|
+
与同分区其它卡片一致;`aria-expanded` 同步反映展开态。
|
|
139
|
+
- **设置服务不可用时的表现**:原先整个卡片退化成一行「设置服务不可用」,
|
|
140
|
+
并因此**连标题一起丢掉**;现在抽屉头照常渲染,只在主体里说明原因——
|
|
141
|
+
这个插件不会在分区里彻底消失。
|
|
142
|
+
|
|
143
|
+
### 变更
|
|
144
|
+
|
|
145
|
+
- 展开态切换与 chevron 旋转遵循 `prefers-reduced-motion`。
|
|
146
|
+
|
|
147
|
+
## 0.1.0-alpha.3
|
|
148
|
+
|
|
149
|
+
体检结果缓存:关面板再打开零延迟出内容,且处置后只更新那一行。
|
|
150
|
+
|
|
151
|
+
### 新增
|
|
152
|
+
|
|
153
|
+
- **体检结果缓存(进程内)**:一次完整扫描(分批走满整个语料)后结果留在宿主进程里,
|
|
154
|
+
面板再次打开直接渲染缓存,不再全量重扫。缓存**只在走满一遍语料后才成型**——
|
|
155
|
+
扫到一半关掉面板不会留下半份结果冒充完整结论。
|
|
156
|
+
- **`resume` 纯读探测**:`session-health-scan` 新增 `resume: true`,**只读缓存、不做任何扫描**。
|
|
157
|
+
面板挂载时用它零成本探一次:命中就出内容,不命中就什么都不做
|
|
158
|
+
(挂载即干重活是上一版被诟病的地方)。同时捎回当前语料总数。
|
|
159
|
+
- **生成时间与刷新入口**:命中缓存时面板显示「结果来自缓存 · N 分钟前」并给出「刷新」
|
|
160
|
+
(强制全量重扫)。旧结果绝不冒充刚扫的。
|
|
161
|
+
- **语料变化提示**:缓存的语料总数与当前不一致时提示「语料已变化(a → b),建议刷新」。
|
|
162
|
+
这条对账只做目录枚举,很便宜——所以它不构成新的缓存失效策略。
|
|
163
|
+
|
|
164
|
+
### 变更
|
|
165
|
+
|
|
166
|
+
- **单条就地回写**:单会话体检与可逆处置后不再依赖重扫——处置本就重算了 `after` 报告,
|
|
167
|
+
直接写回缓存;面板退回列表时该行已是最新档位(转好的行从此消失,与「只列问题」一致)。
|
|
168
|
+
- 缓存**不落盘**:DSH 重启即失效。落盘需要失效策略,而判断失效的代价(枚举语料、
|
|
169
|
+
比对日志 mtime/size)已接近重扫本身,本切片取 YAGNI。
|
|
170
|
+
|
|
171
|
+
### 测试
|
|
172
|
+
|
|
173
|
+
- 新增 `tests/cache.spec.ts`(19 例):成型规则(未走满 / 走满 / 空语料 / 中途中断 / `clear`)、
|
|
174
|
+
单条回写全分支(新增 / 替换 / 转好移出 / no-op),以及 `handleMethod` 接线
|
|
175
|
+
(`resume` 不扫描、分批走满后命中、`onlyProblems=false` 不污染缓存、
|
|
176
|
+
处置后回写的对象身份、缺 cache 的运行时仍可用)。
|
|
177
|
+
|
|
178
|
+
## 0.1.0-alpha.2
|
|
179
|
+
|
|
180
|
+
处置(处方)的判定与呈现修正:不再对「无从判定」的门开方,并明确给出处置后的结论。
|
|
181
|
+
|
|
182
|
+
### 修复
|
|
183
|
+
|
|
184
|
+
- **对 `skipped` 误开处方(重要)**:`prescribe()` 原先用 `level !== 'ok'` 判断投影缓存是否需要隔离,
|
|
185
|
+
于是「本门无从判定」也被当成「投影缓存未对齐」,对着自己的证据输出自相矛盾的处方,
|
|
186
|
+
并建议隔离一条**并不存在**的记录。抽出共享谓词 `isActionable()`(仅 `warn` / `fail` 可处置)统一收口,
|
|
187
|
+
`gates.ts` 的档位标准与 `repair.ts` 的处置标准自此是同一件事。
|
|
188
|
+
- **「四门全绿」误报**:无处置项时固定回「四门全绿」。当门是 `skipped`(无从判定,而非绿)时该文案不成立;
|
|
189
|
+
现在改为「无可处置项(N 门无从判定,非异常):<门 id 列表>」。
|
|
190
|
+
- **处置后仍显示异常,无从判断处置是否生效**:面板只渲染「处置前 / 处置后」两个档位,
|
|
191
|
+
两者都是异常时无法区分「处置失败」与「处置与病灶无关」。
|
|
192
|
+
宿主新增 `assessRepair({ before, after, repair })`,判定为五档之一并附人读说明:
|
|
193
|
+
`nothing-to-do`(四门全绿)/ `repaired`(已恢复)/ `repaired-with-residual`(已隔离缓存,
|
|
194
|
+
但仍有与该缓存无关的异常,如会话日志的 open step)/ `not-applicable`(当前异常无可逆处置项)/
|
|
195
|
+
`failed`(处置自身失败)。面板按档位配色渲染结论横幅。
|
|
196
|
+
|
|
197
|
+
### 说明
|
|
198
|
+
|
|
199
|
+
- **处置能力未变**:仍是「只隔离投影缓存记录、复制后移动、不改会话日志」,本次只修正**判定**与**呈现**。
|
|
200
|
+
典型场景是「仅 `cold-read` 异常(会话存在未结算的 open step)」——这类异常本就不该由本插件修复,
|
|
201
|
+
现在会明确判为 `not-applicable` 并说明原因,而不是静默显示成「处置后还是异常」。
|
|
202
|
+
|
|
203
|
+
### 测试
|
|
204
|
+
|
|
205
|
+
- 新增 `tests/repair.spec.ts`(12 例):覆盖 `isActionable` 的四档、`prescribe` 不再开空方,
|
|
206
|
+
以及 `assessRepair` 五档判定的分支。
|
|
207
|
+
|
|
208
|
+
## 0.1.0-alpha.1
|
|
209
|
+
|
|
210
|
+
体检面板的判定与反馈修正:修掉「注意」全量误报,并补上扫描进度与行内原因。
|
|
211
|
+
|
|
212
|
+
### 修复
|
|
213
|
+
|
|
214
|
+
- **「注意」全量误报(重要)**:`lossless-json` / `projection-cache` / `cold-read` 三门在
|
|
215
|
+
**无从判定**时(冷态会话没有热态投影、缓存记录尚未生成、日志里没有 turn/end)返回 `warn`,
|
|
216
|
+
导致**所有未加载的会话恒为「注意」**,真信号被淹没。
|
|
217
|
+
新增中性档 `skipped`(面板文案「未检查」)承载「无从观测」,**不参与总判聚合**。
|
|
218
|
+
固化的判定标准:`warn` = 观测到异常现象(有据);`skipped` = 无从观测/无从判定(无据)。
|
|
219
|
+
实测:30 条会话由「30×注意」变为「26 正常 / 3 注意 / 1 异常」。
|
|
220
|
+
- **列表行不显示触发原因**:体检结果列表只渲染聚合档位,行与行之间不可区分。
|
|
221
|
+
现在行内列出非 ok 的「门·档位」摘要(如 `可接续性·注意`),无需逐条点开详情。
|
|
222
|
+
|
|
223
|
+
### 新增
|
|
224
|
+
|
|
225
|
+
- **体检扫描进度**:`session-health-scan` 支持 `offset` 分批调用并返回 `total`;
|
|
226
|
+
面板按小批次连续调用、自行累计**真实进度**(`n/total · 已用 Xs`)。
|
|
227
|
+
首批未拿到分母时走不确定态动画。宿主保持无状态,同步扫描循环无需改异步。
|
|
228
|
+
- **处置忙碌反馈**:可逆处置按钮加 spinner 并保持禁用,避免点击后界面静止。
|
|
229
|
+
|
|
230
|
+
### 变更
|
|
231
|
+
|
|
232
|
+
- **页签改名**:`病案室` → `养老院`(英文 `Records Room` → `Retirement Home`),
|
|
233
|
+
与「体检 / 处方 / 出院」的隐喻统一。
|
|
234
|
+
|
|
235
|
+
## 0.1.0-alpha.0
|
|
236
|
+
|
|
237
|
+
首个 alpha 版本:会话管家(历史文件 + 健康检查)。
|
|
238
|
+
|
|
239
|
+
### 新增
|
|
240
|
+
|
|
241
|
+
- **会话历史文件(病案室)**:从 `dsh-session-search-toggle` 迁入官方归档集合的读取与清理实现,
|
|
242
|
+
行为与迁移前等价(备份 + 同目录临时写 + 原子替换;显式编辑模式才允许清理)。
|
|
243
|
+
差异:列表来源改为**官方归档集合真值**(registry 优先、存储文件回退),因为独立索引已随搜索索引包离开;
|
|
244
|
+
标题等元数据为尽力而为(`sessionQuery` 标题快照 → 投影缓存 title → 空)。
|
|
245
|
+
- **健康检查(体检 → 处方 → 出院)**:四个可独立测试的 gate
|
|
246
|
+
(`log-integrity` / `projection-cache` / `lossless-json` / `cold-read`),
|
|
247
|
+
统一输出 `{ id, level, evidence, attribution, detail }`;聚合为 `SessionHealthReport`。
|
|
248
|
+
- **归属索引**:静态扫描 profile 的 `node_modules/<pkg>/lib/*.js`,建立「投影 key → 包名」,
|
|
249
|
+
把失败 gate 指回具体插件与字段路径;扫不到时如实标 `unknown`。
|
|
250
|
+
- **可逆处方**:隔离损坏的投影缓存记录(先复制备份,再移动到 `.quarantine-<ts>`)+ 命令清单。
|
|
251
|
+
**禁止**改写会话日志、改历史数据、静默丢弃字段。
|
|
252
|
+
- **两个 feature gate**:`historyFiles` / `healthCheck`,关闭时对应子域整域不注册(显式 disabled 错误),
|
|
253
|
+
客户端也不渲染对应页签。
|
|
254
|
+
- **路由**:`/session-steward/api/*`,方法名一律 `session-*`,与搜索索引的 `/switch-search/api` 的 `index-*` 完全隔离。
|
|
255
|
+
|
|
256
|
+
### 已知限制
|
|
257
|
+
|
|
258
|
+
- `lossless-json` gate 依赖宿主暴露 `sessionProjections`(热态)才能给出确定判定;
|
|
259
|
+
拿不到时如实降级为 `warn`,不臆测。
|
|
260
|
+
- 健康扫描默认只列最近 30 个非健康会话(`limit` 上限 200),不做全库遍历的默认行为。
|
|
261
|
+
- 客户端面板为最小实现(列表 + 详情 + 三步按钮),未做虚拟滚动与批量操作。
|