diff --git a/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.i18n.yaml b/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.i18n.yaml
index 345eec989b..5d8a536a53 100644
--- a/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.i18n.yaml
+++ b/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.i18n.yaml
@@ -9,8 +9,8 @@
en: 2ba6c43b20a3d347
zh: 5647179ddaa38ad9
/agent-note-ship-experimental-capabilities-as-optional-bundles/decision:
- en: 6566c6fb7287d748
- zh: fe41c0a9da97f340
+ en: d6328ba2b218f2ac
+ zh: 3731561313b1ad5e
/agent-note-ship-experimental-capabilities-as-optional-bundles/alternatives-considered:
en: d6f40bf02df37ab7
zh: e5b85ce9d41e8754
diff --git a/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md b/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md
index a2dded7934..a2d39b0ffb 100644
--- a/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md
+++ b/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md
@@ -18,7 +18,7 @@ Bundles insert ordinary Host rows; optional model tools register in the global t
Claude Code and Codex install on demand through the separate `ON_DEMAND_BUNDLES` catalog; the [on-demand native-bundle decision](2026-10-05-official-on-demand-bundles.md) owns the cost, version, and offline-discovery trade-offs.
-Computer Use is a shipped optional bundle in the experimental group. Its bundle and client plugin use the explicit naming exceptions `@deepseek-ai/dsh-cua-bundle` and `@deepseek-ai/dsh-client-ui-cua`, alongside `@deepseek-ai/dsh-cua`. These names preserve profile references when the capability moves package groups; the experimental classification still controls isolation and promotion. Its repository-owned native component is prepared when the provider loads, without an external Cua Driver runtime.
+Computer Use is a shipped optional bundle in the experimental group. Its bundle uses the explicit naming exception `@deepseek-ai/dsh-cua-bundle`, alongside `@deepseek-ai/dsh-cua`. These names preserve profile references when the capability moves package groups; the experimental classification still controls isolation and promotion. Its repository-owned native component is prepared when the provider loads, without an external Cua Driver runtime.
## Alternatives considered
diff --git a/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md b/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md
index db1b4a5506..15bc65b56f 100644
--- a/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md
+++ b/.agents/notes/implemented/architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md
@@ -18,7 +18,7 @@ Bundle 插入普通 Host 行;可选模型工具注册到全局工具层,因
Claude Code 与 Codex 通过独立的 `ON_DEMAND_BUNDLES` 目录按需安装,其成本、版本与离线发现取舍由[按需原生 bundle 决策](2026-10-05-official-on-demand-bundles.zh.md)管理。
-Computer Use 是 experimental 包组内随安装提供的可选组合包。组合包和前端插件与 `@deepseek-ai/dsh-cua` 一起采用显式命名例外 `@deepseek-ai/dsh-cua-bundle`、`@deepseek-ai/dsh-client-ui-cua`,在能力移动分组时保留配置引用。依赖隔离和晋升仍由实验性分类约束。提供方加载时准备仓库自有的本机组件,无需外部 Cua Driver 运行时。
+Computer Use 是 experimental 包组内随安装提供的可选组合包。组合包与 `@deepseek-ai/dsh-cua` 一起采用显式命名例外 `@deepseek-ai/dsh-cua-bundle`,在能力移动分组时保留配置引用。依赖隔离和晋升仍由实验性分类约束。提供方加载时准备仓库自有的本机组件,无需外部 Cua Driver 运行时。
## 考虑过的替代方案
diff --git a/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.i18n.yaml b/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.i18n.yaml
index 2cac3e4e63..2f89f011b6 100644
--- a/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.i18n.yaml
+++ b/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.i18n.yaml
@@ -9,8 +9,8 @@
en: b32a7ce6483b9b48
zh: ec0938ad032b99d8
/agent-note-application-consent-for-native-computer-use/decision:
- en: 22b3e4b770d2517f
- zh: 2250b31a5a50758a
+ en: 36c560c24c376f12
+ zh: 5e4ff72f66574e38
/agent-note-application-consent-for-native-computer-use/alternatives-considered:
en: 80cd5fd93a42d937
zh: 2a0e241b1b8c2e1d
diff --git a/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.md b/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.md
index d69ba1218c..389a994714 100644
--- a/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.md
+++ b/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.md
@@ -12,7 +12,7 @@ macOS privileges authorize an execution host, not a user's choice of target appl
The CUA executor owns application consent for every object-API and native-tool dispatch. It uses the existing User Questions service for human decisions and the provider's existing profile configuration for saved grants. The existing question UI presents the offered labels; the executor rejects custom text or answers that do not select exactly one offered label. Permission-page icons and names are presentation metadata, excluded from saved identities and model results. General tool approval and operating-system privileges remain separate requirements. Arbitrary persistent PTC code and separately authorized shell tools retain their own execution authority.
-System-permission buttons call the native helper on the DSH host and remain available to remote browsers. The [usage documentation](../../../../packages/experimental/client-ui-cua/README.md#use-this-package) explains where to complete authorization; the page has no persistent remote-access notice.
+System-permission buttons call the native helper on the DSH host and remain available to remote browsers. The [usage documentation](../../../../packages/experimental/cua/README.md#use-this-package) explains where to complete authorization; the page has no persistent remote-access notice.
A saved identity combines the canonical executable path with a verified designated signing requirement, represented by a SHA-256 digest. The path prevents authorization from following a copied application, and the signing requirement distinguishes replacements while allowing matching signed updates. Unverifiable and ad-hoc applications receive session access only, tied to a process instance. Labels do not establish identity.
diff --git a/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.zh.md b/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.zh.md
index b758b796c9..e7311dfc6d 100644
--- a/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.zh.md
+++ b/.agents/notes/implemented/architecture/2026-09-26-cua-application-consent.zh.md
@@ -12,7 +12,7 @@ macOS 权限授权执行宿主,不能表达用户允许操作哪些目标应
CUA 执行器在每次对象 API 和原生工具调用时检查应用授权。人工决定复用 User Questions 服务,长期许可保存在 provider 的现有 profile 配置中。通用工具审批和操作系统权限仍是独立要求。任意 persistent PTC 代码和另行授权的 shell 工具保留各自的执行权限。现有问答界面展示授权选项;执行器拒绝自由文本或未准确选中一个所给选项的回答。权限页图标和名称仅用于展示,不进入保存的身份信息或模型结果。
-系统权限按钮调用运行 DSH 的电脑上的原生 helper,远程访问时仍可使用。授权地点写在[使用说明](../../../../packages/experimental/client-ui-cua/README.zh.md#use-this-package)中,页面不常驻远程访问提示。
+系统权限按钮调用运行 DSH 的电脑上的原生 helper,远程访问时仍可使用。授权地点写在[使用说明](../../../../packages/experimental/cua/README.zh.md#use-this-package)中,页面不常驻远程访问提示。
长期身份由规范化可执行文件路径和经过验证的签名指定要求组成,以 SHA-256 摘要表示。路径阻止许可跟随应用副本,签名要求区分替换程序,并允许符合相同签名要求的更新。签名不可验证或使用 ad-hoc 签名的应用只能获得会话授权,许可绑定进程实例。显示名称不用于确定身份。
diff --git a/docs/capability-seams.i18n.yaml b/docs/capability-seams.i18n.yaml
index 3443e528f0..ae1d83cdf3 100644
--- a/docs/capability-seams.i18n.yaml
+++ b/docs/capability-seams.i18n.yaml
@@ -6,5 +6,5 @@
en: 41d772192075e133
zh: 5ef3da69b4de1d8a
/capability-seams-and-core-services:
- en: b360360db9a3f6a4
- zh: d14808d61000bdff
+ en: 753b3da3abc6aeea
+ zh: aab02ec16c3f744b
diff --git a/docs/capability-seams.md b/docs/capability-seams.md
index 93b22913dc..f2b52ade47 100644
--- a/docs/capability-seams.md
+++ b/docs/capability-seams.md
@@ -54,7 +54,6 @@ flowchart LR
pkg_experimental_computer_use_cua_driver_native["experimental-computer-use-cua-driver-native"]
pkg_cua["cua"]
svc_cuaAccess["ctx.cuaAccess
Computer Use permission controls"]
- pkg_client_ui_cua["client-ui-cua"]
pkg_office_to_pdf["office-to-pdf"]
svc_officeToPdf["ctx.officeToPdf
Office to PDF conversion"]
pkg_client_ui_sidebar_documentpreview["client-ui-sidebar-documentpreview"]
@@ -488,7 +487,7 @@ flowchart LR
svc_credentials --> pkg_api_settings_controller
svc_credentials --> pkg_llm_deepseek
svc_credentials --> pkg_llm_pi_ai
- svc_cuaAccess --> pkg_client_ui_cua
+ svc_cuaAccess --> pkg_cua
svc_deepseekAccount --> pkg_api_account_controller
svc_deepseekAccount --> pkg_llm_deepseek
svc_deepseekLlmApiExtensions --> pkg_llm_deepseek
@@ -633,7 +632,7 @@ flowchart LR
| `ctx.mcpResources` | `seam` | [`mcp-resources`](../packages/mcp/mcp-resources) | [`mcp-client`](../packages/mcp/mcp-client) | [`mcp-resources`](../packages/mcp/mcp-resources) | - | Connection-owned providers serve shared resource tools in the calling agent scope. |
| `ctx.browserUse` | `seam` | [`browser-use`](../packages/browser-use/browser-use) | [`experimental-browser-use-playwright-mcp`](../packages/experimental/browser-use-playwright-mcp), [`experimental-browser-use-chrome-devtools-mcp`](../packages/experimental/browser-use-chrome-devtools-mcp), [`experimental-browser-use-stagehand-native`](../packages/experimental/browser-use-stagehand-native) | [`experimental-browser-use-playwright-mcp`](../packages/experimental/browser-use-playwright-mcp), [`experimental-browser-use-chrome-devtools-mcp`](../packages/experimental/browser-use-chrome-devtools-mcp), [`experimental-browser-use-stagehand-native`](../packages/experimental/browser-use-stagehand-native) | - | One provider-owned name per service instance. Providers own their tools and browser resources per live Session; the shared service has no browser operation API. |
| `ctx.computerUse` | `seam` | [`computer-use`](../packages/computer-use/computer-use) | [`experimental-computer-use-cua-driver-mcp`](../packages/experimental/computer-use-cua-driver-mcp), [`experimental-computer-use-cua-driver-native`](../packages/experimental/computer-use-cua-driver-native) | [`experimental-computer-use-cua-driver-mcp`](../packages/experimental/computer-use-cua-driver-mcp), [`experimental-computer-use-cua-driver-native`](../packages/experimental/computer-use-cua-driver-native) | - | One provider-owned name per service instance. Each provider also owns its model tools; the service has no common action API, runtime selection, or Session workflow lock. |
-| `ctx.cuaAccess` | `core` | [`cua`](../packages/experimental/cua) | - | [`client-ui-cua`](../packages/experimental/client-ui-cua) | - | The native provider owns application consent and cancellation; the optional Client page queries and changes those decisions through its Remote. |
+| `ctx.cuaAccess` | `core` | [`cua`](../packages/experimental/cua) | - | [`cua`](../packages/experimental/cua) | - | The native provider owns application consent and cancellation; the optional Client page queries and changes those decisions through its Remote. |
| `ctx.officeToPdf` | `core` | [`office-to-pdf`](../packages/document/office-to-pdf) | - | [`client-ui-sidebar-documentpreview`](../packages/client/ui-sidebar-documentpreview) | - | Authorized Office bytes are converted on the Host using the declared native target engine, or Node WASM when no native target is declared. |
| `ctx.attachments` | `seam` | [`attachment`](../packages/attachment/attachment) | [`attachment-local`](../packages/attachment/attachment-local) | [`api-session-controller`](../packages/api/session-controller), [`tool-fs`](../packages/fs/tool-fs), [`llm-pi-ai`](../packages/llm/llm-pi-ai), [`llm-deepseek`](../packages/llm/llm-deepseek) | - | The host commits accepted images before session events; provider adapters resolve authorized durable references into provider-native content. |
| `ctx.fileUploads` | `core` | [`client-file-upload`](../packages/client/file-upload) | - | [`api-session-controller`](../packages/api/session-controller) | - | Owns streaming intake, durable storage, and staged receipt lifetime; the Session controller binds receipts to accepted submissions. |
diff --git a/docs/capability-seams.zh.md b/docs/capability-seams.zh.md
index fb70a985bf..fede454e27 100644
--- a/docs/capability-seams.zh.md
+++ b/docs/capability-seams.zh.md
@@ -56,7 +56,6 @@ flowchart LR
pkg_experimental_computer_use_cua_driver_native["experimental-computer-use-cua-driver-native"]
pkg_cua["cua"]
svc_cuaAccess["ctx.cuaAccess
Computer Use permission controls"]
- pkg_client_ui_cua["client-ui-cua"]
pkg_office_to_pdf["office-to-pdf"]
svc_officeToPdf["ctx.officeToPdf
Office to PDF conversion"]
pkg_client_ui_sidebar_documentpreview["client-ui-sidebar-documentpreview"]
@@ -490,7 +489,7 @@ flowchart LR
svc_credentials --> pkg_api_settings_controller
svc_credentials --> pkg_llm_deepseek
svc_credentials --> pkg_llm_pi_ai
- svc_cuaAccess --> pkg_client_ui_cua
+ svc_cuaAccess --> pkg_cua
svc_deepseekAccount --> pkg_api_account_controller
svc_deepseekAccount --> pkg_llm_deepseek
svc_deepseekLlmApiExtensions --> pkg_llm_deepseek
@@ -635,7 +634,7 @@ flowchart LR
| `ctx.mcpResources` | `seam` | [`mcp-resources`](../packages/mcp/mcp-resources) | [`mcp-client`](../packages/mcp/mcp-client) | [`mcp-resources`](../packages/mcp/mcp-resources) | - | 连接所有者提供的操作在调用 agent 的作用域内服务于共享资源工具。 |
| `ctx.browserUse` | `seam` | [`browser-use`](../packages/browser-use/browser-use) | [`experimental-browser-use-playwright-mcp`](../packages/experimental/browser-use-playwright-mcp), [`experimental-browser-use-chrome-devtools-mcp`](../packages/experimental/browser-use-chrome-devtools-mcp), [`experimental-browser-use-stagehand-native`](../packages/experimental/browser-use-stagehand-native) | [`experimental-browser-use-playwright-mcp`](../packages/experimental/browser-use-playwright-mcp), [`experimental-browser-use-chrome-devtools-mcp`](../packages/experimental/browser-use-chrome-devtools-mcp), [`experimental-browser-use-stagehand-native`](../packages/experimental/browser-use-stagehand-native) | - | 每个服务实例注册一个提供方拥有的名称。提供方按实时 Session 拥有自己的工具与浏览器资源;共享服务不提供浏览器操作 API。 |
| `ctx.computerUse` | `seam` | [`computer-use`](../packages/computer-use/computer-use) | [`experimental-computer-use-cua-driver-mcp`](../packages/experimental/computer-use-cua-driver-mcp), [`experimental-computer-use-cua-driver-native`](../packages/experimental/computer-use-cua-driver-native) | [`experimental-computer-use-cua-driver-mcp`](../packages/experimental/computer-use-cua-driver-mcp), [`experimental-computer-use-cua-driver-native`](../packages/experimental/computer-use-cua-driver-native) | - | 每个服务实例只注册一个提供方自定的名称。各提供方也拥有自己的模型工具;服务不提供通用操作 API、运行时选择或 Session 流程锁。 |
-| `ctx.cuaAccess` | `core` | [`cua`](../packages/experimental/cua) | - | [`client-ui-cua`](../packages/experimental/client-ui-cua) | - | 原生 provider 负责应用授权和取消操作;可选的 Client 权限页面通过 Remote 查询和修改授权。 |
+| `ctx.cuaAccess` | `core` | [`cua`](../packages/experimental/cua) | - | [`cua`](../packages/experimental/cua) | - | 原生 provider 负责应用授权和取消操作;可选的 Client 权限页面通过 Remote 查询和修改授权。 |
| `ctx.officeToPdf` | `core` | [`office-to-pdf`](../packages/document/office-to-pdf) | - | [`client-ui-sidebar-documentpreview`](../packages/client/ui-sidebar-documentpreview) | - | 已授权的 Office 字节在宿主上使用已声明的原生目标引擎转换;未声明原生目标时使用 Node WASM。 |
| `ctx.attachments` | `seam` | [`attachment`](../packages/attachment/attachment) | [`attachment-local`](../packages/attachment/attachment-local) | [`api-session-controller`](../packages/api/session-controller), [`tool-fs`](../packages/fs/tool-fs), [`llm-pi-ai`](../packages/llm/llm-pi-ai), [`llm-deepseek`](../packages/llm/llm-deepseek) | - | 宿主会在会话事件之前提交已接受的图片;提供方适配器将已授权的持久引用解析为提供方原生内容。 |
| `ctx.fileUploads` | `core` | [`client-file-upload`](../packages/client/file-upload) | - | [`api-session-controller`](../packages/api/session-controller) | - | 负责流式接收、持久存储和暂存回执生命周期;Session Controller 将回执绑定到已接受的提交。 |
diff --git a/docs/config-catalog.md b/docs/config-catalog.md
index bc4eec2935..0ac5edbca0 100644
--- a/docs/config-catalog.md
+++ b/docs/config-catalog.md
@@ -4684,7 +4684,6 @@ These load from a `cordis.yml` entry with no `config:` block; they declare no co
| `@deepseek-ai/dsh-client-ui-commands` | — | [`packages/client/ui-commands/src/index.ts`](../packages/client/ui-commands/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-conversation` | — | [`packages/client/ui-conversation/src/index.ts`](../packages/client/ui-conversation/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-cordis` | — | [`packages/extensions/ui-cordis/src/index.ts`](../packages/extensions/ui-cordis/src/index.ts) |
-| `@deepseek-ai/dsh-client-ui-cua` | — | [`packages/experimental/client-ui-cua/src/index.ts`](../packages/experimental/client-ui-cua/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-deepseek-model-label-1017` | — | [`packages/client/ui-deepseek-model-label-1017/src/index.ts`](../packages/client/ui-deepseek-model-label-1017/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-deliverables` | `systemPrompt` · `connection` · `sessionQuery` · `sessionController` · `workspaceFiles` · `fs` · `sandboxPolicy` · `workspaceChanges` | [`packages/client/ui-deliverables/src/index.ts`](../packages/client/ui-deliverables/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-directory-picker-browse` | — | [`packages/client/ui-directory-picker-browse/src/index.ts`](../packages/client/ui-directory-picker-browse/src/index.ts) |
@@ -4734,6 +4733,7 @@ These load from a `cordis.yml` entry with no `config:` block; they declare no co
| `@deepseek-ai/dsh-computer-use` | — | [`packages/computer-use/computer-use/src/index.ts`](../packages/computer-use/computer-use/src/index.ts) |
| `@deepseek-ai/dsh-config-editor` | `loader` · `profileContext` | [`packages/boot/config-editor/src/index.ts`](../packages/boot/config-editor/src/index.ts) |
| `@deepseek-ai/dsh-cordis-client-runner` | — | [`packages/extensions/cordis-client-runner/src/index.ts`](../packages/extensions/cordis-client-runner/src/index.ts) |
+| `@deepseek-ai/dsh-cua` | — | [`packages/experimental/cua/src/index.ts`](../packages/experimental/cua/src/index.ts) |
| `@deepseek-ai/dsh-deepseek-llm-api-extensions` | — | [`packages/llm/deepseek-llm-api-extensions/src/index.ts`](../packages/llm/deepseek-llm-api-extensions/src/index.ts) |
| `@deepseek-ai/dsh-experimental-auto-review` | `approval` · `llm` · `permissionPresets` · `sessions` · `tools` · `workingDirectory` | [`packages/experimental/auto-review/src/index.ts`](../packages/experimental/auto-review/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-agent-team` | — | [`packages/experimental/client-ui-agent-team/src/index.ts`](../packages/experimental/client-ui-agent-team/src/index.ts) |
@@ -4821,7 +4821,6 @@ Imported as libraries by other packages; a `cordis.yml` cannot load them.
| `@deepseek-ai/dsh-client-ui-slots` | — | [`packages/client/ui-slots/src/index.ts`](../packages/client/ui-slots/src/index.ts) |
| `@deepseek-ai/dsh-client-web` | — | [`packages/client/web/src/index.ts`](../packages/client/web/src/index.ts) |
| `@deepseek-ai/dsh-cmdline` | — | [`packages/boot/cmdline/src/index.ts`](../packages/boot/cmdline/src/index.ts) |
-| `@deepseek-ai/dsh-cua` | — | [`packages/experimental/cua/src/index.ts`](../packages/experimental/cua/src/index.ts) |
| `@deepseek-ai/dsh-cua-bundle` | — | [`packages/experimental/cua-bundle/src/index.ts`](../packages/experimental/cua-bundle/src/index.ts) |
| `@deepseek-ai/dsh-deque` | — | [`packages/util/deque/src/index.ts`](../packages/util/deque/src/index.ts) |
| `@deepseek-ai/dsh-experimental-agent-team-profile` | — | [`packages/experimental/agent-team-profile/src/index.ts`](../packages/experimental/agent-team-profile/src/index.ts) |
diff --git a/docs/config-catalog.zh.md b/docs/config-catalog.zh.md
index 88327a30f4..f8cfb1749c 100644
--- a/docs/config-catalog.zh.md
+++ b/docs/config-catalog.zh.md
@@ -4686,7 +4686,6 @@ export interface Config {
| `@deepseek-ai/dsh-client-ui-commands` | — | [`packages/client/ui-commands/src/index.ts`](../packages/client/ui-commands/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-conversation` | — | [`packages/client/ui-conversation/src/index.ts`](../packages/client/ui-conversation/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-cordis` | — | [`packages/extensions/ui-cordis/src/index.ts`](../packages/extensions/ui-cordis/src/index.ts) |
-| `@deepseek-ai/dsh-client-ui-cua` | — | [`packages/experimental/client-ui-cua/src/index.ts`](../packages/experimental/client-ui-cua/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-deepseek-model-label-1017` | — | [`packages/client/ui-deepseek-model-label-1017/src/index.ts`](../packages/client/ui-deepseek-model-label-1017/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-deliverables` | `systemPrompt` · `connection` · `sessionQuery` · `sessionController` · `workspaceFiles` · `fs` · `sandboxPolicy` · `workspaceChanges` | [`packages/client/ui-deliverables/src/index.ts`](../packages/client/ui-deliverables/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-directory-picker-browse` | — | [`packages/client/ui-directory-picker-browse/src/index.ts`](../packages/client/ui-directory-picker-browse/src/index.ts) |
@@ -4736,6 +4735,7 @@ export interface Config {
| `@deepseek-ai/dsh-computer-use` | — | [`packages/computer-use/computer-use/src/index.ts`](../packages/computer-use/computer-use/src/index.ts) |
| `@deepseek-ai/dsh-config-editor` | `loader` · `profileContext` | [`packages/boot/config-editor/src/index.ts`](../packages/boot/config-editor/src/index.ts) |
| `@deepseek-ai/dsh-cordis-client-runner` | — | [`packages/extensions/cordis-client-runner/src/index.ts`](../packages/extensions/cordis-client-runner/src/index.ts) |
+| `@deepseek-ai/dsh-cua` | — | [`packages/experimental/cua/src/index.ts`](../packages/experimental/cua/src/index.ts) |
| `@deepseek-ai/dsh-deepseek-llm-api-extensions` | — | [`packages/llm/deepseek-llm-api-extensions/src/index.ts`](../packages/llm/deepseek-llm-api-extensions/src/index.ts) |
| `@deepseek-ai/dsh-experimental-auto-review` | `approval` · `llm` · `permissionPresets` · `sessions` · `tools` · `workingDirectory` | [`packages/experimental/auto-review/src/index.ts`](../packages/experimental/auto-review/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-agent-team` | — | [`packages/experimental/client-ui-agent-team/src/index.ts`](../packages/experimental/client-ui-agent-team/src/index.ts) |
@@ -4823,7 +4823,6 @@ export interface Config {
| `@deepseek-ai/dsh-client-ui-slots` | — | [`packages/client/ui-slots/src/index.ts`](../packages/client/ui-slots/src/index.ts) |
| `@deepseek-ai/dsh-client-web` | — | [`packages/client/web/src/index.ts`](../packages/client/web/src/index.ts) |
| `@deepseek-ai/dsh-cmdline` | — | [`packages/boot/cmdline/src/index.ts`](../packages/boot/cmdline/src/index.ts) |
-| `@deepseek-ai/dsh-cua` | — | [`packages/experimental/cua/src/index.ts`](../packages/experimental/cua/src/index.ts) |
| `@deepseek-ai/dsh-cua-bundle` | — | [`packages/experimental/cua-bundle/src/index.ts`](../packages/experimental/cua-bundle/src/index.ts) |
| `@deepseek-ai/dsh-deque` | — | [`packages/util/deque/src/index.ts`](../packages/util/deque/src/index.ts) |
| `@deepseek-ai/dsh-experimental-agent-team-profile` | — | [`packages/experimental/agent-team-profile/src/index.ts`](../packages/experimental/agent-team-profile/src/index.ts) |
diff --git a/docs/module-graph.md b/docs/module-graph.md
index 39941991c8..ab621eb709 100644
--- a/docs/module-graph.md
+++ b/docs/module-graph.md
@@ -246,7 +246,6 @@ flowchart TD
pkg_office_to_pdf["office-to-pdf"]
end
subgraph group_experimental["packages/experimental"]
- pkg_client_ui_cua["client-ui-cua"]
pkg_cua["cua"]
pkg_cua_bundle["cua-bundle"]
pkg_experimental_agent_team["experimental-agent-team"]
@@ -1544,7 +1543,6 @@ flowchart TD
| [`client-web`](../packages/client/web) | `client` | — |
| [`credentials`](../packages/credentials/credentials) | `credentials` | — |
| [`office-to-pdf`](../packages/document/office-to-pdf) | `document` | — |
-| [`client-ui-cua`](../packages/experimental/client-ui-cua) | `experimental` | — |
| [`cua-bundle`](../packages/experimental/cua-bundle) | `experimental` | — |
| [`experimental-agent-team-profile`](../packages/experimental/agent-team-profile) | `experimental` | — |
| [`experimental-badge-skill-bundle`](../packages/experimental/badge-skill-bundle) | `experimental` | — |
diff --git a/docs/module-graph.zh.md b/docs/module-graph.zh.md
index 97e302bb3d..531c608183 100644
--- a/docs/module-graph.zh.md
+++ b/docs/module-graph.zh.md
@@ -248,7 +248,6 @@ flowchart TD
pkg_office_to_pdf["office-to-pdf"]
end
subgraph group_experimental["packages/experimental"]
- pkg_client_ui_cua["client-ui-cua"]
pkg_cua["cua"]
pkg_cua_bundle["cua-bundle"]
pkg_experimental_agent_team["experimental-agent-team"]
@@ -1546,7 +1545,6 @@ flowchart TD
| [`client-web`](../packages/client/web) | `client` | — |
| [`credentials`](../packages/credentials/credentials) | `credentials` | — |
| [`office-to-pdf`](../packages/document/office-to-pdf) | `document` | — |
-| [`client-ui-cua`](../packages/experimental/client-ui-cua) | `experimental` | — |
| [`cua-bundle`](../packages/experimental/cua-bundle) | `experimental` | — |
| [`experimental-agent-team-profile`](../packages/experimental/agent-team-profile) | `experimental` | — |
| [`experimental-badge-skill-bundle`](../packages/experimental/badge-skill-bundle) | `experimental` | — |
diff --git a/docs/subsystems/computer-use.i18n.yaml b/docs/subsystems/computer-use.i18n.yaml
index 77ba44e680..fc82ebf720 100644
--- a/docs/subsystems/computer-use.i18n.yaml
+++ b/docs/subsystems/computer-use.i18n.yaml
@@ -3,8 +3,8 @@
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/subsystems/computer-use.md
/computer-use:
- en: 6f40d55bef2d7753
- zh: 0fc4eb79afb3cd73
+ en: aff84e3ac8c41594
+ zh: bee7fc09854bfa8b
/computer-use/choose-a-provider:
en: fa2e0d7b41c0450b
zh: af9a799711f901e6
diff --git a/docs/subsystems/computer-use.md b/docs/subsystems/computer-use.md
index a00e0f6e04..bc8f1b0491 100644
--- a/docs/subsystems/computer-use.md
+++ b/docs/subsystems/computer-use.md
@@ -8,7 +8,7 @@ Computer use lets a model observe and operate the local desktop through a config
The [`macOS CUA provider`](../../packages/experimental/cua-macos/README.md) uses the [shared CUA objects and executor](../../packages/experimental/cua/README.md), which enforce application consent through User Questions and profile configuration.
-The CUA provider owns `ctx.cuaAccess` for system-permission status, explicit system requests, and application revocation. Its [permission page](../../packages/experimental/client-ui-cua/README.md) projects these controls; app/window operations enforce the provider's consent policy before dispatch.
+The CUA provider owns `ctx.cuaAccess` for system-permission status, explicit system requests, and application revocation. Its [permission page](../../packages/experimental/cua/README.md) projects these controls; app/window operations enforce the provider's consent policy before dispatch.
| Permission type | Meaning |
|---|---|
diff --git a/docs/subsystems/computer-use.zh.md b/docs/subsystems/computer-use.zh.md
index 00ff655df2..1323c6b033 100644
--- a/docs/subsystems/computer-use.zh.md
+++ b/docs/subsystems/computer-use.zh.md
@@ -8,7 +8,7 @@
[macOS CUA 提供方](../../packages/experimental/cua-macos/README.zh.md)使用[共享 CUA 对象与执行器](../../packages/experimental/cua/README.zh.md),通过 User Questions 和配置档设置执行应用授权。
-CUA provider 通过 `ctx.cuaAccess` 提供系统权限状态、用户主动申请和应用授权撤销。[权限页面](../../packages/experimental/client-ui-cua/README.zh.md)投影这些控件;app/window 操作在分派前执行 provider 的授权检查。
+CUA provider 通过 `ctx.cuaAccess` 提供系统权限状态、用户主动申请和应用授权撤销。[权限页面](../../packages/experimental/cua/README.zh.md)投影这些控件;app/window 操作在分派前执行 provider 的授权检查。
| 权限类型 | 含义 |
|---|---|
diff --git a/packages/experimental/README.i18n.yaml b/packages/experimental/README.i18n.yaml
index 77c06a747b..ce1021f7ee 100644
--- a/packages/experimental/README.i18n.yaml
+++ b/packages/experimental/README.i18n.yaml
@@ -18,8 +18,8 @@
en: b55aeb927737b90d
zh: 0b215fcb5c2c7908
/packages-experimental/packages:
- en: e20594b1b7e506d7
- zh: ef76c3c732ddb547
+ en: 94cc18a191e52f26
+ zh: 6a5ce630fa730239
/packages-experimental/related-documentation:
en: 1cb9d3448d44e48d
zh: cd326d70a746b896
diff --git a/packages/experimental/README.md b/packages/experimental/README.md
index 5f052b8e5e..0a01b71eeb 100644
--- a/packages/experimental/README.md
+++ b/packages/experimental/README.md
@@ -72,7 +72,6 @@ Promotion requires a named product role, documented public behavior and limitati
| [CUA](cua/README.md) | Shared application/window objects, consent, and logged execution. | Library |
| [macOS CUA](cua-macos/README.md) | Swift native execution and platform preparation. | `ctx.computerUse` |
| [`cua-bundle`](cua-bundle/README.md) | Optional Computer Use switch for PTC sessions | — |
-| [`client-ui-cua`](client-ui-cua/README.md) | Computer Use permission setup and application access controls | — |
| [`computer-use-cua-driver-mcp`](computer-use-cua-driver-mcp/README.md) | Use an installed Cua Driver through MCP | `ctx.computerUse` |
| [`computer-use-cua-driver-native`](computer-use-cua-driver-native/README.md) | Embed the Cua Driver native npm runtime | `ctx.computerUse` |
| [`browser-use-playwright-mcp`](browser-use-playwright-mcp/README.md) | Playwright browser tools over MCP | `ctx.browserUse` |
diff --git a/packages/experimental/README.zh.md b/packages/experimental/README.zh.md
index 5a74a36072..6d20549870 100644
--- a/packages/experimental/README.zh.md
+++ b/packages/experimental/README.zh.md
@@ -72,7 +72,6 @@ kind: "package-group"
| [CUA](cua/README.zh.md) | 共享应用与窗口对象、授权和已记录的执行。 | 库 |
| [macOS CUA](cua-macos/README.zh.md) | Swift 原生执行与平台组件准备。 | `ctx.computerUse` |
| [`cua-bundle`](cua-bundle/README.zh.md) | 面向 PTC 会话、默认关闭的 Computer Use 开关 | — |
-| [`client-ui-cua`](client-ui-cua/README.zh.md) | Computer Use 权限设置与应用授权管理 | — |
| [`computer-use-cua-driver-mcp`](computer-use-cua-driver-mcp/README.zh.md) | 通过 MCP 使用已安装的 Cua Driver | `ctx.computerUse` |
| [`computer-use-cua-driver-native`](computer-use-cua-driver-native/README.zh.md) | 嵌入 Cua Driver 原生 npm 运行时 | `ctx.computerUse` |
| [`browser-use-playwright-mcp`](browser-use-playwright-mcp/README.zh.md) | 通过 MCP 提供 Playwright 浏览器工具 | `ctx.browserUse` |
diff --git a/packages/experimental/client-ui-cua/README.i18n.yaml b/packages/experimental/client-ui-cua/README.i18n.yaml
deleted file mode 100644
index 9d1ae66b95..0000000000
--- a/packages/experimental/client-ui-cua/README.i18n.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-# Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
-# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
-# After editing either side, bring the other along and re-record with:
-# pnpm run verify-translation-pairing --write packages/experimental/client-ui-cua/README.md
-/:
- en: e5ff656e81db5fc8
- zh: 43a8e818159176b3
-/deepseek-ai-dsh-client-ui-cua:
- en: 43859860b79a3757
- zh: e8e0829c36613320
-/deepseek-ai-dsh-client-ui-cua/summary:
- en: 4e62e511b5d14986
- zh: 1fce04dbad7515f7
-/deepseek-ai-dsh-client-ui-cua/table-of-contents:
- en: 6658ab477751154b
- zh: 9b371809a6fe38dc
-/deepseek-ai-dsh-client-ui-cua/use-this-package:
- en: 57485612d3ebe444
- zh: b1886ab8e3c313af
-/deepseek-ai-dsh-client-ui-cua/understand-the-implementation:
- en: f16ebf34970a7720
- zh: f1d79b3a60df361c
-/deepseek-ai-dsh-client-ui-cua/further-exploration:
- en: f0fde9f736ade61a
- zh: 43a534a21bcc1c13
-/deepseek-ai-dsh-client-ui-cua/model-experience:
- en: 7cfbaa62f70c1916
- zh: 384ec816a50fc7c5
-/deepseek-ai-dsh-client-ui-cua/model-experience/kv-cache-effect:
- en: f04fc6e6f503960f
- zh: f080408ae6729fee
-/deepseek-ai-dsh-client-ui-cua/known-limitations-and-deferred-work:
- en: c032612d923e1367
- zh: eb77d474e21ca5d9
-/deepseek-ai-dsh-client-ui-cua/known-limitations-and-deferred-work/dev-note:
- en: b836f01bd0bceb4a
- zh: a6ea1361c4a48df0
diff --git a/packages/experimental/client-ui-cua/README.md b/packages/experimental/client-ui-cua/README.md
deleted file mode 100644
index b0c9ae7a12..0000000000
--- a/packages/experimental/client-ui-cua/README.md
+++ /dev/null
@@ -1,92 +0,0 @@
----
-description: "Check macOS Computer Use permissions and revoke application access."
-kind: "package-reference"
----
-
-# @deepseek-ai/dsh-client-ui-cua
-
-English | [中文](README.zh.md)
-
-## Summary
-
-Open Computer Use in Plugins to check Accessibility and Screen Recording, request missing system permissions, and revoke application access. Explicit activation probes permissions and may start a dedicated native helper. Missing privileges show setup guidance; a failed probe directs the user to diagnostics and retry in the details page. System prompts still require the user's decision.
-
-## Table of Contents
-
-- [Use this package](#use-this-package)
-- [Understand the implementation](#understand-the-implementation)
-- [Further Exploration](#further-exploration)
-- [Model Experience](#model-experience)
-- [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
-- [Dev Note](#dev-note)
-
-The permission-page lists show native icons and application names. Paths remain available on hover. Icons are presentation metadata and are never saved with grants. Application access uses the existing User Questions interface, with session access, refusal and, for verifiable applications with writable settings, persistent access.
-
------
-
-
-## Use this package
-
-The [Computer Use bundle](../cua-bundle/README.md) mounts this page with its native provider. **Authorize Computer Use** groups the new-session default, PTC execution mode, Accessibility, and Screen Recording inside one border, with dividers between the rows. Each system-permission row shows the system-reported responsible application’s `.app` bundle filename and icon together in a bordered label. **Manage applications Computer Use can access** places the application lists inside a separate bordered group. Choose **Request permission**, find that application in the macOS permission list, and enable its switch; if macOS names another application, follow that prompt. With no detected source, the page directs the user to the application named by macOS. **Open System Settings** opens the corresponding privacy pane. The page refreshes on entry, when the window regains focus, and after permission actions. A failed query offers **Retry**. Follow any macOS quit-and-reopen prompt and restart DSH as needed.
-
-System-permission operations affect the computer running DSH. When accessing DSH remotely, complete authorization on that computer.
-
-Enabling from the plugin list shows setup guidance when system permissions need attention, with **Later** and **Open settings** actions. Enabling from the detail page displays the permission controls directly. The detail page provides **Set to PTC** under **Default mode for new sessions**; only this action saves the default. Existing sessions keep their preset. **Use persistent mode** in the **PTC execution mode** row separately saves `ptc-runtime.executionMode: persistent-in-memory`. Switching reloads the shared PTC runtime and may interrupt an active call; subsequent calls retain variables and application objects in memory. Already-persistent runtimes show a disabled **Persistent mode enabled** button.
-
-The page lists always-allowed applications and refusals from any session. A refusal in one session does not cancel another session’s grant or prevent a new session from asking. Session-only grants remain effective within their sessions and are omitted from this page. **Revoke** removes the selected application's access and cancels affected work. Input already delivered to an application cannot be undone; observe the application before any further action. **Allow asking again** clears that application’s refusal records across all sessions; the next application selection still requires a new decision.
-
-This plugin has no configurable fields.
-
------
-
-
-## Understand the implementation
-
-
-Implementation internals
-
-The optional browser contribution mounts the native provider's permission Remote and reuses the Plugins activation and configuration slots. The four setup rows remain visible while unknown fields use placeholders. The default-mode form, runtime configuration, system checks, application decisions, and application icons fill in as each query completes. Application names and actions do not wait for icons; icon positions retain their space. User actions run in order without waiting for pending observation queries. Disposal waits for both actions and queries to settle before releasing the separately owned Remote mount. Query errors stay with the affected section, and activation guidance depends only on system checks. Late results after disposal are discarded. One controller projects queries into the page and setup dialog; reconnects and updates to the Host-reported settings namespace refresh it. Operation notices live in the shell overlay, so closing the page does not remove them. The provider owns permission checks, persisted decisions, and cancellation; the browser owns no authorization state.
-
-The detail page reads the effective default (`selectedDefault ?? default`) from the existing `configForms` service. The default button writes only `selectedDefault` through the form's revision-checked settings path. The execution-mode row uses CUA's `ptcConfiguration()` and `enablePersistentPtc()` controls: the Host edits only `ptc-runtime.executionMode` through the existing configuration editor, preserving its ordinary Loader reload lifecycle. Permission checks and runtime state settle independently. Loading, read-only and unavailable settings cannot submit a change; a failed write remains beside the setting for retry.
-
-
-
------
-
-
-## Further Exploration
-
-- [Native provider](../cua/README.md): executable identity and operation checks.
-- [Plugin manager](../../client/ui-plugin-manager/README.md): activation and page slots.
-- [UI primitives](../../client/ui-primitives/README.md): shared modal, buttons, and toast.
-
------
-
-
-## Model Experience
-
-None, as this package registers browser controls and no model-facing tools or prompt sections.
-
-#### KV Cache effect
-
-None; the native provider owns model-visible guidance and operation results.
-
-## Known Limitations and Deferred Work
-
-
-
-This CUA-specific UI remains experimental while Windows support is in development; promotion returns it to the `client` group as `ui-cua`.
-
-- macOS may require restarting the launching application after a system permission change. A pending request is not an authorization grant.
-- Application attribution depends on an optional native system query and available application metadata. If either is unavailable, the page uses generic system-prompt guidance. Packaged Desktop distribution and permission attribution remain deferred.
-- No invariant companion is published: this UI projects the provider's query and stores no independent authorization decisions.
-
-
-### Dev Note
-
-
-Working context for maintainers
-
-None.
-
-
diff --git a/packages/experimental/client-ui-cua/README.zh.md b/packages/experimental/client-ui-cua/README.zh.md
deleted file mode 100644
index 09a011c6d8..0000000000
--- a/packages/experimental/client-ui-cua/README.zh.md
+++ /dev/null
@@ -1,92 +0,0 @@
----
-description: "检查 macOS Computer Use 权限并撤销应用访问权限。"
-kind: "package-reference"
----
-
-# @deepseek-ai/dsh-client-ui-cua
-
-[English](README.md) | 中文
-
-## 概述
-
-在插件页打开 Computer Use,可以检查辅助功能和屏幕录制权限、申请缺失的系统权限,并撤销应用授权。用户显式启用时会检查权限,可能启动专用原生 helper。缺少权限时显示设置引导,查询失败时引导用户到详情页查看原因并重试。系统授权仍由用户决定。
-
-## 目录
-
-- [使用本包](#use-this-package)
-- [理解实现](#understand-the-implementation)
-- [延伸阅读](#further-exploration)
-- [模型体验](#model-experience)
-- [已知限制与后续工作](#known-limitations-and-deferred-work)
-- [开发备注](#dev-note)
-
-权限页列表显示本机图标与应用名称,悬停可查看路径。图标仅用于展示,不随授权保存。应用授权沿用现有 User Questions 界面,提供本会话允许和拒绝;应用签名可验证且配置可写时,还提供始终允许。
-
------
-
-
-## 使用本包
-
-[Computer Use 组合](../cua-bundle/README.zh.md)将本页与原生 provider 一起挂载。“给 Computer Use 授权”把新会话默认模式、PTC 执行方式、辅助功能和屏幕录制放在同一个边框内,四排之间使用分隔线。两条系统权限要求在能识别责任应用时,把该应用的 `.app` 包名称和图标放在同一个标签中。“管理 Computer Use 可访问的应用”使用独立边框包住应用列表。点击“申请权限”,在 macOS 权限列表中找到该应用并开启对应开关;若 macOS 显示其他名称,以系统提示为准。来源无法识别时,页面引导用户查找系统提示的应用。“打开系统设置”会打开对应的隐私设置页。进入详情页、返回窗口或完成授权操作后会自动刷新;查询失败时可点击“重试”。若系统要求退出并重新打开应用,请按提示操作并重新启动 DSH。
-
-系统权限操作作用于运行 DSH 的电脑。远程访问时,请在该电脑上完成授权。
-
-从插件列表启用后,系统权限尚未就绪时会显示设置引导,提供“稍后”和“前往设置”。从详情页启用后直接显示权限控件。详情页的“新会话默认模式”提供“设为 PTC”按钮,仅点击此按钮才保存默认值。已有会话保留原 preset。“PTC 执行方式”一行的“设为持久化”单独保存 `ptc-runtime.executionMode: persistent-in-memory`。切换会重载共享 PTC 执行器,可能打断当前调用;后续调用在内存中保留变量和应用对象。已经使用持久化模式时,按钮显示“已设为持久化”并禁用。
-
-页面展示“始终允许的应用”和“不允许访问的应用”。后者汇总任一会话的拒绝记录,不取消其他会话已有的授权,也不阻止新会话询问授权。会话授权仍在对应会话中生效,详情页不展示这类应用。“撤销”会移除对应应用的访问许可并取消相关操作。已发送到应用的输入无法撤回,继续操作前需重新观察应用。“允许再次询问”清除该应用在所有会话中的拒绝记录;下次选择应用时仍需用户重新决定。
-
-本插件没有配置字段。
-
------
-
-
-## 理解实现
-
-
-实现细节
-
-可选浏览器插件挂载原生 provider 的权限 Remote,复用插件页的启用引导和配置插槽。四排使用条件始终可见,未加载的字段保留占位。默认模式、执行方式、系统权限、应用列表和应用图标分别查询,结果返回后各自显示。应用名称和操作按钮不等待图标,图标位置保留空位。用户操作按顺序执行,不等待尚未完成的查询;卸载时等待操作和查询全部结束,再释放独立持有的 Remote 挂载。查询错误只显示在对应部分,启用引导只等待系统权限结果。卸载后的迟到结果会被丢弃。一个控制器把查询结果投影到页面和设置弹窗;重新连接或 Host 返回的配置 namespace 更新时刷新状态。操作提示挂载到 shell overlay,关闭页面后仍可显示。provider 负责权限检查、持久授权和取消;浏览器不保存授权决定。
-
-详情页通过现有 `configForms` 服务读取实际默认值(`selectedDefault ?? default`)。默认模式按钮仅写入 `selectedDefault`,沿用表单带版本检查的设置写入流程。执行方式一行调用 CUA 的 `ptcConfiguration()` 和 `enablePersistentPtc()`:Host 通过现有配置编辑器仅修改 `ptc-runtime.executionMode`,保留普通 Loader 重载规则。权限检查和执行方式状态独立返回。设置仍在加载、只读或不可用时不能提交;写入失败时在设置旁显示错误,供用户重试。
-
-
-
------
-
-
-## 延伸阅读
-
-- [原生 provider](../cua/README.zh.md):可执行文件身份和操作检查。
-- [插件管理](../../client/ui-plugin-manager/README.zh.md):启用引导和页面插槽。
-- [界面基础组件](../../client/ui-primitives/README.zh.md):共用弹窗、按钮和提示。
-
------
-
-
-## 模型体验
-
-无。本包注册浏览器控件,不注册模型工具或提示词段落。
-
-#### KV 缓存影响
-
-无。模型可见的指引和操作结果由原生 provider 负责。
-
-## 已知限制与后续工作
-
-
-
-这套 CUA 专用界面随 Windows 支持一起开发,暂放在 `experimental`;转为正式功能后迁回 `client` 组的 `ui-cua`。
-
-- 系统权限变更后,macOS 可能要求重启启动程序。申请尚未完成时,不能视为已授权。
-- 应用归属依赖可选的本机系统查询和可读取的应用信息;不可用时,页面使用通用指引,让用户按系统弹窗完成授权。桌面安装包的分发和权限归属留待后续处理。
-- 不提供 invariant companion:本界面投影 provider 查询,不独立保存授权决定。
-
-
-### 开发备注
-
-
-维护者工作记录
-
-无。
-
-
diff --git a/packages/experimental/client-ui-cua/package.json b/packages/experimental/client-ui-cua/package.json
deleted file mode 100644
index 6554c14387..0000000000
--- a/packages/experimental/client-ui-cua/package.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "name": "@deepseek-ai/dsh-client-ui-cua",
- "description": "Computer Use permission setup and application access controls",
- "version": "0.2.1-rc.2",
- "publishConfig": {
- "access": "public"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
- "directory": "packages/experimental/client-ui-cua"
- },
- "type": "module",
- "main": "lib/index.js",
- "types": "lib/types/index.d.ts",
- "exports": {
- ".": {
- "types": "./lib/types/index.d.ts",
- "default": "./lib/index.js"
- },
- "./client": {
- "types": "./lib/types/client/index.d.ts",
- "default": "./lib/client.js"
- },
- "./src/*": "./src/*",
- "./package.json": "./package.json"
- },
- "dsh": {
- "client": {
- "inject": [
- "@deepseek-ai/dsh-api-remotes",
- "@deepseek-ai/dsh-client-locale",
- "@deepseek-ai/dsh-client-ui-plugin-manager",
- "@deepseek-ai/dsh-client-ui-settings",
- "@deepseek-ai/dsh-client-ui-layout"
- ],
- "platform": "web"
- }
- },
- "scripts": {
- "bundle": "tsdown",
- "watch": "tsdown --watch"
- },
- "license": "MIT",
- "peerDependencies": {
- "@deepseek-ai/cordis": "workspace:~"
- },
- "devDependencies": {
- "@deepseek-ai/cordis": "workspace:~",
- "@deepseek-ai/dsh-api-remotes": "workspace:*",
- "@deepseek-ai/dsh-api-gateway": "workspace:*",
- "@deepseek-ai/dsh-client-locale": "workspace:*",
- "@deepseek-ai/dsh-client-store": "workspace:*",
- "@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
- "@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
- "@deepseek-ai/dsh-client-ui-slots": "workspace:*",
- "@deepseek-ai/dsh-client-ui-plugin-manager": "workspace:*",
- "@deepseek-ai/dsh-client-ui-settings": "workspace:*",
- "@deepseek-ai/dsh-client-ui-layout": "workspace:*",
- "@deepseek-ai/dsh-cua": "workspace:*",
- "@deepseek-ai/dsh-client-test-runtime": "workspace:*",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "@testing-library/react": "^16.1.0",
- "@deepseek-ai/dsh-typert-protocol": "workspace:*"
- },
- "files": [
- "lib/index.js",
- "lib/client.js",
- "lib/types/**/*.d.ts"
- ]
-}
diff --git a/packages/experimental/client-ui-cua/src/index.ts b/packages/experimental/client-ui-cua/src/index.ts
deleted file mode 100644
index ceee879f3f..0000000000
--- a/packages/experimental/client-ui-cua/src/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-/** Host marker; the client export owns the optional permission UI, while dsh-cua owns native policy. */
-export function apply(): void {}
diff --git a/packages/experimental/client-ui-cua/tsdown.config.ts b/packages/experimental/client-ui-cua/tsdown.config.ts
deleted file mode 100644
index 71d5bd77f8..0000000000
--- a/packages/experimental/client-ui-cua/tsdown.config.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { clientBundle } from '../../client/tsdown.client.ts'
-
-export default clientBundle(import.meta.dirname, ['lib/types/index.js'])
diff --git a/packages/experimental/cua-bundle/README.i18n.yaml b/packages/experimental/cua-bundle/README.i18n.yaml
index f84fa9dcaa..a2b0c1f5fe 100644
--- a/packages/experimental/cua-bundle/README.i18n.yaml
+++ b/packages/experimental/cua-bundle/README.i18n.yaml
@@ -15,8 +15,8 @@
en: b563e4ec4727d0de
zh: d0228da978238e05
/deepseek-ai-dsh-cua-bundle/use-this-package:
- en: c50ddfc2865ed10f
- zh: f0ee5fd582c7e034
+ en: d171cfb240ae4503
+ zh: b65e31e613f7b000
/deepseek-ai-dsh-cua-bundle/understand-the-implementation:
en: 057771fe13aaa337
zh: 4fdb2b98ff3e7a78
diff --git a/packages/experimental/cua-bundle/README.md b/packages/experimental/cua-bundle/README.md
index 921bc05f20..fc74a014cd 100644
--- a/packages/experimental/cua-bundle/README.md
+++ b/packages/experimental/cua-bundle/README.md
@@ -33,7 +33,7 @@ pnpm dsh web
For the source Desktop launcher and its separate development profile, follow [Desktop development](../../../apps/desktop/README.md). Enable Computer Use in each profile that needs it.
-The switch saves bundle selection in the profile’s `package.json`. Computer Use is installed only in PTC sessions. Enabling from the plugin list offers setup guidance when system permissions need attention; enabling from its detail page displays the permission controls directly. The detail page offers **Set to PTC** for the new-session default; existing sessions keep their preset. The switch leaves PTC execution mode and other settings unchanged. The detail page’s **Use persistent mode** action separately enables in-memory state across PTC calls; its effects and reload behavior are described in the [permission page](../client-ui-cua/README.md). Native preparation runs when the provider loads and reuses the source-hashed executable when available.
+The switch saves bundle selection in the profile’s `package.json`. Computer Use is installed only in PTC sessions. Enabling from the plugin list offers setup guidance when system permissions need attention; enabling from its detail page displays the permission controls directly. The detail page offers **Set to PTC** for the new-session default; existing sessions keep their preset. The switch leaves PTC execution mode and other settings unchanged. The detail page’s **Use persistent mode** action separately enables in-memory state across PTC calls; its effects and reload behavior are described in the [permission page](../cua/README.md). Native preparation runs when the provider loads and reuses the source-hashed executable when available.
Disabling unloads the provider and withdraws CUA tools from its Agent scopes. Runtime configuration, the new-session default and saved grants remain. Session-only application decisions end with provider disposal.
@@ -41,7 +41,7 @@ Computer Use requires a macOS DSH Host. Other operating systems can display the
If preparation fails, the saved selection remains and CUA operations stay unavailable. Read the Host startup diagnostic, correct its cause, then restart DSH.
-Explicit activation runs a read-only permission check, which may start a helper without opening a system dialog. Open the [permission page](../client-ui-cua/README.md) for system requests, settings navigation and automatic refresh. Tasks ask separately before accessing an application. Saved application decisions use the existing profile configuration; session decisions remain in memory across turns and connections until DSH restarts or Computer Use is disabled. Revoke access on the same page.
+Explicit activation runs a read-only permission check, which may start a helper without opening a system dialog. Open the [permission page](../cua/README.md) for system requests, settings navigation and automatic refresh. Tasks ask separately before accessing an application. Saved application decisions use the existing profile configuration; session decisions remain in memory across turns and connections until DSH restarts or Computer Use is disabled. Revoke access on the same page.
-----
diff --git a/packages/experimental/cua-bundle/README.zh.md b/packages/experimental/cua-bundle/README.zh.md
index 6c551c5a09..febad6d82b 100644
--- a/packages/experimental/cua-bundle/README.zh.md
+++ b/packages/experimental/cua-bundle/README.zh.md
@@ -33,7 +33,7 @@ pnpm dsh web
源码 Desktop 的启动方式和独立开发配置档见[桌面开发说明](../../../apps/desktop/README.zh.md)。需要使用 Computer Use 的配置档分别开启该功能。
-开关将组合包选择保存到 profile 的 `package.json`。Computer Use 仅安装在 PTC 会话中。从插件列表启用时,系统权限未就绪会显示设置引导;从详情页启用后直接显示权限控件。详情页提供“设为 PTC”按钮来修改新会话默认模式,已有会话保留原 preset。开关保持 PTC 执行方式和其他设置不变。详情页的“设为持久化”按钮单独开启 PTC 跨调用的内存状态保留,作用范围和重载行为见[权限页面](../client-ui-cua/README.zh.md)。提供方加载时准备本机组件,已有与源码摘要匹配的可执行文件时直接复用。
+开关将组合包选择保存到 profile 的 `package.json`。Computer Use 仅安装在 PTC 会话中。从插件列表启用时,系统权限未就绪会显示设置引导;从详情页启用后直接显示权限控件。详情页提供“设为 PTC”按钮来修改新会话默认模式,已有会话保留原 preset。开关保持 PTC 执行方式和其他设置不变。详情页的“设为持久化”按钮单独开启 PTC 跨调用的内存状态保留,作用范围和重载行为见[权限页面](../cua/README.zh.md)。提供方加载时准备本机组件,已有与源码摘要匹配的可执行文件时直接复用。
关闭会卸载提供方,并从其 Agent 作用域中撤回 CUA 工具。执行器配置、新会话默认值和已保存的授权保留。会话级应用授权随提供方卸载而失效。
@@ -41,7 +41,7 @@ Computer Use 要求 DSH Host 运行在 macOS 上。其他系统可以显示入
准备失败时,已保存的选择保留,CUA 操作不可用。查看 Host 的启动诊断,修复原因后重启 DSH。
-显式启用会进行只读权限检查,可能启动 helper,但不会打开系统授权弹窗。[权限页面](../client-ui-cua/README.zh.md) 提供系统申请入口、设置跳转和自动检测。任务访问应用前会单独询问用户。长期应用授权保存在现有 profile 配置中,会话授权保存在内存中,跨 turn 和连接复用,重启 DSH 或关闭 Computer Use 后失效。可以在同一页面撤销授权。
+显式启用会进行只读权限检查,可能启动 helper,但不会打开系统授权弹窗。[权限页面](../cua/README.zh.md) 提供系统申请入口、设置跳转和自动检测。任务访问应用前会单独询问用户。长期应用授权保存在现有 profile 配置中,会话授权保存在内存中,跨 turn 和连接复用,重启 DSH 或关闭 Computer Use 后失效。可以在同一页面撤销授权。
-----
diff --git a/packages/experimental/cua-bundle/cordis.patch.yml b/packages/experimental/cua-bundle/cordis.patch.yml
index e468011f06..99af9b3ccb 100644
--- a/packages/experimental/cua-bundle/cordis.patch.yml
+++ b/packages/experimental/cua-bundle/cordis.patch.yml
@@ -6,4 +6,4 @@
config:
agentPreset: ptc
- id: ui-cua
- name: '@deepseek-ai/dsh-client-ui-cua'
+ name: '@deepseek-ai/dsh-cua'
diff --git a/packages/experimental/cua-bundle/package.json b/packages/experimental/cua-bundle/package.json
index 155345ecc6..546c66db40 100644
--- a/packages/experimental/cua-bundle/package.json
+++ b/packages/experimental/cua-bundle/package.json
@@ -40,7 +40,7 @@
"dependencies": {
"@deepseek-ai/dsh-experimental-cua-macos": "workspace:*",
"@deepseek-ai/dsh-computer-use": "workspace:*",
- "@deepseek-ai/dsh-client-ui-cua": "workspace:*"
+ "@deepseek-ai/dsh-cua": "workspace:*"
},
"peerDependencies": {
"@deepseek-ai/cordis": "workspace:~"
diff --git a/packages/experimental/cua-macos/README.i18n.yaml b/packages/experimental/cua-macos/README.i18n.yaml
index 8e064caef0..e7d55edf7c 100644
--- a/packages/experimental/cua-macos/README.i18n.yaml
+++ b/packages/experimental/cua-macos/README.i18n.yaml
@@ -45,8 +45,8 @@
en: a2c9acb5a4320dda
zh: e8d1586af60215c4
/deepseek-ai-dsh-experimental-cua-macos/known-limitations-and-deferred-work:
- en: 1c42b446c186b01b
- zh: 0f1ecea4fd0a1a13
+ en: de72c8c1184cb8dd
+ zh: 33fd21a93e51fee1
/deepseek-ai-dsh-experimental-cua-macos/known-limitations-and-deferred-work/dev-note:
en: b836f01bd0bceb4a
zh: 8122fa08b2aa95fa
diff --git a/packages/experimental/cua-macos/README.md b/packages/experimental/cua-macos/README.md
index 7700c69ed1..a91c37b885 100644
--- a/packages/experimental/cua-macos/README.md
+++ b/packages/experimental/cua-macos/README.md
@@ -216,7 +216,7 @@ The queue orders individual native requests. Holding an app object does not rese
- macOS Stage Manager can reduce background window bounds and screenshots to thumbnails. Full-window observation and coordinate input in this state are not guaranteed; model guidance requires explaining foreground needs and avoiding repeated focus reclamation.
- Background input depends on private SkyLight symbols; macOS updates can make them unavailable. Validate each target OS version.
- Observed failures include dispatched Unicode text not appearing in Blender and background Command+A not selecting all text in AppKit. Inspect application state after input; a successful tool result confirms dispatch only.
-- Native binaries require a local build. Signing and Desktop distribution remain future work. The [permission page](../client-ui-cua/README.md) offers macOS prompts and app revocation; packaged Desktop permission attribution remains deferred.
+- Native binaries require a local build. Signing and Desktop distribution remain future work. The [permission page](../cua/README.md) offers macOS prompts and app revocation; packaged Desktop permission attribution remains deferred.
- Persistent PTC is an external dependency assumption, not an implementation in this package. Real-model task success requires separate evaluation beyond native and protocol fixtures.
-----
diff --git a/packages/experimental/cua-macos/README.zh.md b/packages/experimental/cua-macos/README.zh.md
index ccd844dcf7..03ff814e8a 100644
--- a/packages/experimental/cua-macos/README.zh.md
+++ b/packages/experimental/cua-macos/README.zh.md
@@ -216,7 +216,7 @@ Use selectText only on controls advertising selectionWritable. It selects a uniq
- macOS 台前调度可能将后台窗口的尺寸与截图变为缩略图,当前无法保证这种状态下的完整画面与坐标输入;模型指引要求说明前台需求并避免反复抢回焦点。
- 后台输入依赖私有 SkyLight 符号,macOS 升级可能使其不可用,需在目标系统版本验证。
- 实测 Blender Unicode 输入曾出现分派成功但界面未显示文本,后台 AppKit 的 Command+A 曾未选中全文。输入后必须检查应用状态;工具返回成功只表示已分派。
-- 原生二进制需要本地构建,签名和桌面分发留待后续。[权限页面](../client-ui-cua/README.zh.md)提供 macOS 申请入口和应用授权撤销;桌面安装包的权限归属留待后续处理。
+- 原生二进制需要本地构建,签名和桌面分发留待后续。[权限页面](../cua/README.zh.md)提供 macOS 申请入口和应用授权撤销;桌面安装包的权限归属留待后续处理。
- 持久 PTC 是对外部运行环境的假设,本包不实现它。真实模型任务成功率需要在原生测试和协议测试之外单独评估。
-----
diff --git a/packages/experimental/cua-macos/tsconfig.json b/packages/experimental/cua-macos/tsconfig.json
index 05a6c912a2..986873b01b 100644
--- a/packages/experimental/cua-macos/tsconfig.json
+++ b/packages/experimental/cua-macos/tsconfig.json
@@ -12,7 +12,7 @@
"path": "../../../vendor/cordis"
},
{
- "path": "../cua"
+ "path": "../cua/tsconfig.host.json"
},
{
"path": "../../subprocess/subprocess"
diff --git a/packages/experimental/cua/README.i18n.yaml b/packages/experimental/cua/README.i18n.yaml
index 5bdc7c755d..d00649e0f8 100644
--- a/packages/experimental/cua/README.i18n.yaml
+++ b/packages/experimental/cua/README.i18n.yaml
@@ -3,8 +3,8 @@
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/experimental/cua/README.md
/:
- en: aa3d316ef17feae7
- zh: 5a30d743ce257d5b
+ en: ed2539c6d12f814a
+ zh: 55a6c9d7f0d21fb7
/deepseek-ai-dsh-cua:
en: 0ef7ee882840cf1b
zh: 01b9e768eff2d302
@@ -15,11 +15,14 @@
en: 4081cf444a77bf20
zh: def91d58969ec281
/deepseek-ai-dsh-cua/use-this-package:
- en: 577e1b18dd220c73
- zh: bde0692c6695d749
+ en: ceb54d964dc355b6
+ zh: 0892066fbceef7b9
+/deepseek-ai-dsh-cua/use-this-package/permission-controls:
+ en: 6873925322180290
+ zh: 218cada140ec90b1
/deepseek-ai-dsh-cua/understand-the-implementation:
- en: 727a4ec9b5cd1789
- zh: 000a6a34b29e1008
+ en: 68fc12448f1f1fc0
+ zh: ea1d489c263c6d71
/deepseek-ai-dsh-cua/further-exploration:
en: b8b0aece886fadaa
zh: ecd8c88d601f2179
diff --git a/packages/experimental/cua/README.md b/packages/experimental/cua/README.md
index 99c32a8c92..d143d12d18 100644
--- a/packages/experimental/cua/README.md
+++ b/packages/experimental/cua/README.md
@@ -1,6 +1,6 @@
---
description: "Reuse Computer Use application and window objects with authorized, logged platform operations."
-kind: "package-library"
+kind: "package-reference"
---
# @deepseek-ai/dsh-cua
@@ -41,6 +41,18 @@ Actions return `dispatched:true, verified:false`; read fresh state to verify the
`click(target, { holdMs: 800 })` holds the mouse button for 800 milliseconds before release. `holdMs` accepts nonnegative integers and applies to each press of a double-click; zero releases without an additional hold. The provider config `maxClickHoldMs` limits explicit holds and defaults to 5000 ms. Explicit holds use pointer input for both AX indices and coordinates; omission preserves ordinary click behavior. The operation deadline includes the hold, and cancellation or timeout releases the button. Received input cannot be undone; forced helper termination cannot guarantee release.
+### Permission controls
+
+The [Computer Use bundle](../cua-bundle/README.md) mounts this page with its native provider. **Authorize Computer Use** groups the new-session default, PTC execution mode, Accessibility, and Screen Recording inside one border, with dividers between the rows. Each system-permission row shows the system-reported responsible application’s `.app` bundle filename and icon together in a bordered label. **Manage applications Computer Use can access** places the application lists inside a separate bordered group. Choose **Request permission**, find that application in the macOS permission list, and enable its switch; if macOS names another application, follow that prompt. With no detected source, the page directs the user to the application named by macOS. **Open System Settings** opens the corresponding privacy pane. The page refreshes on entry, when the window regains focus, and after permission actions. A failed query offers **Retry**. Follow any macOS quit-and-reopen prompt and restart DSH as needed.
+
+System-permission operations affect the computer running DSH. When accessing DSH remotely, complete authorization on that computer.
+
+Enabling from the plugin list shows setup guidance when system permissions need attention, with **Later** and **Open settings** actions. Enabling from the detail page displays the permission controls directly. The detail page provides **Set to PTC** under **Default mode for new sessions**; only this action saves the default. Existing sessions keep their preset. **Use persistent mode** in the **PTC execution mode** row separately saves `ptc-runtime.executionMode: persistent-in-memory`. Switching reloads the shared PTC runtime and may interrupt an active call; subsequent calls retain variables and application objects in memory. Already-persistent runtimes show a disabled **Persistent mode enabled** button.
+
+The page lists always-allowed applications and refusals from any session. A refusal in one session does not cancel another session’s grant or prevent a new session from asking. Session-only grants remain effective within their sessions and are omitted from this page. **Revoke** removes the selected application's access and cancels affected work. Input already delivered to an application cannot be undone; observe the application before any further action. **Allow asking again** clears that application’s refusal records across all sessions; the next application selection still requires a new decision.
+
+The Host marker has no configurable fields; platform providers own native configuration.
+
-----
@@ -57,6 +69,12 @@ The provider calls [installCua](src/index.ts) with its prepared helper, connecti
[The operation schema](src/protocol.ts) is the authority for model parameters and separately declared Host-only fields. Native implementations enforce target identity, window geometry, resource limits, and operating-system access at execution. No invariant companion is published because this library has no separately projected registry or durable state.
+
+The root Host entry exports `installCua`, `CuaConfig`, and the Typert-discovered `CuaAccess` service; its `apply()` only marks the optional Client contribution. `/client` loads the permission UI through the existing module loader. Separate Host and Client compiler projects keep React, CSS, and browser registrations out of headless imports. `/api` owns the app/window API and its types; `/bridge`, `/native-client`, and `/protocol` retain runtime and platform consumers. `/types` exports only the four named boundary types required by generated Remote declarations. The Client uses package-local types. `/typert` supplies Host reflection and `/remote` supplies generated browser descriptors and codecs; permission authority remains on the Host.
+
+The optional browser contribution mounts the native provider's permission Remote and reuses the Plugins activation and configuration slots. The four setup rows remain visible while unknown fields use placeholders. The default-mode form, runtime configuration, system checks, application decisions, and application icons fill in as each query completes. Application names and actions do not wait for icons; icon positions retain their space. User actions run in order without waiting for pending observation queries. Disposal waits for both actions and queries to settle before releasing the separately owned Remote mount. Query errors stay with the affected section, and activation guidance depends only on system checks. Late results after disposal are discarded. One controller projects queries into the page and setup dialog; reconnects and updates to the Host-reported settings namespace refresh it. Operation notices live in the shell overlay, so closing the page does not remove them. The provider owns permission checks, persisted decisions, and cancellation; the browser owns no authorization state.
+
+The detail page reads the effective default (`selectedDefault ?? default`) from the existing `configForms` service. The default button writes only `selectedDefault` through the form's revision-checked settings path. The execution-mode row uses CUA's `ptcConfiguration()` and `enablePersistentPtc()` controls: the Host edits only `ptc-runtime.executionMode` through the existing configuration editor, preserving its ordinary Loader reload lifecycle. Permission checks and runtime state settle independently. Loading, read-only and unavailable settings cannot submit a change; a failed write remains beside the setting for retry.
-----
diff --git a/packages/experimental/cua/README.zh.md b/packages/experimental/cua/README.zh.md
index ad5251c485..0bfcaf6214 100644
--- a/packages/experimental/cua/README.zh.md
+++ b/packages/experimental/cua/README.zh.md
@@ -1,6 +1,6 @@
---
description: "复用 Computer Use 应用和窗口对象,通过已授权并记录日志的平台操作完成任务。"
-kind: "package-library"
+kind: "package-reference"
---
# @deepseek-ai/dsh-cua
@@ -41,6 +41,18 @@ kind: "package-library"
`click(target, { holdMs: 800 })` 按住鼠标按钮 800 毫秒后松开。`holdMs` 接受非负整数,双击时应用于每次按下;0 表示按下后立即松开,不额外等待。提供方配置 `maxClickHoldMs` 限制显式按住时长,默认 5000 毫秒。指定时长后,AX 索引和坐标目标都使用鼠标事件;省略时保留普通点击行为。按住时间计入操作超时,取消或超时会松开按钮。已接收的输入无法撤销;辅助进程被强制终止时无法保证松开。
+### 权限控件
+
+[Computer Use 组合](../cua-bundle/README.zh.md)将本页与原生 provider 一起挂载。“给 Computer Use 授权”把新会话默认模式、PTC 执行方式、辅助功能和屏幕录制放在同一个边框内,四排之间使用分隔线。两条系统权限要求在能识别责任应用时,把该应用的 `.app` 包名称和图标放在同一个标签中。“管理 Computer Use 可访问的应用”使用独立边框包住应用列表。点击“申请权限”,在 macOS 权限列表中找到该应用并开启对应开关;若 macOS 显示其他名称,以系统提示为准。来源无法识别时,页面引导用户查找系统提示的应用。“打开系统设置”会打开对应的隐私设置页。进入详情页、返回窗口或完成授权操作后会自动刷新;查询失败时可点击“重试”。若系统要求退出并重新打开应用,请按提示操作并重新启动 DSH。
+
+系统权限操作作用于运行 DSH 的电脑。远程访问时,请在该电脑上完成授权。
+
+从插件列表启用后,系统权限尚未就绪时会显示设置引导,提供“稍后”和“前往设置”。从详情页启用后直接显示权限控件。详情页的“新会话默认模式”提供“设为 PTC”按钮,仅点击此按钮才保存默认值。已有会话保留原 preset。“PTC 执行方式”一行的“设为持久化”单独保存 `ptc-runtime.executionMode: persistent-in-memory`。切换会重载共享 PTC 执行器,可能打断当前调用;后续调用在内存中保留变量和应用对象。已经使用持久化模式时,按钮显示“已设为持久化”并禁用。
+
+页面展示“始终允许的应用”和“不允许访问的应用”。后者汇总任一会话的拒绝记录,不取消其他会话已有的授权,也不阻止新会话询问授权。会话授权仍在对应会话中生效,详情页不展示这类应用。“撤销”会移除对应应用的访问许可并取消相关操作。已发送到应用的输入无法撤回,继续操作前需重新观察应用。“允许再次询问”清除该应用在所有会话中的拒绝记录;下次选择应用时仍需用户重新决定。
+
+本插件没有配置字段。
+
-----
@@ -57,6 +69,12 @@ kind: "package-library"
[操作 schema](src/protocol.ts) 定义模型参数,并单独声明 Host 专用字段。原生实现在执行时检查目标身份、窗口几何、资源上限和操作系统访问条件。本库没有独立投影的注册表或持久状态,因此不发布 invariant 模块。
+
+根 Host 入口导出 `installCua`、`CuaConfig` 和供 Typert 发现的 `CuaAccess` 服务,`apply()` 只标记可选 Client 贡献。`/client` 通过现有模块加载器加载权限界面。Host 和 Client 使用独立编译项目,headless 导入不会加载 React、CSS 或浏览器注册。`/api` 提供应用、窗口 API 及其类型;`/bridge`、`/native-client` 和 `/protocol` 保留运行时和平台消费者。`/types` 仅导出生成 Remote 声明所需的四个命名类型,Client 使用包内类型。`/typert` 提供 Host 反射,`/remote` 提供浏览器描述和编解码,权限判断仍由 Host 执行。
+
+可选浏览器插件挂载原生 provider 的权限 Remote,复用插件页的启用引导和配置插槽。四排使用条件始终可见,未加载的字段保留占位。默认模式、执行方式、系统权限、应用列表和应用图标分别查询,结果返回后各自显示。应用名称和操作按钮不等待图标,图标位置保留空位。用户操作按顺序执行,不等待尚未完成的查询;卸载时等待操作和查询全部结束,再释放独立持有的 Remote 挂载。查询错误只显示在对应部分,启用引导只等待系统权限结果。卸载后的迟到结果会被丢弃。一个控制器把查询结果投影到页面和设置弹窗;重新连接或 Host 返回的配置 namespace 更新时刷新状态。操作提示挂载到 shell overlay,关闭页面后仍可显示。provider 负责权限检查、持久授权和取消;浏览器不保存授权决定。
+
+详情页通过现有 `configForms` 服务读取实际默认值(`selectedDefault ?? default`)。默认模式按钮仅写入 `selectedDefault`,沿用表单带版本检查的设置写入流程。执行方式一行调用 CUA 的 `ptcConfiguration()` 和 `enablePersistentPtc()`:Host 通过现有配置编辑器仅修改 `ptc-runtime.executionMode`,保留普通 Loader 重载规则。权限检查和执行方式状态独立返回。设置仍在加载、只读或不可用时不能提交;写入失败时在设置旁显示错误,供用户重试。
-----
diff --git a/packages/experimental/cua/package.json b/packages/experimental/cua/package.json
index a28b368b46..a5c7ff5142 100644
--- a/packages/experimental/cua/package.json
+++ b/packages/experimental/cua/package.json
@@ -37,8 +37,8 @@
"default": "./lib/typert.remote-client.js"
},
"./types": {
- "types": "./lib/types/types.d.ts",
- "default": "./lib/types.js"
+ "types": "./lib/types/remote-types.d.ts",
+ "default": "./lib/remote-types.js"
},
"./native-client": {
"types": "./lib/types/native-client.d.ts",
@@ -47,11 +47,14 @@
"./protocol": {
"types": "./lib/types/protocol.d.ts",
"default": "./lib/protocol.js"
+ },
+ "./client": {
+ "types": "./lib/types/client/index.d.ts",
+ "default": "./lib/client.js"
}
},
"files": [
"lib/index.js",
- "lib/types.js",
"lib/api.js",
"lib/bridge.js",
"lib/native-client.js",
@@ -60,7 +63,9 @@
"lib/typert.host.js",
"lib/typert.host.d.ts",
"lib/typert.remote-client.js",
- "lib/typert.remote-client.d.ts"
+ "lib/typert.remote-client.d.ts",
+ "lib/remote-types.js",
+ "lib/client.js"
],
"license": "MIT",
"peerDependencies": {
@@ -116,6 +121,38 @@
"@deepseek-ai/dsh-hmr": "workspace:*",
"@deepseek-ai/cordis-plugin-timer": "workspace:~",
"@deepseek-ai/dsh-scope": "workspace:*",
- "@deepseek-ai/dsh-agent-preset-registry": "workspace:*"
+ "@deepseek-ai/dsh-agent-preset-registry": "workspace:*",
+ "@deepseek-ai/dsh-api-remotes": "workspace:*",
+ "@deepseek-ai/dsh-api-gateway": "workspace:*",
+ "@deepseek-ai/dsh-client-locale": "workspace:*",
+ "@deepseek-ai/dsh-client-store": "workspace:*",
+ "@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
+ "@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
+ "@deepseek-ai/dsh-client-ui-slots": "workspace:*",
+ "@deepseek-ai/dsh-client-ui-plugin-manager": "workspace:*",
+ "@deepseek-ai/dsh-client-ui-settings": "workspace:*",
+ "@deepseek-ai/dsh-client-ui-layout": "workspace:*",
+ "@deepseek-ai/dsh-client-test-runtime": "workspace:*",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "@testing-library/react": "^16.1.0",
+ "@deepseek-ai/dsh-typert-protocol": "workspace:*",
+ "@deepseek-ai/dsh-loader-smoke": "workspace:*"
+ },
+ "dsh": {
+ "client": {
+ "inject": [
+ "@deepseek-ai/dsh-api-remotes",
+ "@deepseek-ai/dsh-client-locale",
+ "@deepseek-ai/dsh-client-ui-plugin-manager",
+ "@deepseek-ai/dsh-client-ui-settings",
+ "@deepseek-ai/dsh-client-ui-layout"
+ ],
+ "platform": "web"
+ }
+ },
+ "scripts": {
+ "bundle": "tsdown",
+ "watch": "tsdown --watch"
}
}
diff --git a/packages/experimental/client-ui-cua/src/client/PermissionPanel.module.css b/packages/experimental/cua/src/client/PermissionPanel.module.css
similarity index 100%
rename from packages/experimental/client-ui-cua/src/client/PermissionPanel.module.css
rename to packages/experimental/cua/src/client/PermissionPanel.module.css
diff --git a/packages/experimental/client-ui-cua/src/client/PermissionPanel.tsx b/packages/experimental/cua/src/client/PermissionPanel.tsx
similarity index 99%
rename from packages/experimental/client-ui-cua/src/client/PermissionPanel.tsx
rename to packages/experimental/cua/src/client/PermissionPanel.tsx
index 535e22b666..8c304ef81d 100644
--- a/packages/experimental/client-ui-cua/src/client/PermissionPanel.tsx
+++ b/packages/experimental/cua/src/client/PermissionPanel.tsx
@@ -4,7 +4,7 @@ import { Button, Modal, Toast } from '@deepseek-ai/dsh-client-ui-primitives'
import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'
import type {} from '@deepseek-ai/dsh-client-ui-plugin-manager/client'
import type { ConfigForm } from '@deepseek-ai/dsh-client-ui-settings/client'
-import type { CuaApplicationGrant, CuaSystemPermissionState } from '@deepseek-ai/dsh-cua/types'
+import type { CuaApplicationGrant, CuaSystemPermissionState } from '../access-types.ts'
import type { PermissionFace } from './controller.ts'
import type { NS } from './locales.ts'
import css from './PermissionPanel.module.css'
diff --git a/packages/experimental/client-ui-cua/src/client/controller.ts b/packages/experimental/cua/src/client/controller.ts
similarity index 98%
rename from packages/experimental/client-ui-cua/src/client/controller.ts
rename to packages/experimental/cua/src/client/controller.ts
index 9a29b04436..c23497c4d7 100644
--- a/packages/experimental/client-ui-cua/src/client/controller.ts
+++ b/packages/experimental/cua/src/client/controller.ts
@@ -1,6 +1,6 @@
/** One query projection for the permission page and activation guidance. */
import { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-store'
-import type { CuaApplicationId, CuaApplicationState, CuaSystemPermission, CuaSystemPermissionState } from '@deepseek-ai/dsh-cua/types'
+import type { CuaApplicationId, CuaApplicationState, CuaSystemPermission, CuaSystemPermissionState } from '../access-types.ts'
/** Host operations available to the permission UI. */
export interface PermissionActions {
diff --git a/packages/experimental/client-ui-cua/src/client/index.ts b/packages/experimental/cua/src/client/index.ts
similarity index 100%
rename from packages/experimental/client-ui-cua/src/client/index.ts
rename to packages/experimental/cua/src/client/index.ts
diff --git a/packages/experimental/client-ui-cua/src/client/locales.ts b/packages/experimental/cua/src/client/locales.ts
similarity index 100%
rename from packages/experimental/client-ui-cua/src/client/locales.ts
rename to packages/experimental/cua/src/client/locales.ts
diff --git a/packages/experimental/client-ui-cua/src/client/mount.ts b/packages/experimental/cua/src/client/mount.ts
similarity index 100%
rename from packages/experimental/client-ui-cua/src/client/mount.ts
rename to packages/experimental/cua/src/client/mount.ts
diff --git a/packages/experimental/client-ui-cua/src/css-modules.d.ts b/packages/experimental/cua/src/css-modules.d.ts
similarity index 100%
rename from packages/experimental/client-ui-cua/src/css-modules.d.ts
rename to packages/experimental/cua/src/css-modules.d.ts
diff --git a/packages/experimental/cua/src/index.ts b/packages/experimental/cua/src/index.ts
index 708830bf2c..1cec00f09a 100644
--- a/packages/experimental/cua/src/index.ts
+++ b/packages/experimental/cua/src/index.ts
@@ -29,7 +29,6 @@ import type {} from '@deepseek-ai/dsh-settings'
import type {} from '@deepseek-ai/cordis-plugin-loader'
export { CuaAccess } from './access.ts'
-export type * from './access-types.ts'
/** Native executable and per-operation resource bounds. */
export interface CuaConfig {
@@ -376,3 +375,6 @@ var cua = connectCua(() => tools.cua, text => console.log(text));`,
}
}, 'dsh-cua.runtime')
}
+
+/** Host marker for the optional Client contribution; platform providers install native execution separately. */
+export function apply(): void {}
diff --git a/packages/experimental/cua/src/remote-types.ts b/packages/experimental/cua/src/remote-types.ts
new file mode 100644
index 0000000000..6c16dde03d
--- /dev/null
+++ b/packages/experimental/cua/src/remote-types.ts
@@ -0,0 +1,3 @@
+/** Named Remote boundary types required by Typert's generated Client declarations. */
+export type { CuaApplicationId } from './application-types.ts'
+export type { CuaApplicationState, CuaSystemPermission, CuaSystemPermissionState } from './access-types.ts'
diff --git a/packages/experimental/cua/src/types.ts b/packages/experimental/cua/src/types.ts
index 2ca68b96a3..1c0511f0ab 100644
--- a/packages/experimental/cua/src/types.ts
+++ b/packages/experimental/cua/src/types.ts
@@ -1,5 +1,4 @@
/** Native application objects independent of evaluator ownership and persistence. */
-export type * from './access-types.ts'
import type { Branded } from '@deepseek-ai/dsh-brand'
import type { JsonValue } from '@deepseek-ai/dsh-util-values'
import type { z } from 'zod'
diff --git a/packages/experimental/client-ui-cua/tests/controller.client.spec.ts b/packages/experimental/cua/tests/controller.client.spec.ts
similarity index 99%
rename from packages/experimental/client-ui-cua/tests/controller.client.spec.ts
rename to packages/experimental/cua/tests/controller.client.spec.ts
index e05f2d5882..82262df31f 100644
--- a/packages/experimental/client-ui-cua/tests/controller.client.spec.ts
+++ b/packages/experimental/cua/tests/controller.client.spec.ts
@@ -1,7 +1,7 @@
/** Permission refreshes preserve observations and join user actions before withdrawal. */
import { setImmediate } from 'node:timers/promises'
import { expect, it, onTestFinished, vi } from 'vitest'
-import type { CuaApplicationId, CuaApplicationState, CuaSystemPermissionState } from '@deepseek-ai/dsh-cua/types'
+import type { CuaApplicationId, CuaApplicationState, CuaSystemPermissionState } from '../src/access-types.ts'
import { PermissionController } from '../src/client/controller.ts'
const value: CuaSystemPermissionState = { accessibility: true, screenRecording: false, helper: { pid: 9 }, parent: { pid: 8 } }
diff --git a/packages/experimental/cua/tests/export-types.spec.ts b/packages/experimental/cua/tests/export-types.spec.ts
new file mode 100644
index 0000000000..d71093f281
--- /dev/null
+++ b/packages/experimental/cua/tests/export-types.spec.ts
@@ -0,0 +1,18 @@
+/** CUA's public types distinguish object consumers from its generated permission transport. */
+import { expectTypeOf, it } from 'vitest'
+import type { CuaApi } from '@deepseek-ai/dsh-cua/api'
+import type { CuaApplicationState } from '@deepseek-ai/dsh-cua/types'
+// @ts-expect-error Permission payloads are not part of the platform-provider root entry.
+import type { CuaSystemPermissionState as RemovedRoot } from '@deepseek-ai/dsh-cua'
+// @ts-expect-error The object API does not expose permission-page state.
+import type { CuaSystemPermissionState as RemovedApi } from '@deepseek-ai/dsh-cua/api'
+// @ts-expect-error Object interfaces use /api; /types is the generated Remote type entry.
+import type { CuaApi as RemovedTypes } from '@deepseek-ai/dsh-cua/types'
+// @ts-expect-error The nested grant structure is internal, not an independently exported type.
+import type { CuaApplicationGrant as RemovedGrant } from '@deepseek-ai/dsh-cua/types'
+
+it('keeps application operations and the necessary Remote payload types available', () => {
+ expectTypeOf().toHaveProperty('getApp')
+ expectTypeOf().toHaveProperty('allowedApps')
+ expectTypeOf<[RemovedRoot, RemovedApi, RemovedTypes, RemovedGrant]>().toBeArray()
+})
diff --git a/packages/experimental/cua/tests/exports.built.e2e.ts b/packages/experimental/cua/tests/exports.built.e2e.ts
new file mode 100644
index 0000000000..9300b946d5
--- /dev/null
+++ b/packages/experimental/cua/tests/exports.built.e2e.ts
@@ -0,0 +1,18 @@
+/** Published CUA entries retain headless isolation and the existing generated transport. */
+import { execFile } from 'node:child_process'
+import { fileURLToPath } from 'node:url'
+import { promisify } from 'node:util'
+import { resolveExampleLaunch } from '@deepseek-ai/dsh-loader-smoke'
+import { expect, it, onTestFinished } from 'vitest'
+
+it('loads the built Host, object API and native exports without Client dependencies', async () => {
+ const fixture = fileURLToPath(new URL('./fixtures/exports.mjs', import.meta.url))
+ const launch = resolveExampleLaunch({ srcBin: fixture, libBin: fixture, mode: 'lib' })
+ const controller = new AbortController()
+ const child = promisify(execFile)(launch.command, launch.args, { signal: controller.signal })
+ onTestFinished(async () => {
+ controller.abort()
+ await child.catch(() => { /* A failed or cancelled fixture is asserted by the test. */ })
+ })
+ expect((await child).stdout).toBe('headless exports and generated Remote passed\n')
+})
diff --git a/packages/experimental/cua/tests/fixtures/exports.mjs b/packages/experimental/cua/tests/fixtures/exports.mjs
new file mode 100644
index 0000000000..aa1625007c
--- /dev/null
+++ b/packages/experimental/cua/tests/fixtures/exports.mjs
@@ -0,0 +1,28 @@
+/** Built package smoke: headless consumers must not import the browser implementation. */
+import assert from 'node:assert/strict'
+import { registerHooks } from 'node:module'
+
+const guard = registerHooks({
+ resolve(specifier, context, next) {
+ assert(!/^(?:react(?:-dom)?(?:\/|$)|@deepseek-ai\/dsh-client-)/.test(specifier), `Headless import reached ${specifier}`)
+ const result = next(specifier, context)
+ assert(!/\/cua\/lib\/(?:client(?:\/|\.)|types\/client\/)/.test(result.url), `Headless import reached ${result.url}`)
+ return result
+ },
+})
+const { Context } = await import('@deepseek-ai/cordis')
+const host = await import('@deepseek-ai/dsh-cua')
+const { createCuaApi } = await import('@deepseek-ai/dsh-cua/api')
+const { connectCua } = await import('@deepseek-ai/dsh-cua/bridge')
+const { NativeClient } = await import('@deepseek-ai/dsh-cua/native-client')
+const { Request } = await import('@deepseek-ai/dsh-cua/protocol')
+for (const callable of [host.apply, host.installCua, host.CuaAccess, createCuaApi, connectCua, NativeClient]) assert.equal(typeof callable, 'function')
+assert.equal(Request.parse({ method: 'getCapabilities', params: {} }).method, 'getCapabilities')
+const ctx = new Context()
+try { await ctx.plugin(host); assert.equal(ctx.get('cuaAccess'), undefined) }
+finally { await ctx.fiber.dispose() }
+guard.deregister()
+const remote = await import('@deepseek-ai/dsh-cua/remote')
+assert.equal(remote.default.package, '@deepseek-ai/dsh-cua')
+assert.equal(remote.default.descriptors.length, 9)
+process.stdout.write('headless exports and generated Remote passed\n')
diff --git a/packages/experimental/client-ui-cua/tests/mount.client.spec.ts b/packages/experimental/cua/tests/mount.client.spec.ts
similarity index 96%
rename from packages/experimental/client-ui-cua/tests/mount.client.spec.ts
rename to packages/experimental/cua/tests/mount.client.spec.ts
index 904a8453fc..dbf16c9a3b 100644
--- a/packages/experimental/client-ui-cua/tests/mount.client.spec.ts
+++ b/packages/experimental/cua/tests/mount.client.spec.ts
@@ -6,7 +6,7 @@ import { LocaleRuntime } from '@deepseek-ai/dsh-client-locale/client'
import { SlotRegistry } from '@deepseek-ai/dsh-client-ui-renderer/client'
import { createSnapshotStore } from '@deepseek-ai/dsh-client-store'
import { RemoteError, type RemoteResult, type TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'
-import type { CuaApplicationState, CuaSystemPermissionState } from '@deepseek-ai/dsh-cua/types'
+import type { CuaApplicationState, CuaSystemPermissionState } from '../src/access-types.ts'
import { expect, it, vi } from 'vitest'
import type { PermissionFace } from '../src/client/controller.ts'
import { mountCuaPermissions, inject } from '../src/client/mount.ts'
@@ -86,17 +86,17 @@ it('withdraws the permission Remote and all controls with the optional plugin',
await vi.waitFor(() => { expect(actions.hooks.cuaPermissions.getSnapshot().toast?.kind).toBe('requested') })
actions.openSettings('screenRecording')
await vi.waitFor(() => { expect(actions.hooks.cuaPermissions.getSnapshot().toast?.kind).toBe('opened') })
- actions.revoke('a'.repeat(64) as import('@deepseek-ai/dsh-cua/types').CuaApplicationId)
+ actions.revoke('a'.repeat(64) as import('../src/access-types.ts').CuaApplicationId)
await vi.waitFor(() => { expect(actions.hooks.cuaPermissions.getSnapshot().toast?.kind).toBe('revoked') })
- actions.retryApproval('a'.repeat(64) as import('@deepseek-ai/dsh-cua/types').CuaApplicationId)
+ actions.retryApproval('a'.repeat(64) as import('../src/access-types.ts').CuaApplicationId)
await vi.waitFor(() => { expect(actions.hooks.cuaPermissions.getSnapshot().toast?.kind).toBe('retryAllowed') })
const failed = { ok: false as const, error: new RemoteError('gateway/internal', 'offline', {}) }
for (const [target, invoke] of [
[f.runtimeConfiguration, actions.refresh], [f.status, actions.refresh], [f.systemStatus, actions.refresh],
[f.applicationIcons, actions.refresh], [f.requestPermission, () => { actions.request('accessibility') }],
[f.openSettings, () => { actions.openSettings('accessibility') }],
- [f.revoke, () => { actions.revoke('a'.repeat(64) as import('@deepseek-ai/dsh-cua/types').CuaApplicationId) }],
- [f.retryApproval, () => { actions.retryApproval('a'.repeat(64) as import('@deepseek-ai/dsh-cua/types').CuaApplicationId) }],
+ [f.revoke, () => { actions.revoke('a'.repeat(64) as import('../src/access-types.ts').CuaApplicationId) }],
+ [f.retryApproval, () => { actions.retryApproval('a'.repeat(64) as import('../src/access-types.ts').CuaApplicationId) }],
] as const) {
actions.refresh()
await vi.waitFor(() => { expect(actions.hooks.cuaPermissions.getSnapshot().busy).toBe(false) })
@@ -156,7 +156,7 @@ it.each(['plugin', 'root'])('keeps the Remote mounted until an accepted revoke c
const fiber = await f.ctx.plugin({ inject: [...inject], apply: ctx => mountCuaPermissions(ctx, contribution) })
const actions = f.ctx.slots.entries('plugins.bundle.config')[0]!.inject!()
actionsOf(actions)
- actions.revoke('a'.repeat(64) as import('@deepseek-ai/dsh-cua/types').CuaApplicationId)
+ actions.revoke('a'.repeat(64) as import('../src/access-types.ts').CuaApplicationId)
await entered.promise
let closed = false
closing = Promise.resolve(owner === 'plugin' ? fiber.dispose() : f.ctx.fiber.dispose()).then(() => { closed = true })
diff --git a/packages/experimental/client-ui-cua/tests/panel.client.spec.tsx b/packages/experimental/cua/tests/panel.client.spec.tsx
similarity index 99%
rename from packages/experimental/client-ui-cua/tests/panel.client.spec.tsx
rename to packages/experimental/cua/tests/panel.client.spec.tsx
index 0d47ad25b6..d0117edee6 100644
--- a/packages/experimental/client-ui-cua/tests/panel.client.spec.tsx
+++ b/packages/experimental/cua/tests/panel.client.spec.tsx
@@ -3,7 +3,7 @@
import { act, cleanup, fireEvent, render, screen, waitFor, within } from '@testing-library/react'
import { bindSnapshotSelector, makeTranslate } from '@deepseek-ai/dsh-client-test-runtime'
import { createSnapshotStore } from '@deepseek-ai/dsh-client-store'
-import type { CuaApplicationId, CuaApplicationState, CuaSystemPermissionState } from '@deepseek-ai/dsh-cua/types'
+import type { CuaApplicationId, CuaApplicationState, CuaSystemPermissionState } from '../src/access-types.ts'
import type { ConfigFormSnapshot } from '@deepseek-ai/dsh-client-ui-settings/client'
import { afterEach, expect, it, vi } from 'vitest'
import { PermissionPanel, PermissionSetup, PermissionToast, type PermissionPanelProps } from '../src/client/PermissionPanel.tsx'
diff --git a/packages/experimental/client-ui-cua/tsconfig.json b/packages/experimental/cua/tsconfig.client.json
similarity index 78%
rename from packages/experimental/client-ui-cua/tsconfig.json
rename to packages/experimental/cua/tsconfig.client.json
index 66cf034b76..03db4207e8 100644
--- a/packages/experimental/client-ui-cua/tsconfig.json
+++ b/packages/experimental/cua/tsconfig.client.json
@@ -2,10 +2,15 @@
"extends": "../../../tsconfig.base.client.json",
"compilerOptions": {
"rootDir": "src",
- "outDir": "lib/types"
+ "outDir": "lib/types",
+ "tsBuildInfoFile": "lib/tsconfig.client.tsbuildinfo"
},
"include": [
- "src"
+ "src/client",
+ "src/css-modules.d.ts",
+ "src/access-types.ts",
+ "src/application-types.ts",
+ "src/remote-types.ts"
],
"references": [
{
@@ -42,10 +47,10 @@
"path": "../../api/gateway/tsconfig.client.json"
},
{
- "path": "../cua"
+ "path": "../../typert/protocol"
},
{
- "path": "../../typert/protocol"
+ "path": "../../util/brand"
}
]
}
diff --git a/packages/experimental/cua/tsconfig.host.json b/packages/experimental/cua/tsconfig.host.json
new file mode 100644
index 0000000000..ebeaed4918
--- /dev/null
+++ b/packages/experimental/cua/tsconfig.host.json
@@ -0,0 +1,73 @@
+{
+ "extends": "../../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "lib/types",
+ "tsBuildInfoFile": "lib/tsconfig.host.tsbuildinfo"
+ },
+ "include": [
+ "src/*.ts"
+ ],
+ "references": [
+ {
+ "path": "../../../vendor/cordis"
+ },
+ {
+ "path": "../../../vendor/schemastery"
+ },
+ {
+ "path": "../../computer-use/computer-use"
+ },
+ {
+ "path": "../../core/tools"
+ },
+ {
+ "path": "../../core/system-prompt"
+ },
+ {
+ "path": "../../core/agent"
+ },
+ {
+ "path": "../../subprocess/subprocess"
+ },
+ {
+ "path": "../../util/values"
+ },
+ {
+ "path": "../../util/brand"
+ },
+ {
+ "path": "../../util/atomic-write"
+ },
+ {
+ "path": "../../ptc-runtime/ptc-runtime"
+ },
+ {
+ "path": "../../typert/protocol"
+ },
+ {
+ "path": "../../settings/settings"
+ },
+ {
+ "path": "../../interaction/user-questions"
+ },
+ {
+ "path": "../../../vendor/loader"
+ },
+ {
+ "path": "../../attachment/attachment"
+ },
+ {
+ "path": "../../llm/llm"
+ },
+ {
+ "path": "../../core/scope"
+ },
+ {
+ "path": "../../preset/agent-preset-registry"
+ }
+ ],
+ "exclude": [
+ "src/css-modules.d.ts"
+ ]
+}
diff --git a/packages/experimental/cua/tsconfig.json b/packages/experimental/cua/tsconfig.json
index cb086d3e6f..2eca820546 100644
--- a/packages/experimental/cua/tsconfig.json
+++ b/packages/experimental/cua/tsconfig.json
@@ -1,69 +1,11 @@
{
- "extends": "../../../tsconfig.base.json",
- "compilerOptions": {
- "rootDir": "src",
- "outDir": "lib/types"
- },
- "include": [
- "src"
- ],
+ "files": [],
"references": [
{
- "path": "../../../vendor/cordis"
+ "path": "./tsconfig.host.json"
},
{
- "path": "../../../vendor/schemastery"
- },
- {
- "path": "../../computer-use/computer-use"
- },
- {
- "path": "../../core/tools"
- },
- {
- "path": "../../core/system-prompt"
- },
- {
- "path": "../../core/agent"
- },
- {
- "path": "../../subprocess/subprocess"
- },
- {
- "path": "../../util/values"
- },
- {
- "path": "../../util/brand"
- },
- {
- "path": "../../util/atomic-write"
- },
- {
- "path": "../../ptc-runtime/ptc-runtime"
- },
- {
- "path": "../../typert/protocol"
- },
- {
- "path": "../../settings/settings"
- },
- {
- "path": "../../interaction/user-questions"
- },
- {
- "path": "../../../vendor/loader"
- },
- {
- "path": "../../attachment/attachment"
- },
- {
- "path": "../../llm/llm"
- },
- {
- "path": "../../core/scope"
- },
- {
- "path": "../../preset/agent-preset-registry"
+ "path": "./tsconfig.client.json"
}
]
}
diff --git a/packages/experimental/cua/tsdown.config.ts b/packages/experimental/cua/tsdown.config.ts
index f0d407249f..5dac622abb 100644
--- a/packages/experimental/cua/tsdown.config.ts
+++ b/packages/experimental/cua/tsdown.config.ts
@@ -1,10 +1,13 @@
-import { defineConfig } from 'tsdown'
+import type { UserConfig } from 'tsdown'
+import { clientBundle } from '../../client/tsdown.client.ts'
-export default defineConfig(Object.entries({
- index: 'lib/types/index.js', types: 'lib/types/types.js', api: 'lib/types/api.js', bridge: 'lib/types/bridge.js',
+const runtime: UserConfig[] = Object.entries({
+ 'remote-types': 'lib/types/remote-types.js', api: 'lib/types/api.js', bridge: 'lib/types/bridge.js',
'native-client': 'lib/types/native-client.js', protocol: 'lib/types/protocol.js',
}).map(([name, path]) => ({
entry: { [name]: path },
outDir: 'lib', format: ['esm'], platform: 'node', target: 'es2024',
fixedExtension: false, dts: false, clean: false,
-})))
+}))
+
+export default clientBundle(import.meta.dirname, ['lib/types/index.js'], { hostPhase: true, companions: runtime })
diff --git a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
index ba5123c9b4..98ab21a6b9 100644
--- a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
+++ b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts
@@ -2286,8 +2286,8 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
slotInject: '',
declaredBy: 'an entry in \'main\' (client-ui-plugin-manager), so it exists while that entry is mounted',
occupants: [
- 'client-ui-cua PermissionSetup key \'@deepseek-ai/dsh-cua-bundle\'',
'experimental-client-ui-voice-input VoiceSetupPrompt key \'@deepseek-ai/dsh-experimental-voice-input-bundle\'',
+ 'cua PermissionSetup key \'@deepseek-ai/dsh-cua-bundle\'',
],
replaceRisk: 'shadows-shipped-ui',
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.bundle.activation\', () => ctx.slots.register(\n { name: \'plugins.bundle.activation\', key: \'\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
@@ -2330,8 +2330,8 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
declaredBy: 'an entry in \'main\' (client-ui-plugin-manager), so it exists while that entry is mounted',
occupants: [
'experimental-client-ui-cot-translation TranslationSettings key \'@deepseek-ai/dsh-experimental-cot-translation-bundle\'',
- 'client-ui-cua PermissionPanel key \'@deepseek-ai/dsh-cua-bundle\'',
'experimental-client-ui-voice-input VoicePreparation key \'@deepseek-ai/dsh-experimental-voice-input-bundle\'',
+ 'cua PermissionPanel key \'@deepseek-ai/dsh-cua-bundle\'',
],
replaceRisk: 'shadows-shipped-ui',
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.bundle.config\', () => ctx.slots.register(\n { name: \'plugins.bundle.config\', key: \'\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
@@ -3401,7 +3401,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
'client-ui-workspace SessionRenameDialog id \'workspace.session-rename\'',
'client-ui-workspace SessionArchiveConfirmDialog id \'workspace.session-archive\'',
'client-ui-workspace RowActionToast id \'workspace.row-toast\'',
- 'client-ui-cua PermissionToast id \'cua-permission-outcome\'',
+ 'cua PermissionToast id \'cua-permission-outcome\'',
],
replaceRisk: 'none',
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'shell.overlay\', () => ctx.slots.register(\n { name: \'shell.overlay\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
diff --git a/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md b/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md
index 51e9d4b72d..cd38b17726 100644
--- a/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md
+++ b/packages/preset/agent-preset/skills/cordis-composition-reference/references/packages.md
@@ -184,7 +184,6 @@ Every package below exports a Cordis plugin that a bundle patch can name in a Lo
| Package | Config | Description |
|---|---|---|
-| `@deepseek-ai/dsh-client-ui-cua` | no | Computer Use permission setup and application access controls |
| `@deepseek-ai/dsh-experimental-agent-team` | yes | Implicit-root Agent Teams roster, direct peer messaging, and shared task DAG |
| `@deepseek-ai/dsh-experimental-api-speech-to-text` | yes | Authenticated experimental speech transcription for browser clients |
| `@deepseek-ai/dsh-experimental-auto-review` | no | Per-tool LLM authorization review for the DeepSeek Harness Auto permission preset |
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5c0a6f3c23..95dc195b0e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8301,60 +8301,6 @@ importers:
specifier: ^18.2.0
version: 18.3.1(react@18.3.1)
- packages/experimental/client-ui-cua:
- devDependencies:
- '@deepseek-ai/cordis':
- specifier: workspace:~
- version: link:../../../vendor/cordis
- '@deepseek-ai/dsh-api-gateway':
- specifier: workspace:*
- version: link:../../api/gateway
- '@deepseek-ai/dsh-api-remotes':
- specifier: workspace:*
- version: link:../../api/remotes
- '@deepseek-ai/dsh-client-locale':
- specifier: workspace:*
- version: link:../../client/locale
- '@deepseek-ai/dsh-client-store':
- specifier: workspace:*
- version: link:../../client/store
- '@deepseek-ai/dsh-client-test-runtime':
- specifier: workspace:*
- version: link:../../test-support/client-runtime
- '@deepseek-ai/dsh-client-ui-layout':
- specifier: workspace:*
- version: link:../../client/ui-layout
- '@deepseek-ai/dsh-client-ui-plugin-manager':
- specifier: workspace:*
- version: link:../../client/ui-plugin-manager
- '@deepseek-ai/dsh-client-ui-primitives':
- specifier: workspace:*
- version: link:../../client/ui-primitives
- '@deepseek-ai/dsh-client-ui-renderer':
- specifier: workspace:*
- version: link:../../client/ui-renderer
- '@deepseek-ai/dsh-client-ui-settings':
- specifier: workspace:*
- version: link:../../client/ui-settings
- '@deepseek-ai/dsh-client-ui-slots':
- specifier: workspace:*
- version: link:../../client/ui-slots
- '@deepseek-ai/dsh-cua':
- specifier: workspace:*
- version: link:../cua
- '@deepseek-ai/dsh-typert-protocol':
- specifier: workspace:*
- version: link:../../typert/protocol
- '@testing-library/react':
- specifier: ^16.1.0
- version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react:
- specifier: ^18.2.0
- version: 18.3.1
- react-dom:
- specifier: ^18.2.0
- version: 18.3.1(react@18.3.1)
-
packages/experimental/client-ui-voice-input:
devDependencies:
'@deepseek-ai/cordis':
@@ -8586,6 +8532,12 @@ importers:
'@deepseek-ai/dsh-agent-preset-registry':
specifier: workspace:*
version: link:../../preset/agent-preset-registry
+ '@deepseek-ai/dsh-api-gateway':
+ specifier: workspace:*
+ version: link:../../api/gateway
+ '@deepseek-ai/dsh-api-remotes':
+ specifier: workspace:*
+ version: link:../../api/remotes
'@deepseek-ai/dsh-app-boot':
specifier: workspace:*
version: link:../../boot/app-boot
@@ -8595,6 +8547,33 @@ importers:
'@deepseek-ai/dsh-attachment-local':
specifier: workspace:*
version: link:../../attachment/attachment-local
+ '@deepseek-ai/dsh-client-locale':
+ specifier: workspace:*
+ version: link:../../client/locale
+ '@deepseek-ai/dsh-client-store':
+ specifier: workspace:*
+ version: link:../../client/store
+ '@deepseek-ai/dsh-client-test-runtime':
+ specifier: workspace:*
+ version: link:../../test-support/client-runtime
+ '@deepseek-ai/dsh-client-ui-layout':
+ specifier: workspace:*
+ version: link:../../client/ui-layout
+ '@deepseek-ai/dsh-client-ui-plugin-manager':
+ specifier: workspace:*
+ version: link:../../client/ui-plugin-manager
+ '@deepseek-ai/dsh-client-ui-primitives':
+ specifier: workspace:*
+ version: link:../../client/ui-primitives
+ '@deepseek-ai/dsh-client-ui-renderer':
+ specifier: workspace:*
+ version: link:../../client/ui-renderer
+ '@deepseek-ai/dsh-client-ui-settings':
+ specifier: workspace:*
+ version: link:../../client/ui-settings
+ '@deepseek-ai/dsh-client-ui-slots':
+ specifier: workspace:*
+ version: link:../../client/ui-slots
'@deepseek-ai/dsh-computer-use':
specifier: workspace:*
version: link:../../computer-use/computer-use
@@ -8613,6 +8592,9 @@ importers:
'@deepseek-ai/dsh-llm-deepseek':
specifier: workspace:*
version: link:../../llm/llm-deepseek
+ '@deepseek-ai/dsh-loader-smoke':
+ specifier: workspace:*
+ version: link:../../test-support/loader-smoke
'@deepseek-ai/dsh-ptc-runtime':
specifier: workspace:*
version: link:../../ptc-runtime/ptc-runtime
@@ -8655,18 +8637,27 @@ importers:
'@deepseek-ai/dsh-working-directory':
specifier: workspace:*
version: link:../../session/working-directory
+ '@testing-library/react':
+ specifier: ^16.1.0
+ version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react:
+ specifier: ^18.2.0
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.2.0
+ version: 18.3.1(react@18.3.1)
sharp:
specifier: ^0.35.3
version: 0.35.5(@types/node@22.20.1)
packages/experimental/cua-bundle:
dependencies:
- '@deepseek-ai/dsh-client-ui-cua':
- specifier: workspace:*
- version: link:../client-ui-cua
'@deepseek-ai/dsh-computer-use':
specifier: workspace:*
version: link:../../computer-use/computer-use
+ '@deepseek-ai/dsh-cua':
+ specifier: workspace:*
+ version: link:../cua
'@deepseek-ai/dsh-experimental-cua-macos':
specifier: workspace:*
version: link:../cua-macos
diff --git a/scripts/check-workspace-constraints.ts b/scripts/check-workspace-constraints.ts
index f346e4e9f6..108a345794 100644
--- a/scripts/check-workspace-constraints.ts
+++ b/scripts/check-workspace-constraints.ts
@@ -181,7 +181,7 @@ const packageFileExtras: Readonly> = {
// The embedded OAR implementation retains its upstream license.
'@deepseek-ai/dsh-experimental-subagent-oar': ['LICENSE-OAR'],
// CUA publishes its client API and attributed native source for local macOS builds.
- '@deepseek-ai/dsh-cua': ['lib/types.js', 'lib/api.js', 'lib/bridge.js', 'lib/native-client.js', 'lib/protocol.js'],
+ '@deepseek-ai/dsh-cua': ['lib/remote-types.js', 'lib/api.js', 'lib/bridge.js', 'lib/native-client.js', 'lib/protocol.js'],
'@deepseek-ai/dsh-experimental-cua-macos': ['native/bin', 'native/Package.swift', 'native/Sources', 'native/tests/swift', 'native/tests/test_swift.py', 'native/LICENSE.cua-driver', 'native/upstream.json', 'native/README.md', 'native/README.zh.md', 'native/protocol.schema.json'],
'@deepseek-ai/dsh-webhook-github': ['examples/github-review/cordis.yml', 'examples/github-review/github-ready-review-rule.mjs'],
// Owned Worker bundles import this public bootstrap before their business entry.
diff --git a/scripts/experimental-package-policy.ts b/scripts/experimental-package-policy.ts
index 5763dbdedc..44fbd52ebe 100644
--- a/scripts/experimental-package-policy.ts
+++ b/scripts/experimental-package-policy.ts
@@ -4,7 +4,6 @@
export const EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS: Readonly> = {
'packages/experimental/cua': '@deepseek-ai/dsh-cua',
'packages/experimental/cua-bundle': '@deepseek-ai/dsh-cua-bundle',
- 'packages/experimental/client-ui-cua': '@deepseek-ai/dsh-client-ui-cua',
'packages/experimental/tool-session-query': '@deepseek-ai/dsh-tool-session-query',
'packages/experimental/session-title-all-prompts-llm': '@deepseek-ai/dsh-session-title-all-prompts-llm',
'packages/experimental/tool-terminal': '@deepseek-ai/dsh-tool-terminal',
diff --git a/scripts/gen-doc-graphs.ts b/scripts/gen-doc-graphs.ts
index 9123b5211e..94d7ff7c34 100644
--- a/scripts/gen-doc-graphs.ts
+++ b/scripts/gen-doc-graphs.ts
@@ -225,7 +225,7 @@ const SERVICE_ROLES: ServiceRole[] = [
},
{
key: 'cuaAccess', pkg: 'cua', title: 'Computer Use permission controls',
- mode: 'core', consumers: ['client-ui-cua'],
+ mode: 'core', consumers: ['cua'],
note: 'The native provider owns application consent and cancellation; the optional Client page queries and changes those decisions through its Remote.',
},
{
diff --git a/scripts/release/families.spec.ts b/scripts/release/families.spec.ts
index c60e4aef1a..5ead068208 100644
--- a/scripts/release/families.spec.ts
+++ b/scripts/release/families.spec.ts
@@ -62,7 +62,6 @@ describe('release families', () => {
'@deepseek-ai/dsh-experimental-client-ui-agent-team',
'@deepseek-ai/dsh-experimental-client-ui-claude-code-mods',
'@deepseek-ai/dsh-experimental-client-ui-cot-translation',
- '@deepseek-ai/dsh-client-ui-cua',
'@deepseek-ai/dsh-experimental-client-ui-voice-input',
'@deepseek-ai/dsh-experimental-computer-use-cua-driver-mcp',
'@deepseek-ai/dsh-experimental-computer-use-cua-driver-native',
diff --git a/scripts/verify-package-readme-model-experience.ts b/scripts/verify-package-readme-model-experience.ts
index bed5aa89d8..2c313a3dea 100644
--- a/scripts/verify-package-readme-model-experience.ts
+++ b/scripts/verify-package-readme-model-experience.ts
@@ -144,7 +144,6 @@ const SENTENCE_MODEL_EXPERIENCE: Readonly> = {
'packages/client/ui-permission-presets': { kind: 'indirect', reason: 'The picker submits the host /permission command; the knob events it appends own the model-visible effect through the sandbox/approval consumers.' },
'packages/client/ui-settings-plugins': { kind: 'none', reason: 'Browser-side settings surface; registers no model surface.' },
'packages/client/ui-settings-shell': { kind: 'none', reason: 'Browser-side settings surface; registers no model surface.' },
- 'packages/experimental/client-ui-cua': { kind: 'none', reason: 'Browser permission controls; the native provider owns tools and guidance.' },
'packages/client/ui-settings-session-log': { kind: 'none', reason: 'Browser preference controls request metadata, not model input.' },
'packages/client/ui-settings-agent-loop': { kind: 'none', reason: 'Browser-side settings surface; registers no model surface.' },
'packages/client/ui-settings-subagent': { kind: 'none', reason: 'Browser-side settings surface; registers no model surface.' },
diff --git a/tsconfig.base.json b/tsconfig.base.json
index ab576e768b..95528a8c0b 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -302,9 +302,8 @@
"@deepseek-ai/dsh-experimental-client-ui-agent-team/client": ["./packages/experimental/client-ui-agent-team/src/client/index.ts"],
"@deepseek-ai/dsh-client-ui-settings-plugins": ["./packages/client/ui-settings-plugins/src"],
"@deepseek-ai/dsh-client-ui-settings-shell": ["./packages/client/ui-settings-shell/src"],
- "@deepseek-ai/dsh-client-ui-cua": ["./packages/experimental/client-ui-cua/src/index.ts"],
- "@deepseek-ai/dsh-client-ui-cua/client": ["./packages/experimental/client-ui-cua/src/client/index.ts"],
- "@deepseek-ai/dsh-cua/types": ["./packages/experimental/cua/src/types.ts"],
+ "@deepseek-ai/dsh-cua/client": ["./packages/experimental/cua/src/client/index.ts"],
+ "@deepseek-ai/dsh-cua/types": ["./packages/experimental/cua/src/remote-types.ts"],
"@deepseek-ai/dsh-client-ui-settings-agent-loop": ["./packages/client/ui-settings-agent-loop/src"],
"@deepseek-ai/dsh-client-ui-settings-session-log": ["./packages/client/ui-settings-session-log/src"],
"@deepseek-ai/dsh-client-ui-settings-subagent": ["./packages/client/ui-settings-subagent/src"],
diff --git a/tsconfig.client.json b/tsconfig.client.json
index 7bf256becb..c335a29e83 100644
--- a/tsconfig.client.json
+++ b/tsconfig.client.json
@@ -131,7 +131,7 @@
{ "path": "./packages/client/ui-settings-plugins" },
{ "path": "./packages/client/ui-settings-shell" },
{ "path": "./packages/client/ui-settings-agent-loop" },
- { "path": "./packages/experimental/client-ui-cua" },
+ { "path": "./packages/experimental/cua/tsconfig.client.json" },
{ "path": "./packages/client/ui-settings-session-log" },
{ "path": "./packages/client/ui-settings-subagent" },
{ "path": "./packages/client/ui-settings-web-search" },
diff --git a/tsconfig.host.json b/tsconfig.host.json
index a267f50f63..1ae120dd29 100644
--- a/tsconfig.host.json
+++ b/tsconfig.host.json
@@ -276,7 +276,7 @@
{ "path": "./packages/computer-use/computer-use" },
{ "path": "./packages/experimental/computer-use-cua-driver-mcp" },
{ "path": "./packages/experimental/computer-use-cua-driver-native" },
- { "path": "./packages/experimental/cua" },
+ { "path": "./packages/experimental/cua/tsconfig.host.json" },
{ "path": "./packages/experimental/cua-bundle" },
{ "path": "./packages/experimental/cua-macos" },
{ "path": "./packages/client/ui-sidebar-documentpreview/tsconfig.host.json" },
diff --git a/vitest.config.ts b/vitest.config.ts
index 7857266cd1..56d206808f 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -333,7 +333,7 @@ export default defineConfig({
'packages/experimental/client-ui-voice-input/src/client/index.ts',
// The permission entry binds generated Remote code; cua-permissions.e2e.ts covers
// its built entry, while source tests exercise mountCuaPermissions and its UI.
- 'packages/experimental/client-ui-cua/src/client/index.ts',
+ 'packages/experimental/cua/src/client/index.ts',
// The mods band entry imports the bridge's generated Remote contribution, which exists only in lib;
// the Web snapshot exercises the built entry, while source tests cover mountModsBand.
'packages/experimental/client-ui-claude-code-mods/src/client/index.ts',