merge(cua): integrate combined Host and Client package from basic onboarding

This commit is contained in:
creatixchu committed 2026-10-19 19:53:37 +08:00
commit 98f126e032
73 files changed
+390 -534

No files matched your search

@@ -9,8 +9,8 @@
en: 2ba6c43b20a3d347
zh: 5647179ddaa38ad9
/agent-note-ship-experimental-capabilities-as-optional-bundles/decision:
en: 8bfcb14ebbc4fd0e
zh: af028b545fac806a
en: e28694eaf87ec685
zh: b14c6e817a6186a9
/agent-note-ship-experimental-capabilities-as-optional-bundles/alternatives-considered:
en: d6f40bf02df37ab7
zh: e5b85ce9d41e8754
@@ -20,7 +20,7 @@ Claude Code and Codex install on demand through the separate `ON_DEMAND_BUNDLES`
Computer Use is a shipped optional bundle in the experimental group. Its repository-owned native component is prepared only for enabled profiles, without an external Cua Driver runtime. It declares `dsh.bundle.experimental: true` for the experimental card label; existing experimental package names retain their labels.
The CUA 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.
The CUA 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.
## Alternatives considered
@@ -20,7 +20,7 @@ Claude Code 与 Codex 通过独立的 `ON_DEMAND_BUNDLES` 目录按需安装,
Computer Use 是 experimental 包组内随安装提供的可选组合包。其仓库自有原生组件只为已启用的配置档准备,不引入外部 Cua Driver 运行时。它通过 `dsh.bundle.experimental: true` 显示实验性卡片标签;已有实验包名保留对应标签。
CUA 组合包和前端插件与 `@deepseek-ai/dsh-cua` 一起采用显式命名例外 `@deepseek-ai/dsh-cua-bundle`、`@deepseek-ai/dsh-client-ui-cua`,在能力移动分组时保留配置引用。依赖隔离和晋升仍由实验性分类约束。
CUA 组合包与 `@deepseek-ai/dsh-cua` 一起采用显式命名例外 `@deepseek-ai/dsh-cua-bundle`,在能力移动分组时保留配置引用。依赖隔离和晋升仍由实验性分类约束。
## 考虑过的替代方案
@@ -9,8 +9,8 @@
en: b32a7ce6483b9b48
zh: ec0938ad032b99d8
/agent-note-application-consent-for-native-computer-use/decision:
en: 5c0fec597962dbc4
zh: 184aad8bf516a245
en: 28ec4cc587ba487b
zh: 8b89bbdff8eff6eb
/agent-note-application-consent-for-native-computer-use/alternatives-considered:
en: 9f41ecc5e34efe17
zh: b30ba6dae25b20b2
@@ -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 profile-scoped domain storage for saved grants. Its fixed approval presentation reuses the tool-approval card without adopting the session's tool-approval policy. Native 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.
@@ -12,7 +12,7 @@ macOS 权限授权执行宿主,不能表达用户允许操作哪些目标应
CUA 执行器在每次对象 API 和原生工具调用时检查应用授权。人工决定复用 User Questions 服务,长期许可保存在按 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 签名的应用只能获得会话授权,许可绑定进程实例。显示名称不用于确定身份。
+2 -2
View File
@@ -6,5 +6,5 @@
en: 41d772192075e133
zh: 5ef3da69b4de1d8a
/capability-seams-and-core-services:
en: b360360db9a3f6a4
zh: d14808d61000bdff
en: 753b3da3abc6aeea
zh: aab02ec16c3f744b
+2 -3
View File
@@ -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<br/>Computer Use permission controls"]
pkg_client_ui_cua["client-ui-cua"]
pkg_office_to_pdf["office-to-pdf"]
svc_officeToPdf["ctx.officeToPdf<br/>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. |
+2 -3
View File
@@ -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<br/>Computer Use permission controls"]
pkg_client_ui_cua["client-ui-cua"]
pkg_office_to_pdf["office-to-pdf"]
svc_officeToPdf["ctx.officeToPdf<br/>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 将回执绑定到已接受的提交。 |
+1 -2
View File
@@ -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) |
+1 -2
View File
@@ -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) |
+2 -3
View File
@@ -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"]
@@ -1076,6 +1075,7 @@ flowchart TD
pkg_cua --> pkg_computer_use
pkg_cua --> pkg_llm
pkg_cua --> pkg_scope
pkg_cua --> pkg_storage_domain
pkg_cua --> pkg_subprocess
pkg_cua --> pkg_system_prompt
pkg_cua --> pkg_tools
@@ -1544,7 +1544,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` | — |
@@ -1742,7 +1741,7 @@ flowchart TD
| [`session-query`](../packages/session-query/session-query) | `session-query` | [`brand`](../packages/util/brand), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-title`](../packages/session/session-title), [`tool-todo`](../packages/todo/tool-todo) |
| [`api-settings-controller`](../packages/api/settings-controller) | `api` | [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`credentials`](../packages/credentials/credentials), [`native-command`](../packages/util/native-command), [`session`](../packages/core/session), [`settings`](../packages/settings/settings), [`typert-protocol`](../packages/typert/protocol) |
| [`web-app`](../packages/bundle/web-app) | `bundle` | [`shell-env`](../packages/shell/shell-env) |
| [`cua`](../packages/experimental/cua) | `experimental` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`attachment`](../packages/attachment/attachment), [`computer-use`](../packages/computer-use/computer-use), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`subprocess`](../packages/subprocess/subprocess), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`user-questions`](../packages/interaction/user-questions) |
| [`cua`](../packages/experimental/cua) | `experimental` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`attachment`](../packages/attachment/attachment), [`computer-use`](../packages/computer-use/computer-use), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`storage-domain`](../packages/storage/storage-domain), [`subprocess`](../packages/subprocess/subprocess), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`user-questions`](../packages/interaction/user-questions) |
| [`experimental-auto-review`](../packages/experimental/auto-review) | `experimental` | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) |
| [`webhook`](../packages/experimental/webhook) | `experimental` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`workspace`](../packages/workspace/workspace) |
| [`tool-cordis`](../packages/extensions/tool-cordis) | `extensions` | [`agent`](../packages/core/agent), [`app-boot`](../packages/boot/app-boot), [`cordis-host-runner`](../packages/extensions/cordis-host-runner), [`tools`](../packages/core/tools) |
+2 -3
View File
@@ -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"]
@@ -1078,6 +1077,7 @@ flowchart TD
pkg_cua --> pkg_computer_use
pkg_cua --> pkg_llm
pkg_cua --> pkg_scope
pkg_cua --> pkg_storage_domain
pkg_cua --> pkg_subprocess
pkg_cua --> pkg_system_prompt
pkg_cua --> pkg_tools
@@ -1546,7 +1546,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` | — |
@@ -1744,7 +1743,7 @@ flowchart TD
| [`session-query`](../packages/session-query/session-query) | `session-query` | [`brand`](../packages/util/brand), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-title`](../packages/session/session-title), [`tool-todo`](../packages/todo/tool-todo) |
| [`api-settings-controller`](../packages/api/settings-controller) | `api` | [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`credentials`](../packages/credentials/credentials), [`native-command`](../packages/util/native-command), [`session`](../packages/core/session), [`settings`](../packages/settings/settings), [`typert-protocol`](../packages/typert/protocol) |
| [`web-app`](../packages/bundle/web-app) | `bundle` | [`shell-env`](../packages/shell/shell-env) |
| [`cua`](../packages/experimental/cua) | `experimental` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`attachment`](../packages/attachment/attachment), [`computer-use`](../packages/computer-use/computer-use), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`subprocess`](../packages/subprocess/subprocess), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`user-questions`](../packages/interaction/user-questions) |
| [`cua`](../packages/experimental/cua) | `experimental` | [`agent`](../packages/core/agent), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`attachment`](../packages/attachment/attachment), [`computer-use`](../packages/computer-use/computer-use), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`storage-domain`](../packages/storage/storage-domain), [`subprocess`](../packages/subprocess/subprocess), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`user-questions`](../packages/interaction/user-questions) |
| [`experimental-auto-review`](../packages/experimental/auto-review) | `experimental` | [`agent`](../packages/core/agent), [`agent-instructions`](../packages/context/agent-instructions), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) |
| [`webhook`](../packages/experimental/webhook) | `experimental` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`agent-preset-registry`](../packages/preset/agent-preset-registry), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`session`](../packages/core/session), [`session-title`](../packages/session/session-title), [`workspace`](../packages/workspace/workspace) |
| [`tool-cordis`](../packages/extensions/tool-cordis) | `extensions` | [`agent`](../packages/core/agent), [`app-boot`](../packages/boot/app-boot), [`cordis-host-runner`](../packages/extensions/cordis-host-runner), [`tools`](../packages/core/tools) |
+2 -2
View File
@@ -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: 7b0903dd1514a86b
zh: 951b5da2fdab02c4
en: d3496899650b7131
zh: 74d4f51b1a0db1f4
/computer-use/choose-a-provider:
en: fa2e0d7b41c0450b
zh: af9a799711f901e6
+1 -1
View File
@@ -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 |
|---|---|
+1 -1
View File
@@ -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 的授权检查。
| 权限类型 | 含义 |
|---|---|
+2 -2
View File
@@ -18,8 +18,8 @@
en: b55aeb927737b90d
zh: 0b215fcb5c2c7908
/packages-experimental/packages:
en: e12eeae4540a53e0
zh: 44f65caca730252d
en: 69e15a5ea21262ab
zh: 33a6a907018d0e5d
/packages-experimental/related-documentation:
en: 1cb9d3448d44e48d
zh: cd326d70a746b896
-1
View File
@@ -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 with persistent PTC | — |
| [`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` |
-1
View File
@@ -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) | 默认关闭的 Computer Use 开关与 persistent PTC 组合 | — |
| [`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` |
@@ -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: 3ea778e9b27756c4
zh: 30546f132a77d94d
/deepseek-ai-dsh-client-ui-cua/use-this-package:
en: 7bf328334f27968f
zh: 4d68b54f049497d4
/deepseek-ai-dsh-client-ui-cua/understand-the-implementation:
en: 43b9245a9d9b2262
zh: ae25ea17010d99b3
/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
@@ -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)
Application permission prompts and permission-page lists show native icons and application names. Paths remain available on hover. Icons are presentation metadata and are never saved with grants. This plugin registers the application-approval presentation in the existing composer chain and reuses the shared approval card. The pending question still owns waiting, cancellation and answers. The prompt offers session access, refusal and, for verifiable applications with durable profile storage, persistent access.
-----
<a id="use-this-package"></a>
## 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 shows setup guidance when system permissions need attention, with **Later** and **Open settings** actions. The dialog navigates to the plugin details without changing the default mode. 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.
-----
<a id="understand-the-implementation"></a>
## Understand the implementation
<details>
<summary>Implementation internals</summary>
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. Plugin Manager’s pending state pauses observation during bundle changes and resumes it afterward; late results from the previous activation are discarded. One controller projects queries into the page and setup dialog; reconnects refresh it. Page entry, focus and completed actions read the current permission store. 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.
</details>
-----
<a id="further-exploration"></a>
## 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.
-----
<a id="model-experience"></a>
## 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
<a id="known-limitations-and-deferred-work"></a>
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.
<a id="dev-note"></a>
### Dev Note
<details>
<summary>Working context for maintainers</summary>
None.
</details>
@@ -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)
应用授权提示和权限页列表显示本机图标与应用名称,悬停可查看列表中的路径。图标仅用于展示,不随授权保存。本插件通过现有 composer 注册应用审批呈现,复用共用审批卡片,等待、取消和回答仍由原待答问题负责。提示提供本会话允许和拒绝;应用签名可验证且 profile 持久存储可用时,还提供始终允许。
-----
<a id="use-this-package"></a>
## 使用本包
[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 执行器,可能打断当前调用;后续调用在内存中保留变量和应用对象。已经使用持久化模式时,按钮显示“已设为持久化”并禁用。
页面展示“始终允许的应用”和“不允许访问的应用”。后者汇总任一会话的拒绝记录,不取消其他会话已有的授权,也不阻止新会话询问授权。会话授权仍在对应会话中生效,详情页不展示这类应用。“撤销”会移除对应应用的访问许可并取消相关操作。已发送到应用的输入无法撤回,继续操作前需重新观察应用。“允许再次询问”清除该应用在所有会话中的拒绝记录;下次选择应用时仍需用户重新决定。
本插件没有配置字段。
-----
<a id="understand-the-implementation"></a>
## 理解实现
<details>
<summary>实现细节</summary>
可选浏览器插件挂载原生 provider 的权限 Remote,复用插件页的启用引导和配置插槽。四排使用条件始终可见,未加载的字段保留占位。默认模式、执行方式、系统权限、应用列表和应用图标分别查询,结果返回后各自显示。应用名称和操作按钮不等待图标,图标位置保留空位。用户操作按顺序执行,不等待尚未完成的查询;卸载时等待操作和查询全部结束,再释放独立持有的 Remote 挂载。查询错误只显示在对应部分,启用引导只等待系统权限结果。面板复用插件管理器的忙碌状态,在启停期间暂停查询,完成后再刷新;上一次启用期间的迟到结果会被丢弃。一个控制器把查询结果投影到页面和设置弹窗;重新连接时刷新状态。进入页面、返回窗口和完成操作后都会读取当前授权记录。操作提示挂载到 shell overlay,关闭页面后仍可显示。provider 负责权限检查、持久授权和取消;浏览器不保存授权决定。
详情页通过现有 `configForms` 服务读取实际默认值(`selectedDefault ?? default`)。默认模式按钮仅写入 `selectedDefault`,沿用表单带版本检查的设置写入流程。执行方式一行调用 CUA 的 `ptcConfiguration()` 和 `enablePersistentPtc()`:Host 通过现有配置编辑器仅修改 `ptc-runtime.executionMode`,保留普通 Loader 重载规则。权限检查和执行方式状态独立返回。设置仍在加载、只读或不可用时不能提交;写入失败时在设置旁显示错误,供用户重试。
</details>
-----
<a id="further-exploration"></a>
## 延伸阅读
- [原生 provider](../cua/README.zh.md):可执行文件身份和操作检查。
- [插件管理](../../client/ui-plugin-manager/README.zh.md):启用引导和页面插槽。
- [界面基础组件](../../client/ui-primitives/README.zh.md):共用弹窗、按钮和提示。
-----
<a id="model-experience"></a>
## 模型体验
无。本包注册浏览器控件,不注册模型工具或提示词段落。
#### KV 缓存影响
无。模型可见的指引和操作结果由原生 provider 负责。
## 已知限制与后续工作
<a id="known-limitations-and-deferred-work"></a>
这套 CUA 专用界面随 Windows 支持一起开发,暂放在 `experimental`;转为正式功能后迁回 `client` 组的 `ui-cua`。
- 系统权限变更后,macOS 可能要求重启启动程序。申请尚未完成时,不能视为已授权。
- 应用归属依赖可选的本机系统查询和可读取的应用信息;不可用时,页面使用通用指引,让用户按系统弹窗完成授权。桌面安装包的分发和权限归属留待后续处理。
- 不提供 invariant companion:本界面投影 provider 查询,不独立保存授权决定。
<a id="dev-note"></a>
### 开发备注
<details>
<summary>维护者工作记录</summary>
无。
</details>
@@ -1,78 +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",
"@deepseek-ai/dsh-client-ui-user-questions",
"@deepseek-ai/dsh-client-ui-approval",
"@deepseek-ai/dsh-client-ui-conversation"
],
"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:*",
"@deepseek-ai/dsh-client-ui-user-questions": "workspace:*",
"@deepseek-ai/dsh-client-ui-approval": "workspace:*",
"@deepseek-ai/dsh-client-ui-conversation": "workspace:*"
},
"files": [
"lib/index.js",
"lib/client.js",
"lib/types/**/*.d.ts"
]
}
@@ -1,2 +0,0 @@
/** Host marker; the client export owns the optional permission UI, while dsh-cua owns native policy. */
export function apply(): void {}
@@ -1,3 +0,0 @@
import { clientBundle } from '../../client/tsdown.client.ts'
export default clientBundle(import.meta.dirname, ['lib/types/index.js'])
@@ -15,8 +15,8 @@
en: b563e4ec4727d0de
zh: d0228da978238e05
/deepseek-ai-dsh-cua-bundle/use-this-package:
en: 0e0d77615d168483
zh: 29ddf3d328670699
en: 2b71d4835b0e737e
zh: 335d1d5730ae628d
/deepseek-ai-dsh-cua-bundle/understand-the-implementation:
en: 8cf76d5bc5ab785b
zh: 18d24f49fe8fa14f
+1 -1
View File
@@ -41,7 +41,7 @@ Computer Use is available only on a macOS DSH Host. Other Hosts refuse enablemen
If preparation fails, the saved selection remains, while CUA operations stay unavailable. Refresh or reopen the plugin page to read the component 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 profile-scoped domain storage. Conversation decisions survive turns, connections, DSH restarts and Computer Use disablement without applying to another conversation. 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 profile-scoped domain storage. Conversation decisions survive turns, connections, DSH restarts and Computer Use disablement without applying to another conversation. Revoke access on the same page.
-----
@@ -41,7 +41,7 @@ Computer Use 仅支持 macOS DSH Host。其他 Host 会在保存设置前拒绝
准备失败时,已保存的选择和 PTC 设置保留,CUA 操作暂不可用。刷新或重新打开插件页查看组件诊断,修复后重启 DSH。
显式启用会进行只读权限检查,可能启动 helper,但不会打开系统授权弹窗。[权限页面](../client-ui-cua/README.zh.md) 提供系统申请入口、设置跳转和自动检测。任务访问应用前会单独询问用户。应用授权保存在按 profile 隔离的存储域中。会话授权跨 turn、连接、DSH 重启和 Computer Use 启停保留,只在原对话中生效。可以在同一页面撤销授权。
显式启用会进行只读权限检查,可能启动 helper,但不会打开系统授权弹窗。[权限页面](../cua/README.zh.md) 提供系统申请入口、设置跳转和自动检测。任务访问应用前会单独询问用户。应用授权保存在按 profile 隔离的存储域中。会话授权跨 turn、连接、DSH 重启和 Computer Use 启停保留,只在原对话中生效。可以在同一页面撤销授权。
-----
@@ -6,4 +6,4 @@
config:
agentPreset: ptc
- id: ui-cua
name: '@deepseek-ai/dsh-client-ui-cua'
name: '@deepseek-ai/dsh-cua'
@@ -44,7 +44,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:~"
@@ -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
+1 -1
View File
@@ -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.
-----
+1 -1
View File
@@ -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 是对外部运行环境的假设,本包不实现它。真实模型任务成功率需要在原生测试和协议测试之外单独评估。
-----
@@ -12,7 +12,7 @@
"path": "../../../vendor/cordis"
},
{
"path": "../cua"
"path": "../cua/tsconfig.host.json"
},
{
"path": "../../subprocess/subprocess"
+9 -6
View File
@@ -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: 400de8528e57cf00
zh: 1eb88c23eb4b511f
/deepseek-ai-dsh-cua/use-this-package:
en: 33e2ce6748f23743
zh: 4c2f53e92231859f
en: 85eb7df652948f7b
zh: 6b1210e3ddb418f2
/deepseek-ai-dsh-cua/use-this-package/permission-controls:
en: 6e026c1dbd4c7516
zh: 2cbd52f00475a5e3
/deepseek-ai-dsh-cua/understand-the-implementation:
en: 82a91b10bc505310
zh: 5c3ad0152c14d5fb
en: a9aae475f99aaed5
zh: e7451f7fd8e05656
/deepseek-ai-dsh-cua/further-exploration:
en: 166e3c1f9a67f753
zh: 698c5136c5350052
+19 -1
View File
@@ -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 shows setup guidance when system permissions need attention, with **Later** and **Open settings** actions. The dialog navigates to the plugin details without changing the default mode. 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.
-----
<a id="understand-the-implementation"></a>
@@ -61,6 +73,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. The permission store owns durable consent separately from the native protocol.
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. Plugin Manager’s pending state pauses observation during bundle changes and resumes it afterward; late results from the previous activation are discarded. One controller projects queries into the page and setup dialog; reconnects refresh it. Page entry, focus and completed actions read the current permission store. 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.
</details>
-----
+19 -1
View File
@@ -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 执行器,可能打断当前调用;后续调用在内存中保留变量和应用对象。已经使用持久化模式时,按钮显示“已设为持久化”并禁用。
页面展示“始终允许的应用”和“不允许访问的应用”。后者汇总任一会话的拒绝记录,不取消其他会话已有的授权,也不阻止新会话询问授权。会话授权仍在对应会话中生效,详情页不展示这类应用。“撤销”会移除对应应用的访问许可并取消相关操作。已发送到应用的输入无法撤回,继续操作前需重新观察应用。“允许再次询问”清除该应用在所有会话中的拒绝记录;下次选择应用时仍需用户重新决定。
本插件没有配置字段。
-----
<a id="understand-the-implementation"></a>
@@ -61,6 +73,12 @@ kind: "package-library"
[操作 schema](src/protocol.ts) 定义模型参数,并单独声明 Host 专用字段。原生实现在执行时检查目标身份、窗口几何、资源上限和操作系统访问条件。授权存储独立于原生协议保存持久许可。
根 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 挂载。查询错误只显示在对应部分,启用引导只等待系统权限结果。面板复用插件管理器的忙碌状态,在启停期间暂停查询,完成后再刷新;上一次启用期间的迟到结果会被丢弃。一个控制器把查询结果投影到页面和设置弹窗;重新连接时刷新状态。进入页面、返回窗口和完成操作后都会读取当前授权记录。操作提示挂载到 shell overlay,关闭页面后仍可显示。provider 负责权限检查、持久授权和取消;浏览器不保存授权决定。
详情页通过现有 `configForms` 服务读取实际默认值(`selectedDefault ?? default`)。默认模式按钮仅写入 `selectedDefault`,沿用表单带版本检查的设置写入流程。执行方式一行调用 CUA 的 `ptcConfiguration()` 和 `enablePersistentPtc()`:Host 通过现有配置编辑器仅修改 `ptc-runtime.executionMode`,保留普通 Loader 重载规则。权限检查和执行方式状态独立返回。设置仍在加载、只读或不可用时不能提交;写入失败时在设置旁显示错误,供用户重试。
</details>
-----
+48 -5
View File
@@ -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": {
@@ -117,8 +122,46 @@
"@deepseek-ai/cordis-plugin-timer": "workspace:~",
"@deepseek-ai/dsh-scope": "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:*",
"@deepseek-ai/dsh-storage-domain": "workspace:*",
"@deepseek-ai/dsh-storage": "workspace:*",
"@deepseek-ai/dsh-storage-json": "workspace:*"
"@deepseek-ai/dsh-storage-json": "workspace:*",
"@deepseek-ai/dsh-client-ui-user-questions": "workspace:*",
"@deepseek-ai/dsh-client-ui-approval": "workspace:*",
"@deepseek-ai/dsh-client-ui-conversation": "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",
"@deepseek-ai/dsh-client-ui-user-questions",
"@deepseek-ai/dsh-client-ui-approval",
"@deepseek-ai/dsh-client-ui-conversation"
],
"platform": "web"
}
},
"scripts": {
"bundle": "tsdown",
"watch": "tsdown --watch"
}
}
@@ -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'
@@ -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 {
+3 -1
View File
@@ -29,7 +29,6 @@ import type {} from '@deepseek-ai/dsh-ptc-runtime'
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 {
@@ -366,3 +365,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 {}
@@ -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'
-1
View File
@@ -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'
@@ -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 } }
@@ -0,0 +1,29 @@
/** CUA's public types distinguish object consumers from its generated permission transport. */
import { expect, expectTypeOf, it } from 'vitest'
import { Context } from '@deepseek-ai/cordis'
import * as Cua from '../src/index.ts'
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<CuaApi>().toHaveProperty('getApp')
expectTypeOf<CuaApplicationState>().toHaveProperty('allowedApps')
expectTypeOf<[RemovedRoot, RemovedApi, RemovedTypes, RemovedGrant]>().toBeArray()
})
it('mounts the Host marker without installing native or browser services', async () => {
const ctx = new Context()
try {
await ctx.plugin(Cua)
expect(ctx.get('cuaAccess')).toBeUndefined()
expect(ctx.get('computerUse')).toBeUndefined()
} finally { await ctx.fiber.dispose() }
})
@@ -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')
})
+28
View File
@@ -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')
@@ -6,11 +6,10 @@ 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'
import { apply as hostApply } from '../src/index.ts'
import type { ApplicationApprovalProps } from '../src/client/ApplicationApproval.tsx'
const contribution: TypertRemoteContribution = { package: '@deepseek-ai/dsh-cua', descriptors: [] }
@@ -72,7 +71,6 @@ async function fixture(fail = false) {
}
it('withdraws the permission Remote and all controls with the optional plugin', async () => {
hostApply()
const f = await fixture()
try {
const fiber = f.ctx.plugin({ inject: [...inject], apply: ctx => mountCuaPermissions(ctx, contribution) })
@@ -91,17 +89,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) })
@@ -160,7 +158,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 })
@@ -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'
@@ -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"
},
{
"path": "../../client/ui-user-questions/tsconfig.json"
@@ -0,0 +1,79 @@
{
"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": "../../interaction/user-questions"
},
{
"path": "../../../vendor/loader"
},
{
"path": "../../attachment/attachment"
},
{
"path": "../../llm/llm"
},
{
"path": "../../core/scope"
},
{
"path": "../../preset/agent-preset-registry"
},
{
"path": "../../storage/storage-domain"
},
{
"path": "../../boot/app-boot"
},
{
"path": "../../boot/config-editor"
}
],
"exclude": [
"src/css-modules.d.ts"
]
}
+3 -67
View File
@@ -1,75 +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": "../../interaction/user-questions"
},
{
"path": "../../../vendor/loader"
},
{
"path": "../../attachment/attachment"
},
{
"path": "../../llm/llm"
},
{
"path": "../../core/scope"
},
{
"path": "../../preset/agent-preset-registry"
},
{
"path": "../../storage/storage-domain"
},
{
"path": "../../boot/app-boot"
},
{
"path": "../../boot/config-editor"
"path": "./tsconfig.client.json"
}
]
}
+7 -4
View File
@@ -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 })
@@ -604,7 +604,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
'client-ui-approval ApprovalPanel',
'client-ui-subagent SubagentReadOnlyComposer',
'client-ui-user-questions QuestionComposer',
'client-ui-cua ApplicationApproval',
'cua ApplicationApproval',
],
replaceRisk: 'none',
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'conversation.composer\', () => ctx.slots.register(\n { name: \'conversation.composer\', select: owner => null },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
@@ -2287,8 +2287,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: \'<one key the owner dispatches>\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
@@ -2331,8 +2331,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: \'<one key the owner dispatches>\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
@@ -3402,7 +3402,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}',
@@ -184,7 +184,7 @@ 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-cua` | no | Shared Computer Use application objects, authorization, and logged tool execution |
| `@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 |
+57 -66
View File
@@ -8301,69 +8301,6 @@ importers:
specifier: ^18.2.0
version: 18.3.1([email protected])
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-approval':
specifier: workspace:*
version: link:../../client/ui-approval
'@deepseek-ai/dsh-client-ui-conversation':
specifier: workspace:*
version: link:../../client/ui-conversation
'@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-client-ui-user-questions':
specifier: workspace:*
version: link:../../client/ui-user-questions
'@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/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
react:
specifier: ^18.2.0
version: 18.3.1
react-dom:
specifier: ^18.2.0
version: 18.3.1([email protected])
packages/experimental/client-ui-voice-input:
devDependencies:
'@deepseek-ai/cordis':
@@ -8595,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
@@ -8604,6 +8547,42 @@ 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-approval':
specifier: workspace:*
version: link:../../client/ui-approval
'@deepseek-ai/dsh-client-ui-conversation':
specifier: workspace:*
version: link:../../client/ui-conversation
'@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-client-ui-user-questions':
specifier: workspace:*
version: link:../../client/ui-user-questions
'@deepseek-ai/dsh-computer-use':
specifier: workspace:*
version: link:../../computer-use/computer-use
@@ -8622,6 +8601,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
@@ -8670,18 +8652,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/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
react:
specifier: ^18.2.0
version: 18.3.1
react-dom:
specifier: ^18.2.0
version: 18.3.1([email protected])
sharp:
specifier: ^0.35.3
version: 0.35.5(@types/[email protected])
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
+1 -1
View File
@@ -181,7 +181,7 @@ const packageFileExtras: Readonly<Record<string, readonly string[]>> = {
// 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.
-1
View File
@@ -55,7 +55,6 @@ const KIND_TEMPLATES: Readonly<Record<string, string>> = {
* library; the check re-derives the entry shape so a stale entry fails loud.
*/
const PACKAGE_LIBRARIES: Readonly<Record<string, string>> = {
'packages/experimental/cua': 'Shared CUA objects and installer consumed by platform providers; no plugin entry.',
'packages/experimental/browser-use-runtime': 'Provider-owned browser resource management and MCP integration helpers; no plugin entry.',
'packages/boot/app-boot': 'Boot library the app bins import; plain helper exports.',
'packages/boot/cmdline': 'Command-line library the app bins import; plain module exports.',
-1
View File
@@ -4,7 +4,6 @@
export const EXPERIMENTAL_PACKAGE_NAME_EXCEPTIONS: Readonly<Record<string, string>> = {
'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',
+1 -1
View File
@@ -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.',
},
{
-1
View File
@@ -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',
@@ -144,7 +144,6 @@ const SENTENCE_MODEL_EXPERIENCE: Readonly<Record<string, SentenceContract>> = {
'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.' },
+2 -3
View File
@@ -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"],
+1 -1
View File
@@ -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" },
+1 -1
View File
@@ -277,7 +277,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" },
+1 -1
View File
@@ -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',