dsh-group-status 0.5.0 → 0.5.1
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.md +71 -0
- package/README.en.md +4 -2
- package/README.md +4 -2
- package/lib/client.js +1192 -1157
- package/lib/client.js.map +1 -1
- package/lib/index.js +31 -4
- package/lib/types/build-stamp.d.ts +4 -0
- package/lib/types/build-stamp.d.ts.map +1 -0
- package/lib/types/build-stamp.js +23 -0
- package/lib/types/build-stamp.js.map +1 -0
- package/lib/types/client/BadgeSettingsCard.js +3 -3
- package/lib/types/client/BadgeSettingsCard.js.map +1 -1
- package/lib/types/client/group-status.d.ts +5 -0
- package/lib/types/client/group-status.d.ts.map +1 -1
- package/lib/types/client/group-status.js +25 -0
- package/lib/types/client/group-status.js.map +1 -1
- package/lib/types/client/locales.d.ts +4 -0
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/locales.js +4 -0
- package/lib/types/client/locales.js.map +1 -1
- package/lib/types/client/rows/EmptySessions.d.ts +4 -0
- package/lib/types/client/rows/EmptySessions.d.ts.map +1 -0
- package/lib/types/client/rows/EmptySessions.js +10 -0
- package/lib/types/client/rows/EmptySessions.js.map +1 -0
- package/lib/types/client/rows/ListView.d.ts +24 -0
- package/lib/types/client/rows/ListView.d.ts.map +1 -0
- package/lib/types/client/rows/ListView.js +81 -0
- package/lib/types/client/rows/ListView.js.map +1 -0
- package/lib/types/client/rows/SessionTree.d.ts +4 -0
- package/lib/types/client/rows/SessionTree.d.ts.map +1 -0
- package/lib/types/client/rows/SessionTree.js +381 -0
- package/lib/types/client/rows/SessionTree.js.map +1 -0
- package/lib/types/client/rows/ViewOptionsMenu.d.ts +14 -0
- package/lib/types/client/rows/ViewOptionsMenu.d.ts.map +1 -0
- package/lib/types/client/rows/ViewOptionsMenu.js +50 -0
- package/lib/types/client/rows/ViewOptionsMenu.js.map +1 -0
- package/lib/types/client/rows/WorkspaceBrowser.d.ts +0 -5
- package/lib/types/client/rows/WorkspaceBrowser.d.ts.map +1 -1
- package/lib/types/client/rows/WorkspaceBrowser.js +7 -557
- package/lib/types/client/rows/WorkspaceBrowser.js.map +1 -1
- package/lib/types/client/rows/browser-shared.d.ts +105 -0
- package/lib/types/client/rows/browser-shared.d.ts.map +1 -0
- package/lib/types/client/rows/browser-shared.js +93 -0
- package/lib/types/client/rows/browser-shared.js.map +1 -0
- package/lib/types/client/session-actions/derived.d.ts.map +1 -1
- package/lib/types/client/session-actions/derived.js +13 -2
- package/lib/types/client/session-actions/derived.js.map +1 -1
- package/lib/types/client/session-watermarks.d.ts +6 -1
- package/lib/types/client/session-watermarks.d.ts.map +1 -1
- package/lib/types/client/session-watermarks.js +31 -11
- package/lib/types/client/session-watermarks.js.map +1 -1
- package/lib/types/client/toast/register.d.ts.map +1 -1
- package/lib/types/client/toast/register.js +102 -132
- package/lib/types/client/toast/register.js.map +1 -1
- package/lib/types/host-contract.d.ts +15 -1
- package/lib/types/host-contract.d.ts.map +1 -1
- package/lib/types/host-contract.js +47 -4
- package/lib/types/host-contract.js.map +1 -1
- package/lib/types/index.d.ts +6 -3
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +10 -4
- package/lib/types/index.js.map +1 -1
- package/package.json +15 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,77 @@
|
|
|
6
6
|
|
|
7
7
|
## 未发布
|
|
8
8
|
|
|
9
|
+
## 0.5.1 — 2026-10-27
|
|
10
|
+
|
|
11
|
+
- **refactor** 会话列表面板拆成四个组件文件:`rows/WorkspaceBrowser.tsx` 从 1562 行降到 685 行,
|
|
12
|
+
树体、扁平列表、搜索结果、视图选项菜单、空态占位各自独立(`SessionTree.tsx` / `ListView.tsx` /
|
|
13
|
+
`ViewOptionsMenu.tsx` / `EmptySessions.tsx`),三类共享件(搜索 wire 常量、拖拽状态机、树体的 prop
|
|
14
|
+
契约)收进 `browser-shared.ts`。三个列表体本来就是**互斥渲染**的分支,拆开后仍互不 import;成环由
|
|
15
|
+
`browser-shared.ts` 单向下指挡掉。行为不变:切分是逐段搬移,没有改写判定、排序或动画时序。
|
|
16
|
+
|
|
17
|
+
- **perf** 空闲分组不再产生新的状态对象:`summarizeGroupStatus` 对「六项全零且没有来源贡献」的组
|
|
18
|
+
交回冻结的 `EMPTY_LIVE_STATUS`,`mergeLiveStatus` 把「加一份零」实现为**原样返回入参**。多层折叠
|
|
19
|
+
里每层都会把子树重滚一遍,此前每滚一次都为每个空闲组造一份等值新对象;下游按引用判等的选择器于是
|
|
20
|
+
每轮重渲染,而它读到的数字一个没变。合并仍不修改任何入参。
|
|
21
|
+
|
|
22
|
+
- **perf** `watermarkRows` 在第一个被截断的行处提前退出(空行必然排在组首,由 `tree.ts` 的
|
|
23
|
+
`sectionMembers` 保证,这条例外前提写进了它的 JSDoc);`raiseWatermarks` 整趟只拷贝一次对象,
|
|
24
|
+
不再为每个抬升的分组各展开一次;`WorkspaceBrowser` 与三个列表体共用的「主视图保留了哪个会话」
|
|
25
|
+
扫描改为按 list 身份记忆,不再每轮渲染各 `Object.values()` 一次(`browser-shared.ts` 的
|
|
26
|
+
`mainViewSessionId`)。
|
|
27
|
+
|
|
28
|
+
- **fix** `derive()` 用模块私有 Symbol 代替 `undefined` 表示「尚未投影」:投影**合法地**可能返回
|
|
29
|
+
`undefined`("此刻没有待处理请求"就是一次正常的空结果),旧写法让每次 `getSnapshot()` 都重跑投影;
|
|
30
|
+
投影若新建 `Set`/数组,消费者每次读都拿到新引用,选择器永不收敛 —— 正是这个投影器要避免的事。
|
|
31
|
+
|
|
32
|
+
- **a11y** 徽标设置卡片的数字增减按钮不再硬编码中文 `aria-label`(`settings.count.decrease` /
|
|
33
|
+
`settings.count.increase` 进 zh/en 两份字典);搜索结果区补 `aria-busy`,并给「无匹配」与
|
|
34
|
+
「仅显示前 N 条」加上 `role="status"`,屏幕阅读器能从"正在搜索"读到终止结果。徽标自身的
|
|
35
|
+
`aria-label` 与 `title` 经复核同源、且逐项覆盖可见状态点与数字,无需改动。
|
|
36
|
+
|
|
37
|
+
- **test** 补上此前**从未在本仓库跑过**的契约:`tests/apply-smoke.client.spec.ts`(宿主半边
|
|
38
|
+
`apply()` 不读 `ctx`、banner 仍报得出产物与进程)、`tests/facet-lifecycle.client.spec.tsx`
|
|
39
|
+
(登记面 → 消费存储 → React 的迟到登记 / 快照推送 / 同 id 热替换 / 注销 / dispose)、
|
|
40
|
+
`tests/derive.client.spec.ts`(投影身份稳定,含"返回 `undefined` 也只算一次")与
|
|
41
|
+
`tests/locale-keys.client.spec.ts`(中英字典键必须同集合)。`group-status` 那条「空闲组是全零」
|
|
42
|
+
改为同时断言**引用**就是哨兵;`cross-plugin-summary` 补了「store 迟到注册后 hook 自愈」。
|
|
43
|
+
每条新用例都做过反向验证:改坏被保护的行为即失败,改回即通过。
|
|
44
|
+
|
|
45
|
+
- **fix** 把客户端运行时依赖**逐条写进 `peerDependencies`**(12 个 `@deepseek-ai/dsh-*`,
|
|
46
|
+
范围 `^0.2.1-rc.2` = `engines.dsh` 下界),闭合"声明说不支持、内核照样装"的洞。
|
|
47
|
+
**为什么必须这么做**:≤0.2.0 的内核**不读 `engines.dsh`**,只按 `dsh-*` peer 的范围判兼容
|
|
48
|
+
(0.2.1 起反过来——`engines.dsh` 单独决定,peer 不参与判定)。此前 peer 里只有
|
|
49
|
+
`@deepseek-ai/cordis`,于是 0.2.0 把本插件判成"兼容"并装载;而那一代没发布
|
|
50
|
+
`@deepseek-ai/dsh-api-remote-access`,客户端 `inject` 的 `remoteAccess` 永远拿不到 →
|
|
51
|
+
fiber 永久 pending → `uiWorkspace` 不再被提供 → **`ui-sidebar` / `ui-conversation` /
|
|
52
|
+
`ui-chat` 等 12 条一起不激活,整页 "Failed to load plugins",用户失去整个侧栏**。
|
|
53
|
+
现在 0.2.0-rc.2 实测:内核打印 `skipping profile bundle "dsh-group-status": … peerDependencies {...}`,
|
|
54
|
+
插件不装载,**控制台 0 错误、宿主自带侧栏照常工作**;而 0.2.1-rc.2 / rc.3 / rc.4 三代
|
|
55
|
+
`engines.dsh` 命中即返回,peer 不参与判定,仍全部判过、真 GUI 里分区正常渲染。
|
|
56
|
+
新增用例 `tests/artifacts.node.test.mjs`「每个客户端注入包都声明为 peer,且范围等于
|
|
57
|
+
`engines.dsh` 的下界」把这条不变量钉住(反向验证:把任一 peer 改成 `*` 即红)。
|
|
58
|
+
|
|
59
|
+
- **docs** 跨代次验证记录(2026-10-27,`devkit/results/dsh-group-status-cross-kernel-2026-10-27.json`
|
|
60
|
+
与 `devkit/results/screens/`):0.2.1-rc.2 上 gate / peer / tsc / test / 冷启动装配全绿,
|
|
61
|
+
真 GUI 里分组行、会话行、View options 菜单、扁平列表、搜索命中与无匹配态均正常,
|
|
62
|
+
搜索区的 `aria-busy` 与 `role="status"` 在真机可见。**0.2.0-rc.2 实测会把整个侧栏拖下去**:
|
|
63
|
+
该代次没发布 `@deepseek-ai/dsh-api-remote-access`,客户端 `inject` 的 `remoteAccess` 拿不到
|
|
64
|
+
→ fiber 永久 pending → `uiWorkspace` 不再被提供 → 侧栏 / 对话 / chat 共 12 条一起不激活,
|
|
65
|
+
页面直接 "Failed to load plugins"。所以 `engines.dsh >=0.2.1-rc.2` 是**硬下界**,不是保守估计;
|
|
66
|
+
0.1.7/0.2.0 的内核也不读 `engines.dsh`(只卡 `dsh-*` peer,而本包的 `dsh-*` peer 只有
|
|
67
|
+
`@deepseek-ai/cordis`),因此这两代上它**能被装进去**——装进去就会坏,别手工降级。
|
|
68
|
+
折叠分组的活状态徽标这一轮**未判定**:隔离实例里宿主没有上报会话活状态,新/旧构建 A/B 均为空,
|
|
69
|
+
故不能算通过(对照记录见 `devkit/results/screens/README.md`)。
|
|
70
|
+
|
|
71
|
+
- **chore** 构建与守卫:CI 新增 `lib/client.js` 的 gzip 体积预算(当前 77,312 字节 / 上限 84,000,
|
|
72
|
+
`release-invariants` job,纯 shell);`parseHostPendingKinds` 解析不到时改为抛出**点名是哪一条正则
|
|
73
|
+
破了**的错误,不再静默返回空集合 —— 空集合会让"集合相等"永远成立,或退化成一条误导性的
|
|
74
|
+
"我们多认了 kind"漂移;`build/tools/experimental-package-policy.ts` 删掉本仓库结构上不可能走到的
|
|
75
|
+
分支(没有 `packages/experimental/` 树,十个保留名在 264 个已装包里一个都不出现);产物可复现性
|
|
76
|
+
检查排除被 `.gitignore` 的增量缓存 `tsconfig.tsbuildinfo`(它记的是上次构建动过哪些文件,与被比较的
|
|
77
|
+
编译输出无关)。
|
|
78
|
+
|
|
79
|
+
|
|
9
80
|
## 0.5.0 — 2026-10-22
|
|
10
81
|
|
|
11
82
|
- **fix** 宿主契约漂移**从此有人看着了**:`pendingInteraction.kind` 是开放集合
|
package/README.en.md
CHANGED
|
@@ -180,12 +180,14 @@ dsh plugin --profile web remove dsh-group-status
|
|
|
180
180
|
|
|
181
181
|
| Item | Value |
|
|
182
182
|
|---|---|
|
|
183
|
-
| DSH core | `0.2.1-rc.2` |
|
|
184
|
-
| peer
|
|
183
|
+
| DSH core | declares `>=0.2.1-rc.2 <0.3.0-0`; verified on `0.2.1-rc.2` / `rc.3` / `rc.4` |
|
|
184
|
+
| peer dependencies | `@deepseek-ai/cordis ~4.0.5` plus 12 `@deepseek-ai/dsh-*` at `^0.2.1-rc.2` |
|
|
185
185
|
| Upstream base | `@deepseek-ai/dsh-client-ui-workspace 0.2.1-rc.2` (source vendored into `src/`) |
|
|
186
186
|
| Install shape | fork override: same slots registered, stock row disabled via `cordis.patch.yml` |
|
|
187
187
|
| Optional partners | dsh-later (schedule summary), dsh-gitea-dispatch (waiting-review summary) |
|
|
188
188
|
|
|
189
|
+
Those 12 peers are not metadata. Cores at or below 0.2.0 **do not read `engines.dsh`** — they judge compatibility purely from `@deepseek-ai/dsh*` peer ranges. Without the enumeration, 0.2.0 considers this package compatible and installs it; that generation never published `@deepseek-ai/dsh-api-remote-access`, so the client `inject` for `remoteAccess` never resolves, the fiber stays pending, `uiWorkspace` is never provided, and `ui-sidebar` / `ui-conversation` / `ui-chat` — 12 entries in all — fail to activate. The page becomes "Failed to load plugins" and the user loses the entire sidebar. With the peers declared, 0.2.0-rc.2 measured as `skipping profile bundle`, and the host is unharmed; from 0.2.1 on, `engines.dsh` decides alone and peers are ignored, so in-window generations are unaffected.
|
|
190
|
+
|
|
189
191
|
Every upstream generation requires a manual rebase — see the [upgrade runbook](./docs/upgrading.md). If upstream renames a slot, changes a component signature or the context contract, this package will not follow on its own.
|
|
190
192
|
|
|
191
193
|
---
|
package/README.md
CHANGED
|
@@ -182,12 +182,14 @@ dsh plugin --profile web remove dsh-group-status
|
|
|
182
182
|
|
|
183
183
|
| 项 | 值 |
|
|
184
184
|
|---|---|
|
|
185
|
-
| DSH 内核 | `0.2.1-rc.2` |
|
|
186
|
-
| peer 依赖 | `@deepseek-ai/cordis ~4.0.5` |
|
|
185
|
+
| DSH 内核 | 声明 `>=0.2.1-rc.2 <0.3.0-0`;实测 `0.2.1-rc.2` / `rc.3` / `rc.4` 全绿 |
|
|
186
|
+
| peer 依赖 | `@deepseek-ai/cordis ~4.0.5` + 12 个 `@deepseek-ai/dsh-*`,范围 `^0.2.1-rc.2` |
|
|
187
187
|
| 上游基线 | `@deepseek-ai/dsh-client-ui-workspace 0.2.1-rc.2`(源码已 vendored 进本仓库 `src/`)|
|
|
188
188
|
| 安装形态 | fork 覆盖包:同槽位注册 + `cordis.patch.yml` 禁用官方行 |
|
|
189
189
|
| 可选搭档 | dsh-later(定时任务摘要)、dsh-gitea-dispatch(等待评审摘要)|
|
|
190
190
|
|
|
191
|
+
peer 里那 12 条**不是元数据**:≤0.2.0 的内核不读 `engines.dsh`,只按 `@deepseek-ai/dsh*` peer 的范围判兼容。不逐条声明时,0.2.0 会把本包判成「兼容」并装进去 —— 而那一代没有 `@deepseek-ai/dsh-api-remote-access`,客户端 `inject` 的 `remoteAccess` 永远拿不到,fiber 永久 pending,`uiWorkspace` 不再被提供,`ui-sidebar` / `ui-conversation` / `ui-chat` 等 12 条一起不激活,**整页 "Failed to load plugins",用户失去整个侧栏**。声明之后,0.2.0-rc.2 实测是内核直接 `skipping profile bundle`,宿主不受损;而 0.2.1 起 `engines.dsh` 命中即返回、peer 不参与判定,窗口内代次不受影响。
|
|
192
|
+
|
|
191
193
|
上游一换代就得按[升级手册](./docs/upgrading.md) rebase 一次;上游改槽位名、组件签名或上下文契约时,本包不会自动跟上。
|
|
192
194
|
|
|
193
195
|
其中**会静默失效**的那部分(我们认的待处理 kind 集合、我们从宿主读的两个状态事实)有守卫兜着:`tests/host-pending-kinds.node.test.mjs` 直接读锁定版宿主的实现来比对,宿主一改就红;人看的版本是 `pnpm check-upstream`(加 `--latest` 还能查 npm 上已发布的最高版)。
|