dsh-modellix 0.2.1 → 0.3.0

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 CHANGED
@@ -6,6 +6,21 @@ The format follows Keep a Changelog.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.0] - 2026-10-15
10
+
11
+ ### Changed
12
+
13
+ - Replaced repeated immediate task reads with bounded server waits and an overall cancellation deadline.
14
+ - Moved remote waits outside the shared Design write queue; observations remain serialized and credential-epoch guarded.
15
+ - Added deterministic image, video, and audio upload validation up to 16 MiB and explicit file-quota recovery guidance.
16
+ - Updated real API acceptance to exercise server waits without replaying media submissions.
17
+
18
+ ### Fixed
19
+
20
+ - Keep API Key validation errors visible while a credential editor is open; background configuration refresh resumes after it closes.
21
+ - Restore keyboard focus to the credential editor's opener when a host Modal applies its own autofocus.
22
+ - Keep settings controls enabled during background refresh and discard stale replies after a newer settings change.
23
+
9
24
  ## [0.2.1] - 2026-09-02
10
25
 
11
26
  ### Changed
package/README.md CHANGED
@@ -8,6 +8,13 @@
8
8
 
9
9
  ![A real English Harness conversation showing a completed Modellix image result](docs/assets/chat-media-generation-en.webp)
10
10
 
11
+ ## What changed in 0.3.0
12
+
13
+ - Task monitoring uses bounded server waits. Only a known task ID is observed, and stopping a wait never resubmits the paid generation.
14
+ - Chat and result history stay responsive during a wait. Disabling Design, changing credentials, or closing the plugin cancels outstanding reads and prevents stale results from being saved.
15
+ - Workspace uploads support the File API's image, video, and audio formats up to 16 MiB, with local file/container checks. Harness attachment uploads still use its image attachment reader. On quota errors, list files and explicitly delete only selected IDs through the File API or CLI; the plugin never deletes files automatically.
16
+ - The server must support `wait=true`; an unsupported server produces a compatibility error instead of repeated short polling.
17
+
11
18
  ## What changed in 0.2.1
12
19
 
13
20
  - The Web switch now unregisters only `modellix_web_search` and `modellix_web_fetch`. Harness-native Web tools and providers remain available, so turning Modellix Web off falls back to the active profile's defaults.
@@ -60,7 +67,7 @@ To install a trusted local build:
60
67
  pnpm install --frozen-lockfile
61
68
  pnpm run verify:release:static
62
69
  pnpm pack
63
- dsh plugin --profile web add ./dsh-modellix-0.2.1.tgz
70
+ dsh plugin --profile web add ./dsh-modellix-0.3.0.tgz
64
71
  ```
65
72
 
66
73
  See [local usage](docs/en-US/LOCAL_USAGE.md) for the complete Windows-first workflow.
@@ -110,7 +117,7 @@ The **Modellix Design** button sits at the far right of the conversation header,
110
117
  - The entire Results list is expanded by default and can be collapsed.
111
118
  - Every result card is expanded by default and can be collapsed by selecting its header.
112
119
  - The close button returns focus to the launcher.
113
- - The advanced exact-parameter editor remains implemented but its entry is hidden in `0.2.1`; ordinary users work through chat.
120
+ - The advanced exact-parameter editor remains implemented but its entry is hidden in `0.3.0`; ordinary users work through chat.
114
121
  - At 560 px and below, the panel uses the available viewport width. At 360 px and below, the launcher becomes a reachable compact control.
115
122
 
116
123
  ## LLM models
package/README.zh-CN.md CHANGED
@@ -8,6 +8,13 @@
8
8
 
9
9
  ![真实中文 Harness 会话中已完成的 Modellix 图片结果](docs/assets/chat-media-generation-zh.webp)
10
10
 
11
+ ## 0.3.0 的主要变化
12
+
13
+ - 任务监控改为有界服务端等待,只观察已知任务 ID;停止等待不会重新提交计费生成。
14
+ - 等待期间 Chat 与结果历史保持响应。关闭 Design、更换凭据或关闭插件时会取消未完成的读取,并阻止旧结果写入。
15
+ - 工作区上传支持 File API 的图片、视频和音频格式,单文件上限 16 MiB,并校验本地文件与容器。Harness 附件仍使用其图片读取接口。配额不足时,通过 File API 或 CLI 列出文件并明确删除选中的 ID;插件不会自动清理文件。
16
+ - 服务端需要支持 `wait=true`;不支持时会明确提示兼容性错误,不会回退为反复短轮询。
17
+
11
18
  ## 0.2.1 的主要变化
12
19
 
13
20
  - Web 开关现在只注销 `modellix_web_search` 与 `modellix_web_fetch`。Harness 原生 Web 工具和 Provider 保持可用,关闭 Modellix Web 后会回退到当前 Profile 的默认能力。
@@ -60,7 +67,7 @@ dsh --profile web
60
67
  pnpm install --frozen-lockfile
61
68
  pnpm run verify:release:static
62
69
  pnpm pack
63
- dsh plugin --profile web add ./dsh-modellix-0.2.1.tgz
70
+ dsh plugin --profile web add ./dsh-modellix-0.3.0.tgz
64
71
  ```
65
72
 
66
73
  完整 Windows 本地流程见[本地使用指南](docs/zh-CN/LOCAL_USAGE.md)。
@@ -110,7 +117,7 @@ Agent 会按实际情况:
110
117
  - 整个结果列表默认展开,可点击收起。
111
118
  - 每张结果卡默认展开,可点击卡片头部收起。
112
119
  - 点击 X 关闭后,焦点会回到入口按钮。
113
- - 高级精准参数编辑器已保留,但 `0.2.1` 暂不显示入口;普通用户通过 Chat 使用。
120
+ - 高级精准参数编辑器已保留,但 `0.3.0` 暂不显示入口;普通用户通过 Chat 使用。
114
121
  - 560px 及以下使用可用视口全宽;360px 及以下入口变为可触达的紧凑按钮。
115
122
 
116
123
  ## LLM 模型
@@ -42,7 +42,7 @@ pnpm run verify:pack
42
42
  pnpm pack
43
43
  ```
44
44
 
45
- The repository root will contain a file such as `dsh-modellix-0.2.1.tgz`. Do not ask DSH to install the unbuilt TypeScript checkout directly.
45
+ The repository root will contain a file such as `dsh-modellix-0.3.0.tgz`. Do not ask DSH to install the unbuilt TypeScript checkout directly.
46
46
 
47
47
  ## 3. Create an isolated local Harness environment
48
48
 
@@ -60,7 +60,7 @@ This affects only the current PowerShell process and its children. Omit this ste
60
60
  Install the tarball into the `web` profile and inspect the merged configuration:
61
61
 
62
62
  ```powershell
63
- dsh plugin --profile web add .\dsh-modellix-0.2.1.tgz
63
+ dsh plugin --profile web add .\dsh-modellix-0.3.0.tgz
64
64
  dsh --profile web --dump-config
65
65
  ```
66
66
 
@@ -88,10 +88,12 @@ An environment-sourced Modellix Key is read-only in the UI. Stop and restart Har
88
88
  ## 6. Start the local Web UI
89
89
 
90
90
  ```powershell
91
- dsh --profile web --no-open
91
+ dsh --profile web --no-open --port 3080 --trusted-host localhost:3080
92
92
  ```
93
93
 
94
- The terminal prints the actual address, such as `http://127.0.0.1:3080`. Open the printed address; do not assume the port is fixed.
94
+ The supported Harness currently accepts only its loopback IP or all interfaces as a bind value. Keep the default loopback binding, allow `localhost:3080` through its trust fence, and open `http://localhost:3080/`. Do not use an all-interface bind for local acceptance.
95
+
96
+ The terminal prints the actual address, such as `http://localhost:3080`. Open the printed address; do not assume the port is fixed.
95
97
 
96
98
  A fresh profile may first show Harness's own DeepSeek initialization dialog. Complete or otherwise handle that step before the plugin presents “Connect Modellix”:
97
99
 
@@ -109,7 +111,7 @@ A fresh profile may first show Harness's own DeepSeek initialization dialog. Com
109
111
  6. Select **Modellix Design** at the far right of the session header to see all current-session results.
110
112
  7. Use Preview/JSON on successful cards, image enlargement, native video/audio players, **Add URL to chat**, and **Download**.
111
113
 
112
- The advanced exact-parameter editor remains internal but its entry is hidden in `0.2.1`. Routine UI flows do not display payment prompts; usage and details remain available in Modellix.
114
+ The advanced exact-parameter editor remains internal but its entry is hidden in `0.3.0`. Routine UI flows do not display payment prompts; usage and details remain available in Modellix.
113
115
 
114
116
  ## 8. Use Modellix LLM models
115
117
 
@@ -137,9 +139,9 @@ After source changes:
137
139
  Set-Location 'D:\work\maas\githup\dsh-modellix'
138
140
  pnpm run verify:pack
139
141
  pnpm pack
140
- dsh plugin --profile web add .\dsh-modellix-0.2.1.tgz
142
+ dsh plugin --profile web add .\dsh-modellix-0.3.0.tgz
141
143
  dsh --profile web --dump-config
142
- dsh --profile web --no-open
144
+ dsh --profile web --no-open --port 3080 --trusted-host localhost:3080
143
145
  ```
144
146
 
145
147
  ## 11. Troubleshooting
@@ -149,8 +151,8 @@ dsh --profile web --no-open
149
151
  | A DeepSeek API Key dialog appears first | This is the fresh Harness profile's base initialization, not the Modellix dialog; complete it before configuring Modellix |
150
152
  | The CLI is logged in but the plugin still requests a Key | The CLI Keychain and Harness Credential service are separate; save it in the plugin UI or inject `MODELLIX_API_KEY` into the Harness process |
151
153
  | Modellix Design is missing | Inspect `--dump-config`, confirm Design is enabled, and fully restart the running profile after an update |
152
- | A task remains stale in assistant prose | Current status belongs to the live card and right panel; `0.2.1` updates the card in the background and avoids nonterminal status wording in ordinary prose |
153
- | One task shows two cards | This is not expected in `0.2.1`; record the job/tool call ids without Secrets and report a duplicate-card defect |
154
+ | A task remains stale in assistant prose | Current status belongs to the live card and right panel; `0.3.0` updates the card in the background and avoids nonterminal status wording in ordinary prose |
155
+ | One task shows two cards | This is not expected in `0.3.0`; record the job/tool call ids without Secrets and report a duplicate-card defect |
154
156
  | The UI reports an invalid Key | Only an explicit Modellix 401 enters this state; replace a local Credential in settings, or update an environment source and restart |
155
157
  | Balance is insufficient | A 402 is not treated as an invalid Key; fund the account or change the task before retrying manually |
156
158
  | Requests are rate-limited | Wait for the 429 window to end before retrying manually |
@@ -1,6 +1,6 @@
1
1
  [English](RELEASE_CHECKLIST.md) | [简体中文](../zh-CN/RELEASE_CHECKLIST.md)
2
2
 
3
- # dsh-modellix 0.2.1 Release and Acceptance Checklist
3
+ # dsh-modellix 0.3.0 Release and Acceptance Checklist
4
4
 
5
5
  Use this document for manual product acceptance and for the final release gate. Check each item against the exact package/commit being released.
6
6
 
@@ -23,7 +23,7 @@ Record before testing:
23
23
 
24
24
  | Item | Expected |
25
25
  | --- | --- |
26
- | Package | `dsh-modellix@0.2.1` |
26
+ | Package | `dsh-modellix@0.3.0` |
27
27
  | Harness | `0.1.2-alpha.4` latest matrix plus `0.1.1-rc.2` compatibility matrix |
28
28
  | Development Node | `24.18.1` |
29
29
  | pnpm | `11.24.0` |
@@ -219,7 +219,7 @@ Create Secret-free files outside the repository:
219
219
 
220
220
  Both files must:
221
221
 
222
- - target `dsh-modellix@0.2.1`;
222
+ - target `dsh-modellix@0.3.0`;
223
223
  - contain the exact lowercase 40-character Git HEAD;
224
224
  - use a canonical UTC ISO-8601 completion time no older than 72 hours;
225
225
  - have status `passed` for every required check;
@@ -244,10 +244,10 @@ After all checks pass:
244
244
  5. Read back:
245
245
 
246
246
  ```sh
247
- npm view dsh-modellix@0.2.1 version dist.integrity dist.shasum --json --registry=https://registry.npmjs.org/ --prefer-online
247
+ npm view dsh-modellix@0.3.0 version dist.integrity dist.shasum --json --registry=https://registry.npmjs.org/ --prefer-online
248
248
  ```
249
249
 
250
- 6. From an empty external directory and fresh npm cache, install `dsh-modellix@0.2.1`.
250
+ 6. From an empty external directory and fresh npm cache, install `dsh-modellix@0.3.0`.
251
251
  7. Verify the installed version and `dsh --profile <isolated> --dump-config`.
252
252
  8. Remove temporary npm config, cache, tarball, profile, evidence intermediates, and process variables.
253
253
 
@@ -2,7 +2,16 @@
2
2
 
3
3
  # dsh-modellix User Guide
4
4
 
5
- This guide describes the current `0.2.1` experience. Media creation is chat-first; there is no standalone Design tab. The right-side **Modellix Design** panel is a session-scoped result workspace.
5
+ This guide describes the current `0.3.0` experience. Media creation is chat-first; there is no standalone Design tab. The right-side **Modellix Design** panel is a session-scoped result workspace.
6
+
7
+
8
+ ## What changed in 0.3.0
9
+
10
+ - Task monitoring uses bounded server waits. Only a known task ID is observed, and stopping a wait never resubmits the paid generation.
11
+ - Chat and result history stay responsive during a wait. Disabling Design, changing credentials, or closing the plugin cancels outstanding reads and prevents stale results from being saved.
12
+ - Workspace uploads support the File API's image, video, and audio formats up to 16 MiB, with local file/container checks. Harness attachment uploads still use its image attachment reader. On quota errors, list files and explicitly delete only selected IDs through the File API or CLI; the plugin never deletes files automatically.
13
+ - The server must support `wait=true`; an unsupported server produces a compatibility error instead of repeated short polling.
14
+
6
15
 
7
16
  ## 1. Install and verify
8
17
 
@@ -28,7 +37,7 @@ To use a local package artifact:
28
37
  pnpm install --frozen-lockfile
29
38
  pnpm run verify:release:static
30
39
  pnpm pack
31
- dsh plugin --profile web add ./dsh-modellix-0.2.1.tgz
40
+ dsh plugin --profile web add ./dsh-modellix-0.3.0.tgz
32
41
  ```
33
42
 
34
43
  See [LOCAL_USAGE.md](LOCAL_USAGE.md) for isolated-profile setup and update commands.
@@ -80,7 +89,7 @@ It does not add a standalone Design tab.
80
89
  - Results and every card are expanded by default.
81
90
  - Select **Results** to collapse the whole list; select a card header to collapse only that card.
82
91
  - Select X to close. Keyboard focus returns to the launcher.
83
- - The advanced exact-parameter editor remains in the implementation but its entry is hidden for `0.2.1`.
92
+ - The advanced exact-parameter editor remains in the implementation but its entry is hidden for `0.3.0`.
84
93
 
85
94
  ## 4. Create media by chatting
86
95
 
@@ -283,11 +292,11 @@ Keep the conversation open long enough for the Client watcher, verify the Creden
283
292
 
284
293
  ### Two cards represent one task
285
294
 
286
- This is not expected in `0.2.1`. Capture the two job ids and tool call ids without Secrets. The generation card should win the per-session task claim, and the matching result-query card should be suppressed.
295
+ This is not expected in `0.3.0`. Capture the two job ids and tool call ids without Secrets. The generation card should win the per-session task claim, and the matching result-query card should be suppressed.
287
296
 
288
297
  ### Results from another conversation appear
289
298
 
290
- This is not expected for new `0.2.1` tasks. Record the affected session/task ids and report it as a session-isolation defect.
299
+ This is not expected for new `0.3.0` tasks. Record the affected session/task ids and report it as a session-isolation defect.
291
300
 
292
301
  ### Media cannot play
293
302
 
@@ -42,7 +42,7 @@ pnpm run verify:pack
42
42
  pnpm pack
43
43
  ```
44
44
 
45
- 完成后,仓库根目录会生成类似 `dsh-modellix-0.2.1.tgz` 的文件。不要直接把未构建的 TypeScript 源码交给 DSH 安装。
45
+ 完成后,仓库根目录会生成类似 `dsh-modellix-0.3.0.tgz` 的文件。不要直接把未构建的 TypeScript 源码交给 DSH 安装。
46
46
 
47
47
  ## 3. 创建独立的本地 Harness 环境
48
48
 
@@ -60,7 +60,7 @@ New-Item -ItemType Directory -Force -Path $env:DSH_HOME | Out-Null
60
60
  把刚生成的 tarball 安装到 `web` Profile:
61
61
 
62
62
  ```powershell
63
- dsh plugin --profile web add .\dsh-modellix-0.2.1.tgz
63
+ dsh plugin --profile web add .\dsh-modellix-0.3.0.tgz
64
64
  dsh --profile web --dump-config
65
65
  ```
66
66
 
@@ -88,10 +88,12 @@ $env:MODELLIX_API_KEY = (Get-Content -LiteralPath 'D:\secrets\modellix-key.txt'
88
88
  ## 6. 启动本地 Web UI
89
89
 
90
90
  ```powershell
91
- dsh --profile web --no-open
91
+ dsh --profile web --no-open --port 3080 --trusted-host localhost:3080
92
92
  ```
93
93
 
94
- 终端会打印实际地址,例如 `http://127.0.0.1:3080`。用浏览器打开终端显示的地址,不要假定端口固定。
94
+ 当前受支持的 Harness 绑定值仅接受回环 IP 或全部网卡。保留默认的回环绑定,通过信任边界显式允许 `localhost:3080`,并打开 `http://localhost:3080/`;本地验收不要绑定全部网卡。
95
+
96
+ 终端会打印实际地址,例如 `http://localhost:3080`。用浏览器打开终端显示的地址,不要假定端口固定。
95
97
 
96
98
  全新 Profile 可能先显示 Harness 自带的 DeepSeek 初始化弹窗。完成或按需处理该步骤后,插件会显示“连接 Modellix”弹窗:
97
99
 
@@ -109,7 +111,7 @@ dsh --profile web --no-open
109
111
  6. 点击会话头部最右侧 **Modellix Design**,查看当前会话全部结果。
110
112
  7. 成功卡可用预览/JSON、图片放大、原生视频/音频播放器、**添加 URL 到对话框** 和 **下载**。
111
113
 
112
- 高级精准参数编辑器继续保留,但 `0.2.1` 暂不显示入口。常规 UI 不显示付费提示;消耗与明细在 Modellix 查看。
114
+ 高级精准参数编辑器继续保留,但 `0.3.0` 暂不显示入口。常规 UI 不显示付费提示;消耗与明细在 Modellix 查看。
113
115
 
114
116
  ## 8. 使用 Modellix LLM
115
117
 
@@ -137,9 +139,9 @@ dsh --profile web --no-open
137
139
  Set-Location 'D:\work\maas\githup\dsh-modellix'
138
140
  pnpm run verify:pack
139
141
  pnpm pack
140
- dsh plugin --profile web add .\dsh-modellix-0.2.1.tgz
142
+ dsh plugin --profile web add .\dsh-modellix-0.3.0.tgz
141
143
  dsh --profile web --dump-config
142
- dsh --profile web --no-open
144
+ dsh --profile web --no-open --port 3080 --trusted-host localhost:3080
143
145
  ```
144
146
 
145
147
  ## 11. 常见问题
@@ -149,8 +151,8 @@ dsh --profile web --no-open
149
151
  | 先出现 DeepSeek API Key 弹窗 | 这是全新 Harness Profile 的基础初始化,不是 Modellix 弹窗;完成后继续配置 Modellix |
150
152
  | `modellix-cli` 已登录但插件仍要求 Key | CLI Keychain 与 Harness Credential 相互独立;在插件 UI 保存,或给 Harness 启动进程设置 `MODELLIX_API_KEY` |
151
153
  | 看不到 Modellix Design | 检查 `--dump-config`、确认 Design 已开启,并在更新后完整重启运行中的 Profile |
152
- | 助手正文里的状态看起来旧 | 当前状态属于实时卡片与右侧面板;`0.2.1` 后台更新卡片,并避免在普通正文写非终态 |
153
- | 一个任务显示两张卡 | `0.2.1` 不应出现;在不包含 Secret 的情况下记录 job/tool call id 并报告重复卡缺陷 |
154
+ | 助手正文里的状态看起来旧 | 当前状态属于实时卡片与右侧面板;`0.3.0` 后台更新卡片,并避免在普通正文写非终态 |
155
+ | 一个任务显示两张卡 | `0.3.0` 不应出现;在不包含 Secret 的情况下记录 job/tool call id 并报告重复卡缺陷 |
154
156
  | 页面提示 Key 无效 | 只有 Modellix 明确返回 401 才会进入该状态;本地 Credential 可在设置中更换,环境来源需在外部更新并重启 |
155
157
  | 余额不足 | 402 不会被误报为 Key 无效;充值或调整任务后手动重试 |
156
158
  | 请求过多 | 等待 429 限流窗口结束后再手动重试 |
@@ -1,6 +1,6 @@
1
1
  [English](../en-US/RELEASE_CHECKLIST.md) | [简体中文](RELEASE_CHECKLIST.md)
2
2
 
3
- # dsh-modellix 0.2.1 发布与验收清单
3
+ # dsh-modellix 0.3.0 发布与验收清单
4
4
 
5
5
  本文用于人工产品验收和最终发布门禁。每一项都必须针对即将发布的准确包版本与 commit 检查。
6
6
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  | 项目 | 预期 |
25
25
  | --- | --- |
26
- | 包 | `dsh-modellix@0.2.1` |
26
+ | 包 | `dsh-modellix@0.3.0` |
27
27
  | Harness | `0.1.2-alpha.4` 最新矩阵,并兼容验证 `0.1.1-rc.2` |
28
28
  | 开发 Node | `24.18.1` |
29
29
  | pnpm | `11.24.0` |
@@ -219,7 +219,7 @@ pnpm run test:real:modellix
219
219
 
220
220
  两个文件必须:
221
221
 
222
- - 指向 `dsh-modellix@0.2.1`;
222
+ - 指向 `dsh-modellix@0.3.0`;
223
223
  - 包含准确的 40 位小写 Git HEAD;
224
224
  - 使用不早于 72 小时的规范 UTC ISO-8601 时间;
225
225
  - 所有必填 check 均为 `passed`;
@@ -244,10 +244,10 @@ pnpm run verify:release
244
244
  5. 回读:
245
245
 
246
246
  ```sh
247
- npm view dsh-modellix@0.2.1 version dist.integrity dist.shasum --json --registry=https://registry.npmjs.org/ --prefer-online
247
+ npm view dsh-modellix@0.3.0 version dist.integrity dist.shasum --json --registry=https://registry.npmjs.org/ --prefer-online
248
248
  ```
249
249
 
250
- 6. 在仓库外空目录和全新 npm cache 中安装 `dsh-modellix@0.2.1`。
250
+ 6. 在仓库外空目录和全新 npm cache 中安装 `dsh-modellix@0.3.0`。
251
251
  7. 检查实际落盘版本和 `dsh --profile <isolated> --dump-config`。
252
252
  8. 删除临时 npm 配置、cache、tarball、profile、Evidence 中间文件和进程变量。
253
253
 
@@ -2,7 +2,16 @@
2
2
 
3
3
  # dsh-modellix 用户指南
4
4
 
5
- 本文说明 `0.2.1` 的当前体验。媒体创作以对话为主,不再存在独立 Design Tab;右侧 **Modellix Design** 是按会话隔离的结果工作区。
5
+ 本文说明 `0.3.0` 的当前体验。媒体创作以对话为主,不再存在独立 Design Tab;右侧 **Modellix Design** 是按会话隔离的结果工作区。
6
+
7
+
8
+ ## 0.3.0 的主要变化
9
+
10
+ - 任务监控改为有界服务端等待,只观察已知任务 ID;停止等待不会重新提交计费生成。
11
+ - 等待期间 Chat 与结果历史保持响应。关闭 Design、更换凭据或关闭插件时会取消未完成的读取,并阻止旧结果写入。
12
+ - 工作区上传支持 File API 的图片、视频和音频格式,单文件上限 16 MiB,并校验本地文件与容器。Harness 附件仍使用其图片读取接口。配额不足时,通过 File API 或 CLI 列出文件并明确删除选中的 ID;插件不会自动清理文件。
13
+ - 服务端需要支持 `wait=true`;不支持时会明确提示兼容性错误,不会回退为反复短轮询。
14
+
6
15
 
7
16
  ## 1. 安装与检查
8
17
 
@@ -28,7 +37,7 @@ dsh --profile web
28
37
  pnpm install --frozen-lockfile
29
38
  pnpm run verify:release:static
30
39
  pnpm pack
31
- dsh plugin --profile web add ./dsh-modellix-0.2.1.tgz
40
+ dsh plugin --profile web add ./dsh-modellix-0.3.0.tgz
32
41
  ```
33
42
 
34
43
  独立 Profile 与更新命令见 [LOCAL_USAGE.md](LOCAL_USAGE.md)。
@@ -80,7 +89,7 @@ dsh plugin --profile web add ./dsh-modellix-0.2.1.tgz
80
89
  - 结果列表和每张卡片默认展开。
81
90
  - 点击 **结果** 收起整个列表;点击卡片头部只收起该卡片。
82
91
  - 点击 X 关闭,键盘焦点回到入口。
83
- - 高级精准参数编辑器保留在实现中,但 `0.2.1` 隐藏入口。
92
+ - 高级精准参数编辑器保留在实现中,但 `0.3.0` 隐藏入口。
84
93
 
85
94
  ## 4. 通过对话创建媒体
86
95
 
@@ -283,11 +292,11 @@ Provider 使用 OpenAI 兼容接口,重试次数为 `0`;目录不可用时
283
292
 
284
293
  ### 同一任务出现两张卡
285
294
 
286
- `0.2.1` 不应出现。请在不包含 Secret 的情况下记录两张卡的 job id 和 tool call id。生成卡应赢得当前会话的任务展示权,匹配的结果查询卡应被抑制。
295
+ `0.3.0` 不应出现。请在不包含 Secret 的情况下记录两张卡的 job id 和 tool call id。生成卡应赢得当前会话的任务展示权,匹配的结果查询卡应被抑制。
287
296
 
288
297
  ### 显示其他会话结果
289
298
 
290
- 新建 `0.2.1` 任务不应出现。请记录受影响的 session/task id,并按会话隔离缺陷报告。
299
+ 新建 `0.3.0` 任务不应出现。请记录受影响的 session/task id,并按会话隔离缺陷报告。
291
300
 
292
301
  ### 媒体不能播放
293
302
 
package/lib/client.js CHANGED
@@ -800,6 +800,19 @@ var SettingsController = class extends ResourceController {
800
800
  load(signal) {
801
801
  return this.perform("load", () => this.#rpc.settings(signal));
802
802
  }
803
+ async refresh(signal) {
804
+ const previous = this.store.getSnapshot();
805
+ if (previous.data === null) return this.load(signal);
806
+ if (previous.pending !== null) return false;
807
+ try {
808
+ const data = await this.#rpc.settings(signal);
809
+ if (this.store.getSnapshot() !== previous) return false;
810
+ this.publishData(data);
811
+ return true;
812
+ } catch {
813
+ return false;
814
+ }
815
+ }
803
816
  saveOnboarding(apiKey, services, expectedCredentialEpoch, signal) {
804
817
  return this.perform("save-onboarding", () => this.#rpc.saveOnboarding(apiKey, services, expectedCredentialEpoch, signal));
805
818
  }
@@ -969,10 +982,14 @@ function useExternalDialogGate(requestedOpen, externalDialogOwner) {
969
982
  }
970
983
  /** Adds the focus behavior intentionally absent from the public Modal primitive. */
971
984
  function useDialogA11y(options) {
972
- const { open, container, externalDialogOwner, initialFocusSelector, mandatory, onEscape } = options;
985
+ const { open, requestedOpen = open, container, externalDialogOwner, initialFocusSelector, mandatory, onEscape } = options;
973
986
  const onEscapeRef = (0, react.useRef)(onEscape);
974
987
  const restoreTargetRef = (0, react.useRef)(null);
975
988
  onEscapeRef.current = onEscape;
989
+ (0, react.useEffect)(() => {
990
+ if (!requestedOpen || typeof document === "undefined") return;
991
+ restoreTargetRef.current ??= document.activeElement instanceof HTMLElement ? document.activeElement : null;
992
+ }, [requestedOpen]);
976
993
  (0, react.useEffect)(() => {
977
994
  if (!open || typeof document === "undefined") return;
978
995
  const activeBeforeOpen = document.activeElement instanceof HTMLElement ? document.activeElement : null;
@@ -1306,6 +1323,7 @@ function CredentialModal(props) {
1306
1323
  }, [clear, onCancel]);
1307
1324
  useDialogA11y({
1308
1325
  open: surfaceOpen,
1326
+ requestedOpen: open,
1309
1327
  container: contentRef,
1310
1328
  externalDialogOwner,
1311
1329
  initialFocusSelector: "[data-mdlx-initial-focus]",
@@ -1786,16 +1804,20 @@ function CredentialRecoveryOverlay({ controller, t }) {
1786
1804
  recoveryToken
1787
1805
  ]);
1788
1806
  (0, react.useEffect)(() => {
1789
- if (recoveryPresented) return;
1807
+ if (recoveryPresented || dialog.activeOwner !== null) return;
1790
1808
  const refresh = () => {
1791
1809
  const current = controller.store.getSnapshot();
1792
1810
  if (current.pending !== null || current.status === "loading") return;
1793
- controller.load();
1811
+ controller.refresh();
1794
1812
  };
1795
1813
  refresh();
1796
1814
  const timer = window.setInterval(refresh, RECOVERY_REFRESH_MS);
1797
1815
  return () => window.clearInterval(timer);
1798
- }, [controller, recoveryPresented]);
1816
+ }, [
1817
+ controller,
1818
+ dialog.activeOwner,
1819
+ recoveryPresented
1820
+ ]);
1799
1821
  (0, react.useEffect)(() => () => dialogCoordinator.release(RECOVERY_CREDENTIAL_DIALOG_OWNER), [dialogCoordinator]);
1800
1822
  const dismiss = (0, react.useCallback)(() => {
1801
1823
  dialogCoordinator.dismissCredential(RECOVERY_CREDENTIAL_DIALOG_OWNER);