dsh-manage-session 0.3.3 → 0.4.8
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 +19 -0
- package/CHANGELOG.ko.md +18 -0
- package/CHANGELOG.md +40 -0
- package/dsh.plugin.json +2 -2
- package/lib/client.js +167 -33
- package/lib/index.d.ts +123 -8
- package/lib/index.js +1147 -815
- package/package.json +125 -122
- package/src/client/card.tsx +150 -153
- package/src/client/health-panel.tsx +51 -0
- package/src/client/host-api.ts +14 -1
- package/src/client/index.ts +337 -234
- package/src/client/locales.ts +15 -0
- package/src/host/health/gates.ts +4 -1
- package/src/host/health/source-kind.ts +350 -0
- package/src/host/history/archive.ts +4 -1
- package/src/host/history/purge.ts +51 -4
- package/src/index.ts +56 -48
package/CHANGELOG.ja.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# 変更履歴
|
|
2
2
|
|
|
3
|
+
## 0.4.8
|
|
4
|
+
|
|
5
|
+
### 修正 —— ST1:変換が第一-party プロデューサー名でホストと食い違う問題
|
|
6
|
+
|
|
7
|
+
- `migrateSessionSourceKind` は行ごとに `isFirstPartyLegacyProducer` を照合(ホスト
|
|
8
|
+
`dsh-session-format-v3-to-v4@0.1.7-rc.2` lib/index.js:51-84 の2表を一字一句収録、
|
|
9
|
+
実測 5+25=**30** 名)。該当行はスキップし `skippedFirstParty` で正直に報告——
|
|
10
|
+
第一-party 名はホストの改名表/同名 kind(role 敏感分岐含む)で処理されるため、
|
|
11
|
+
無条件の接頭辞付与はホストが生成しない kind を書き出し、帰属を静かに壊します。
|
|
12
|
+
第一方旧行のみのログは書き込まない。30 名対照テストとホスト公式デコーダ読み返し
|
|
13
|
+
検証を追加(161 テスト全緑)。
|
|
14
|
+
|
|
15
|
+
### 強化 —— R2:purge 側が署名変換バックアップを認識
|
|
16
|
+
|
|
17
|
+
- 統計とクリーンアップの両経路で `*.pre-sourcemigrate-<ts>` バックアップを認識:
|
|
18
|
+
統計は行ごとに `backupBytes`/`backupCount` を追加(`bytes` の部分集合、単列で
|
|
19
|
+
誤読防止)、クリーンアップ結果は `backupsRemoved` を追加。回帰 6 件を追加、
|
|
20
|
+
全 167 テスト。
|
|
21
|
+
|
|
3
22
|
## 0.1.0-alpha.6
|
|
4
23
|
|
|
5
24
|
### 修正 —— アイコンとラベルの間隔を詰め、狭いサイドバーで隣を潰さない
|
package/CHANGELOG.ko.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# 변경 이력
|
|
2
2
|
|
|
3
|
+
## 0.4.8
|
|
4
|
+
|
|
5
|
+
### 수정 —— ST1:변환이 제1자 프로듀서명에서 호스트와 불일치
|
|
6
|
+
|
|
7
|
+
- `migrateSessionSourceKind`는 행마다 `isFirstPartyLegacyProducer`를 조회(호스트
|
|
8
|
+
`dsh-session-format-v3-to-v4@0.1.7-rc.2` lib/index.js:51-84의 두 표를 그대로 수록,
|
|
9
|
+
실측 5+25=**30**명). 해당 행은 건너뛰고 `skippedFirstParty`로 정직하게 보고——
|
|
10
|
+
제1자명은 호스트의 개명표/동명 kind(role 민감 분기 포함)으로 처리되므로 무조건
|
|
11
|
+
접두사를 붙이면 호스트가 생성하지 않는 kind를 기록해 귀속이 조용히 손상됩니다.
|
|
12
|
+
제1자 구형 행만 있는 로그는 기록하지 않음. 30명 대조 테스트와 호스트 공식
|
|
13
|
+
디코더 재독 단언 추가(161 테스트 전부 통과).
|
|
14
|
+
|
|
15
|
+
### 강화 —— R2:purge 측 서명 변환 백업 인식
|
|
16
|
+
|
|
17
|
+
- 통계와 정리 양 경로에서 `*.pre-sourcemigrate-<ts>` 백업을 인식: 통계는 행마다
|
|
18
|
+
`backupBytes`/`backupCount` 추가(`bytes`의 부분집합, 단열로 오독 방지),
|
|
19
|
+
정리 결과에 `backupsRemoved` 추가. 회귀 6건 추가, 전체 167 테스트.
|
|
20
|
+
|
|
3
21
|
## 0.1.0-alpha.6
|
|
4
22
|
|
|
5
23
|
### 수정 — 아이콘과 레이블 간격 축소, 좁은 사이드바에서 이웃을 밀어내지 않음
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.8
|
|
4
|
+
|
|
5
|
+
### 修复 —— ST1:转换对第一方生产者名与宿主分叉
|
|
6
|
+
|
|
7
|
+
- `migrateSessionSourceKind` 逐行查 `isFirstPartyLegacyProducer`(两张表逐字照录宿主
|
|
8
|
+
`dsh-session-format-v3-to-v4@0.1.7-rc.2` lib/index.js:51-84,实测 5+25=**30** 个第一方名),
|
|
9
|
+
命中即跳过该行并以 `skippedFirstParty` 如实上报——第一方名走宿主改名表/同名裸 kind
|
|
10
|
+
(含 role 敏感分支),无条件加前缀会写出宿主永不产出的 kind,静默损坏归因。
|
|
11
|
+
只含第一方旧行时不写盘。新增 30 名对照测试与宿主官方解码器读回断言(161 测试全绿)。
|
|
12
|
+
|
|
13
|
+
### 加固 —— R2:purge 侧识别署名转换备份
|
|
14
|
+
|
|
15
|
+
- 归档统计与清理两路识别 `*.pre-sourcemigrate-<ts>` 备份(后缀常量
|
|
16
|
+
`SOURCE_MIGRATE_BACKUP_SUFFIX` 已在 0.4.7 导出,本次接线):
|
|
17
|
+
- **统计**:`locateSessionUsage` / `session-history-list` 每行新增 `backupBytes` /
|
|
18
|
+
`backupCount`——备份是 `bytes` 的子集,单列出来免得被当作日志体积误读;
|
|
19
|
+
- **清理**:`session-history-purge` 结果新增 `backupsRemoved`(整目录删除本就连带
|
|
20
|
+
备份,此处置个数让「备份一并处置」如实上报,不再是黑箱)。
|
|
21
|
+
- 新增 6 条回归(后缀判定、统计单列、如实 0、清理上报、连带保留、列表带出),全套 167 测试。
|
|
22
|
+
|
|
23
|
+
## 0.4.7
|
|
24
|
+
|
|
25
|
+
### 新增 —— 插件署名格式体检门(source-kind)与旧署名转换
|
|
26
|
+
|
|
27
|
+
- **背景**:宿主 0.1.7-rc.1 起(会话格式 v4)拒绝裸 `source: { kind: 'plugin', plugin }` 署名
|
|
28
|
+
(SessionFormatError,整轮失败);genui 之外的未适配插件(session-guard、prime-memory 等)
|
|
29
|
+
已按清单修写路径,但存量日志里由它们写入的旧署名行仍在——未适配插件的读回判断会失配。
|
|
30
|
+
- **检测(只读)**:体检新增第 6 门 `source-kind`,按日志 header 的格式代次分线:
|
|
31
|
+
- **版本依赖表**(详见 `src/host/health/source-kind.ts` 头注):v1/v2 早期线(未考证)与
|
|
32
|
+
v3(0.1.6 时代,待考证)旧行合法、不动(宿主 v3→v4 迁移负责);**v4(≥0.1.7-rc.1)拒绝
|
|
33
|
+
旧署名**,观测到即 warn。
|
|
34
|
+
- v4 之前的版本线记 ok 不抬档——不越权处理宿主迁移契约内的数据(防过度操作)。
|
|
35
|
+
- **转换(显式触发)**:新增 API `session-health-source-migrate` 与体检面板「转换旧署名」按钮
|
|
36
|
+
(仅 source-kind 门 warn 时出现)。把 `{ kind: 'plugin', plugin: N }` 改写为
|
|
37
|
+
`{ kind: 'plugin:N' }`(删除 plugin 字段),其余字节原样保留。
|
|
38
|
+
- **红线三闸**:只动 source 署名字段;改前整文件备份(`*.pre-sourcemigrate-<ts>`,可回退);
|
|
39
|
+
完整性不合格(撕裂尾帧/解码失败/seq 缺口)或 header.version < 4 时拒绝执行。这是
|
|
40
|
+
「禁止改写会话日志」红线的唯一显式例外,经用户逐会话触发。
|
|
41
|
+
- genui 不在掌控范围,本插件不做也不会替它转换(其历史行转换后由其读回判断自行失配与否自负)。
|
|
42
|
+
|
|
3
43
|
## 0.1.0-alpha.6
|
|
4
44
|
|
|
5
45
|
### 修复 —— 图标与文案间距收紧;窄栏下不再挤掉邻居
|
package/dsh.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-manage-session",
|
|
3
3
|
"name": "dsh-manage-session",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"description": {
|
|
6
6
|
"en": "Session Steward (DSH 0.1.5 line): browse and bulk-prune the official session archive set, and run a four-gate session health checkup that ends in a reversible, backup-first prescription. Never rewrites session logs.",
|
|
7
7
|
"zh": "会话管家(DSH 0.1.5 专线):浏览并批量清理官方会话归档集合,并对会话做四门体检,最终给出可逆、先备份的处方。不改写会话日志。"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"engines": {
|
|
16
|
-
"dsh": ">=0.1.
|
|
16
|
+
"dsh": ">=0.1.7-rc.1 <0.1.8-0"
|
|
17
17
|
},
|
|
18
18
|
"components": {
|
|
19
19
|
"host": "lib/index.js",
|
package/lib/client.js
CHANGED
|
@@ -31,6 +31,7 @@ window.__ModuleLoader__.load({
|
|
|
31
31
|
"card.health.desc": "体检 → 处方 → 出院。关闭后不注册体检接口、不渲染该页签。",
|
|
32
32
|
"card.readonly": "当前会话无法修改设置(只读挂载)。",
|
|
33
33
|
"card.unavailable": "设置服务不可用,无法读取配置。",
|
|
34
|
+
"family.title": "起子插件设置",
|
|
34
35
|
"panel.title": "会话管家",
|
|
35
36
|
"panel.tab.history": "养老院",
|
|
36
37
|
"panel.tab.health": "体检",
|
|
@@ -75,6 +76,7 @@ window.__ModuleLoader__.load({
|
|
|
75
76
|
"health.gate.projection-cache": "投影缓存",
|
|
76
77
|
"health.gate.lossless-json": "无损 JSON",
|
|
77
78
|
"health.gate.cold-read": "可接续性",
|
|
79
|
+
"health.gate.source-kind": "插件署名",
|
|
78
80
|
"health.attribution": "归属",
|
|
79
81
|
"health.field": "字段",
|
|
80
82
|
"health.unknownOwner": "归属未知",
|
|
@@ -83,6 +85,11 @@ window.__ModuleLoader__.load({
|
|
|
83
85
|
"health.phase.discharge": "③ 出院",
|
|
84
86
|
"health.repair": "执行可逆处置",
|
|
85
87
|
"health.repairing": "处置中…",
|
|
88
|
+
"health.sourceMigrate": "转换旧署名",
|
|
89
|
+
"health.sourceMigrating": "转换中…",
|
|
90
|
+
"health.sourceMigrated": "已转换 {n} 行旧署名(备份:{backup})",
|
|
91
|
+
"health.sourceMigrateNone": "没有需要转换的旧署名行",
|
|
92
|
+
"health.sourceMigrateFail": "转换失败:{error}",
|
|
86
93
|
"health.before": "处置前",
|
|
87
94
|
"health.after": "处置后",
|
|
88
95
|
"health.quarantined": "已隔离投影缓存记录(重启 DSH 后重折叠)",
|
|
@@ -111,6 +118,7 @@ window.__ModuleLoader__.load({
|
|
|
111
118
|
"card.health.desc": "Checkup → Prescription → Discharge. When off, health routes and the tab are gone.",
|
|
112
119
|
"card.readonly": "This session cannot edit settings (read-only mount).",
|
|
113
120
|
"card.unavailable": "Settings service unavailable; configuration cannot be read.",
|
|
121
|
+
"family.title": "Screwdriver plugin settings",
|
|
114
122
|
"panel.title": "Session Steward",
|
|
115
123
|
"panel.tab.history": "Retirement Home",
|
|
116
124
|
"panel.tab.health": "Checkup",
|
|
@@ -155,6 +163,7 @@ window.__ModuleLoader__.load({
|
|
|
155
163
|
"health.gate.projection-cache": "Projection cache",
|
|
156
164
|
"health.gate.lossless-json": "Lossless JSON",
|
|
157
165
|
"health.gate.cold-read": "Continuability",
|
|
166
|
+
"health.gate.source-kind": "Plugin signature",
|
|
158
167
|
"health.attribution": "Owner",
|
|
159
168
|
"health.field": "Field",
|
|
160
169
|
"health.unknownOwner": "owner unknown",
|
|
@@ -163,6 +172,11 @@ window.__ModuleLoader__.load({
|
|
|
163
172
|
"health.phase.discharge": "3) Discharge",
|
|
164
173
|
"health.repair": "Apply reversible repair",
|
|
165
174
|
"health.repairing": "Repairing…",
|
|
175
|
+
"health.sourceMigrate": "Migrate legacy signatures",
|
|
176
|
+
"health.sourceMigrating": "Migrating…",
|
|
177
|
+
"health.sourceMigrated": "Migrated {n} legacy signature rows (backup: {backup})",
|
|
178
|
+
"health.sourceMigrateNone": "No legacy signature rows to migrate",
|
|
179
|
+
"health.sourceMigrateFail": "Migration failed: {error}",
|
|
166
180
|
"health.before": "Before",
|
|
167
181
|
"health.after": "After",
|
|
168
182
|
"health.quarantined": "Projection cache quarantined (refolds after a DSH restart)",
|
|
@@ -196,17 +210,14 @@ window.__ModuleLoader__.load({
|
|
|
196
210
|
/**
|
|
197
211
|
* 设置卡(插件配置行):一个可折叠抽屉 —— 会话历史文件 / 健康检查。
|
|
198
212
|
*
|
|
199
|
-
* **chrome
|
|
200
|
-
*
|
|
213
|
+
* **chrome 必须自己渲染**:宿主不为贡献卡提供任何外壳,标题、说明、
|
|
214
|
+
* 展开/收起全归插件自己所有。早期版本只渲染裸行,与同分区其它插件
|
|
215
|
+
* 的抽屉形态不一致,还让 `card.title` / `card.desc` 成为死文案。
|
|
201
216
|
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
* 结果既与分区内其它插件的抽屉形态不一致,又让 `card.title` / `card.desc`
|
|
207
|
-
* 变成定义了却没人渲染的死文案。
|
|
208
|
-
*
|
|
209
|
-
* 读写走 settingsScope 的显式 `set`(用户在控件上的直接操作,非隐式提交)。
|
|
217
|
+
* 读写走 configForms(`configForms.get(STEWARD_ENTRY_ID)`,以本插件 entry 为键;
|
|
218
|
+
* 旧宿主回退 settingsScope 绑定)的显式 `set`。0.1.7 起本卡挂在插件族共用
|
|
219
|
+
* 设置节(`dsh-family.tab`,dsh-thinking-levels 顶级「起子插件设置」节声明)里,
|
|
220
|
+
* 与同节其它抽屉一样默认展开。
|
|
210
221
|
*/
|
|
211
222
|
/** 一行设置项。 */
|
|
212
223
|
function Row(props) {
|
|
@@ -269,10 +280,10 @@ window.__ModuleLoader__.load({
|
|
|
269
280
|
strokeLinejoin: "round"
|
|
270
281
|
}))]);
|
|
271
282
|
}
|
|
272
|
-
/**
|
|
283
|
+
/** 插件设置卡主体(抽屉)。默认展开,family 设置节内直接呈现完整面板。 */
|
|
273
284
|
function StewardSettingsCard({ t, scope }) {
|
|
274
285
|
const snapshot = (0, react.useSyncExternalStore)((listener) => scope.subscribe(listener), () => scope.getSnapshot());
|
|
275
|
-
const [open, setOpen] = (0, react.useState)(
|
|
286
|
+
const [open, setOpen] = (0, react.useState)(true);
|
|
276
287
|
const value = snapshot.value ?? {};
|
|
277
288
|
const writable = snapshot.writable;
|
|
278
289
|
const rows = [];
|
|
@@ -683,7 +694,8 @@ window.__ModuleLoader__.load({
|
|
|
683
694
|
"log-integrity": "health.gate.log-integrity",
|
|
684
695
|
"projection-cache": "health.gate.projection-cache",
|
|
685
696
|
"lossless-json": "health.gate.lossless-json",
|
|
686
|
-
"cold-read": "health.gate.cold-read"
|
|
697
|
+
"cold-read": "health.gate.cold-read",
|
|
698
|
+
"source-kind": "health.gate.source-kind"
|
|
687
699
|
};
|
|
688
700
|
const LEVEL_LABEL = {
|
|
689
701
|
ok: "health.level.ok",
|
|
@@ -733,6 +745,9 @@ window.__ModuleLoader__.load({
|
|
|
733
745
|
const [error, setError] = (0, react.useState)(null);
|
|
734
746
|
const [detail, setDetail] = (0, react.useState)(null);
|
|
735
747
|
const [repairing, setRepairing] = (0, react.useState)(false);
|
|
748
|
+
const [migrating, setMigrating] = (0, react.useState)(false);
|
|
749
|
+
/** 署名转换结果提示(一次性;点击转换或返回列表时清除)。 */
|
|
750
|
+
const [migrateNote, setMigrateNote] = (0, react.useState)(null);
|
|
736
751
|
const [discharge, setDischarge] = (0, react.useState)(null);
|
|
737
752
|
const [copied, setCopied] = (0, react.useState)(null);
|
|
738
753
|
/** 分批扫描进度:done = 已访问会话数,total = 语料总数(0 表示尚未拿到分母)。 */
|
|
@@ -788,6 +803,7 @@ window.__ModuleLoader__.load({
|
|
|
788
803
|
setError(null);
|
|
789
804
|
setDetail(null);
|
|
790
805
|
setDischarge(null);
|
|
806
|
+
setMigrateNote(null);
|
|
791
807
|
setFindings(null);
|
|
792
808
|
setCacheInfo(null);
|
|
793
809
|
setProgress({
|
|
@@ -856,6 +872,7 @@ window.__ModuleLoader__.load({
|
|
|
856
872
|
const openDetail = (sessionId) => {
|
|
857
873
|
setError(null);
|
|
858
874
|
setDischarge(null);
|
|
875
|
+
setMigrateNote(null);
|
|
859
876
|
callHostAny("session-health-session", { sessionId }, 12e4).then((res) => {
|
|
860
877
|
if (res.ok === true) {
|
|
861
878
|
setDetail(res);
|
|
@@ -886,6 +903,28 @@ window.__ModuleLoader__.load({
|
|
|
886
903
|
setCopied(text);
|
|
887
904
|
} catch {}
|
|
888
905
|
};
|
|
906
|
+
const runSourceMigrate = (sessionId) => {
|
|
907
|
+
setMigrating(true);
|
|
908
|
+
setError(null);
|
|
909
|
+
setMigrateNote(null);
|
|
910
|
+
callHostAny("session-health-source-migrate", { sessionId }, 12e4).then((res) => {
|
|
911
|
+
if (res.after !== void 0) {
|
|
912
|
+
setDetail({
|
|
913
|
+
ok: true,
|
|
914
|
+
report: res.after,
|
|
915
|
+
prescriptions: detail?.prescriptions ?? []
|
|
916
|
+
});
|
|
917
|
+
reconcileRow(res.after);
|
|
918
|
+
}
|
|
919
|
+
const changed = res.outcome?.changedRows ?? 0;
|
|
920
|
+
if (res.ok === true && changed > 0) setMigrateNote(translate(t, "health.sourceMigrated", {
|
|
921
|
+
n: changed,
|
|
922
|
+
backup: res.outcome?.backup ?? ""
|
|
923
|
+
}));
|
|
924
|
+
else if (res.ok === true) setMigrateNote(translate(t, "health.sourceMigrateNone"));
|
|
925
|
+
else setMigrateNote(translate(t, "health.sourceMigrateFail", { error: res.outcome?.error ?? res.error ?? "未知原因" }));
|
|
926
|
+
}).catch((err) => setError(String(err instanceof Error ? err.message : err))).finally(() => setMigrating(false));
|
|
927
|
+
};
|
|
889
928
|
const report = detail?.report ?? discharge?.after;
|
|
890
929
|
const lines = [];
|
|
891
930
|
lines.push((0, react.createElement)("div", {
|
|
@@ -1052,6 +1091,25 @@ window.__ModuleLoader__.load({
|
|
|
1052
1091
|
className: "dss_spinner",
|
|
1053
1092
|
"aria-hidden": "true"
|
|
1054
1093
|
}) : null, (0, react.createElement)("span", { key: "tx" }, repairing ? translate(t, "health.repairing") : translate(t, "health.repair"))])]));
|
|
1094
|
+
if (report.gates.some((gate) => gate.id === "source-kind" && gate.level === "warn")) lines.push((0, react.createElement)("div", {
|
|
1095
|
+
key: "migrate",
|
|
1096
|
+
className: "dss_phaseRow"
|
|
1097
|
+
}, [(0, react.createElement)("button", {
|
|
1098
|
+
key: "m",
|
|
1099
|
+
type: "button",
|
|
1100
|
+
className: "dss_actBtn",
|
|
1101
|
+
disabled: migrating,
|
|
1102
|
+
onClick: () => {
|
|
1103
|
+
runSourceMigrate(report.sessionId);
|
|
1104
|
+
}
|
|
1105
|
+
}, [migrating ? (0, react.createElement)("span", {
|
|
1106
|
+
key: "sp",
|
|
1107
|
+
className: "dss_spinner",
|
|
1108
|
+
"aria-hidden": "true"
|
|
1109
|
+
}) : null, (0, react.createElement)("span", { key: "tx" }, migrating ? translate(t, "health.sourceMigrating") : translate(t, "health.sourceMigrate"))]), migrateNote !== null && (0, react.createElement)("span", {
|
|
1110
|
+
key: "note",
|
|
1111
|
+
className: "dss_status"
|
|
1112
|
+
}, migrateNote)]));
|
|
1055
1113
|
const prescriptions = detail?.prescriptions ?? discharge?.prescriptions ?? [];
|
|
1056
1114
|
if (prescriptions.length > 0) lines.push((0, react.createElement)("div", {
|
|
1057
1115
|
key: "cmds",
|
|
@@ -1227,8 +1285,16 @@ window.__ModuleLoader__.load({
|
|
|
1227
1285
|
const style = document.createElement("style");
|
|
1228
1286
|
style.id = id;
|
|
1229
1287
|
style.textContent = `
|
|
1288
|
+
/* 侧栏 footer 槽位公约(2026-09-26):一行多入口(第三方 dsh-context 等)会互相
|
|
1289
|
+
挤占 —— 宿主 .footerActions 是 nowrap flex 行。这里允许容器换行,并把本插件
|
|
1290
|
+
入口钉成独占一整行(flex-basis:100%);其余入口(含第三方)自然落到后续行,
|
|
1291
|
+
各行内部自行布局,谁也不挤谁。类名用 [class*=] 中段匹配:宿主是 CSS Module
|
|
1292
|
+
哈希类名(实测形如 hHd-Xa_footerActions —— <hash>_<name>,哈希在前),
|
|
1293
|
+
中段跨版本稳定。 */
|
|
1294
|
+
[class*="footerActions"]{flex-wrap:wrap;row-gap:2px;height:auto;min-height:0}
|
|
1295
|
+
/* 宽栏:独占一整行、放弃主动收缩(flex-shrink:0),行内居中;收起轨道回落自然宽度。 */
|
|
1230
1296
|
.dss_entryWrap{flex:0 1 auto;display:inline-flex;align-items:center;min-width:0}
|
|
1231
|
-
.dss_entryWrapWide{margin-left:
|
|
1297
|
+
.dss_entryWrapWide{flex:0 0 100%;width:100%;justify-content:center;margin-left:0}
|
|
1232
1298
|
.dss_footerEntry{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;gap:4px;height:42px;padding:0 10px 0 8px;border:none;border-radius:12px;background:transparent;cursor:pointer;color:var(--dsw-alias-label-primary);font-family:inherit;font-size:14px;line-height:22px;white-space:nowrap;overflow:hidden;transition:background-color 160ms ease-out,color 160ms ease-out}
|
|
1233
1299
|
.dss_footerEntry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
|
|
1234
1300
|
.dss_footerEntryRail{width:28px;height:28px;padding:0;gap:0;border-radius:50%}
|
|
@@ -1319,7 +1385,7 @@ window.__ModuleLoader__.load({
|
|
|
1319
1385
|
}
|
|
1320
1386
|
/**
|
|
1321
1387
|
* 客户端插件主体。
|
|
1322
|
-
* @param ctx - 客户端上下文(slots、可选 locale /
|
|
1388
|
+
* @param ctx - 客户端上下文(slots、可选 locale / configForms)。
|
|
1323
1389
|
*/
|
|
1324
1390
|
function apply(ctx) {
|
|
1325
1391
|
ctx.effect(() => injectStyles(), "dsh-manage-session: stylesheet");
|
|
@@ -1328,33 +1394,101 @@ window.__ModuleLoader__.load({
|
|
|
1328
1394
|
zh,
|
|
1329
1395
|
en
|
|
1330
1396
|
}), "dsh-manage-session: dictionaries");
|
|
1331
|
-
const
|
|
1397
|
+
const configForms = ctx.get("configForms");
|
|
1398
|
+
const legacySettings = ctx.get("settingsScope");
|
|
1399
|
+
const bound = configForms?.get("dsh-manage-session") ?? legacySettings?.bind({ namespace: "session-steward" });
|
|
1332
1400
|
const slots = ctx.get("slots");
|
|
1333
1401
|
if (slots === void 0) return;
|
|
1334
1402
|
slots.inject("sidebar.footer.action", () => slots.register({
|
|
1335
1403
|
name: "sidebar.footer.action",
|
|
1336
1404
|
id: STEWARD_ENTRY_ID,
|
|
1337
|
-
order:
|
|
1405
|
+
order: 6
|
|
1338
1406
|
}, (props) => (0, react.createElement)(StewardEntry, {
|
|
1339
1407
|
...props,
|
|
1340
1408
|
scope: bound
|
|
1341
1409
|
})), "dsh-manage-session: sidebar footer entry");
|
|
1342
|
-
slots.inject("
|
|
1343
|
-
name: "
|
|
1344
|
-
id:
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1410
|
+
slots.inject("dsh-family.tab", () => slots.register({
|
|
1411
|
+
name: "dsh-family.tab",
|
|
1412
|
+
id: STEWARD_ENTRY_ID,
|
|
1413
|
+
order: 40,
|
|
1414
|
+
label: () => translate(locale?.bind?.(NS), "card.title"),
|
|
1415
|
+
locale: NS
|
|
1416
|
+
}, (props) => (0, react.createElement)(StewardSettingsCard, {
|
|
1417
|
+
scope: bound,
|
|
1418
|
+
t: props.t
|
|
1419
|
+
})), "dsh-manage-session: family settings tab");
|
|
1420
|
+
const familyTabsHooks = makeFamilyTabsHooks(slots);
|
|
1421
|
+
ctx.effect(() => {
|
|
1422
|
+
let claimed;
|
|
1423
|
+
const timer = setTimeout(() => {
|
|
1424
|
+
if (slots.entries("settings.section").some((e) => e.options.id === FAMILY_SECTION_ID)) return;
|
|
1425
|
+
try {
|
|
1426
|
+
claimed = slots.register({
|
|
1427
|
+
name: "settings.section",
|
|
1428
|
+
id: FAMILY_SECTION_ID,
|
|
1429
|
+
order: 40,
|
|
1430
|
+
label: () => translate(locale?.bind?.(NS), "family.title"),
|
|
1431
|
+
locale: NS,
|
|
1432
|
+
inject: () => ({ hooks: { tabs: familyTabsHooks } }),
|
|
1433
|
+
children: { [FAMILY_CHILD_KEY]: {
|
|
1434
|
+
kind: "list",
|
|
1435
|
+
scope: "root"
|
|
1436
|
+
} }
|
|
1437
|
+
}, StewardFamilySection);
|
|
1438
|
+
} catch {}
|
|
1439
|
+
}, FAMILY_HOST_GRACE_MS);
|
|
1440
|
+
return () => {
|
|
1441
|
+
clearTimeout(timer);
|
|
1442
|
+
if (typeof claimed === "function") claimed();
|
|
1443
|
+
};
|
|
1444
|
+
}, "dsh-manage-session: family fallback host");
|
|
1445
|
+
}
|
|
1446
|
+
/** 家族节固定 id(与 thinking-levels / guard 的注册严格一致)。 */
|
|
1447
|
+
const FAMILY_SECTION_ID = "dsh-family";
|
|
1448
|
+
/** 家族子席位 key(与 thinking-levels 的声明严格一致)。 */
|
|
1449
|
+
const FAMILY_CHILD_KEY = "dsh-family.tab";
|
|
1450
|
+
/** 接管宽限期:guard 2000ms 先试,本插件 2600ms 兜底。 */
|
|
1451
|
+
const FAMILY_HOST_GRACE_MS = 2600;
|
|
1452
|
+
/** 接管节的账本投影 hooks(与 thinking-levels 的 FamilySectionInjected 同形;locale 变更也触发重渲染)。 */
|
|
1453
|
+
function makeFamilyTabsHooks(slots) {
|
|
1454
|
+
let version = -1;
|
|
1455
|
+
let tabs = [];
|
|
1456
|
+
return {
|
|
1457
|
+
getSnapshot: () => {
|
|
1458
|
+
const next = slots.getVersion(FAMILY_CHILD_KEY);
|
|
1459
|
+
if (next !== version) {
|
|
1460
|
+
version = next;
|
|
1461
|
+
tabs = slots.entries(FAMILY_CHILD_KEY).map((entry) => ({
|
|
1462
|
+
id: entry.options.id ?? "",
|
|
1463
|
+
order: entry.options.order ?? 0,
|
|
1464
|
+
label: typeof entry.options.label === "function" ? (() => {
|
|
1465
|
+
try {
|
|
1466
|
+
return String(entry.options.label() ?? entry.options.id ?? "");
|
|
1467
|
+
} catch {
|
|
1468
|
+
return String(entry.options.id ?? "");
|
|
1469
|
+
}
|
|
1470
|
+
})() : String(entry.options.label ?? entry.options.id ?? "")
|
|
1471
|
+
})).sort((a, b) => a.order - b.order);
|
|
1472
|
+
}
|
|
1473
|
+
return tabs;
|
|
1474
|
+
},
|
|
1475
|
+
subscribe: (listener) => slots.subscribe(FAMILY_CHILD_KEY, listener)
|
|
1476
|
+
};
|
|
1477
|
+
}
|
|
1478
|
+
/**
|
|
1479
|
+
* 家族节接管组件(fallback host section):纯通用渲染 —— 把 `dsh-family.tab`
|
|
1480
|
+
* 账本里的每张贡献卡(含本插件自己的,接管时本插件也声明了该子席位)按
|
|
1481
|
+
* order 依次 renderSlot;各卡本身是默认展开的抽屉,整节即一页抽屉。
|
|
1482
|
+
*/
|
|
1483
|
+
function StewardFamilySection(props) {
|
|
1484
|
+
const tabs = (0, react.useSyncExternalStore)(props.hooks.tabs.subscribe, props.hooks.tabs.getSnapshot);
|
|
1485
|
+
return (0, react.createElement)("div", { style: {
|
|
1486
|
+
display: "grid",
|
|
1487
|
+
gap: "12px"
|
|
1488
|
+
} }, ...tabs.map((row) => (0, react.createElement)("div", { key: row.id }, props.renderSlot(FAMILY_CHILD_KEY, {}, {
|
|
1489
|
+
only: row.id,
|
|
1490
|
+
fallback: null
|
|
1491
|
+
}))));
|
|
1358
1492
|
}
|
|
1359
1493
|
/** 入口按钮:持有面板开关;两个页签的可见性来自配置快照。 */
|
|
1360
1494
|
function StewardEntry(props) {
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import z from "@deepseek-ai/schemastery";
|
|
1
2
|
//#region node_modules/cosmokit/lib/index.d.ts
|
|
2
3
|
type Dict<T = any, K extends string | symbol = string> = { [key in K]: T; };
|
|
3
4
|
type Promisify<T> = Promise<T extends Promise<infer S> ? S : T>;
|
|
@@ -734,7 +735,7 @@ interface GateAttribution {
|
|
|
734
735
|
}
|
|
735
736
|
/** 一个 gate 的结果。 */
|
|
736
737
|
interface GateResult {
|
|
737
|
-
id: 'generation' | 'log-integrity' | 'projection-cache' | 'lossless-json' | 'cold-read';
|
|
738
|
+
id: 'generation' | 'log-integrity' | 'projection-cache' | 'lossless-json' | 'cold-read' | 'source-kind';
|
|
738
739
|
level: GateLevel;
|
|
739
740
|
evidence: string;
|
|
740
741
|
attribution?: GateAttribution;
|
|
@@ -883,6 +884,8 @@ interface StewardHistoryRow {
|
|
|
883
884
|
bytes: number;
|
|
884
885
|
/** 投影缓存占用字节数。 */
|
|
885
886
|
cacheBytes: number;
|
|
887
|
+
/** 署名转换备份(`*.pre-sourcemigrate-<ts>`)占用字节数——`bytes` 的子集,单列防误读为日志体积。 */
|
|
888
|
+
backupBytes: number;
|
|
886
889
|
}
|
|
887
890
|
/** 列表结果。 */
|
|
888
891
|
interface StewardHistoryListResult {
|
|
@@ -944,13 +947,30 @@ interface StewardSessionUsage {
|
|
|
944
947
|
sessionId: string;
|
|
945
948
|
/** 转录目录绝对路径(不存在时缺省)。 */
|
|
946
949
|
dir?: string;
|
|
947
|
-
/**
|
|
950
|
+
/** 转录目录占用字节数(**含**署名转换备份;备份单列在 `backupBytes`)。 */
|
|
948
951
|
bytes: number;
|
|
952
|
+
/**
|
|
953
|
+
* 署名转换备份(`*.pre-sourcemigrate-<ts>`,见 `SOURCE_MIGRATE_BACKUP_SUFFIX`)
|
|
954
|
+
* 占用字节数 —— 是 `bytes` 的子集,单列出来免得被当作日志体积误读。
|
|
955
|
+
*/
|
|
956
|
+
backupBytes: number;
|
|
957
|
+
/** 备份文件个数。 */
|
|
958
|
+
backupCount: number;
|
|
949
959
|
/** 投影缓存文件绝对路径(不存在时缺省)。 */
|
|
950
960
|
cacheFile?: string;
|
|
951
961
|
/** 投影缓存占用字节数。 */
|
|
952
962
|
cacheBytes: number;
|
|
953
963
|
}
|
|
964
|
+
/** 是否署名转换备份文件(`*.pre-sourcemigrate-<ts>`)。 */
|
|
965
|
+
declare function isSourceMigrateBackupName(name: string): boolean;
|
|
966
|
+
/**
|
|
967
|
+
* 列出一个转录目录里的署名转换备份(只扫顶层:备份与日志同目录落盘)。
|
|
968
|
+
* @returns 备份绝对路径与合计字节数;目录不存在时为空。
|
|
969
|
+
*/
|
|
970
|
+
declare function backupFilesIn(dir: string): {
|
|
971
|
+
files: string[];
|
|
972
|
+
bytes: number;
|
|
973
|
+
};
|
|
954
974
|
/** 转录根目录(`<dshHome>/sessions`)。 */
|
|
955
975
|
declare function sessionsRootFor(dshHome: string): string;
|
|
956
976
|
/**
|
|
@@ -996,8 +1016,10 @@ interface StewardHistoryPurgeResult {
|
|
|
996
1016
|
ok: boolean;
|
|
997
1017
|
/** 成功清理的会话数。 */
|
|
998
1018
|
purged?: number;
|
|
999
|
-
/** 释放的字节数(转录 +
|
|
1019
|
+
/** 释放的字节数(转录 + 投影缓存;含随目录删除的署名转换备份)。 */
|
|
1000
1020
|
freedBytes?: number;
|
|
1021
|
+
/** 一并删除的署名转换备份(`*.pre-sourcemigrate-<ts>`)个数。 */
|
|
1022
|
+
backupsRemoved?: number;
|
|
1001
1023
|
/** 逐条失败原因;不阻断其余条目。 */
|
|
1002
1024
|
failures?: {
|
|
1003
1025
|
sessionId: string;
|
|
@@ -1022,6 +1044,88 @@ interface StewardPurgeOptions {
|
|
|
1022
1044
|
*/
|
|
1023
1045
|
declare function purgeHistory(payload: unknown, log?: (msg: string) => void, options?: StewardPurgeOptions): StewardHistoryPurgeResult;
|
|
1024
1046
|
//#endregion
|
|
1047
|
+
//#region src/host/health/source-kind.d.ts
|
|
1048
|
+
/** v4 线起点的宿主版本(会话格式 v4 引入 producer-owned source kind)。 */
|
|
1049
|
+
declare const V4_HOST_MIN = "0.1.7-rc.1";
|
|
1050
|
+
/** 一份日志里的旧署名事实。 */
|
|
1051
|
+
interface SourceKindFacts {
|
|
1052
|
+
/** 旧署名事件总数。 */
|
|
1053
|
+
legacyCount: number;
|
|
1054
|
+
/** 按生产者插件名统计。 */
|
|
1055
|
+
byPlugin: Record<string, number>;
|
|
1056
|
+
/** 命中样例(seq + 插件名),最多 5 条,供证据展示。 */
|
|
1057
|
+
examples: {
|
|
1058
|
+
seq: number;
|
|
1059
|
+
plugin: string;
|
|
1060
|
+
}[];
|
|
1061
|
+
/** 日志 header 的格式代次(无从读取时 undefined)。 */
|
|
1062
|
+
headerVersion?: number;
|
|
1063
|
+
}
|
|
1064
|
+
/** 从解码后的日志提取旧署名事实(只读)。 */
|
|
1065
|
+
declare function readSourceKindFacts(log: SessionLogRead): SourceKindFacts;
|
|
1066
|
+
/**
|
|
1067
|
+
* gate 5:插件署名格式(v4 线要求 producer-owned kind)。
|
|
1068
|
+
*
|
|
1069
|
+
* 档位判据(有据才抬档):
|
|
1070
|
+
* - header.version ≥ 4 且观测到旧署名行 → `warn`:v4 校验拒绝这种署名;存量行让
|
|
1071
|
+
* 未适配插件的读回判断(`kind === 'plugin' && plugin === name`)失配,转换可消除;
|
|
1072
|
+
* - header.version < 4 → `ok`:v3 及更早线旧行合法,宿主迁移负责,**不动**(防过度操作);
|
|
1073
|
+
* - header.version 无从读取 → `skipped`:无从判定该走哪条版本线。
|
|
1074
|
+
* @param facts - 旧署名事实;undefined 表示未提供(无日志)。
|
|
1075
|
+
*/
|
|
1076
|
+
declare function gateSourceKind(facts: SourceKindFacts | undefined): {
|
|
1077
|
+
id: 'source-kind';
|
|
1078
|
+
level: GateLevel;
|
|
1079
|
+
evidence: string;
|
|
1080
|
+
detail?: Record<string, unknown>;
|
|
1081
|
+
};
|
|
1082
|
+
/** 转换结果。 */
|
|
1083
|
+
interface SourceKindMigrationOutcome {
|
|
1084
|
+
ok: boolean;
|
|
1085
|
+
sessionId: string;
|
|
1086
|
+
/** 被改写的日志路径。 */
|
|
1087
|
+
path: string;
|
|
1088
|
+
/** 备份路径(改写前的完整副本;ok 且 changed 时必有)。 */
|
|
1089
|
+
backup?: string;
|
|
1090
|
+
/** 改写的行数。 */
|
|
1091
|
+
changedRows?: number;
|
|
1092
|
+
/** 按生产者插件名统计的改写行数。 */
|
|
1093
|
+
byPlugin?: Record<string, number>;
|
|
1094
|
+
/**
|
|
1095
|
+
* 按生产者名统计的**跳过**行数(第一方名,宿主迁移职权,见
|
|
1096
|
+
* `isFirstPartyLegacyProducer`)。跳过是如实上报,不是静默丢弃。
|
|
1097
|
+
*/
|
|
1098
|
+
skippedFirstParty?: Record<string, number>;
|
|
1099
|
+
error?: string;
|
|
1100
|
+
}
|
|
1101
|
+
/**
|
|
1102
|
+
* 从旧署名对象构造新署名:`{ kind: 'plugin', plugin: name, …rest }` → `{ kind: 'plugin:name', …rest }`。
|
|
1103
|
+
* 非 legacy(缺 plugin 字段 / kind 不符)返回 undefined,调用方跳过该行。
|
|
1104
|
+
*
|
|
1105
|
+
* ⚠️ 只对**第三方**生产者名成立(第四轮审计 ST1):宿主 `producerKind`
|
|
1106
|
+
* (dsh-session-format-v3-to-v4@0.1.7-rc.2 lib/index.js:88-96)对第一方名走改名表
|
|
1107
|
+
* 或同名裸 kind,本函数无条件加前缀会对那 30 个名字写出宿主永不产出的 kind。
|
|
1108
|
+
* 第一方名由 `FIRST_PARTY_RENAMED_PRODUCERS` / `FIRST_PARTY_SAME_NAME_PRODUCERS`
|
|
1109
|
+
* 判定,`migrateSessionSourceKind` 命中即跳过并如实上报(宿主迁移职权,不代转换)。
|
|
1110
|
+
*/
|
|
1111
|
+
declare function migrateLegacySource(source: unknown): Record<string, unknown> | undefined;
|
|
1112
|
+
/**
|
|
1113
|
+
* 转换一个会话日志里的旧署名行(v4 线专用;先备份,只动署名字段)。
|
|
1114
|
+
*
|
|
1115
|
+
* 执行闸(任一不满足即拒绝,不写盘):
|
|
1116
|
+
* 1. 日志可整体解码且无完整性问题(撕裂尾帧 / 解码失败 / seq 缺口);
|
|
1117
|
+
* 2. header.version ≥ 4(v3 及更早的旧行按契约由宿主迁移,不动);
|
|
1118
|
+
* 3. 确有旧署名行(没有则空手而归,不做无谓重压缩)。
|
|
1119
|
+
* @param sessionId - 会话 id(用于结果标注)。
|
|
1120
|
+
* @param logPath - 当前代日志路径(必须 .zstd 结尾)。
|
|
1121
|
+
* @param log - 已解码的日志(复用体检结果,闸 1/2 在其上判定)。
|
|
1122
|
+
* @param dshHome - DSH home(备份不依赖它,参数保留与其它处置一致的面)。
|
|
1123
|
+
* @param now - 时间源(备份后缀,测试可控)。
|
|
1124
|
+
*/
|
|
1125
|
+
declare function migrateSessionSourceKind(sessionId: string, logPath: string, log: SessionLogRead, dshHome?: string, now?: () => number): SourceKindMigrationOutcome;
|
|
1126
|
+
/** 备份文件的后缀约定(purge/清理工具可据此识别并一并处置)。 */
|
|
1127
|
+
declare const SOURCE_MIGRATE_BACKUP_SUFFIX = ".pre-sourcemigrate-";
|
|
1128
|
+
//#endregion
|
|
1025
1129
|
//#region src/host/health/lossless.d.ts
|
|
1026
1130
|
/**
|
|
1027
1131
|
* 无损 JSON 判定 —— 本次事故的核心 gate 判据。
|
|
@@ -1228,6 +1332,16 @@ declare function scanSessions(options: {
|
|
|
1228
1332
|
//#region src/index.d.ts
|
|
1229
1333
|
/** 本插件声明的宿主服务(与 toggle 相同的注入面)。 */
|
|
1230
1334
|
declare const inject: string[];
|
|
1335
|
+
/** 运行时配置 schema(与 src/config.ts 的形状保持一致)。0.1.7:volatile 字段即设置表单。 */
|
|
1336
|
+
declare const Config: z<Schemastery.ObjectS<NoInfer<{
|
|
1337
|
+
enabled: z<boolean, boolean, "volatile-defined">;
|
|
1338
|
+
historyFiles: z<boolean, boolean, "volatile-defined">;
|
|
1339
|
+
healthCheck: z<boolean, boolean, "volatile-defined">;
|
|
1340
|
+
}>>, Schemastery.ObjectT<NoInfer<{
|
|
1341
|
+
enabled: z<boolean, boolean, "volatile-defined">;
|
|
1342
|
+
historyFiles: z<boolean, boolean, "volatile-defined">;
|
|
1343
|
+
healthCheck: z<boolean, boolean, "volatile-defined">;
|
|
1344
|
+
}>>, "plain">;
|
|
1231
1345
|
/** 运行时依赖。 */
|
|
1232
1346
|
interface StewardRuntime {
|
|
1233
1347
|
config: () => Required<StewardConfig>;
|
|
@@ -1255,7 +1369,7 @@ interface StewardRuntime {
|
|
|
1255
1369
|
* prune = 取消归档状态(可逆,会话回到侧边栏);purge = 清理归档文件(不可逆,真删实体)。
|
|
1256
1370
|
*/
|
|
1257
1371
|
declare const HISTORY_METHODS: readonly ["session-history-list", "session-history-prune", "session-history-purge"];
|
|
1258
|
-
declare const HEALTH_METHODS: readonly ["session-health-status", "session-health-scan", "session-health-session", "session-health-repair"];
|
|
1372
|
+
declare const HEALTH_METHODS: readonly ["session-health-status", "session-health-scan", "session-health-session", "session-health-repair", "session-health-source-migrate"];
|
|
1259
1373
|
/** 依据开关判定某方法是否启用。 */
|
|
1260
1374
|
declare function methodEnabled(method: string, config: Required<StewardConfig>): boolean;
|
|
1261
1375
|
/**
|
|
@@ -1266,9 +1380,10 @@ declare function methodEnabled(method: string, config: Required<StewardConfig>):
|
|
|
1266
1380
|
*/
|
|
1267
1381
|
declare function handleMethod(method: string, payload: unknown, runtime: StewardRuntime): Promise<unknown>;
|
|
1268
1382
|
/**
|
|
1269
|
-
*
|
|
1270
|
-
* @param ctx - host 插件上下文(webServer / webRuntime / 可选
|
|
1383
|
+
* 插件主体:装配运行时、挂载 fenced 路由。
|
|
1384
|
+
* @param ctx - host 插件上下文(webServer / webRuntime / 可选 sessionQuery、sessions、sessionProjections)。
|
|
1385
|
+
* @param config - 组合条目(0.1.7:`.volatile()` 字段为 live ref)。
|
|
1271
1386
|
*/
|
|
1272
|
-
declare function apply(ctx: Context): void;
|
|
1387
|
+
declare function apply(ctx: Context, config?: Partial<StewardConfig>): void;
|
|
1273
1388
|
//#endregion
|
|
1274
|
-
export { DEFAULT_CONFIG, type DiscoveredSession, type GenerationArtifact, HEALTH_METHODS, HISTORY_METHODS, HealthCache, type HealthCacheEntry, type LogArtifact, type LogCompression, type RepairAssessment, type RepairVerdict, STEWARD_API_PREFIX, STEWARD_SETTINGS_NAMESPACE, type SessionGenerations, type SessionPriority, type StewardConfig, StewardRuntime, apply, assessRepair, buildProjectionOwnerIndex, buildSessionReport, classifyGenerationFilename, countCorpus, createAttributor, decodeSessionLogBytes, decodeSessionLogFile, dirSize, discoverSessions, editWorkspaceDocument, findSession, findSessionLog, firstLosslessViolation, gateColdRead, gateGeneration, gateLogIntegrity, gateLosslessJson, gateProjectionCache, generationLogFilename, handleMethod, indexSessionDirs, inject, isLossless, isMigrationStagingFilename, isSafeChild, latestArtifactMtime, listHistory, locateSessionUsage, methodEnabled, parseGenerationLogFilename, prescribe, projCacheRootFor, pruneArchiveFile, pruneHistory, purgeHistory, quarantineProjectionCache, readArchiveSet, readProjectionCache, readSessionGenerations, readTailFacts, scanSessions, scanZstdFrames, sessionPriority, sessionsRootFor };
|
|
1389
|
+
export { Config, DEFAULT_CONFIG, type DiscoveredSession, type GenerationArtifact, HEALTH_METHODS, HISTORY_METHODS, HealthCache, type HealthCacheEntry, type LogArtifact, type LogCompression, type RepairAssessment, type RepairVerdict, SOURCE_MIGRATE_BACKUP_SUFFIX, STEWARD_API_PREFIX, STEWARD_SETTINGS_NAMESPACE, type SessionGenerations, type SessionPriority, type StewardConfig, StewardRuntime, V4_HOST_MIN, apply, assessRepair, backupFilesIn, buildProjectionOwnerIndex, buildSessionReport, classifyGenerationFilename, countCorpus, createAttributor, decodeSessionLogBytes, decodeSessionLogFile, dirSize, discoverSessions, editWorkspaceDocument, findSession, findSessionLog, firstLosslessViolation, gateColdRead, gateGeneration, gateLogIntegrity, gateLosslessJson, gateProjectionCache, gateSourceKind, generationLogFilename, handleMethod, indexSessionDirs, inject, isLossless, isMigrationStagingFilename, isSafeChild, isSourceMigrateBackupName, latestArtifactMtime, listHistory, locateSessionUsage, methodEnabled, migrateLegacySource, migrateSessionSourceKind, parseGenerationLogFilename, prescribe, projCacheRootFor, pruneArchiveFile, pruneHistory, purgeHistory, quarantineProjectionCache, readArchiveSet, readProjectionCache, readSessionGenerations, readSourceKindFacts, readTailFacts, scanSessions, scanZstdFrames, sessionPriority, sessionsRootFor };
|