@deepseek-ai/dsh-experimental-client-ui-agent-team 0.1.6-alpha.2 → 0.1.7-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/experimental/client-ui-agent-team/README.md
5
- README.md: ab40e2de09406991c55160005f2f16cf6931e195
6
- README.zh.md: 2913ff65930f260d53a0bee3b3ed6cb9634fcd5a
5
+ README.md: 253c243a680a989988ea65e553c14eff9a699155
6
+ README.zh.md: 143c855b8b8a45a7d3777700aefa6a378401f20d
package/README.md CHANGED
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
9
9
 
10
10
  ## Summary
11
11
 
12
- This package adds an Agent Teams action to the Web conversation header, where a user can inspect the current roster, manage the shared task board, and navigate into a teammate's conversation. It reads authoritative Team state through the generated `ctx.remote.agentTeams` contribution and keeps ordinary child-history navigation on the stable addressed-subagent path. Choose it through the published experimental Agent Teams Web profile. The browser projection does not extend the stable API Proxy, store Team state, or register model-facing input.
12
+ This package adds an Agent Teams action to the Web conversation header, where a user can inspect the current roster, inspect the shared task board, and navigate into a teammate's conversation. It reads authoritative Team state through the generated `ctx.remote.agentTeams` contribution and keeps ordinary child-history navigation on the stable addressed-subagent path. Choose it through the published experimental Agent Teams bundle. The browser projection does not extend the stable API Proxy, store Team state, or register model-facing input.
13
13
 
14
14
  ## Table of Contents
15
15
 
@@ -25,15 +25,17 @@ This package adds an Agent Teams action to the Web conversation header, where a
25
25
  <a id="use-this-package"></a>
26
26
  ## Use this package
27
27
 
28
- Install the package through [`@deepseek-ai/dsh-experimental-agent-team-web-profile`](../agent-team-web-profile/README.md) after the stable Web bundle and the Host-side Agent Teams profile. The Web Client loader mounts the `/client` export; the root Host export is inert, and the package has no user configuration fields.
28
+ Enable this package through [`@deepseek-ai/dsh-experimental-agent-team-profile`](../agent-team-profile/README.md), which supplies the Team service, tools, and Web UI together. The Web Client loader mounts the `/client` export; the root Host export is inert, and the package has no user configuration fields.
29
29
 
30
30
  ### Inspect and navigate the roster
31
31
 
32
- Opening the panel calls `agentTeams/view`. Roster rows show durable names, runtime status, model, and diagnostics. Selecting a healthy teammate refreshes the existing direct-child catalog and opens the ordinary `{ parentSessionId, childSessionId, mode: 'continuable' }` address. History and later human prompts continue through the stable addressed-subagent conversation path; this package adds no Team-specific address field.
32
+ Opening the panel calls `agentTeams/view`. Roster rows show durable names, turn availability, model, and diagnostics. Provisioning and running members use the shared ongoing loader, inactive members use idle, and failed members use error. Selecting a healthy teammate opens the ordinary `{ parentSessionId, childSessionId, mode: 'continuable' }` address from its Lead and roster identity without refreshing or checking the parent catalog. The Host validates the parent, child, and mode when history opens. History and later human prompts continue through the stable addressed-subagent conversation path; this package adds no Team-specific address field.
33
33
 
34
- ### Manage the task board
34
+ ### Inspect the task board
35
35
 
36
- The task board shows task identity, owner, blockers, readiness, advisory write scopes, and overlap warnings. A user can create, edit, assign or unassign, complete, reopen, and delete tasks through `agentTeams/createTask` and `agentTeams/updateTask`. Every update sends the displayed revision, and create or update rejections remain explicit business results.
36
+ Ready pending tasks use idle, blocked pending tasks use warning, in-progress tasks use ongoing, and completed tasks use done.
37
+
38
+ The read-only task board shows task identity, owner, blockers, readiness, advisory write scopes, and overlap warnings. Team agents create and update tasks through their tools; the panel provides no task mutation controls.
37
39
 
38
40
  -----
39
41
 
@@ -45,7 +47,7 @@ The task board shows task identity, owner, blockers, readiness, advisory write s
45
47
 
46
48
  The Client export mounts the generated `ctx.remote.agentTeams` contribution from [`@deepseek-ai/dsh-experimental-agent-team/remote`](../agent-team/README.md), then registers its locale dictionaries and one conversation-header slot through Cordis effects. Disposing the plugin fiber removes both registrations.
47
49
 
48
- Starting a create or update invalidates older refreshes. Success reloads the complete Team view so every task's derived fields stay current. A `team-task-conflict` result displays a stale-state notice only after that reload succeeds; a reload failure remains visible instead. Editing task text or scopes and changing dependencies use two sequential compare-and-set mutations because the Team service exposes them as separate actions.
50
+ The panel renders outside the conversation container and stays within the viewport. Opening moves focus into the panel; Escape or Close returns focus to its trigger. Clicking outside or moving focus outside the panel and trigger closes it without moving focus back. Opening or refreshing the panel reads the complete Team view. Overlapping refreshes keep the newest response, and responses for a previous conversation are ignored.
49
51
 
50
52
  | File | Role |
51
53
  |---|---|
@@ -61,7 +63,7 @@ Starting a create or update invalidates older refreshes. Success reloads the com
61
63
  <a id="further-exploration"></a>
62
64
  ## Further Exploration
63
65
 
64
- - [Agent Teams Web profile](../agent-team-web-profile/README.md) — the published opt-in bundle that mounts this Client plugin.
66
+ - [Agent Teams bundle](../agent-team-profile/README.md) — the published opt-in bundle that mounts this Client plugin.
65
67
  - [Agent Teams service](../agent-team/README.md) — authoritative roster, task, and Remote behavior.
66
68
  - [Conversation UI](../../client/ui-conversation/README.md) — the stable header slot and addressed-subagent navigation surface.
67
69
  - [Experimental packages](../README.md) — incubation status and publication policy.
@@ -71,7 +73,7 @@ Starting a create or update invalidates older refreshes. Success reloads the com
71
73
  <a id="model-experience"></a>
72
74
  ## Model Experience
73
75
 
74
- None, as this browser projection and task control surface registers no model-facing input.
76
+ None, as this browser projection registers no model-facing input.
75
77
 
76
78
  #### KV Cache effect
77
79
 
@@ -81,7 +83,7 @@ No direct effect; the Team tools and ordinary conversation submission own any la
81
83
 
82
84
  <a id="known-limitations-and-deferred-work"></a>
83
85
 
84
- - **Snapshot refresh** — the panel refreshes on open, explicit refresh, and mutations; it has no live event subscription or mailbox timeline.
86
+ - **Snapshot refresh** — the panel refreshes on open and explicit refresh; it has no live event subscription or mailbox timeline.
85
87
  - **Ordinary child continuation** — a human message sent after navigation uses the stable addressed-subagent prompt path, not the Team peer mailbox.
86
88
  - **No lifecycle or workspace controls** — the panel cannot spawn, rename, delete, or interrupt teammates, and write scopes remain advisory metadata.
87
89
 
package/README.zh.md CHANGED
@@ -9,7 +9,7 @@ kind: "package-reference"
9
9
 
10
10
  ## 概述
11
11
 
12
- 本包向 Web 会话页头添加 Agent Teams action,让用户检查当前 roster、管理共享任务板并导航到 teammate 会话。它通过生成的 `ctx.remote.agentTeams` contribution 读取权威 Team 状态,并让普通 child history 导航继续使用稳定的 addressed-subagent 路径。通过公开发布的实验性 Agent Teams Web profile 选择本包。这个浏览器 projection 不扩展稳定 API Proxy、不存储 Team 状态,也不注册面向模型的输入。
12
+ 本包向 Web 会话页头添加 Agent Teams action,让用户检查当前 roster、查看共享任务板并导航到 teammate 会话。它通过生成的 `ctx.remote.agentTeams` contribution 读取权威 Team 状态,并让普通 child history 导航继续使用稳定的 addressed-subagent 路径。通过公开发布的实验性 Agent Teams bundle 选择本包。这个浏览器 projection 不扩展稳定 API Proxy、不存储 Team 状态,也不注册面向模型的输入。
13
13
 
14
14
  ## 目录
15
15
 
@@ -25,15 +25,17 @@ kind: "package-reference"
25
25
  <a id="use-this-package"></a>
26
26
  ## 使用本包
27
27
 
28
- 在稳定 Web bundle 与 Host-side Agent Teams profile 之后,通过 [`@deepseek-ai/dsh-experimental-agent-team-web-profile`](../agent-team-web-profile/README.zh.md) 安装本包。Web Client loader 挂载 `/client` export;root Host export 不执行行为,本包也没有用户配置字段。
28
+ 通过 [`@deepseek-ai/dsh-experimental-agent-team-profile`](../agent-team-profile/README.zh.md) 启用本包。这个组合包同时提供团队服务、工具与 Web 界面。Web Client loader 挂载 `/client` export;root Host export 不执行行为,本包也没有用户配置字段。
29
29
 
30
30
  ### 检查并导航 roster
31
31
 
32
- 打开 panel 会调用 `agentTeams/view`。Roster row 展示持久 name、运行时 status、model 与 diagnostics。选择健康 teammate 时,系统刷新既有直接 child catalog,并打开普通的 `{ parentSessionId, childSessionId, mode: 'continuable' }` address。History 与后续人类提示词继续使用稳定 addressed-subagent 会话路径;本包不会添加 Team 专用 address 字段。
32
+ 打开 panel 会调用 `agentTeams/view`。Roster row 展示持久 name、轮次可用状态、model 与 diagnostics。provisioning 和 running 成员使用共享 ongoing loading,inactive 成员使用 idle 灰点,failed 成员使用 error 红点。选择健康 teammate 时,系统直接根据其 Lead 与 roster 身份打开普通的 `{ parentSessionId, childSessionId, mode: 'continuable' }` address,不刷新或检查 parent catalog。Host 在打开历史时校验 parent、child 与 mode。History 与后续人类提示词继续使用稳定 addressed-subagent 会话路径;本包不会添加 Team 专用 address 字段。
33
33
 
34
- ### 管理任务板
34
+ ### 查看任务板
35
35
 
36
- 任务板展示 task identity、owner、blocker、readiness、提示性 write scope 与重叠 warning。用户可以通过 `agentTeams/createTask` 与 `agentTeams/updateTask` 创建、编辑、分配或取消分配、完成、重开和删除任务。每次 update 都发送当前显示的 revision,create 或 update rejection 都保留为显式 business result。
36
+ 可开始的 pending 任务使用 idle 灰点,被依赖阻塞的 pending 任务使用 warning 橙点,in-progress 任务使用 ongoing loading,completed 任务使用 done 绿点。
37
+
38
+ 只读任务板展示任务标识、负责人、依赖、就绪状态、提示性写入范围与重叠警告。Team agent 通过工具创建和更新任务;面板不提供任务修改控件。
37
39
 
38
40
  -----
39
41
 
@@ -45,7 +47,7 @@ kind: "package-reference"
45
47
 
46
48
  Client export 挂载来自 [`@deepseek-ai/dsh-experimental-agent-team/remote`](../agent-team/README.zh.md) 的生成的 `ctx.remote.agentTeams` contribution,然后通过 Cordis effect 注册 locale dictionary 与一个 conversation-header slot。Dispose plugin fiber 会移除这两项 registration。
47
49
 
48
- 开始 create 或 update 会让更早的 refresh 失效。成功后会重新读取完整 Team view,使每个 task 的派生字段保持最新。`team-task-conflict` 结果仅在重新读取成功后显示状态陈旧提示;如果重新读取失败,则改为显示重新读取错误。由于 Team 服务把任务文本或 scope 编辑与 dependency 修改公开为独立 action,两者使用两个连续的 compare-and-set mutation。
50
+ 面板渲染在会话容器外,并保持在视口范围内。打开时焦点移入面板;按 Escape 或选择关闭按钮时,焦点返回触发按钮。点击外部或将焦点移出面板与触发按钮时,面板关闭,但不会将焦点移回。打开或刷新面板会读取完整 Team view。并行刷新只保留最新响应,属于上一个会话的响应会被忽略。
49
51
 
50
52
  | 文件 | 职责 |
51
53
  |---|---|
@@ -61,7 +63,7 @@ Client export 挂载来自 [`@deepseek-ai/dsh-experimental-agent-team/remote`](.
61
63
  <a id="further-exploration"></a>
62
64
  ## 进一步探索
63
65
 
64
- - [Agent Teams Web profile](../agent-team-web-profile/README.zh.md)——挂载本 Client plugin 的公开 opt-in bundle。
66
+ - [Agent Teams bundle](../agent-team-profile/README.zh.md)——挂载本 Client plugin 的公开 opt-in bundle。
65
67
  - [Agent Teams service](../agent-team/README.zh.md)——权威 roster、task 与 Remote 行为。
66
68
  - [会话 UI](../../client/ui-conversation/README.zh.md)——稳定 header slot 与 addressed-subagent 导航表层。
67
69
  - [实验性包](../README.zh.md)——孵化状态与发布规则。
@@ -71,7 +73,7 @@ Client export 挂载来自 [`@deepseek-ai/dsh-experimental-agent-team/remote`](.
71
73
  <a id="model-experience"></a>
72
74
  ## 模型体验
73
75
 
74
- 无直接影响,因为该浏览器 projection 与任务控制界面不注册面向模型的输入。
76
+ 无直接影响,因为该浏览器 projection 不注册面向模型的输入。
75
77
 
76
78
  #### KV Cache 影响
77
79
 
@@ -81,7 +83,7 @@ Client export 挂载来自 [`@deepseek-ai/dsh-experimental-agent-team/remote`](.
81
83
 
82
84
  <a id="known-limitations-and-deferred-work"></a>
83
85
 
84
- - **Snapshot refresh**——panel 会在打开、显式 refresh 与 mutation 后刷新;它没有实时事件订阅或 mailbox timeline。
86
+ - **Snapshot refresh**——panel 会在打开和显式 refresh 时刷新;它没有实时事件订阅或 mailbox timeline。
85
87
  - **普通 child continuation**——导航后发送的人类消息使用稳定 addressed-subagent 提示词路径,而不是 Team peer mailbox。
86
88
  - **没有 lifecycle 或 workspace control**——panel 不能 spawn、rename、delete 或 interrupt teammate,write scope 仍只是提示性 metadata。
87
89
 
package/lib/client.js CHANGED
@@ -6,6 +6,7 @@ window.__ModuleLoader__.load({
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let react = require("react");
9
+ let react_dom = require("react-dom");
9
10
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
10
11
  //#region ../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/core.js
11
12
  var _a$1;
@@ -4046,91 +4047,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4046
4047
  }
4047
4048
  //#endregion
4048
4049
  //#region ../agent-team/lib/typert.remote-client.js
4049
- let _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_0$schema$value;
4050
- const _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_0$schema = () => _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_0$schema$value ??= intersection(string(), unknown());
4051
- let _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_1$schema$value;
4052
- const _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_1$schema = () => _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_1$schema$value ??= object({
4053
- "subject": string().readonly(),
4054
- "description": string().readonly(),
4055
- "blockedBy": array(intersection(string(), unknown())).readonly().optional(),
4056
- "writeScopes": array(string()).readonly().optional()
4057
- });
4058
- let _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_result$schema$value;
4059
- const _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_result$schema = () => _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_result$schema$value ??= union([object({
4060
- "ok": literal(true).readonly(),
4061
- "value": object({
4062
- "id": intersection(string(), unknown()).readonly(),
4063
- "revision": number().readonly(),
4064
- "subject": string().readonly(),
4065
- "description": string().readonly(),
4066
- "status": union([
4067
- literal("pending"),
4068
- literal("in_progress"),
4069
- literal("completed"),
4070
- literal("deleted")
4071
- ]).readonly(),
4072
- "blockedBy": array(intersection(string(), unknown())).readonly(),
4073
- "writeScopes": array(string()).readonly(),
4074
- "ownerName": string().readonly().optional(),
4075
- "ready": boolean().readonly(),
4076
- "writeScopeWarnings": array(string()).readonly()
4077
- }).readonly()
4078
- }), object({
4079
- "ok": literal(false).readonly(),
4080
- "error": object({
4081
- "code": union([literal("team-task-conflict"), literal("team-rejected")]).readonly(),
4082
- "message": string().readonly()
4083
- }).readonly()
4084
- })]);
4085
- let _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_0$schema$value;
4086
- const _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_0$schema = () => _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_0$schema$value ??= intersection(string(), unknown());
4087
- let _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_1$schema$value;
4088
- const _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_1$schema = () => _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_1$schema$value ??= object({
4089
- "taskId": intersection(string(), unknown()).readonly(),
4090
- "expectedRevision": number().readonly(),
4091
- "action": union([
4092
- literal("complete"),
4093
- literal("edit"),
4094
- literal("claim"),
4095
- literal("release"),
4096
- literal("set_dependencies"),
4097
- literal("reopen"),
4098
- literal("reassign"),
4099
- literal("delete")
4100
- ]).readonly(),
4101
- "subject": string().readonly().optional(),
4102
- "description": string().readonly().optional(),
4103
- "blockedBy": array(intersection(string(), unknown())).readonly().optional(),
4104
- "writeScopes": array(string()).readonly().optional(),
4105
- "owner": string().readonly().optional()
4106
- });
4107
- let _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_result$schema$value;
4108
- const _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_result$schema = () => _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_result$schema$value ??= union([object({
4109
- "ok": literal(true).readonly(),
4110
- "value": object({
4111
- "id": intersection(string(), unknown()).readonly(),
4112
- "revision": number().readonly(),
4113
- "subject": string().readonly(),
4114
- "description": string().readonly(),
4115
- "status": union([
4116
- literal("pending"),
4117
- literal("in_progress"),
4118
- literal("completed"),
4119
- literal("deleted")
4120
- ]).readonly(),
4121
- "blockedBy": array(intersection(string(), unknown())).readonly(),
4122
- "writeScopes": array(string()).readonly(),
4123
- "ownerName": string().readonly().optional(),
4124
- "ready": boolean().readonly(),
4125
- "writeScopeWarnings": array(string()).readonly()
4126
- }).readonly()
4127
- }), object({
4128
- "ok": literal(false).readonly(),
4129
- "error": object({
4130
- "code": union([literal("team-task-conflict"), literal("team-rejected")]).readonly(),
4131
- "message": string().readonly()
4132
- }).readonly()
4133
- })]);
4134
4050
  let _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_parameter_0$schema$value;
4135
4051
  const _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_parameter_0$schema = () => _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_parameter_0$schema$value ??= intersection(string(), unknown());
4136
4052
  let _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_result$schema$value;
@@ -4140,9 +4056,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4140
4056
  "name": string().readonly(),
4141
4057
  "role": union([literal("lead"), literal("teammate")]).readonly(),
4142
4058
  "status": union([
4143
- literal("running"),
4144
4059
  literal("failed"),
4145
- literal("idle"),
4060
+ literal("running"),
4146
4061
  literal("inactive"),
4147
4062
  literal("provisioning")
4148
4063
  ]).readonly(),
@@ -4158,9 +4073,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4158
4073
  "subject": string().readonly(),
4159
4074
  "description": string().readonly(),
4160
4075
  "status": union([
4076
+ literal("completed"),
4161
4077
  literal("pending"),
4162
4078
  literal("in_progress"),
4163
- literal("completed"),
4164
4079
  literal("deleted")
4165
4080
  ]).readonly(),
4166
4081
  "blockedBy": array(intersection(string(), unknown())).readonly(),
@@ -4172,129 +4087,43 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4172
4087
  });
4173
4088
  const TYPERT_REMOTE = {
4174
4089
  package: "@deepseek-ai/dsh-experimental-agent-team",
4175
- descriptors: [
4176
- {
4177
- id: "@deepseek-ai/dsh-experimental-agent-team#agentTeams/createTask",
4178
- service: "agentTeams",
4179
- namespace: "agentTeams",
4180
- method: "createTask",
4181
- implementation: "remoteCreateTask",
4182
- invocation: { kind: "direct" },
4183
- scope: {
4184
- context: "agent",
4185
- wire: "agentId"
4186
- },
4187
- parameters: [{
4188
- name: "agent",
4189
- wire: "agentId",
4190
- source: "lookup",
4191
- lookup: "agent",
4192
- codec: {
4193
- mode: "strict",
4194
- typeSymbol: "@deepseek-ai/dsh-session/types#SessionId",
4195
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_0$schema
4196
- }
4197
- }, {
4198
- name: "request",
4199
- wire: "request",
4200
- source: "json",
4201
- codec: {
4202
- mode: "strict",
4203
- typeSymbol: "@deepseek-ai/dsh-experimental-agent-team/client#CreateTeamTaskRequest",
4204
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_parameter_1$schema
4205
- }
4206
- }],
4207
- result: {
4208
- mode: "strict",
4209
- typeSymbol: "@deepseek-ai/dsh-experimental-agent-team/client#TeamTaskMutationResult",
4210
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_createTask_result$schema
4211
- },
4212
- sourceLocation: {
4213
- "file": "packages/experimental/agent-team/src/index.ts",
4214
- "line": 257,
4215
- "column": 3
4216
- }
4090
+ descriptors: [{
4091
+ id: "@deepseek-ai/dsh-experimental-agent-team#agentTeams/view",
4092
+ service: "agentTeams",
4093
+ namespace: "agentTeams",
4094
+ method: "view",
4095
+ implementation: "remoteView",
4096
+ invocation: { kind: "direct" },
4097
+ scope: {
4098
+ context: "agent",
4099
+ wire: "agentId"
4217
4100
  },
4218
- {
4219
- id: "@deepseek-ai/dsh-experimental-agent-team#agentTeams/updateTask",
4220
- service: "agentTeams",
4221
- namespace: "agentTeams",
4222
- method: "updateTask",
4223
- implementation: "remoteUpdateTask",
4224
- invocation: { kind: "direct" },
4225
- scope: {
4226
- context: "agent",
4227
- wire: "agentId"
4228
- },
4229
- parameters: [{
4230
- name: "agent",
4231
- wire: "agentId",
4232
- source: "lookup",
4233
- lookup: "agent",
4234
- codec: {
4235
- mode: "strict",
4236
- typeSymbol: "@deepseek-ai/dsh-session/types#SessionId",
4237
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_0$schema
4238
- }
4239
- }, {
4240
- name: "request",
4241
- wire: "request",
4242
- source: "json",
4243
- codec: {
4244
- mode: "strict",
4245
- typeSymbol: "@deepseek-ai/dsh-experimental-agent-team/client#UpdateTeamTaskRequest",
4246
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_parameter_1$schema
4247
- }
4248
- }],
4249
- result: {
4101
+ parameters: [{
4102
+ name: "agent",
4103
+ wire: "agentId",
4104
+ source: "lookup",
4105
+ lookup: "agent",
4106
+ codec: {
4250
4107
  mode: "strict",
4251
- typeSymbol: "@deepseek-ai/dsh-experimental-agent-team/client#TeamTaskMutationResult",
4252
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_updateTask_result$schema
4253
- },
4254
- sourceLocation: {
4255
- "file": "packages/experimental/agent-team/src/index.ts",
4256
- "line": 268,
4257
- "column": 3
4108
+ typeSymbol: "@deepseek-ai/dsh-session/types#SessionId",
4109
+ create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_parameter_0$schema
4258
4110
  }
4111
+ }],
4112
+ result: {
4113
+ mode: "strict",
4114
+ typeSymbol: "@deepseek-ai/dsh-experimental-agent-team/client#TeamView",
4115
+ create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_result$schema
4259
4116
  },
4260
- {
4261
- id: "@deepseek-ai/dsh-experimental-agent-team#agentTeams/view",
4262
- service: "agentTeams",
4263
- namespace: "agentTeams",
4264
- method: "view",
4265
- implementation: "remoteView",
4266
- invocation: { kind: "direct" },
4267
- scope: {
4268
- context: "agent",
4269
- wire: "agentId"
4270
- },
4271
- parameters: [{
4272
- name: "agent",
4273
- wire: "agentId",
4274
- source: "lookup",
4275
- lookup: "agent",
4276
- codec: {
4277
- mode: "strict",
4278
- typeSymbol: "@deepseek-ai/dsh-session/types#SessionId",
4279
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_parameter_0$schema
4280
- }
4281
- }],
4282
- result: {
4283
- mode: "strict",
4284
- typeSymbol: "@deepseek-ai/dsh-experimental-agent-team/client#TeamView",
4285
- create: _deepseek_ai_dsh_experimental_agent_team_agentTeams_view_result$schema
4286
- },
4287
- sourceLocation: {
4288
- "file": "packages/experimental/agent-team/src/index.ts",
4289
- "line": 243,
4290
- "column": 3
4291
- }
4117
+ sourceLocation: {
4118
+ "file": "packages/experimental/agent-team/src/index.ts",
4119
+ "line": 242,
4120
+ "column": 3
4292
4121
  }
4293
- ]
4122
+ }]
4294
4123
  };
4295
4124
  //#endregion
4296
4125
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/experimental/client-ui-agent-team/src/client/TeamAction.module.css.mjs
4297
- const css = ".VoX2oq_root{position:relative}.VoX2oq_trigger,.VoX2oq_iconButton,.VoX2oq_smallButton,.VoX2oq_taskActions button,.VoX2oq_formActions button{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px}.VoX2oq_trigger{align-items:center;gap:5px;min-height:28px;padding:3px 7px;font-size:12px;display:inline-flex}.VoX2oq_trigger:hover,.VoX2oq_iconButton:hover,.VoX2oq_smallButton:hover,.VoX2oq_taskActions button:hover,.VoX2oq_formActions button:hover{background:var(--dsw-alias-interactive-bg-hover)}.VoX2oq_count{background:var(--dsw-alias-fill-l2);font-variant-numeric:tabular-nums;text-align:center;border-radius:8px;min-width:16px}.VoX2oq_panel{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);z-index:110;box-sizing:border-box;background:var(--dsw-specific-menu);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);width:min(560px,100vw - 32px);max-height:min(680px,100vh - 120px);box-shadow:var(--dsw-elevation-prominent);border:0;border-radius:12px;padding:10px;position:absolute;top:calc(100% + 5px);left:0;overflow:auto}.VoX2oq_toolbar,.VoX2oq_sectionTitle,.VoX2oq_taskTitle,.VoX2oq_taskActions,.VoX2oq_formActions{align-items:center;gap:8px;display:flex}.VoX2oq_toolbar{min-height:28px}.VoX2oq_spacer{flex:1}.VoX2oq_iconButton{justify-content:center;align-items:center;width:26px;height:26px;display:inline-flex}.VoX2oq_panel h3{color:var(--dsw-alias-label-secondary);margin:12px 0 6px;font-size:12px;font-weight:500}.VoX2oq_roster{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;display:grid}.VoX2oq_member{border:.5px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border-radius:8px;align-items:flex-start;gap:8px;padding:8px;display:flex}.VoX2oq_member:disabled{cursor:default}.VoX2oq_memberText{flex-direction:column;min-width:0;display:flex}.VoX2oq_memberText small,.VoX2oq_meta{color:var(--dsw-alias-label-tertiary);font-size:11px}.VoX2oq_diagnostic,.VoX2oq_error,.VoX2oq_warning{color:var(--dsw-alias-state-error-primary)}.VoX2oq_smallButton{align-items:center;gap:4px;margin-left:auto;padding:4px 7px;font-size:11px;display:inline-flex}.VoX2oq_tasks{flex-direction:column;gap:7px;display:flex}.VoX2oq_task,.VoX2oq_form{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:9px;padding:9px}.VoX2oq_taskTitle span{color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:11px}.VoX2oq_task p{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;margin:5px 0;font-size:12px}.VoX2oq_meta{flex-wrap:wrap;gap:4px 10px;display:flex}.VoX2oq_taskActions{flex-wrap:wrap;margin-top:8px}.VoX2oq_taskActions label{color:var(--dsw-alias-label-tertiary);align-items:center;gap:4px;font-size:11px;display:inline-flex}.VoX2oq_taskActions select,.VoX2oq_form input,.VoX2oq_form textarea{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);font:inherit;border-radius:6px}.VoX2oq_taskActions button,.VoX2oq_formActions button{align-items:center;gap:3px;padding:4px 6px;font-size:11px;display:inline-flex}.VoX2oq_taskActions button:disabled,.VoX2oq_formActions button:disabled{opacity:.45;cursor:default}.VoX2oq_form{gap:6px;margin-bottom:7px;display:grid}.VoX2oq_form input,.VoX2oq_form textarea{width:100%;padding:6px 8px;font-size:12px}.VoX2oq_form textarea{resize:vertical;min-height:58px}.VoX2oq_notice,.VoX2oq_error{padding:9px;font-size:12px}";
4126
+ const css = ".VoX2oq_root{position:relative}.VoX2oq_trigger,.VoX2oq_iconButton{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px}.VoX2oq_trigger{align-items:center;gap:5px;min-height:28px;padding:3px 7px;font-size:12px;display:inline-flex}.VoX2oq_trigger:hover,.VoX2oq_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.VoX2oq_count{background:var(--dsw-alias-fill-l2);font-variant-numeric:tabular-nums;text-align:center;border-radius:8px;min-width:16px}.VoX2oq_panel{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);z-index:110;box-sizing:border-box;background:var(--dsw-specific-menu);width:min(560px,100vw - 32px);max-height:min(680px,100vh - 32px);backdrop-filter:var(--dsw-menu-backdrop-filter);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-prominent);border:0;border-radius:12px;padding:10px;position:fixed;overflow:auto}.VoX2oq_toolbar,.VoX2oq_taskTitle{align-items:center;gap:8px;display:flex}.VoX2oq_toolbar{min-height:28px}.VoX2oq_spacer{flex:1}.VoX2oq_iconButton{justify-content:center;align-items:center;width:26px;height:26px;display:inline-flex}.VoX2oq_panel h3{color:var(--dsw-alias-label-secondary);margin:12px 0 6px;font-size:12px;font-weight:500}.VoX2oq_roster{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;display:grid}.VoX2oq_member{border:.5px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border-radius:8px;align-items:flex-start;gap:8px;padding:8px;display:flex}.VoX2oq_member:disabled{cursor:default}.VoX2oq_memberText{flex-direction:column;min-width:0;display:flex}.VoX2oq_memberText small,.VoX2oq_meta{color:var(--dsw-alias-label-tertiary);font-size:11px}.VoX2oq_diagnostic,.VoX2oq_error,.VoX2oq_warning{color:var(--dsw-alias-state-error-primary)}.VoX2oq_tasks{flex-direction:column;gap:7px;display:flex}.VoX2oq_task{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:9px;padding:9px}.VoX2oq_taskState{color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;margin-left:auto;font-size:11px;display:inline-flex}.VoX2oq_task p{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;margin:5px 0;font-size:12px}.VoX2oq_meta{flex-wrap:wrap;gap:4px 10px;display:flex}.VoX2oq_notice,.VoX2oq_error{align-items:center;gap:6px;padding:9px;font-size:12px;display:flex}";
4298
4127
  const tagId = "@deepseek-ai/dsh-experimental-client-ui-agent-team/TeamAction.module.css";
4299
4128
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
4300
4129
  const tag = document.createElement("style");
@@ -4307,8 +4136,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4307
4136
  "count": "VoX2oq_count",
4308
4137
  "diagnostic": "VoX2oq_diagnostic",
4309
4138
  "error": "VoX2oq_error",
4310
- "form": "VoX2oq_form",
4311
- "formActions": "VoX2oq_formActions",
4312
4139
  "iconButton": "VoX2oq_iconButton",
4313
4140
  "member": "VoX2oq_member",
4314
4141
  "memberText": "VoX2oq_memberText",
@@ -4317,11 +4144,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4317
4144
  "panel": "VoX2oq_panel",
4318
4145
  "root": "VoX2oq_root",
4319
4146
  "roster": "VoX2oq_roster",
4320
- "sectionTitle": "VoX2oq_sectionTitle",
4321
- "smallButton": "VoX2oq_smallButton",
4322
4147
  "spacer": "VoX2oq_spacer",
4323
4148
  "task": "VoX2oq_task",
4324
- "taskActions": "VoX2oq_taskActions",
4149
+ "taskState": "VoX2oq_taskState",
4325
4150
  "taskTitle": "VoX2oq_taskTitle",
4326
4151
  "tasks": "VoX2oq_tasks",
4327
4152
  "toolbar": "VoX2oq_toolbar",
@@ -4330,22 +4155,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4330
4155
  };
4331
4156
  //#endregion
4332
4157
  //#region lib/types/client/TeamAction.js
4333
- const EMPTY_DRAFT = {
4334
- subject: "",
4335
- description: "",
4336
- blockers: "",
4337
- scopes: ""
4338
- };
4339
- function items(value) {
4340
- return [...new Set(value.split(",").map((item) => item.trim()).filter(Boolean))];
4341
- }
4342
- function taskIds(value) {
4343
- return items(value);
4344
- }
4345
- /**
4346
- * One failure line for either carrier: a Remote failure, or a Team business
4347
- * rejection whose codes stay local to this seam and never ride the wire.
4348
- */
4349
4158
  function failureText(error) {
4350
4159
  return `${error.message} (${error.code})`;
4351
4160
  }
@@ -4361,23 +4170,46 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4361
4170
  function memberStatusKey(status) {
4362
4171
  switch (status) {
4363
4172
  case "running": return "memberStatus.running";
4364
- case "idle": return "memberStatus.idle";
4365
4173
  case "inactive": return "memberStatus.inactive";
4366
4174
  case "provisioning": return "memberStatus.provisioning";
4367
4175
  case "failed": return "memberStatus.failed";
4368
4176
  }
4369
4177
  }
4370
- /** Render the live Team roster and compare-and-set task board. */
4371
- function TeamAction({ sessionId, load, createTask, updateTask, openTeammate, t }) {
4178
+ function memberDotState(status) {
4179
+ switch (status) {
4180
+ case "running":
4181
+ case "provisioning": return "ongoing";
4182
+ case "inactive": return "idle";
4183
+ case "failed": return "error";
4184
+ }
4185
+ }
4186
+ function taskDotState(task) {
4187
+ switch (task.status) {
4188
+ case "pending": return task.ready ? "idle" : "warning";
4189
+ case "in_progress": return "ongoing";
4190
+ case "completed": return "done";
4191
+ /* v8 ignore next -- Team views omit deleted task tombstones. */
4192
+ case "deleted": return "idle";
4193
+ }
4194
+ }
4195
+ /** Render the Team roster and read-only task board. */
4196
+ function TeamAction({ sessionId, load, openTeammate, t }) {
4372
4197
  const [open, setOpen] = (0, react.useState)(false);
4373
4198
  const [loading, setLoading] = (0, react.useState)(false);
4374
4199
  const [view, setView] = (0, react.useState)(null);
4375
4200
  const [error, setError] = (0, react.useState)(null);
4376
- const [creating, setCreating] = (0, react.useState)(false);
4377
- const [createDraft, setCreateDraft] = (0, react.useState)(EMPTY_DRAFT);
4378
- const [editing, setEditing] = (0, react.useState)(null);
4379
- const [editDraft, setEditDraft] = (0, react.useState)(EMPTY_DRAFT);
4380
- const [pendingTasks, setPendingTasks] = (0, react.useState)(() => /* @__PURE__ */ new Set());
4201
+ const rootRef = (0, react.useRef)(null);
4202
+ const triggerRef = (0, react.useRef)(null);
4203
+ const panelRef = (0, react.useRef)(null);
4204
+ const position = (0, _deepseek_ai_dsh_client_ui_primitives.useAnchoredPosition)({
4205
+ open,
4206
+ anchorRef: triggerRef,
4207
+ panelRef,
4208
+ gap: 5,
4209
+ margin: 16
4210
+ });
4211
+ const positioned = position !== null;
4212
+ (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(rootRef, open, setOpen, panelRef);
4381
4213
  const sessionRef = (0, react.useRef)(sessionId);
4382
4214
  const refreshGeneration = (0, react.useRef)(0);
4383
4215
  sessionRef.current = sessionId;
@@ -4387,124 +4219,45 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4387
4219
  setLoading(false);
4388
4220
  setView(null);
4389
4221
  setError(null);
4390
- setCreating(false);
4391
- setCreateDraft(EMPTY_DRAFT);
4392
- setEditing(null);
4393
- setEditDraft(EMPTY_DRAFT);
4394
- setPendingTasks(/* @__PURE__ */ new Set());
4395
4222
  }, [sessionId]);
4223
+ (0, react.useLayoutEffect)(() => {
4224
+ if (open && positioned) panelRef.current?.focus();
4225
+ }, [open, positioned]);
4226
+ const close = () => {
4227
+ setOpen(false);
4228
+ triggerRef.current?.focus();
4229
+ };
4396
4230
  const refresh = (0, react.useCallback)(async () => {
4397
4231
  const requestedSession = sessionId;
4398
4232
  const generation = ++refreshGeneration.current;
4399
4233
  setLoading(true);
4400
4234
  const result = await load(requestedSession);
4401
- if (sessionRef.current !== requestedSession || refreshGeneration.current !== generation) return false;
4235
+ if (sessionRef.current !== requestedSession || refreshGeneration.current !== generation) return;
4402
4236
  setLoading(false);
4403
4237
  if (result.ok) {
4404
4238
  setView(result.value);
4405
4239
  setError(null);
4406
- return true;
4407
- } else {
4408
- setError(failureText(result.error));
4409
- return false;
4410
- }
4240
+ } else setError(failureText(result.error));
4411
4241
  }, [load, sessionId]);
4412
- const invalidateRefresh = (0, react.useCallback)(() => {
4413
- refreshGeneration.current += 1;
4414
- setLoading(false);
4415
- }, []);
4416
- const settleTask = (0, react.useCallback)(async (taskId, operation) => {
4417
- const requestedSession = sessionId;
4418
- invalidateRefresh();
4419
- setPendingTasks((current) => new Set(current).add(taskId));
4420
- try {
4421
- const result = await operation();
4422
- if (sessionRef.current !== requestedSession) return void 0;
4423
- if (!result.ok) {
4424
- setError(failureText(result.error));
4425
- return;
4426
- }
4427
- if (!result.value.ok) {
4428
- if (result.value.error.code === "team-task-conflict") {
4429
- const reloaded = await refresh();
4430
- if (sessionRef.current !== requestedSession) return void 0;
4431
- if (reloaded) setError(t("conflict"));
4432
- } else setError(failureText(result.value.error));
4433
- return;
4434
- }
4435
- const task = result.value.value;
4436
- setError(null);
4437
- await refresh();
4438
- if (sessionRef.current !== requestedSession) return void 0;
4439
- return task;
4440
- } finally {
4441
- if (sessionRef.current === requestedSession) setPendingTasks((current) => {
4442
- const next = new Set(current);
4443
- next.delete(taskId);
4444
- return next;
4445
- });
4446
- }
4447
- }, [
4448
- invalidateRefresh,
4449
- refresh,
4450
- sessionId,
4451
- t
4452
- ]);
4453
- const submitCreate = async () => {
4454
- const subject = createDraft.subject.trim();
4455
- const description = createDraft.description.trim();
4456
- /* v8 ignore next -- TaskForm disables Save while either normalized field is empty. */
4457
- if (subject === "" || description === "") return;
4458
- if (await settleTask("create", () => createTask(sessionId, {
4459
- subject,
4460
- description,
4461
- blockedBy: taskIds(createDraft.blockers),
4462
- writeScopes: items(createDraft.scopes)
4463
- })) === void 0) return;
4464
- setCreateDraft(EMPTY_DRAFT);
4465
- setCreating(false);
4466
- };
4467
- const startEdit = (task) => {
4468
- setEditing(task.id);
4469
- setEditDraft({
4470
- subject: task.subject,
4471
- description: task.description,
4472
- blockers: task.blockedBy.join(", "),
4473
- scopes: task.writeScopes.join(", ")
4474
- });
4475
- };
4476
- const submitEdit = async (task) => {
4477
- const requestedSession = sessionId;
4478
- const edited = await settleTask(task.id, () => updateTask(requestedSession, {
4479
- taskId: task.id,
4480
- expectedRevision: task.revision,
4481
- action: "edit",
4482
- subject: editDraft.subject.trim(),
4483
- description: editDraft.description.trim(),
4484
- writeScopes: items(editDraft.scopes)
4485
- }));
4486
- if (edited === void 0) return;
4487
- const blockedBy = taskIds(editDraft.blockers);
4488
- if (blockedBy.length === edited.blockedBy.length && blockedBy.every((blocker, index) => blocker === edited.blockedBy[index])) {
4489
- setEditing(null);
4490
- return;
4491
- }
4492
- if (await settleTask(task.id, () => updateTask(requestedSession, {
4493
- taskId: task.id,
4494
- expectedRevision: edited.revision,
4495
- action: "set_dependencies",
4496
- blockedBy
4497
- })) === void 0) return;
4498
- setEditing(null);
4499
- };
4500
4242
  const teammates = view?.members.filter((member) => member.role === "teammate") ?? [];
4501
- const assignable = view?.members.filter((member) => member.status !== "failed" && member.status !== "provisioning") ?? [];
4502
4243
  return (0, react_jsx_runtime.jsxs)("div", {
4244
+ ref: rootRef,
4503
4245
  className: TeamAction_module_css_default.root,
4504
4246
  "data-team-action": true,
4247
+ onKeyDown: (event) => {
4248
+ if (event.key !== "Escape" || !open) return;
4249
+ event.preventDefault();
4250
+ close();
4251
+ },
4252
+ onBlur: (event) => {
4253
+ const target = event.relatedTarget;
4254
+ if (target instanceof Node && !event.currentTarget.contains(target) && !panelRef.current?.contains(target)) setOpen(false);
4255
+ },
4505
4256
  children: [(0, react_jsx_runtime.jsxs)("button", {
4506
4257
  type: "button",
4258
+ ref: triggerRef,
4507
4259
  className: TeamAction_module_css_default.trigger,
4260
+ "aria-haspopup": "dialog",
4508
4261
  "aria-expanded": open,
4509
4262
  onClick: () => {
4510
4263
  const next = !open;
@@ -4512,23 +4265,36 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4512
4265
  if (next) refresh();
4513
4266
  },
4514
4267
  children: [
4515
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconUserOutline16, { size: 14 }),
4268
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconUserOutlineRegular, { size: 14 }),
4516
4269
  (0, react_jsx_runtime.jsx)("span", { children: t("trigger") }),
4517
4270
  teammates.length > 0 && (0, react_jsx_runtime.jsx)("span", {
4518
4271
  className: TeamAction_module_css_default.count,
4519
4272
  children: teammates.length
4520
4273
  })
4521
4274
  ]
4522
- }), open && (0, react_jsx_runtime.jsxs)("div", {
4275
+ }), open && (0, react_dom.createPortal)((0, react_jsx_runtime.jsxs)("div", {
4276
+ ref: panelRef,
4523
4277
  className: TeamAction_module_css_default.panel,
4278
+ style: position ?? {
4279
+ visibility: "hidden",
4280
+ left: 0,
4281
+ top: 0
4282
+ },
4524
4283
  role: "dialog",
4284
+ tabIndex: -1,
4525
4285
  "aria-label": t("trigger"),
4286
+ "data-team-panel": true,
4526
4287
  children: [
4527
4288
  (0, react_jsx_runtime.jsxs)("div", {
4528
4289
  className: TeamAction_module_css_default.toolbar,
4529
4290
  children: [
4530
4291
  (0, react_jsx_runtime.jsx)("strong", { children: t("trigger") }),
4531
4292
  (0, react_jsx_runtime.jsx)("span", { className: TeamAction_module_css_default.spacer }),
4293
+ loading && view !== null && (0, react_jsx_runtime.jsx)("span", {
4294
+ role: "status",
4295
+ "aria-label": t("loading"),
4296
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" })
4297
+ }),
4532
4298
  (0, react_jsx_runtime.jsx)("button", {
4533
4299
  type: "button",
4534
4300
  className: TeamAction_module_css_default.iconButton,
@@ -4536,27 +4302,26 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4536
4302
  onClick: () => {
4537
4303
  refresh();
4538
4304
  },
4539
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline14, {})
4305
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 })
4540
4306
  }),
4541
4307
  (0, react_jsx_runtime.jsx)("button", {
4542
4308
  type: "button",
4543
4309
  className: TeamAction_module_css_default.iconButton,
4544
4310
  "aria-label": t("close"),
4545
- onClick: () => {
4546
- setOpen(false);
4547
- },
4548
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 14 })
4311
+ onClick: close,
4312
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutlineRegular, { size: 14 })
4549
4313
  })
4550
4314
  ]
4551
4315
  }),
4552
- error !== null && (0, react_jsx_runtime.jsx)("div", {
4316
+ error !== null && (0, react_jsx_runtime.jsxs)("div", {
4553
4317
  className: TeamAction_module_css_default.error,
4554
4318
  role: "alert",
4555
- children: error
4319
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "error" }), error]
4556
4320
  }),
4557
- loading && view === null && (0, react_jsx_runtime.jsx)("div", {
4321
+ loading && view === null && (0, react_jsx_runtime.jsxs)("div", {
4558
4322
  className: TeamAction_module_css_default.notice,
4559
- children: t("loading")
4323
+ role: "status",
4324
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" }), t("loading")]
4560
4325
  }),
4561
4326
  view !== null && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("section", { children: [(0, react_jsx_runtime.jsx)("h3", { children: t("roster") }), (0, react_jsx_runtime.jsx)("div", {
4562
4327
  className: TeamAction_module_css_default.roster,
@@ -4566,11 +4331,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4566
4331
  disabled: member.role === "lead" || member.status === "failed" || member.status === "provisioning",
4567
4332
  title: member.role === "teammate" ? t("open") : void 0,
4568
4333
  onClick: () => {
4569
- openTeammate(sessionId, member).catch((reason) => {
4334
+ try {
4335
+ openTeammate(sessionId, member);
4336
+ } catch (reason) {
4570
4337
  setError(String(reason));
4571
- });
4338
+ }
4572
4339
  },
4573
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: member.status === "running" ? "ongoing" : member.status === "failed" ? "error" : "done" }), (0, react_jsx_runtime.jsxs)("span", {
4340
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: memberDotState(member.status) }), (0, react_jsx_runtime.jsxs)("span", {
4574
4341
  className: TeamAction_module_css_default.memberText,
4575
4342
  children: [
4576
4343
  (0, react_jsx_runtime.jsx)("span", { children: member.name }),
@@ -4583,62 +4350,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4583
4350
  })]
4584
4351
  }, member.id))
4585
4352
  })] }), (0, react_jsx_runtime.jsxs)("section", { children: [
4586
- (0, react_jsx_runtime.jsxs)("div", {
4587
- className: TeamAction_module_css_default.sectionTitle,
4588
- children: [(0, react_jsx_runtime.jsx)("h3", { children: t("tasks") }), (0, react_jsx_runtime.jsxs)("button", {
4589
- type: "button",
4590
- className: TeamAction_module_css_default.smallButton,
4591
- onClick: () => {
4592
- setCreating(true);
4593
- },
4594
- children: [
4595
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, { size: 13 }),
4596
- " ",
4597
- t("create")
4598
- ]
4599
- })]
4600
- }),
4601
- creating && (0, react_jsx_runtime.jsx)(TaskForm, {
4602
- draft: createDraft,
4603
- setDraft: setCreateDraft,
4604
- pending: pendingTasks.has("create"),
4605
- onSave: () => {
4606
- submitCreate();
4607
- },
4608
- onCancel: () => {
4609
- setCreating(false);
4610
- },
4611
- t
4612
- }),
4613
- view.tasks.length === 0 && !creating && (0, react_jsx_runtime.jsx)("div", {
4353
+ (0, react_jsx_runtime.jsx)("h3", { children: t("tasks") }),
4354
+ view.tasks.length === 0 && (0, react_jsx_runtime.jsx)("div", {
4614
4355
  className: TeamAction_module_css_default.notice,
4615
4356
  children: t("empty")
4616
4357
  }),
4617
4358
  (0, react_jsx_runtime.jsx)("div", {
4618
4359
  className: TeamAction_module_css_default.tasks,
4619
- children: view.tasks.map((task) => editing === task.id ? (0, react_jsx_runtime.jsx)(TaskForm, {
4620
- draft: editDraft,
4621
- setDraft: setEditDraft,
4622
- pending: pendingTasks.has(task.id),
4623
- onSave: () => {
4624
- submitEdit(task);
4625
- },
4626
- onCancel: () => {
4627
- setEditing(null);
4628
- },
4629
- t
4630
- }, task.id) : (0, react_jsx_runtime.jsxs)("article", {
4360
+ children: view.tasks.map((task) => (0, react_jsx_runtime.jsxs)("article", {
4631
4361
  className: TeamAction_module_css_default.task,
4632
4362
  children: [
4633
4363
  (0, react_jsx_runtime.jsxs)("div", {
4634
4364
  className: TeamAction_module_css_default.taskTitle,
4635
- children: [(0, react_jsx_runtime.jsx)("strong", { children: task.subject }), (0, react_jsx_runtime.jsx)("span", { children: t(statusKey(task.status)) })]
4365
+ children: [(0, react_jsx_runtime.jsx)("strong", { children: task.subject }), (0, react_jsx_runtime.jsxs)("span", {
4366
+ className: TeamAction_module_css_default.taskState,
4367
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: taskDotState(task) }), (0, react_jsx_runtime.jsx)("span", { children: t(statusKey(task.status)) })]
4368
+ })]
4636
4369
  }),
4637
4370
  (0, react_jsx_runtime.jsx)("p", { children: task.description }),
4638
4371
  (0, react_jsx_runtime.jsxs)("div", {
4639
4372
  className: TeamAction_module_css_default.meta,
4640
4373
  children: [
4641
4374
  (0, react_jsx_runtime.jsx)("span", { children: task.id }),
4375
+ (0, react_jsx_runtime.jsxs)("span", { children: [
4376
+ t("owner"),
4377
+ ": ",
4378
+ task.ownerName ?? t("unowned")
4379
+ ] }),
4642
4380
  task.status === "pending" && (0, react_jsx_runtime.jsx)("span", { children: task.ready ? t("ready") : t("blocked") }),
4643
4381
  task.blockedBy.length > 0 && (0, react_jsx_runtime.jsxs)("span", { children: [
4644
4382
  t("blockedBy"),
@@ -4655,149 +4393,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4655
4393
  children: warning
4656
4394
  }, warning))
4657
4395
  ]
4658
- }),
4659
- (0, react_jsx_runtime.jsxs)("div", {
4660
- className: TeamAction_module_css_default.taskActions,
4661
- children: [
4662
- (0, react_jsx_runtime.jsxs)("label", { children: [t("owner"), (0, react_jsx_runtime.jsxs)("select", {
4663
- value: task.ownerName ?? "",
4664
- disabled: pendingTasks.has(task.id) || task.status === "completed",
4665
- onChange: (event) => {
4666
- const owner = event.target.value;
4667
- settleTask(task.id, () => updateTask(sessionId, {
4668
- taskId: task.id,
4669
- expectedRevision: task.revision,
4670
- action: "reassign",
4671
- ...owner === "" ? {} : { owner }
4672
- }));
4673
- },
4674
- children: [(0, react_jsx_runtime.jsx)("option", {
4675
- value: "",
4676
- children: t("unowned")
4677
- }), assignable.map((member) => (0, react_jsx_runtime.jsx)("option", {
4678
- value: member.name,
4679
- children: member.name
4680
- }, member.id))]
4681
- })] }),
4682
- (0, react_jsx_runtime.jsxs)("button", {
4683
- type: "button",
4684
- onClick: () => {
4685
- startEdit(task);
4686
- },
4687
- disabled: pendingTasks.has(task.id),
4688
- children: [
4689
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutline16, { size: 13 }),
4690
- " ",
4691
- t("edit")
4692
- ]
4693
- }),
4694
- task.status === "in_progress" && (0, react_jsx_runtime.jsxs)("button", {
4695
- type: "button",
4696
- disabled: pendingTasks.has(task.id),
4697
- onClick: () => {
4698
- settleTask(task.id, () => updateTask(sessionId, {
4699
- taskId: task.id,
4700
- expectedRevision: task.revision,
4701
- action: "complete"
4702
- }));
4703
- },
4704
- children: [
4705
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline14, {}),
4706
- " ",
4707
- t("complete")
4708
- ]
4709
- }),
4710
- task.status === "completed" && (0, react_jsx_runtime.jsx)("button", {
4711
- type: "button",
4712
- disabled: pendingTasks.has(task.id),
4713
- onClick: () => {
4714
- settleTask(task.id, () => updateTask(sessionId, {
4715
- taskId: task.id,
4716
- expectedRevision: task.revision,
4717
- action: "reopen"
4718
- }));
4719
- },
4720
- children: t("reopen")
4721
- }),
4722
- (0, react_jsx_runtime.jsxs)("button", {
4723
- type: "button",
4724
- disabled: pendingTasks.has(task.id),
4725
- onClick: () => {
4726
- settleTask(task.id, () => updateTask(sessionId, {
4727
- taskId: task.id,
4728
- expectedRevision: task.revision,
4729
- action: "delete"
4730
- }));
4731
- },
4732
- children: [
4733
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, { size: 13 }),
4734
- " ",
4735
- t("delete")
4736
- ]
4737
- })
4738
- ]
4739
4396
  })
4740
4397
  ]
4741
4398
  }, task.id))
4742
4399
  })
4743
4400
  ] })] })
4744
4401
  ]
4745
- })]
4746
- });
4747
- }
4748
- function TaskForm({ draft, setDraft, pending, onSave, onCancel, t }) {
4749
- const field = (key, value) => {
4750
- setDraft({
4751
- ...draft,
4752
- [key]: value
4753
- });
4754
- };
4755
- return (0, react_jsx_runtime.jsxs)("div", {
4756
- className: TeamAction_module_css_default.form,
4757
- children: [
4758
- (0, react_jsx_runtime.jsx)("input", {
4759
- value: draft.subject,
4760
- placeholder: t("subject"),
4761
- onChange: (event) => {
4762
- field("subject", event.target.value);
4763
- }
4764
- }),
4765
- (0, react_jsx_runtime.jsx)("textarea", {
4766
- value: draft.description,
4767
- placeholder: t("description"),
4768
- onChange: (event) => {
4769
- field("description", event.target.value);
4770
- }
4771
- }),
4772
- (0, react_jsx_runtime.jsx)("input", {
4773
- value: draft.blockers,
4774
- placeholder: t("blockers"),
4775
- onChange: (event) => {
4776
- field("blockers", event.target.value);
4777
- }
4778
- }),
4779
- (0, react_jsx_runtime.jsx)("input", {
4780
- value: draft.scopes,
4781
- placeholder: t("scopes"),
4782
- onChange: (event) => {
4783
- field("scopes", event.target.value);
4784
- }
4785
- }),
4786
- (0, react_jsx_runtime.jsxs)("div", {
4787
- className: TeamAction_module_css_default.formActions,
4788
- children: [(0, react_jsx_runtime.jsx)("button", {
4789
- type: "button",
4790
- disabled: pending || draft.subject.trim() === "" || draft.description.trim() === "",
4791
- onClick: onSave,
4792
- children: t("save")
4793
- }), (0, react_jsx_runtime.jsx)("button", {
4794
- type: "button",
4795
- disabled: pending,
4796
- onClick: onCancel,
4797
- children: t("cancel")
4798
- })]
4799
- })
4800
- ]
4402
+ }), document.body)]
4801
4403
  });
4802
4404
  }
4803
4405
  //#endregion
@@ -4816,26 +4418,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4816
4418
  tasks: "共享任务",
4817
4419
  model: "模型",
4818
4420
  open: "打开 teammate 会话",
4819
- create: "新建任务",
4820
- subject: "任务标题",
4821
- description: "任务描述",
4822
- blockers: "依赖任务 id(逗号分隔)",
4823
- scopes: "写入范围(逗号分隔)",
4824
- save: "保存",
4825
- cancel: "取消",
4826
- edit: "编辑",
4827
- complete: "完成",
4828
- reopen: "重开",
4829
- delete: "删除",
4830
4421
  owner: "Owner",
4831
4422
  unowned: "未分配",
4832
4423
  blockedBy: "依赖",
4833
4424
  writeScopes: "写入范围",
4834
4425
  ready: "可开始",
4835
4426
  blocked: "被依赖阻塞",
4836
- conflict: "任务状态已变化,已重新加载;请检查后重试。",
4837
4427
  "memberStatus.running": "运行中",
4838
- "memberStatus.idle": "空闲",
4839
4428
  "memberStatus.inactive": "未运行",
4840
4429
  "memberStatus.provisioning": "准备中",
4841
4430
  "memberStatus.failed": "失败",
@@ -4854,26 +4443,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4854
4443
  tasks: "Shared tasks",
4855
4444
  model: "Model",
4856
4445
  open: "Open teammate conversation",
4857
- create: "New task",
4858
- subject: "Task subject",
4859
- description: "Task description",
4860
- blockers: "Blocking task ids (comma separated)",
4861
- scopes: "Write scopes (comma separated)",
4862
- save: "Save",
4863
- cancel: "Cancel",
4864
- edit: "Edit",
4865
- complete: "Complete",
4866
- reopen: "Reopen",
4867
- delete: "Delete",
4868
4446
  owner: "Owner",
4869
4447
  unowned: "Unowned",
4870
4448
  blockedBy: "Blocked by",
4871
4449
  writeScopes: "Write scopes",
4872
4450
  ready: "Ready",
4873
4451
  blocked: "Blocked by dependencies",
4874
- conflict: "Task state changed and was reloaded. Review it before retrying.",
4875
4452
  "memberStatus.running": "Running",
4876
- "memberStatus.idle": "Idle",
4877
4453
  "memberStatus.inactive": "Inactive",
4878
4454
  "memberStatus.provisioning": "Provisioning",
4879
4455
  "memberStatus.failed": "Failed",
@@ -4905,20 +4481,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4905
4481
  async load(sessionId) {
4906
4482
  return await ctx.remote.agentTeams.view(leadSessionId(sessionId));
4907
4483
  },
4908
- async createTask(sessionId, input) {
4909
- return await ctx.remote.agentTeams.createTask(leadSessionId(sessionId), input);
4910
- },
4911
- async updateTask(sessionId, input) {
4912
- const { owner, ...rest } = input;
4913
- return await ctx.remote.agentTeams.updateTask(leadSessionId(sessionId), {
4914
- ...rest,
4915
- ...owner === void 0 ? {} : { owner }
4916
- });
4917
- },
4918
- async openTeammate(sessionId, member) {
4484
+ openTeammate(sessionId, member) {
4919
4485
  if (member.role !== "teammate") return;
4920
4486
  const parentSessionId = leadSessionId(sessionId);
4921
- await sessions.refreshSubagents(parentSessionId);
4922
4487
  if ((sessions.retainInfo(sessionId).getSnapshot().retainedBy.mainView ?? 0) === 0) return;
4923
4488
  ctx.uiWorkspace.openSession({
4924
4489
  parentSessionId,
@@ -1,35 +1,17 @@
1
1
  import type { SessionId } from '@deepseek-ai/dsh-session/types';
2
- import type { TeamMemberView as TeamRosterMember, TeamTaskAction, TeamTaskId, TeamTaskMutationResult, TeamView } from '@deepseek-ai/dsh-experimental-agent-team/client';
2
+ import type { TeamMemberView as TeamRosterMember, TeamView } from '@deepseek-ai/dsh-experimental-agent-team/client';
3
3
  import type { RemoteResult } from '@deepseek-ai/dsh-api-remotes/client';
4
4
  import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
5
5
  import { NS } from './locales.ts';
6
6
  /** Generated Remote result consumed directly by the Team UI. */
7
7
  export type TeamActionResult<T> = RemoteResult<T>;
8
- /** Generated Remote result whose business value preserves Team task rejections. */
9
- export type TeamTaskActionResult = RemoteResult<TeamTaskMutationResult>;
10
8
  /** Business actions injected by the browser plugin. */
11
9
  export interface TeamActionInjected {
12
10
  load: (sessionId: SessionId) => Promise<TeamActionResult<TeamView>>;
13
- createTask: (sessionId: SessionId, input: {
14
- subject: string;
15
- description: string;
16
- blockedBy: TeamTaskId[];
17
- writeScopes: string[];
18
- }) => Promise<TeamTaskActionResult>;
19
- updateTask: (sessionId: SessionId, input: {
20
- taskId: TeamTaskId;
21
- expectedRevision: number;
22
- action: TeamTaskAction;
23
- subject?: string;
24
- description?: string;
25
- blockedBy?: TeamTaskId[];
26
- writeScopes?: string[];
27
- owner?: string;
28
- }) => Promise<TeamTaskActionResult>;
29
- openTeammate: (sessionId: SessionId, member: TeamRosterMember) => Promise<void>;
11
+ openTeammate: (sessionId: SessionId, member: TeamRosterMember) => void;
30
12
  }
31
13
  /** Full props of the Team conversation-header action. */
32
14
  export type TeamActionProps = PropsRuntime<'conversation.session.header.actions'> & TeamActionInjected & PropsLocale<typeof NS>;
33
- /** Render the live Team roster and compare-and-set task board. */
34
- export declare function TeamAction({ sessionId, load, createTask, updateTask, openTeammate, t, }: TeamActionProps): import("react").JSX.Element;
15
+ /** Render the Team roster and read-only task board. */
16
+ export declare function TeamAction({ sessionId, load, openTeammate, t, }: TeamActionProps): import("react").JSX.Element;
35
17
  //# sourceMappingURL=TeamAction.d.ts.map
@@ -12,26 +12,13 @@ export declare const zh: {
12
12
  tasks: string;
13
13
  model: string;
14
14
  open: string;
15
- create: string;
16
- subject: string;
17
- description: string;
18
- blockers: string;
19
- scopes: string;
20
- save: string;
21
- cancel: string;
22
- edit: string;
23
- complete: string;
24
- reopen: string;
25
- delete: string;
26
15
  owner: string;
27
16
  unowned: string;
28
17
  blockedBy: string;
29
18
  writeScopes: string;
30
19
  ready: string;
31
20
  blocked: string;
32
- conflict: string;
33
21
  'memberStatus.running': string;
34
- 'memberStatus.idle': string;
35
22
  'memberStatus.inactive': string;
36
23
  'memberStatus.provisioning': string;
37
24
  'memberStatus.failed': string;
@@ -52,26 +39,13 @@ export declare const en: {
52
39
  tasks: string;
53
40
  model: string;
54
41
  open: string;
55
- create: string;
56
- subject: string;
57
- description: string;
58
- blockers: string;
59
- scopes: string;
60
- save: string;
61
- cancel: string;
62
- edit: string;
63
- complete: string;
64
- reopen: string;
65
- delete: string;
66
42
  owner: string;
67
43
  unowned: string;
68
44
  blockedBy: string;
69
45
  writeScopes: string;
70
46
  ready: string;
71
47
  blocked: string;
72
- conflict: string;
73
48
  'memberStatus.running': string;
74
- 'memberStatus.idle': string;
75
49
  'memberStatus.inactive': string;
76
50
  'memberStatus.provisioning': string;
77
51
  'memberStatus.failed': string;
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Team Panel",
4
+ "description": "View team members and shared tasks, and navigate to member conversations."
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "团队面板",
4
+ "description": "查看团队成员和共享任务,并切换到成员会话。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-experimental-client-ui-agent-team",
3
3
  "description": "Web Agent Teams roster, task board, and teammate navigation",
4
- "version": "0.1.6-alpha.2",
4
+ "version": "0.1.7-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -22,6 +22,7 @@
22
22
  "types": "./lib/types/client/index.d.ts",
23
23
  "default": "./lib/client.js"
24
24
  },
25
+ "./locale/*.json": "./locale/*.json",
25
26
  "./src/*": "./src/*",
26
27
  "./package.json": "./package.json"
27
28
  },
@@ -40,41 +41,43 @@
40
41
  },
41
42
  "license": "MIT",
42
43
  "peerDependencies": {
43
- "@deepseek-ai/dsh-api-session-controller": "^0.1.6-alpha.2",
44
- "@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.2",
45
- "@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.2",
46
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.2",
47
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.2",
48
- "@deepseek-ai/dsh-client-ui-session": "^0.1.6-alpha.2",
49
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.2",
50
- "@deepseek-ai/dsh-client-ui-workspace": "^0.1.6-alpha.2",
51
- "@deepseek-ai/dsh-session": "^0.1.6-alpha.2",
52
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.6-alpha.2",
53
- "@deepseek-ai/dsh-experimental-agent-team": "^0.1.6-alpha.2",
54
- "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.2",
55
- "@deepseek-ai/cordis": "^4.0.2"
44
+ "@deepseek-ai/dsh-api-remotes": "^0.1.7-alpha.1",
45
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.7-alpha.1",
46
+ "@deepseek-ai/dsh-client-locale": "^0.1.7-alpha.1",
47
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.7-alpha.1",
48
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.7-alpha.1",
49
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.7-alpha.1",
50
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.7-alpha.1",
51
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.7-alpha.1",
52
+ "@deepseek-ai/dsh-client-ui-workspace": "^0.1.7-alpha.1",
53
+ "@deepseek-ai/dsh-experimental-agent-team": "^0.1.7-alpha.1",
54
+ "@deepseek-ai/dsh-session": "^0.1.7-alpha.1",
55
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.7-alpha.1",
56
+ "@deepseek-ai/cordis": "^4.0.3"
56
57
  },
57
58
  "devDependencies": {
58
59
  "@testing-library/react": "^16.1.0",
59
60
  "@types/react": "~18.3.1",
61
+ "@types/react-dom": "~18.3.0",
60
62
  "react": "^18.2.0",
61
63
  "react-dom": "^18.2.0",
62
- "@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.2",
63
- "@deepseek-ai/dsh-api-session-controller": "^0.1.6-alpha.2",
64
- "@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.2",
65
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.6-alpha.2",
66
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.6-alpha.2",
67
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.2",
68
- "@deepseek-ai/dsh-client-ui-session": "^0.1.6-alpha.2",
69
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.2",
70
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.2",
71
- "@deepseek-ai/dsh-session": "^0.1.6-alpha.2",
72
- "@deepseek-ai/dsh-experimental-agent-team": "^0.1.6-alpha.2",
73
- "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.2",
74
- "@deepseek-ai/dsh-client-ui-workspace": "^0.1.6-alpha.2",
75
- "@deepseek-ai/cordis": "^4.0.2"
64
+ "@deepseek-ai/dsh-api-remotes": "^0.1.7-alpha.1",
65
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.7-alpha.1",
66
+ "@deepseek-ai/dsh-client-locale": "^0.1.7-alpha.1",
67
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.7-alpha.1",
68
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.7-alpha.1",
69
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.7-alpha.1",
70
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.7-alpha.1",
71
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.7-alpha.1",
72
+ "@deepseek-ai/dsh-client-ui-workspace": "^0.1.7-alpha.1",
73
+ "@deepseek-ai/dsh-experimental-agent-team": "^0.1.7-alpha.1",
74
+ "@deepseek-ai/dsh-session": "^0.1.7-alpha.1",
75
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.7-alpha.1",
76
+ "@deepseek-ai/cordis": "^4.0.3",
77
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.7-alpha.1"
76
78
  },
77
79
  "files": [
80
+ "locale/*.json",
78
81
  "lib/index.js",
79
82
  "lib/client.js",
80
83
  "lib/types/**/*.d.ts"