dsh-codex-connect 0.1.0-alpha.4.43 → 0.1.0-alpha.4.45

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/INSTALL.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Installation Runbook for CLI Agents
2
2
 
3
- Published Alpha 4.41 is verified with DSH `0.1.2-rc.1` and pi-ai `0.84.4` within `^0.84.2`, and with each exact DSH `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` model-runtime pairing using pi-ai `0.85.1`.
3
+ Published Alpha 4.43 is verified with the exact DSH `0.1.7-rc.1` model-runtime pairing and pi-ai `0.85.1`. Earlier DSH pairings retain their separately published plugin versions below.
4
4
 
5
5
  Install `dsh-codex-connect` into one requested DeepSeek Harness profile without changing its current default model, search route, global configuration, or OAuth state.
6
6
 
7
- Channel snapshot on 2026-09-23: npm `alpha` points to `0.1.0-alpha.4.41`; `latest` remains on `0.1.0-alpha.4.40`. Use the exact-version commands below for 4.41. Publishing an Alpha and promoting the default installation channel are separate actions.
7
+ Channel snapshot on 2026-09-24: npm `alpha` points to `0.1.0-alpha.4.43`; `latest` remains on `0.1.0-alpha.4.41`. Use the exact-version command for the installed DSH version. Publishing an Alpha and promoting the default installation channel are separate actions.
8
8
 
9
9
  ## Safety requirements
10
10
 
@@ -30,10 +30,13 @@ Check `dsh --version` before changing the requested profile. Use `dsh --help` to
30
30
  | `0.1.5-alpha.1` | `0.1.0-alpha.4.41` |
31
31
  | `0.1.5-rc.1` | `0.1.0-alpha.4.41` |
32
32
  | `0.1.5-rc.2` | `0.1.0-alpha.4.41` |
33
+ | `0.1.7-rc.1` | `0.1.0-alpha.4.43` |
33
34
 
34
35
  If your exact DSH version is unknown or not listed, preserve the installed host, report that the combination is unverified, and verify it before making installation changes. A missing record does not prove incompatibility, and the catalog's latest verified DSH version is not the latest upstream release. Do not recommend upgrading or downgrading DSH merely to match a row. Investigate any specific failure and seek verification of the installed combination. Do not blindly install `dsh-codex-connect@alpha`: `alpha` is a moving tag, not a compatibility guarantee. Do not infer support for newer DSH versions from these rows.
35
36
 
36
- Alpha 4.41 requires one consistent DSH plugin API version: `0.1.2-rc.1` with `@earendil-works/pi-ai` `^0.84.2`, or one of `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` with pi-ai `0.85.1`; Node.js remains `^22.19.0 || >=24.0.0`. Mixed host versions and other DSH/pi-ai combinations remain unverified. Alpha 4.25 remains the verified choice for DSH `0.1.2-alpha.5`, Alpha 4.23 remains the verified choice for DSH `0.1.2-alpha.2`, Alpha 4.21 remains the verified choice for DSH `0.1.1-rc.2`, and staying on DSH `0.1.0-rc.7` means selecting Alpha 4.14. Changing DSH is a separate operation requiring the user's explicit request; a plugin update request does not authorize it. The repository's `pnpm --silent run check:compatibility` remains a strict development/release dependency gate, not a recommendation to change a user's host.
37
+ Alpha 4.43 requires one consistent DSH `0.1.7-rc.1` plugin API and pi-ai `0.85.1`; Node.js remains `^22.19.0 || >=24.0.0`. It does not support the older DSH rows. Alpha 4.41 remains the choice for DSH `0.1.2-rc.1` with pi-ai `^0.84.2`, or `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` with pi-ai `0.85.1`. Mixed host versions and other DSH/pi-ai combinations remain unverified. Alpha 4.25 remains the verified choice for DSH `0.1.2-alpha.5`, Alpha 4.23 for DSH `0.1.2-alpha.2`, Alpha 4.21 for DSH `0.1.1-rc.2`, and Alpha 4.14 for DSH `0.1.0-rc.7`. Changing DSH is a separate operation requiring the user's explicit request; a plugin update request does not authorize it. The repository's `pnpm --silent run check:compatibility` remains a strict development/release dependency gate, not a recommendation to change a user's host.
38
+
39
+ The Alpha 4.43 recommendation follows [exact-release main CI](https://github.com/franksong2702/dsh-codex-connect/actions/runs/35887810404) on Node 22/24, Chromium and Windows checks, plus the stock DSH `0.1.7-rc.1` same-artifact installation matrix. The [original publish run](https://github.com/franksong2702/dsh-codex-connect/actions/runs/35888766215) uploaded the verified npm package but timed out waiting for public registry readback; do not rerun publication. Once npm exposed the exact version and `alpha` tag, the [recovery-only run](https://github.com/franksong2702/dsh-codex-connect/actions/runs/35889959811) verified the archive against that original artifact and created the matching Git tag and prerelease without republishing. These checks used synthetic providers, not a real ChatGPT account. Stock rc.1 keeps Task controls paused; migration of old Task grants across a Harness upgrade remains unverified.
37
40
 
38
41
  The Alpha 4.41 recommendation follows successful [exact-release main CI](https://github.com/franksong2702/dsh-codex-connect/actions/runs/35817909046) on Node 22 and 24 (1,282 unit tests each), 52 Chromium tests, and a four-host same-artifact installation matrix. After npm processing completed, the [recovery verification](https://github.com/franksong2702/dsh-codex-connect/actions/runs/35819017165) matched the public npm archive byte-for-byte to the original verified release artifact, then created the matching Git tag and GitHub prerelease. The [original release run](https://github.com/franksong2702/dsh-codex-connect/actions/runs/35818489220) remains failed because npm's public readback was not available within its bounded retry period; do not rerun publication. These are synthetic-provider installation/lifecycle checks, not new real-account acceptance or a newly exercised published-package upgrade. Task-level model control remains opt-in; a new grant preselects only GPT-5.6 Sol / Medium and displays its scope and request limit before Start. Existing grants are not silently narrowed. Stock DSH 0.1.6-alpha.1 and alpha.2 remain undeclared; their separate compatibility trackers are not broadened by this release.
39
42
 
@@ -70,13 +73,19 @@ Alpha 4.33 omits the `modelErrors` profile field required by RC model packages,
70
73
  dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.41
71
74
  ```
72
75
 
76
+ For the exact DSH `0.1.7-rc.1` pairing, use Alpha 4.43:
77
+
78
+ ```sh
79
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.43
80
+ ```
81
+
73
82
  For DSH `0.1.2-alpha.5`, use Alpha 4.25:
74
83
 
75
84
  ```sh
76
85
  dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.25
77
86
  ```
78
87
 
79
- If npm is unavailable after the matching GitHub prerelease is created, use `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.21'` only for the DSH `0.1.1-rc.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.23'` only for the DSH `0.1.2-alpha.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.25'` only for the DSH `0.1.2-alpha.5` combination, or `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.41'` only for the DSH `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, or `0.1.5-rc.2` combinations.
88
+ If npm is unavailable after the matching GitHub prerelease is created, use `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.21'` only for the DSH `0.1.1-rc.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.23'` only for the DSH `0.1.2-alpha.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.25'` only for the DSH `0.1.2-alpha.5` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.41'` only for the DSH `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` combinations, or `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.43'` only for DSH `0.1.7-rc.1`.
80
89
 
81
90
  3. Run `dsh web --help` once to compose the installed profile without starting the server. DSH `0.1.2-rc.1` prepares profile plugin dependency fallback during this step.
82
91
  4. Run `dsh --profile web --dump-config` and require exactly one `llm-openai-codex` row loading `dsh-codex-connect`.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # git hash-object README.md docs/README.zh.md
5
- README.md: fa12308fc1124ec0edc183a088fcdff77323bc3a
6
- docs/README.zh.md: 9ec30155f320aae3d9ed33d091304624ff70943b
5
+ README.md: 1944b620eca818c50a7fa94e694706f0cd43f654
6
+ docs/README.zh.md: dec04b07db9a90fd2babd153073716d9d9b69409
package/README.md CHANGED
@@ -12,23 +12,23 @@ Codex Connect adds the `openai-codex` model provider to the normal Harness agent
12
12
 
13
13
  ## Quick start
14
14
 
15
- This guide describes the published pairings below. Check `dsh --version` first and use `doctor --json` to inspect the installed model-runtime packages: an rc.1 CLI can resolve rc.2 packages. For other versions, use [Installation and upgrades](INSTALL.md). A moving npm tag such as `alpha` is not a compatibility guarantee.
15
+ This guide describes the published pairing below. Check `dsh --version` first and use `doctor --json` for local diagnostics; the CLI version alone does not prove which model-runtime packages are installed, and missing metadata is reported as unknown. For other versions, use [Installation and upgrades](INSTALL.md). A moving npm tag such as `alpha` is not a compatibility guarantee.
16
16
 
17
17
  | Requirement | Verified pairing |
18
18
  |---|---|
19
- | Codex Connect | `0.1.0-alpha.4.41` |
20
- | DeepSeek Harness | `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, or `0.1.5-rc.2` |
19
+ | Codex Connect | `0.1.0-alpha.4.43` |
20
+ | DeepSeek Harness | `0.1.7-rc.1` |
21
21
  | Node.js | `^22.19.0 \|\| >=24.0.0` |
22
22
  | Account | ChatGPT OAuth with access to the requested Codex model; availability is decided by OpenAI |
23
23
 
24
- As of 2026-09-23, npm `alpha` points to 4.41 while `latest` remains on 4.40. Use the exact version below for 4.41; publishing an Alpha and changing the default installation channel are separate actions.
24
+ As of 2026-09-24, npm `alpha` points to 4.43 while `latest` remains on 4.41. Use the exact version below for this DSH pairing; publishing an Alpha and changing the default installation channel are separate actions.
25
25
 
26
- Task-level model choice remains off until enabled for a new conversation. In 4.41, a new grant preselects only GPT-5.6 Sol / Medium and shows the exact scope and request limit before Start. Existing task grants are preserved; take over manually and start a new task to choose a narrower scope.
26
+ On stock DSH `0.1.7-rc.1`, ordinary Composer works, but Task controls remain paused: activation is rejected and fresh Sessions do not show them. Migration of earlier Task grants across a Harness upgrade is not verified. Older supported pairings and their task behavior are documented in [Installation and upgrades](INSTALL.md).
27
27
 
28
28
  ### 1. Install
29
29
 
30
30
  ```sh
31
- dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.41
31
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.43
32
32
  dsh web
33
33
  ```
34
34
 
@@ -67,7 +67,7 @@ dsh plugin --profile web exec dsh-codex-connect doctor --json
67
67
 
68
68
  ## Optional capabilities
69
69
 
70
- **New in Alpha 4.40:** task-level model control is off by default. After explicit task authorization, GPT-5.6 Sol/Medium starts the task, and the active model may continue, change effort, or hand off the main task within the granted scope. The task shares one request ledger and budget; stopping, manual takeover, and restart recovery retain the grant boundary. Phase 2 read-only delegation requires separate consent and does not grant workers write access. These are opt-in task capabilities, not parallel Think/Split/Remember switches. See [Phase 1](docs/experiments/adaptive-task-phase1.md) and [Phase 2 consent](docs/experiments/adaptive-task-phase2-consent.md).
70
+ **Earlier Alpha 4.40/4.41 pairings:** task-level model control is off by default. After explicit task authorization, GPT-5.6 Sol/Medium starts the task, and the active model may continue, change effort, or hand off the main task within the granted scope. The task shares one request ledger and budget; stopping, manual takeover, and restart recovery retain the grant boundary. Phase 2 read-only delegation requires separate consent and does not grant workers write access. Stock DSH `0.1.7-rc.1` with Alpha 4.43 keeps these Task controls paused; do not infer they are available from an older pairing. See [Phase 1](docs/experiments/adaptive-task-phase1.md) and [Phase 2 consent](docs/experiments/adaptive-task-phase2-consent.md).
71
71
 
72
72
  Alpha 4.40 also supplies `gpt-6-sol` and `gpt-6-luna` when older provider catalogs omit them, retaining native metadata when present. Both expose Low through Max (including Xhigh); Default omits an explicit effort. Codex Sol's Ultra orchestration mode is not implemented. New task grants can explicitly include these models, but existing grants, GPT-5.6 Sol/Medium startup and Luna Reserve remain unchanged. A catalog entry is not proof of account access. See [compatibility scope and validation](docs/experiments/gpt6-sol-luna-compatibility.md).
73
73
 
@@ -86,7 +86,7 @@ All options below are off on a fresh installation. Edit them in **Settings → P
86
86
 
87
87
  With `enableReserveFallback: true`, the account UI and agent routing share one identity-bound quota state. Background refresh follows the returned quota windows while recently in use; fresh state is reused across agent steps. Ordinary quota reads also share the cache, even with Reserve disabled. The plugin enters `gpt-reserve` only with complete, non-FedRAMP account/user identity and backend Luna Reserve authorization, then restores the session's previous model and reasoning effort after confirmed ordinary-usage recovery. Reserve has its own allowance, is hidden from the model picker, and is not unlimited. The backend decides eligibility; reset times alone do not authorize a switch. This version supports known `gpt-5.6-luna` metadata only. See [Luna Reserve fallback](docs/reference.md#luna-reserve-fallback) for refresh, identity, and verification limits.
88
88
 
89
- Use the image generation capability included with your current GPT subscription. Generated originals are stored separately from attachment previews; disabling the capability or uninstalling the plugin does not delete them. See [Configuration and recovery](docs/reference.md#search-and-image-tools) for storage and access rules.
89
+ Use the image generation capability included with your current GPT subscription. Successful images appear below the conversation answer without opening its processing details; the original tool card remains available there. Generated originals are stored separately from attachment previews; disabling the capability or uninstalling the plugin does not delete them. See [Configuration and recovery](docs/reference.md#search-and-image-tools) for storage and access rules.
90
90
 
91
91
  Auto-review operates after Harness policy requires approval; it does not bypass that policy. See [Auto-review behavior](docs/auto-review.md) before enabling it.
92
92
 
package/docs/README.zh.md CHANGED
@@ -12,23 +12,23 @@ Codex Connect 为标准 Harness agent loop 添加 `openai-codex` 模型提供方
12
12
 
13
13
  ## 快速开始
14
14
 
15
- 本指南介绍下方已发布的组合。请先运行 `dsh --version`,并用 `doctor --json` 检查实际安装的模型运行库:rc.1 CLI 可能解析到 rc.2 包。其他版本请查阅[安装与升级](../INSTALL.md)。`alpha` 等会移动的 npm tag 不代表兼容性保证。
15
+ 本指南介绍下方已发布的组合。请先运行 `dsh --version`,再用 `doctor --json` 做本地诊断;单凭 CLI 版本无法证明实际安装的模型运行库版本,缺少版本元数据时会报告未知。其他版本请查阅[安装与升级](../INSTALL.md)。`alpha` 等会移动的 npm tag 不代表兼容性保证。
16
16
 
17
17
  | 要求 | 已验证组合 |
18
18
  |---|---|
19
- | Codex Connect | `0.1.0-alpha.4.41` |
20
- | DeepSeek Harness | `0.1.2-rc.1`、`0.1.5-alpha.1`、`0.1.5-rc.1` 或 `0.1.5-rc.2` |
19
+ | Codex Connect | `0.1.0-alpha.4.43` |
20
+ | DeepSeek Harness | `0.1.7-rc.1` |
21
21
  | Node.js | `^22.19.0 \|\| >=24.0.0` |
22
22
  | 账户 | 通过 ChatGPT OAuth 使用所请求的 Codex 模型;可用性由 OpenAI 决定 |
23
23
 
24
- 截至 2026-09-23,npm `alpha` 指向 4.41,`latest` 仍指向 4.40。安装 4.41 请使用下方精确版本命令;发布 Alpha 与提升默认安装渠道是两项独立操作。
24
+ 截至 2026-09-24,npm `alpha` 指向 4.43,`latest` 仍指向 4.41。安装此 DSH 组合请使用下方精确版本命令;发布 Alpha 与提升默认安装渠道是两项独立操作。
25
25
 
26
- 任务级模型选择仍需在新会话中主动开启。4.41 的新授权默认只选择 GPT-5.6 Sol / Medium,开始前会显示准确的模型范围和请求上限。已有任务授权不会被自动收窄;如需改用较窄范围,请先切回手动,再在新任务中选择。
26
+ 在原版 DSH `0.1.7-rc.1` 上,普通 Composer 可用,但 Task 控件仍暂停:激活请求会被拒绝,新 Session 不显示这些控件。跨 Harness 升级迁移旧任务授权尚未验证。较旧组合及其任务行为见[安装与升级](../INSTALL.md)。
27
27
 
28
28
  ### 1. 安装
29
29
 
30
30
  ```sh
31
- dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.41
31
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.43
32
32
  dsh web
33
33
  ```
34
34
 
@@ -67,7 +67,7 @@ dsh plugin --profile web exec dsh-codex-connect doctor --json
67
67
 
68
68
  ## 可选能力
69
69
 
70
- **Alpha 4.40 新增:**任务级模型安排默认关闭。用户明确授予任务权限后,由 GPT-5.6 Sol/Medium 起步;当前模型可以在授权范围内继续、调档或交接主任务。请求共用同一任务账本与预算;停止、手动接管和重启恢复都保留授权边界。Phase 2 的只读委派需要单独同意,不会给委派工作者写入权限。它们是按任务开启的能力,不是并列的 Think/Split/Remember 开关。参见 [Phase 1](experiments/adaptive-task-phase1.md) 与 [Phase 2 同意边界](experiments/adaptive-task-phase2-consent.md)。
70
+ **较早的 Alpha 4.40/4.41 组合:**任务级模型安排默认关闭。用户明确授予任务权限后,由 GPT-5.6 Sol/Medium 起步;当前模型可以在授权范围内继续、调档或交接主任务。请求共用同一任务账本与预算;停止、手动接管和重启恢复都保留授权边界。Phase 2 的只读委派需要单独同意,不会给委派工作者写入权限。原版 DSH `0.1.7-rc.1` 配合 Alpha 4.43 时,这些 Task 控件仍暂停;不能从旧组合推断它们可用。参见 [Phase 1](experiments/adaptive-task-phase1.md) 与 [Phase 2 同意边界](experiments/adaptive-task-phase2-consent.md)。
71
71
 
72
72
  Alpha 4.40 还会在旧提供方目录缺失时补充 `gpt-6-sol` 和 `gpt-6-luna`,已有原生定义时保留其元数据。两者提供 Low 到 Max(含 Xhigh),Default 不指定推理档位;尚未实现 Codex Sol 的 Ultra 编排模式。新任务可明确授权使用它们,但已有授权、GPT-5.6 Sol/Medium 起步与 Luna Reserve 不变。模型出现在目录中不代表账户具有调用资格。参见[兼容范围与验证](experiments/gpt6-sol-luna-compatibility.md)。
73
73
 
@@ -86,7 +86,7 @@ Alpha 4.40 还会在旧提供方目录缺失时补充 `gpt-6-sol` 和 `gpt-6-lun
86
86
 
87
87
  启用 `enableReserveFallback: true` 后,账户 UI 和 agent 路由共用一份绑定身份的额度状态,最近有使用需求时按服务端返回的额度窗口后台刷新;有效状态可跨 agent step 复用。普通额度读取也共用缓存,即使 Reserve 已关闭。只有身份完整、非 FedRAMP 且服务端授权时,插件才进入 `gpt-reserve`;普通额度确认恢复后,切回该会话先前的模型和推理强度。Reserve 有自己的额度,不出现在模型选择器中,也不是无限额度。资格由服务端决定,重置时间本身不授权切换。当前版本只支持已知的 `gpt-5.6-luna` 元数据。刷新、身份和验证限制见 [Luna Reserve 回退](reference.zh.md#luna-reserve-回退)。
88
88
 
89
- 使用你当前 GPT 订阅计划提供的图片生成能力。生成原文件与附件预览分开保存;关闭能力或卸载插件不会删除这些文件。存储和访问规则见[配置与恢复](reference.zh.md#搜索与图片工具)。
89
+ 使用你当前 GPT 订阅计划提供的图片生成能力。成功生成的图片会显示在对话回复下方,无需展开处理过程;原工具卡片仍保留在处理过程里。生成原文件与附件预览分开保存;关闭能力或卸载插件不会删除这些文件。存储和访问规则见[配置与恢复](reference.zh.md#搜索与图片工具)。
90
90
 
91
91
  自动审查在 Harness 策略判定需要审批后执行,不会绕过该策略。启用前请阅读[自动审查行为](auto-review.zh.md)。
92
92
 
@@ -0,0 +1,7 @@
1
+ # Image results in the answer
2
+
3
+ DSH 0.1.7-rc.1 groups Tool calls inside a completed Turn's collapsed processing disclosure. Codex Connect rendered generated images only through its keyed Tool view, so a successful image could remain invisible until the reader expanded that disclosure. The final Assistant message contains text rather than a second image block; the image bytes and preview reference were not missing.
4
+
5
+ The browser plugin now adds a `conversation.chat.turnTail` entry. That Host-owned location is independent of the processing disclosure. It observes only the current Turn's Tool rows, including nested PTC results and result-only history windows, and reuses the same validated image presentation and complete result card. The original Tool view remains in processing details. The plugin does not write a duplicate Assistant message or copy image bytes into the Session log.
6
+
7
+ The regression test first failed because the completed Turn had no visible gallery. It now checks direct and nested successful results, filtering of failed and unrelated calls, closing-sequence exclusion, and the visible gallery with no expanded processing state. A headless Chromium check confirms the image and download action are visible outside any hidden processing content. Acceptance on an isolated live DSH instance remains separate from these synthetic tests.
package/docs/design.md CHANGED
@@ -40,6 +40,8 @@ When `enableImageTool: true`, `view_image` is registered only after tools, files
40
40
 
41
41
  Each remote-image redirect hop has one 30-second deadline covering DNS, connection, and body consumption. Cancellation settles the caller's wait immediately; an operating-system DNS lookup may still finish later, but its result cannot start a new HTTP request after cancellation or timeout.
42
42
 
43
+ Successful Codex image-generation Tool results also render in the independent completed-Turn tail. DSH groups Tool calls into a collapsed processing disclosure, so the keyed Tool card alone cannot make generated images visible with the answer. The tail reads only this Turn's settled Tool rows, including nested PTC calls and restored history, and uses the same validated result metadata, session-bound preview loader, Lightbox, and download controls as the Tool card. Failed, malformed, unrelated, or post-answer results do not enter the visible image row. The Tool card remains available in processing details.
44
+
43
45
  ## Conflicts and diagnostics
44
46
 
45
47
  Before registration the plugin checks current provider ids. An existing `openai-codex` adapter produces a focused message naming the likely legacy-bundle or manual-provider cause. The boot-free CLI `doctor` reports package/runtime version, OAuth path metadata, capability defaults, and safe conflict guidance without returning auth content.
@@ -0,0 +1,21 @@
1
+ # Codex Connect Alpha 4.45 — generated images visible in answers
2
+
3
+ ## English
4
+
5
+ Generated images now appear below a completed answer without opening the collapsed processing details. The existing Tool result remains available inside those details, including its original-image download and follow-up controls. The answer view uses the same validated image result and attachment access; it does not generate a second image, alter the provider request, or duplicate image bytes in the Session log.
6
+
7
+ This release targets DeepSeek Harness `0.1.7-rc.1`. The fix passed local unit and Chromium tests, and the reporter confirmed the visible result on an isolated 3081 instance. That review did not send a new image-generation request or validate other DSH versions. Preparing this package does not upgrade existing installations; publication and the npm `latest` promotion are separately verified steps.
8
+
9
+ After npm publication is confirmed, install the exact version with:
10
+
11
+ ```sh
12
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.45
13
+ ```
14
+
15
+ ## 中文
16
+
17
+ 生成的图片现在会显示在已完成回复的下方,不必展开折叠的“处理过程”。原有 Tool 结果仍保留在处理详情中,包括原图下载和后续操作。回复区域复用同一份已验证的图片结果与附件访问,不会再次生图、改变 Provider 请求,也不会在 Session 日志中复制图片数据。
18
+
19
+ 本版针对 DeepSeek Harness `0.1.7-rc.1`。修复已通过本地单元测试和 Chromium 测试,并由报告者在隔离的 3081 实例上确认图片可见。该次验收没有发起新的真实生图请求,也不代表验证了其他 DSH 版本。准备安装包不会升级现有实例;发布和 npm `latest` 提升分别核验。
20
+
21
+ 确认 npm 发布后,可使用上面的精确版本命令安装。
package/lib/bin.js CHANGED
@@ -765,7 +765,7 @@ async function detectCompatibility(options = {}) {
765
765
  }
766
766
  //#endregion
767
767
  //#region src/version.ts
768
- const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.43";
768
+ const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.45";
769
769
  //#endregion
770
770
  //#region src/doctor.ts
771
771
  /** Secret-free diagnostics and duplicate-provider guidance. */
package/lib/client.js CHANGED
@@ -52,6 +52,18 @@ window.__ModuleLoader__.load({
52
52
  if (entries.length > 256) return false;
53
53
  return entries.every(([modelId, window]) => modelId.length > 0 && modelId.trim() === modelId && (window === null || typeof window === "number" && Number.isSafeInteger(window) && window > 0));
54
54
  }
55
+ /** Preserve per-model null masks until the Host has merged its settings layers. */
56
+ function parseOpenAICodexContextWindowOverrides(value) {
57
+ if (value === void 0 || value === null) return void 0;
58
+ if (!isValidOpenAICodexContextWindowOverrides(value)) throw new TypeError("OpenAI Codex contextWindowOverrides must contain at most 256 nonempty model ids with positive safe-integer token budgets or null resets");
59
+ return { ...value };
60
+ }
61
+ /** Resolve merged settings; whole-map or per-model null masks use catalog defaults. */
62
+ function resolveOpenAICodexContextWindowOverrides(value) {
63
+ const overrides = parseOpenAICodexContextWindowOverrides(value);
64
+ if (overrides === void 0) return void 0;
65
+ return Object.fromEntries(Object.entries(overrides).filter((entry) => entry[1] !== null));
66
+ }
55
67
  Object.freeze({
56
68
  models: void 0,
57
69
  enableProxy: false,
@@ -73,6 +85,60 @@ window.__ModuleLoader__.load({
73
85
  function isRecord$3(value) {
74
86
  return typeof value === "object" && value !== null && !Array.isArray(value);
75
87
  }
88
+ /** Narrow the redacted settings wire payload before it enters React state. */
89
+ function decodeOpenAICodexSettings(value) {
90
+ if (!isRecord$3(value)) return void 0;
91
+ const models = value["models"];
92
+ const enableProxy = value["enableProxy"];
93
+ const proxyUrl = value["proxyUrl"];
94
+ const contextWindowOverrides = value["contextWindowOverrides"];
95
+ const enableSearch = value["enableSearch"];
96
+ const enableReserveFallback = value["enableReserveFallback"];
97
+ const enableNativeCompaction = value["enableNativeCompaction"];
98
+ const enableImageTool = value["enableImageTool"];
99
+ const enableImageGeneration = value["enableImageGeneration"];
100
+ const imageModelHint = value["imageModelHint"];
101
+ const autoReviewDisclosureAcknowledged = value["autoReviewDisclosureAcknowledged"];
102
+ const enableAutoReview = value["enableAutoReview"];
103
+ const searchModel = value["searchModel"];
104
+ const searchMode = value["searchMode"];
105
+ const searchContextSize = value["searchContextSize"];
106
+ const searchMaxOutputTokens = value["searchMaxOutputTokens"];
107
+ if (models !== void 0 && (!Array.isArray(models) || models.some((model) => typeof model !== "string"))) return void 0;
108
+ if (enableProxy !== void 0 && typeof enableProxy !== "boolean") return void 0;
109
+ if (proxyUrl !== void 0 && (typeof proxyUrl !== "string" || !isValidOpenAICodexProxyUrl(proxyUrl))) return void 0;
110
+ if (contextWindowOverrides !== void 0 && contextWindowOverrides !== null && !isValidOpenAICodexContextWindowOverrides(contextWindowOverrides)) return void 0;
111
+ if (typeof enableSearch !== "boolean" || typeof enableImageTool !== "boolean") return void 0;
112
+ if (enableReserveFallback !== void 0 && typeof enableReserveFallback !== "boolean") return void 0;
113
+ if (enableNativeCompaction !== void 0 && typeof enableNativeCompaction !== "boolean") return void 0;
114
+ if (enableImageGeneration !== void 0 && typeof enableImageGeneration !== "boolean") return void 0;
115
+ if (imageModelHint !== void 0 && !isValidOpenAICodexImageModelHint(imageModelHint)) return void 0;
116
+ if (autoReviewDisclosureAcknowledged !== void 0 && typeof autoReviewDisclosureAcknowledged !== "boolean") return void 0;
117
+ if (enableAutoReview !== void 0 && typeof enableAutoReview !== "boolean") return void 0;
118
+ if (typeof searchModel !== "string" || searchModel.trim().length === 0) return void 0;
119
+ if (searchMode !== "cached" && searchMode !== "indexed" && searchMode !== "live") return void 0;
120
+ if (searchContextSize !== "low" && searchContextSize !== "medium" && searchContextSize !== "high") return void 0;
121
+ if (typeof searchMaxOutputTokens !== "number" || !Number.isInteger(searchMaxOutputTokens) || searchMaxOutputTokens < 1) return void 0;
122
+ const overrides = resolveOpenAICodexContextWindowOverrides(contextWindowOverrides);
123
+ return {
124
+ models: models === void 0 ? void 0 : [...new Set(models)],
125
+ enableProxy: enableProxy ?? false,
126
+ proxyUrl: proxyUrl === void 0 ? DEFAULT_OPENAI_CODEX_PROXY_URL : normalizeOpenAICodexProxyUrl(proxyUrl),
127
+ contextWindowOverrides: overrides === void 0 ? void 0 : Object.freeze(overrides),
128
+ enableSearch,
129
+ enableReserveFallback: enableReserveFallback ?? false,
130
+ enableNativeCompaction: enableNativeCompaction ?? false,
131
+ enableImageTool,
132
+ enableImageGeneration: enableImageGeneration ?? false,
133
+ imageModelHint: imageModelHint ?? "",
134
+ autoReviewDisclosureAcknowledged: autoReviewDisclosureAcknowledged ?? false,
135
+ enableAutoReview: enableAutoReview ?? false,
136
+ searchModel,
137
+ searchMode,
138
+ searchContextSize,
139
+ searchMaxOutputTokens
140
+ };
141
+ }
76
142
  //#endregion
77
143
  //#region src/client/request-json.ts
78
144
  /** Bounded same-origin JSON reads, including response-body consumption. */
@@ -5310,6 +5376,35 @@ window.__ModuleLoader__.load({
5310
5376
  };
5311
5377
  }
5312
5378
  //#endregion
5379
+ //#region src/client/image-result-presentation.ts
5380
+ const IMAGE_TOOL = "codex_connect_image_generate";
5381
+ function promptFromArgs(raw) {
5382
+ try {
5383
+ const value = JSON.parse(raw);
5384
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
5385
+ const prompt = value.prompt;
5386
+ if (typeof prompt !== "string") return void 0;
5387
+ const trimmed = prompt.trim();
5388
+ return trimmed.length > 0 && trimmed.length <= 32e3 ? trimmed : void 0;
5389
+ } catch {
5390
+ return;
5391
+ }
5392
+ }
5393
+ /** Return the bounded prompt that belongs to this image Tool row. */
5394
+ function promptForImageToolBlock(block) {
5395
+ if (!("kind" in block)) return block.phase === "start" ? promptFromArgs(block.argsRaw) : void 0;
5396
+ const decoded = decodeImagePresentationMeta(block.meta);
5397
+ if (decoded !== void 0) return decoded.prompt;
5398
+ return block.call === null ? void 0 : promptFromArgs(block.call.argsRaw);
5399
+ }
5400
+ /** Only a successful image Tool result can enter the visible answer gallery. */
5401
+ function imagePresentationForResult(block) {
5402
+ if (block.isError || block.call !== null && block.call.name !== IMAGE_TOOL) return void 0;
5403
+ if (block.meta !== void 0) return decodeImagePresentationMeta(block.meta);
5404
+ const prompt = promptForImageToolBlock(block);
5405
+ return prompt === void 0 ? void 0 : decodeImageResultContent(block.content, prompt);
5406
+ }
5407
+ //#endregion
5313
5408
  //#region src/client/CodexImageGallery.tsx
5314
5409
  /** Self-contained result-image gallery for the tool-call view.
5315
5410
  *
@@ -5821,30 +5916,6 @@ window.__ModuleLoader__.load({
5821
5916
  function contentText(content) {
5822
5917
  for (const block of content) if (typeof block === "object" && block !== null && block.type === "text" && typeof block.text === "string") return block.text;
5823
5918
  }
5824
- function presentation(block) {
5825
- if (!("kind" in block) || block.kind !== "tool-result" || block.isError) return void 0;
5826
- if (block.meta !== void 0) return decodeImagePresentationMeta(block.meta);
5827
- const prompt = promptFor(block);
5828
- return prompt === void 0 ? void 0 : decodeImageResultContent(block.content, prompt);
5829
- }
5830
- function promptFromArgs(raw) {
5831
- try {
5832
- const value = JSON.parse(raw);
5833
- if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
5834
- const prompt = value.prompt;
5835
- if (typeof prompt !== "string") return void 0;
5836
- const trimmed = prompt.trim();
5837
- return trimmed.length > 0 && trimmed.length <= 32e3 ? trimmed : void 0;
5838
- } catch {
5839
- return;
5840
- }
5841
- }
5842
- function promptFor(block) {
5843
- if (!("kind" in block)) return promptFromArgs(block.argsRaw);
5844
- const decoded = decodeImagePresentationMeta(block.meta);
5845
- if (decoded !== void 0) return decoded.prompt;
5846
- return block.call === null ? void 0 : promptFromArgs(block.call.argsRaw);
5847
- }
5848
5919
  function useSessionActions(sessionId, sessions) {
5849
5920
  const [pending, setPending] = (0, react.useState)(null);
5850
5921
  const [failed, setFailed] = (0, react.useState)(false);
@@ -6180,8 +6251,8 @@ window.__ModuleLoader__.load({
6180
6251
  const load = useImageLoader(sessionId, sessions);
6181
6252
  const sessionActions = useSessionActions(sessionId, sessions);
6182
6253
  const galleryLabels = (0, react.useMemo)(() => labels(t), [t]);
6183
- const prompt = promptFor(block);
6184
- const decoded = (0, react.useMemo)(() => presentation(block), [block]);
6254
+ const prompt = promptForImageToolBlock(block);
6255
+ const decoded = (0, react.useMemo)(() => "kind" in block ? imagePresentationForResult(block) : void 0, [block]);
6185
6256
  if (!("kind" in block)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ResponsiveCard, {
6186
6257
  label: t("generating"),
6187
6258
  visual: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -6273,6 +6344,32 @@ window.__ModuleLoader__.load({
6273
6344
  children: t("unknownResult")
6274
6345
  })]
6275
6346
  });
6347
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ImageResultCard, {
6348
+ decoded,
6349
+ sessionId,
6350
+ load,
6351
+ sessionActions,
6352
+ galleryLabels,
6353
+ t
6354
+ });
6355
+ }
6356
+ /** Render the same complete result controls in the independent answer tail. */
6357
+ function CodexImageTurnResult({ block, sessionId, sessions, t }) {
6358
+ const load = useImageLoader(sessionId, sessions);
6359
+ const sessionActions = useSessionActions(sessionId, sessions);
6360
+ const galleryLabels = (0, react.useMemo)(() => labels(t), [t]);
6361
+ const decoded = (0, react.useMemo)(() => imagePresentationForResult(block), [block]);
6362
+ if (decoded === void 0) return null;
6363
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ImageResultCard, {
6364
+ decoded,
6365
+ sessionId,
6366
+ load,
6367
+ sessionActions,
6368
+ galleryLabels,
6369
+ t
6370
+ });
6371
+ }
6372
+ function ImageResultCard({ decoded, sessionId, load, sessionActions, galleryLabels, t }) {
6276
6373
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ResponsiveCard, {
6277
6374
  label: t("completed"),
6278
6375
  visual: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -6383,8 +6480,53 @@ window.__ModuleLoader__.load({
6383
6480
  });
6384
6481
  }
6385
6482
  //#endregion
6483
+ //#region src/client/CodexImageTurnTail.tsx
6484
+ /** Visible generated-image results after a completed conversation turn. */
6485
+ const resultStack = {
6486
+ display: "grid",
6487
+ gap: 12,
6488
+ minWidth: 0
6489
+ };
6490
+ /** Keep successful image results from this turn, including nested PTC calls. */
6491
+ function selectTurnImageResults(rows, closingSeq) {
6492
+ const images = [];
6493
+ for (const row of rows) {
6494
+ const pending = [row.root];
6495
+ const visited = /* @__PURE__ */ new Set();
6496
+ while (pending.length > 0) {
6497
+ const block = pending.pop();
6498
+ if (block === void 0 || visited.has(block.callId)) continue;
6499
+ visited.add(block.callId);
6500
+ if ("kind" in block && block.seq <= closingSeq && imagePresentationForResult(block) !== void 0) images.push(block);
6501
+ for (let index = block.subCalls.length - 1; index >= 0; index--) {
6502
+ const child = block.subCalls[index];
6503
+ if (child !== void 0) pending.push(child);
6504
+ }
6505
+ }
6506
+ }
6507
+ return images.sort((left, right) => left.seq - right.seq);
6508
+ }
6509
+ /** Put generated images in the independent answer tail, outside Turn-process disclosure. */
6510
+ function CodexImageTurnTail({ turn, seq, sessionId, useChat, sessions, t }) {
6511
+ const source = useChat((chat) => chat.nodes.turnDataSource(turn.turn, "tool-call"));
6512
+ const rows = (0, react.useSyncExternalStore)(source.subscribe, source.getSnapshot, source.getSnapshot);
6513
+ const results = (0, react.useMemo)(() => selectTurnImageResults(rows, seq), [rows, seq]);
6514
+ if (results.length === 0) return null;
6515
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
6516
+ "data-turn-image-results": "",
6517
+ "aria-label": t("completed"),
6518
+ style: resultStack,
6519
+ children: results.map((block) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CodexImageTurnResult, {
6520
+ block,
6521
+ sessionId,
6522
+ sessions,
6523
+ t
6524
+ }, block.callId))
6525
+ });
6526
+ }
6527
+ //#endregion
6386
6528
  //#region src/version.ts
6387
- const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.43";
6529
+ const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.45";
6388
6530
  //#endregion
6389
6531
  //#region src/client/OpenAICodexModelsCard.tsx
6390
6532
  /** Compact Models account entry with quota disclosure and shared configuration. */
@@ -6910,6 +7052,73 @@ window.__ModuleLoader__.load({
6910
7052
  }) : null] });
6911
7053
  }
6912
7054
  //#endregion
7055
+ //#region src/client/config-form.ts
7056
+ /**
7057
+ * The Host form validates its serialized schema in the browser. Codex Connect's
7058
+ * Host-only schema transforms cannot be rehydrated there, so read the same
7059
+ * accepted Host view through this package's browser-safe decoder. Writes still
7060
+ * use the Host form's ordered queue and revision checks.
7061
+ */
7062
+ var OpenAICodexConfigForm = class {
7063
+ form;
7064
+ mirror;
7065
+ formSnapshot;
7066
+ mirrorSnapshot;
7067
+ projected;
7068
+ constructor(form, mirror) {
7069
+ this.form = form;
7070
+ this.mirror = mirror;
7071
+ }
7072
+ getSnapshot() {
7073
+ const form = this.form.getSnapshot();
7074
+ const mirror = this.mirror.getSnapshot();
7075
+ if (form === this.formSnapshot && mirror === this.mirrorSnapshot && this.projected !== void 0) return this.projected;
7076
+ this.formSnapshot = form;
7077
+ this.mirrorSnapshot = mirror;
7078
+ if (form.status !== "loading") return this.projected = form;
7079
+ if (mirror.view === void 0) return this.projected = mirror.status === "unavailable" ? {
7080
+ ...form,
7081
+ status: "unavailable"
7082
+ } : form;
7083
+ const view = mirror.view.namespaces.find((candidate) => candidate.ns === OPENAI_CODEX_SETTINGS_NAMESPACE);
7084
+ if (view === void 0) return this.projected = {
7085
+ ...form,
7086
+ status: "unavailable"
7087
+ };
7088
+ const value = decodeOpenAICodexSettings(view.value);
7089
+ this.projected = value === void 0 ? {
7090
+ ...form,
7091
+ status: "unavailable"
7092
+ } : {
7093
+ status: "ready",
7094
+ value,
7095
+ base: view.base,
7096
+ user: view.user,
7097
+ revision: view.revision,
7098
+ writable: mirror.view.writable,
7099
+ mode: form.mode
7100
+ };
7101
+ return this.projected;
7102
+ }
7103
+ subscribe(listener) {
7104
+ const stopForm = this.form.subscribe(listener);
7105
+ const stopMirror = this.mirror.subscribe(listener);
7106
+ return () => {
7107
+ stopForm();
7108
+ stopMirror();
7109
+ };
7110
+ }
7111
+ mutate(ops, expectedRevision) {
7112
+ return this.form.mutate(ops, expectedRevision);
7113
+ }
7114
+ set(field, value) {
7115
+ return this.form.set(field, value);
7116
+ }
7117
+ unset(field) {
7118
+ return this.form.unset(field);
7119
+ }
7120
+ };
7121
+ //#endregion
6913
7122
  //#region src/client/index.tsx
6914
7123
  /** Stable browser-plugin name. */
6915
7124
  const name = "dsh-codex-connect-client";
@@ -6942,8 +7151,8 @@ window.__ModuleLoader__.load({
6942
7151
  en
6943
7152
  }), "dsh-codex-connect: settings copy");
6944
7153
  const t = ctx.locale.bind(namespace);
7154
+ const configScope = new OpenAICodexConfigForm(ctx.configForms.get(OPENAI_CODEX_SETTINGS_NAMESPACE), ctx.configForms.describe());
6945
7155
  ctx.effect(() => ctx.configForms.whileServed([OPENAI_CODEX_SETTINGS_NAMESPACE], () => {
6946
- const configScope = ctx.configForms.get(OPENAI_CODEX_SETTINGS_NAMESPACE);
6947
7156
  return ctx.slots.register({
6948
7157
  name: "settings.plugins.tab",
6949
7158
  id: "codex-connect",
@@ -6965,7 +7174,7 @@ window.__ModuleLoader__.load({
6965
7174
  inject: () => ({
6966
7175
  t,
6967
7176
  account,
6968
- configScope: ctx.configForms.get(OPENAI_CODEX_SETTINGS_NAMESPACE)
7177
+ configScope
6969
7178
  })
6970
7179
  }, OpenAICodexModelsCard));
6971
7180
  ctx.slots.inject("shell.overlay", () => ctx.slots.register({
@@ -6987,6 +7196,13 @@ window.__ModuleLoader__.load({
6987
7196
  locale: namespace,
6988
7197
  inject: () => ({ sessions: ctx.sessions })
6989
7198
  }, CodexImageToolView));
7199
+ ctx.slots.inject("conversation.chat.turnTail", () => ctx.slots.register({
7200
+ name: "conversation.chat.turnTail",
7201
+ id: "codex-connect-generated-images",
7202
+ order: 20,
7203
+ locale: namespace,
7204
+ inject: () => ({ sessions: ctx.sessions })
7205
+ }, CodexImageTurnTail));
6990
7206
  ctx.inject(["slots", "modelDirectories"], (scope) => {
6991
7207
  scope.slots.inject("conversation.input.right", () => scope.slots.register({
6992
7208
  name: "conversation.input.right",
package/lib/index.js CHANGED
@@ -5294,7 +5294,7 @@ function registerOpenAICodexOriginalImageRoute(ctx, trustedOrigins, assets) {
5294
5294
  }
5295
5295
  //#endregion
5296
5296
  //#region src/version.ts
5297
- const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.43";
5297
+ const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.45";
5298
5298
  //#endregion
5299
5299
  //#region src/doctor.ts
5300
5300
  /** Secret-free diagnostics and duplicate-provider guidance. */
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "dsh-codex-connect",
3
3
  "displayName": "Codex Connect",
4
4
  "description": "ChatGPT OAuth and Codex models for DeepSeek Harness.",
5
- "version": "0.1.0-alpha.4.43",
5
+ "version": "0.1.0-alpha.4.45",
6
6
  "author": "Frank Song",
7
7
  "contributors": [
8
8
  "Yan-Zero (original dsh-codex author)"
@@ -97,6 +97,7 @@
97
97
  "@deepseek-ai/dsh-api-session-controller",
98
98
  "@deepseek-ai/dsh-client-ui-layout",
99
99
  "@deepseek-ai/dsh-client-ui-conversation",
100
+ "@deepseek-ai/dsh-client-ui-chat",
100
101
  "@deepseek-ai/dsh-client-ui-model-selection",
101
102
  "@deepseek-ai/dsh-client-ui-settings",
102
103
  "@deepseek-ai/dsh-client-ui-settings-plugins",
@@ -111,6 +112,7 @@
111
112
  "@deepseek-ai/dsh-agent": "0.1.7-rc.1",
112
113
  "@deepseek-ai/dsh-atomic-write": "0.1.7-rc.1",
113
114
  "@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
115
+ "@deepseek-ai/dsh-client-ui-chat": "0.1.7-rc.1",
114
116
  "@deepseek-ai/dsh-client-ui-layout": "0.1.7-rc.1",
115
117
  "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.1",
116
118
  "@deepseek-ai/dsh-client-ui-tool": "0.1.7-rc.1",
@@ -153,6 +155,7 @@
153
155
  "@deepseek-ai/dsh-client-connection": "0.1.7-rc.1",
154
156
  "@deepseek-ai/dsh-client-locale": "0.1.7-rc.1",
155
157
  "@deepseek-ai/dsh-client-store": "0.1.7-rc.1",
158
+ "@deepseek-ai/dsh-client-ui-chat": "0.1.7-rc.1",
156
159
  "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-rc.1",
157
160
  "@deepseek-ai/dsh-client-ui-layout": "0.1.7-rc.1",
158
161
  "@deepseek-ai/dsh-client-ui-model-selection": "0.1.7-rc.1",