tianshu-mcp 0.7.4 → 0.7.6

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.en.md CHANGED
@@ -8,6 +8,84 @@ Chinese version: [CHANGELOG.md](CHANGELOG.md)
8
8
 
9
9
  ---
10
10
 
11
+ ## [0.7.6] - 2026-09-30
12
+
13
+ ### Fixed
14
+
15
+ - **Three ZCode adapter defects (issue #27), reproduced and fixed on real ZCode `3.14.3.7762` (Windows)**:
16
+ - **Split project-collection channels causing a binding deadlock**: on 3.14.3 the
17
+ `[data-testid^="workspace-item-"]` nodes are **not gone from the DOM** — they are scrolled out of
18
+ the viewport instead (measured on the real machine: **40 of 42 nodes invisible**). The old
19
+ implementation collected them without any visibility filter, so the ghost entries made
20
+ `if (!out.length)` permanently false and the only trustworthy channel (the dropdown menu) never
21
+ ran. `matchZcodeProject` then matched a ghost item, the working auto-import branch was skipped,
22
+ and the task died with `project_mismatch`. `projects()` now filters the legacy channel by
23
+ visibility, **always merges both channels**, and lets same-named menu items override sidebar
24
+ entries (only the menu's `aria-checked` is binding evidence rendered by ZCode itself).
25
+ - **Fall back to import when clicks never land**: `clickProject` now reports a distinguishable
26
+ reason (`trigger-unavailable` / `not-found` / `not-visible`). When the target is listed but not a
27
+ single click ever landed, the adapter falls back to the `selectZcodeFolder` import path instead
28
+ of declaring failure (still fail-closed when `allowCreateProject=false`).
29
+ - **Runtime CDP disconnects no longer declare death**: a single `Runtime.evaluate` timeout or an
30
+ endpoint hiccup does not mean CDP is dead (in the reported incident the agent kept writing
31
+ artifacts after MCP had already failed the task). The send phase and the runtime loop now share
32
+ one guard: the first disconnect reconnects **once, for observation only** (matching the existing
33
+ `codex`/`qoder` pattern — **never resending the task**); a failed reconnect or a second
34
+ disconnect lands on `needs_user(setup_recovery)` with both facts attached — whether the process
35
+ is still alive and whether the window still shows running signals — so "still running" is never
36
+ misread as "stopped".
37
+ - **`reasoningLevel` implemented end to end**: the tier set **varies per model**, so it is read
38
+ from the UI **after the model is confirmed** and validated. Out-of-range tiers and unreadable
39
+ tier sets are rejected **before sending** (`reasoning_level_invalid`) instead of silently reusing
40
+ the current value; omitting the tier never touches the UI. Real-machine contract:
41
+ trigger `chat-thought-level-select-trigger` (combobox), options
42
+ `chat-thought-level-select-item-{enabled,disabled}` (binary on/off), options mounted only while
43
+ the menu is open.
44
+ - **Root cause of the "two-level model menu is flaky" symptom**: model items live in the provider
45
+ group's **second-level submenu**, which renders only on **hover** — clicking selects the group
46
+ itself or collapses the menu. The provider group testid has also drifted to
47
+ `chat-model-select-group-registry-provider:`. Group expansion now uses hover
48
+ (`clickExact(..., "hover")`), and when two rounds both yield an empty candidate list the menu is
49
+ reopened for one more round instead of declaring `model_unavailable`.
50
+ - **Permission-menu contract drift (surfaced by the real-machine run, fixed as the same class of defect)**:
51
+ on 3.14.3 the permission items use `menuitemradio` / `menuitemcheckbox` (**not** `option`), and the
52
+ visible name lives in the item's **direct text node**, followed by an explanatory sentence
53
+ (e.g. "Full access — fewer confirmations."). Both mismatched the old implementation and stalled
54
+ dispatch at `permission_unknown`. The selector now carries a role-agnostic fallback, and
55
+ `clickExact` resolves labels from direct text nodes first.
56
+
57
+ ### Real-machine verification
58
+
59
+ - `npm run probe:zcode -- dom-contracts`: `workspaceItems=42` (2 visible / 40 invisible),
60
+ `dataProjectPath=0`; with the menu open `projects()` returns the menu items with correct checked
61
+ state — independently reproducing both the issue's geometric premise and the fixed collection.
62
+ - `npm run probe:zcode -- models` / `permission` plus one-off probes: pinned the provider-group hover
63
+ semantics, the permission item role/text structure, and the binary tier shape
64
+ (`current=on`, `tiers=Off/On`).
65
+ - `npm run smoke:zcode`: end-to-end real-machine dispatch (project binding → model switch →
66
+ permission confirm → send → poll to terminal state).
67
+
68
+ ## [0.7.5] - 2026-09-29
69
+
70
+ ### Fixed
71
+
72
+ - **Qoder CN 0.4.2/0.4.3 support** (PR #26, contributed by jian-in): from 0.4.2 the model menu drops
73
+ the "default/custom" group tabs (candidates become a flat list and the model name moves to the trigger
74
+ text); in 0.4.3 the composer picker loses its `aria-label` and the bound-workspace container loses its
75
+ `title`. The selector candidate order now puts the stable marker `[data-workspace-picker-trigger]` before
76
+ the broad aria heuristic (otherwise it matches the sidebar "Workspace" section header and surfaces as
77
+ `qoder_stage_timeout: workspace-menu`); the "menu is open" check is narrowed to the search box
78
+ `workspaceSearch` (a generic `[role=menu][data-state=open]` can be matched by an unrelated overlay and
79
+ pass falsely); bound-workspace readback lists title-less container candidates and falls back to
80
+ `aria-label`/text. `QoderCdpClient` gains `resolveKey()`/`textKey()` for compound queries that need the
81
+ first matching candidate.
82
+ - **Verify engine normalises the `cwd` drive-letter case on Windows** (same PR): a project path may be
83
+ registered with a lowercase drive letter (e.g. `e:/proj` in `projects.json`), and vite/vitest key their
84
+ module graph by path string, so `e:\proj` and `E:\proj` count as two locations, the same module appears
85
+ twice, and collection crashes. `runVerifyCommand` now normalises with `fs.realpathSync.native` before
86
+ spawning (the non-native variant returns the lowercase drive letter unchanged on Windows); when the path
87
+ cannot be resolved it falls back to the original value, so normalisation never blocks acceptance.
88
+
11
89
  ## [0.7.4] - 2026-09-28
12
90
 
13
91
  ### Fixed
@@ -191,11 +269,35 @@ Chinese version: [CHANGELOG.md](CHANGELOG.md)
191
269
  - ARCHITECTURE / README / agent-profiles / adapter-matrix / SKILL / usage-examples (both languages): the status moves from "in development" to "wired", and the new `endReason` / `needsUserKind` values are added.
192
270
  - Versions: `package.json` and `src/version.generated.ts` are synced to `0.7.1` (per the `+0.0.1` rule); tag `v0.7.1` pushed and published to npm.
193
271
 
194
- ## [Unreleased] — mcp-gui independent line
195
-
196
- > This change adds a **new independent delivery surface**. The MCP package's runtime logic (tool contracts, task
197
- > model, acceptance engine and all of `src/**`) is **unchanged**.
198
- > **The MCP package version stays at `0.7.0` (not yet released)**; the GUI evolves independently with its own version
272
+ ## [0.1.0] — 2026-09-29 — mcp-gui independent line
273
+
274
+ > This is the **first stable release** of the GUI's independent version line (going stable + update log panel).
275
+ > The MCP package's runtime logic (tool contracts, task model, acceptance engine and all of `src/**`) is
276
+ > **unchanged**, and the package version stays at `0.7.4`; the GUI evolves independently with its own version
277
+ > numbers and its own tags (`gui-v*`).
278
+ >
279
+ > **Three categories of change relative to `0.1.0-beta.9`**:
280
+ >
281
+ > 1. **New update log panel**: a dedicated desktop update window ("Update log") that pops up automatically when the
282
+ > silent startup check finds a new version that has not been ignored. It offers `Download and install` /
283
+ > `Ignore this version` / `Later`. "Ignore this version" suppresses the **automatic** prompt only (a manual
284
+ > "Check for updates" still shows that version, a higher version re-prompts, and the record is persisted in app
285
+ > preferences). The window states **which source will be used** (the result of concurrently probing Gitee /
286
+ > GitHub and picking by latency, with an explicit degradation notice when neither is reachable). Its body is the
287
+ > **bilingual release note** for that version (composed from `docs/release-gui-v<version>.md` + `.en.md`, rendered
288
+ > as Markdown with inline HTML disabled). The window size follows the maintainer's annotation:
289
+ > `min(1070px,92vw)` × `min(750px,88vh)`. Adds `mcp-gui/src/core/version.ts` (version comparison and ignore
290
+ > decisions, 16 unit tests) and `mcp-gui/src/components/UpdateDialog.vue`; `Preferences` gains
291
+ > `ignored_update_version` (with a serde default so an old preferences file is not reset wholesale).
292
+ > 2. **Release pipeline now supports stable releases**: the tag filter in `.github/workflows/gui.yml` widens from
293
+ > `gui-v*-beta.*` to **`gui-v*`**, so stable and preview builds share one pipeline; a new step decides the
294
+ > pre-release flag from the tag shape (only tags containing `-beta.` / `-rc.` pass `--prerelease`); a new
295
+ > `scripts/gui-release-body.mjs` composes the bilingual release body (used via `--notes-file` on GitHub and
296
+ > `--body-file` on Gitee, so both sides are **byte-identical in content**, and a missing doc **exits non-zero**).
297
+ > 3. **Version and wording go stable**: the GUI version is unified to `0.1.0` in all four places
298
+ > (`package.json` / `package-lock.json` / `tauri.conf.json` / `Cargo.toml`); the UI label
299
+ > "Beta channel (pre-release)" becomes "Stable channel / 正式版通道"; and every hard-coded "beta" wording in
300
+ > `gitee-gui-release.mjs` and `gui.yml` is removed.
199
301
  > (`0.1.0-beta.N`) and its own tag (`gui-v*`).
200
302
 
201
303
  ### Added
package/CHANGELOG.md CHANGED
@@ -7,6 +7,62 @@
7
7
 
8
8
  ---
9
9
 
10
+ ## [0.7.6] - 2026-09-30
11
+
12
+ ### 修复
13
+
14
+ - **ZCode 适配器三项缺陷(issue #27),已在真机 ZCode `3.14.3.7762`(Windows)上复现并修复**:
15
+ - **项目采集渠道分裂导致绑定死锁**:3.14.3 上 `[data-testid^="workspace-item-"]` **并未从 DOM 消失**,
16
+ 只是被滚出视口(真机实测 **42 个节点中 40 个不可见**)。旧实现采集时不做可见性过滤,幽灵项入列使
17
+ `if (!out.length)` 短路恒为假,唯一可信的菜单渠道永不执行 → `matchZcodeProject` 命中幽灵项 →
18
+ 可用的自动导入分支被跳过 → 任务卡死在 `project_mismatch`。现在 `projects()` 对旧契约项做可见性过滤、
19
+ 两条渠道**始终合并**,且同名的菜单项覆盖侧边栏项(只有菜单的 `aria-checked` 是 ZCode 自己渲染的绑定证据)。
20
+ - **点击落空时回落导入**:`clickProject` 现在返回可区分的原因(`trigger-unavailable` / `not-found` /
21
+ `not-visible`);目标项在列表里却一次都没真正点中时,回落 `selectZcodeFolder` 导入路径而不是直接判死
22
+ (`allowCreateProject=false` 时仍在下一道闸门 fail-closed)。
23
+ - **运行期 CDP 断连不再判死**:单次 `Runtime.evaluate` 超时或端点抖动不等于 CDP 已死(issue 现场是
24
+ 「MCP 判定失败后 agent 仍在写产物」)。发送阶段与运行期统一护栏:首次断连重连**观察一次**
25
+ (对齐 `codex`/`qoder` 的既有范式,重连只用于观察、**绝不重发任务**),重连失败或再次断连落
26
+ `needs_user(setup_recovery)`,并附「进程是否仍在」「窗口是否仍有运行信号」两侧事实,避免把「仍在跑」
27
+ 误读成「已停」。
28
+ - **`reasoningLevel` 端到端实现**:档位集合**随模型变化**,因此在**模型确认之后**才读取界面实际渲染的选项
29
+ 并校验;越权档位与「集合读不到」都在**发送前**报错(`reasoning_level_invalid`),绝不静默沿用;
30
+ 未指定档位时完全不触碰界面。真机契约:触发器 `chat-thought-level-select-trigger`(combobox),
31
+ 选项 `chat-thought-level-select-item-{enabled,disabled}`(二值 开启/关闭),选项只在菜单展开时挂载。
32
+ - **「两级模型菜单点击不稳」根因**:模型项在 provider 分组的**二级子菜单**里,**必须 hover 分组**才渲染,
33
+ 用 click 会选中分组本身或收起菜单;provider 分组 testid 也已漂移为
34
+ `chat-model-select-group-registry-provider:`。现在展开分组改用 hover(`clickExact(..., "hover")`),
35
+ 并在两轮候选皆空时把菜单重开一次再试一轮,不凭一轮空列表判 `model_unavailable`。
36
+ - **权限菜单契约漂移(真机测试暴露,同类问题一并修复)**:3.14.3 的权限项 role 是
37
+ `menuitemradio` / `menuitemcheckbox`(**不是** `option`),且可见名写在项内的**直接文本节点**里、
38
+ 后面还跟一句说明(如「完全访问减少确认次数。」)。旧实现两处都会 0 命中,导致派发卡在 `permission_unknown`。
39
+ 候选选择器补无 role 限制的兜底,`clickExact` 的标签解析优先取直接文本节点。
40
+
41
+ ### 真机验证
42
+
43
+ - `npm run probe:zcode -- dom-contracts`:`workspaceItems=42`(可见 2 / 不可见 40)、`dataProjectPath=0`、
44
+ 菜单展开后 `projects()` 返回菜单项且勾选态正确 —— 独立复现了 issue 的几何前提与修复后的采集结果。
45
+ - `npm run probe:zcode -- models` / `permission` 与一次性探针:锁定 provider 分组 hover 语义、
46
+ 权限项 role 与文本结构、档位二值形态(`current=on`、`tiers=Off/On`)。
47
+ - `npm run smoke:zcode`:真机端到端派发(项目绑定 → 模型切换 → 权限确认 → 发送 → 轮询终态)。
48
+
49
+ ## [0.7.5] - 2026-09-29
50
+
51
+ ### 修复
52
+
53
+ - **Qoder CN 0.4.2/0.4.3 适配**(PR #26,贡献者 jian-in):0.4.2 起模型菜单移除「默认/自定义」
54
+ 分组 tab(候选为平铺列表、模型名移到触发器文本),0.4.3 的输入栏 picker 去掉 `aria-label`、
55
+ 已绑定工作区容器去掉 `title`。选择器候选顺序把稳定标记 `[data-workspace-picker-trigger]`
56
+ 提到宽泛 aria 启发式之前(否则会点中侧栏「工作区」区域头,表现为 `qoder_stage_timeout: workspace-menu`);
57
+ 「菜单已打开」判定收窄为只认搜索框 `workspaceSearch`(泛化的 `[role=menu][data-state=open]`
58
+ 会被无关浮层误命中而假通过);已绑定工作区读回并列无 `title` 容器候选并回退 `aria-label`/文本。
59
+ `QoderCdpClient` 新增 `resolveKey()`/`textKey()`,供组合式查询取首个命中候选。
60
+ - **验收引擎在 Windows 上归一 check 的 `cwd` 盘符大小写**(同 PR):项目路径可能以小写盘符登记
61
+ (如 `projects.json` 里的 `e:/proj`),而 vite/vitest 按路径字符串建模块图与缓存键,
62
+ `e:\proj` 与 `E:\proj` 会被当成两个位置、同一模块出现两份实例,表现为收集期崩溃。
63
+ `runVerifyCommand` 在 spawn 前用 `fs.realpathSync.native` 归一(非 native 版本在 Windows 上
64
+ 原样返回小写盘符,不纠正大小写);路径不可解析时退回原值,归一失败不阻断验收。
65
+
10
66
  ## [0.7.4] - 2026-09-28
11
67
 
12
68
  ### 修复
@@ -179,10 +235,29 @@
179
235
  - ARCHITECTURE / README / agent-profiles / adapter-matrix / SKILL / usage-examples 双语:状态由「开发中」同步为「已接线」,并补齐新的 `endReason` / `needsUserKind` 取值。
180
236
  - 版本:`package.json` 与 `src/version.generated.ts` 同步为 `0.7.1`(按 `+0.0.1` 规则);已打 tag `v0.7.1` 并发布到 npm。
181
237
 
182
- ## [未发布] — mcp-gui 独立版本线
183
-
184
- > 本次变更为**新增独立交付面**:MCP 主包的运行时逻辑(工具契约、任务模型、验收引擎与 `src/**`)**零改动**。
185
- > **MCP 主包版本保持不变**(仍为 `0.7.0`,尚未发布);GUI 使用独立版本号(`0.1.0-beta.N`)与独立 tag(`gui-v*`)独立演进。
238
+ ## [0.1.0] — 2026-09-29 — mcp-gui 独立版本线
239
+
240
+ > 本版本为 GUI 独立版本线的**首个正式版**(转正 + 更新日志面板)。MCP 主包的运行时逻辑
241
+ > (工具契约、任务模型、验收引擎与 `src/**`)**零改动**,主包版本保持 `0.7.4` 不变;
242
+ > GUI 使用独立版本号与独立 tag(`gui-v*`)独立演进。
243
+ >
244
+ > **0.1.0 相对 `0.1.0-beta.9` 的三类改动**:
245
+ >
246
+ > 1. **新增更新日志面板**:桌面端独立的更新窗口「更新日志」——启动静默检查命中新版本且该版本未被忽略时
247
+ > 自动弹出,提供 `下载并安装 / 忽略此版本 / 稍后`;「忽略此版本」**只压自动提示**(手动「检查更新」
248
+ > 仍展示该版本,出现更高版本时重新提示,记录持久化在应用偏好);窗口显式展示**本次将通过哪个源更新**
249
+ > (并发实测 Gitee / GitHub 择优的结果与延迟,两端都不可达时给出降级提示);正文即该版本的**双语发行说明**
250
+ > (`docs/release-gui-v<版本>.md` + `.en.md` 合成,Markdown 渲染、禁用内联 HTML)。窗口尺寸按维护者红框批注
251
+ > 实现为 `min(1070px,92vw)` × `min(750px,88vh)`。新增 `mcp-gui/src/core/version.ts`(版本比较与忽略判定,
252
+ > 16 项单测)与 `mcp-gui/src/components/UpdateDialog.vue`;`Preferences` 新增 `ignored_update_version`
253
+ > (带 serde 默认值兜底,避免旧偏好文件整份回退默认值)。
254
+ > 2. **发布链转为支持正式版**:`.github/workflows/gui.yml` 的 tag 过滤器由 `gui-v*-beta.*` 扩为 **`gui-v*`**,
255
+ > 正式版与预发布共用一条流水线;新增按 tag 形态判定 pre-release 的步骤(含 `-beta.` / `-rc.` 才带
256
+ > `--prerelease`);新增 `scripts/gui-release-body.mjs` 合成双语发行版正文(GitHub 侧 `--notes-file`、
257
+ > Gitee 侧 `--body-file`,两端**同源**,**缺文档即非 0 退出**)。
258
+ > 3. **版本与文案转正**:GUI 版本号四处(`package.json` / `package-lock.json` / `tauri.conf.json` / `Cargo.toml`)
259
+ > 统一为 `0.1.0`;界面「测试版通道(pre-release)」改为「正式版通道 / Stable channel」;
260
+ > `gitee-gui-release.mjs` 与 gui.yml 中的硬编码「测试版」字样全部移除。
186
261
 
187
262
  ### 新增
188
263