fix(team): preserve current Client architecture after rebase

This commit is contained in:
fengsy
2026-08-26 10:56:57 +08:00
parent 8852161662
commit eadd5df82b
51 changed files with 363 additions and 147 deletions
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-18-experimental-agent-teams-packages.md
2026-08-18-experimental-agent-teams-packages.md: 495922d57bd88a78f0ca6b61367ef49c820db632
2026-08-18-experimental-agent-teams-packages.zh.md: 65aed57e223d8fa9b8ff97e2fcc109057b51474d
2026-08-18-experimental-agent-teams-packages.md: b769791d52472290f76eec7e518f24001db919ad
2026-08-18-experimental-agent-teams-packages.zh.md: 25227770b5029b1baedef6bd9b7ad78b79586365
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-06-agent-teams-web.md
2026-08-06-agent-teams-web.md: fca3ee6a79f292b21c44a168e499e1be2179d7e9
2026-08-06-agent-teams-web.zh.md: 5f3e0333aed08be831e6cfd653dc476f6ca6a374
2026-08-06-agent-teams-web.md: 5002146f7db67f7199102b286a85da0148864fa9
2026-08-06-agent-teams-web.zh.md: d05f22141811f35ba52a92a02c8153b024ef8d8d
@@ -6,7 +6,7 @@ English | [中文](2026-08-06-agent-teams-web.zh.md)
## Problem
The durable Agent Teams runtime owns roster, mailbox, and task state but exposes only model tools and Host service methods. Web users need to inspect teammate activity, manage shared tasks with the same compare-and-set rules, and open a teammate conversation. Agent Teams is still experimental, so these capabilities must not add Team-specific contracts or dependencies to the stable API Proxy, Client runtime, Subagent UI, or Web bundle.
The durable Agent Teams runtime owns roster, mailbox, and task state but exposes only model tools and Host service methods. Web users need to inspect teammate activity, manage shared tasks with the same compare-and-set rules, and open a teammate conversation. Agent Teams is still experimental, so these capabilities must not add Team-specific contracts or dependencies to the stable API Proxy, Session Controller, Client UI packages, or Web bundle.
## Decision
@@ -40,4 +40,4 @@ Team-service unit tests, generation, and a plain-Node built-artifact smoke verif
## Consequences
The Team service is the single Cordis owner for both domain state and the Remote operations that expose selected Team values. The stable API Proxy, Client runtime, Subagent UI, and Web bundle remain Team-agnostic. Source-checkout users must add two ordered experimental profile layers to a Web profile. Promotion renames the experimental npm packages but does not require a new generated namespace.
The Team service is the single Cordis owner for both domain state and the Remote operations that expose selected Team values. The stable API Proxy, Session Controller, Client UI packages, and Web bundle remain Team-agnostic. Source-checkout users must add two ordered experimental profile layers to a Web profile. Promotion renames the experimental npm packages but does not require a new generated namespace.
@@ -6,7 +6,7 @@
## 问题
持久 Agent Teams runtime 负责 roster、mailbox 与 task 状态,但只提供模型工具和 Host service method。Web 用户需要查看 teammate 活动、按同样的 compare-and-set 规则管理共享任务,并打开 teammate 会话。Agent Teams 仍处于实验阶段,因此这些能力不能向稳定 API Proxy、Client runtime、Subagent UI 或 Web bundle 增加 Team 专用 contract 或依赖。
持久 Agent Teams runtime 负责 roster、mailbox 与 task 状态,但只提供模型工具和 Host service method。Web 用户需要查看 teammate 活动、按同样的 compare-and-set 规则管理共享任务,并打开 teammate 会话。Agent Teams 仍处于实验阶段,因此这些能力不能向稳定 API Proxy、Session Controller、Client UI package 或 Web bundle 增加 Team 专用 contract 或依赖。
## 决策
@@ -18,7 +18,7 @@ Teammate navigation 使用既有 `{ parentSessionId, childSessionId, mode: 'cont
`@deepseek-ai/dsh-experimental-agent-team-web-profile` 在稳定 Web bundle 之后只插入 UI。它与 Host 侧 `@deepseek-ai/dsh-experimental-agent-team-profile` 一起应用,后者已经插入 `ctx.agentTeams` 与模型工具。两个稳定 bundle 都不包含禁用的 Team row 或依赖。
稳定 Web preset 仍会在自身 preset scope 内注册 continuable Subagent control。顶层 Agent Teams profile override 无法替换这些 registration,因此该实验性 composition 可能同时暴露 Team roster 与 legacy child control。Team-aware Web preset 暂缓实现;[Web profile README](../../../../packages/experimental/agent-team-web-profile/README.zh.md#已知限制与暂缓事项)负责记录当前限制。
稳定 Web preset 仍会在自身 preset scope 内注册 continuable Subagent control。顶层 Agent Teams profile override 无法替换这些 registration,因此该实验性 composition 可能同时暴露 Team roster 与 legacy child control。Team-aware Web preset 暂缓实现;[Web profile README](../../../../packages/experimental/agent-team-web-profile/README.zh.md#known-limitations-and-deferred-work)负责记录当前限制。
## 边界
@@ -40,4 +40,4 @@ Team service 单元测试、生成流程与 plain-Node built-artifact smoke 校
## 后果
Team service 是 domain state 与公开选定 Team value 的 Remote operation 的唯一 Cordis owner。稳定 API Proxy、Client runtime、Subagent UI 和 Web bundle 保持 Team 无关。源码 checkout 用户必须向 Web profile 添加两个有序 experimental profile 层。Promotion 会重命名实验性 npm package,但不要求新的生成式 namespace。
Team service 是 domain state 与公开选定 Team value 的 Remote operation 的唯一 Cordis owner。稳定 API Proxy、Session Controller、Client UI package 和 Web bundle 保持 Team 无关。源码 checkout 用户必须向 Web profile 添加两个有序 experimental profile 层。Promotion 会重命名实验性 npm package,但不要求新的生成式 namespace。
+5 -5
View File
@@ -22,8 +22,8 @@
backgroundMode: one-shot
- insert:
- id: team
name: '@deepseek-ai/dsh-team'
- id: agent-team
name: '@deepseek-ai/dsh-experimental-agent-team'
config:
maxMembers: 8
maxTasks: 256
@@ -31,12 +31,12 @@
maxMessageBytes: 65536
disposalTimeoutMs: 5000
- id: tool-team
name: '@deepseek-ai/dsh-tool-team'
- id: tool-agent-team
name: '@deepseek-ai/dsh-experimental-tool-agent-team'
config:
freshProvider: spawn
forkProvider: fork
- insert:
- id: ui-agent-team
name: '@deepseek-ai/dsh-client-ui-agent-team'
name: '@deepseek-ai/dsh-experimental-client-ui-agent-team'
@@ -8,7 +8,7 @@
- button "Close":
- img
- heading "Members" [level=3]
- 'button "lead idle · Model: deepseek-v4-flash" [disabled]'
- 'button "lead Idle · Model: deepseek-v4-flash" [disabled]'
- heading "Shared tasks" [level=3]
- button "New task":
- img
+2 -2
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/capability-seams.md
capability-seams.md: d86a05e240cd64a0c8a172b00fe9e1df809fe408
capability-seams.zh.md: 1050191d696fd5a46aa28101beef118b07c29ed2
capability-seams.md: 2ee2d1b989c4eb25b245cfd528b2fa1ba3bb0272
capability-seams.zh.md: 7ecda568ef4df4d360414ee872d2b0241ebe1dce
+3 -1
View File
@@ -172,6 +172,7 @@ flowchart LR
pkg_experimental_agent_team["experimental-agent-team"]
svc_agentTeams["ctx.agentTeams<br/>Agent Teams coordination domain"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_client_ui_agent_team["experimental-client-ui-agent-team"]
pkg_jobs["jobs"]
svc_jobs["ctx.jobs<br/>Background job registry"]
pkg_jobs_local["jobs-local"]
@@ -324,6 +325,7 @@ flowchart LR
svc_agentDefaultModel --> pkg_headless
svc_agentDefaultModel --> pkg_host_apiproxy
svc_agentLoop --> pkg_agent_spine_demo
svc_agentTeams --> pkg_experimental_client_ui_agent_team
svc_agentTeams --> pkg_experimental_tool_agent_team
svc_agents --> pkg_acp
svc_agents --> pkg_agent_loop
@@ -500,7 +502,7 @@ flowchart LR
| `ctx.fs` | `seam` | [`fs`](../packages/fs/fs) | [`fs-local`](../packages/fs/fs-local), [`fs-sandbox`](../packages/fs/fs-sandbox), [`fs-e2b`](../packages/e2b/fs-e2b) | [`tool-fs`](../packages/fs/tool-fs) | [`fs-observation-policy`](../packages/fs/fs-observation-policy) | tool-fs executes read/write/edit through ctx.fs; fs-sandbox fences mutations by the shared sandbox mode; fs-observation-policy contributes observed-state checks through the fs/* event gate. |
| `ctx.compaction` | `seam` | [`compaction`](../packages/compaction/compaction) | [`compaction-basic`](../packages/compaction/compaction-basic) | [`compaction-basic`](../packages/compaction/compaction-basic) | - | The basic backend consumes post-step pressure and request-error recovery events; there is no model-facing compact tool. |
| `ctx.subagents` | `seam` | [`subagent`](../packages/subagent/subagent) | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process), [`subagent-fork-in-process`](../packages/subagent/subagent-fork-in-process), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code), [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control), [`tool-ralph`](../packages/workflow/tool-ralph) | - | Providers implement transports; the service also owns optional Activation-based continuation orchestration, tool-subagent selects one-shot or continuable delegation, tool-subagent-control delivers follow-ups, and tool-ralph requires one fresh structured-output route. |
| `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | - | Owns the implicit-root roster, durable peer mailbox, shared task DAG, and continuable-child lifecycle; tool-agent-team contributes the scoped model policy and controls. |
| `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team), [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | - | Owns the implicit-root roster, durable peer mailbox, shared task DAG, continuable-child lifecycle, and generated Team Remote methods; tool-agent-team contributes model controls and client-ui-agent-team mounts the browser contribution. |
| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-jobs`](../packages/jobs/tool-jobs) | - | Producers (background bash, PTY sends, and subagent delegations) register running work; tool-jobs is the model-facing controller that reads, lists, and kills it; jobs-local is the process-local registry. |
| `ctx.web` | `seam` | [`web`](../packages/web/web) | [`web-search-exa`](../packages/web/web-search-exa), [`web-search-perplexity`](../packages/web/web-search-perplexity), [`web-search-deepseek`](../packages/web/web-search-deepseek), [`web-fetch-http`](../packages/web/web-fetch-http) | [`tool-web`](../packages/web/tool-web) | - | Search and fetch providers register into one ctx.web seam; tool-web owns the stable model-facing names. |
| `ctx.spillStore` | `seam` | [`spill`](../packages/spill/spill) | [`spill-local`](../packages/spill/spill-local) | [`spill-policy`](../packages/spill/spill-policy) | - | The backend saves oversized tool text and returns a model-facing locator plus retrieval hint; spill-policy is the tools/post-execute consumer that decides when to spill. |
+3 -1
View File
@@ -174,6 +174,7 @@ flowchart LR
pkg_experimental_agent_team["experimental-agent-team"]
svc_agentTeams["ctx.agentTeams<br/>Agent Teams coordination domain"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_client_ui_agent_team["experimental-client-ui-agent-team"]
pkg_jobs["jobs"]
svc_jobs["ctx.jobs<br/>Background job registry"]
pkg_jobs_local["jobs-local"]
@@ -326,6 +327,7 @@ flowchart LR
svc_agentDefaultModel --> pkg_headless
svc_agentDefaultModel --> pkg_host_apiproxy
svc_agentLoop --> pkg_agent_spine_demo
svc_agentTeams --> pkg_experimental_client_ui_agent_team
svc_agentTeams --> pkg_experimental_tool_agent_team
svc_agents --> pkg_acp
svc_agents --> pkg_agent_loop
@@ -502,7 +504,7 @@ flowchart LR
| `ctx.fs` | `seam` | [`fs`](../packages/fs/fs) | [`fs-local`](../packages/fs/fs-local), [`fs-sandbox`](../packages/fs/fs-sandbox), [`fs-e2b`](../packages/e2b/fs-e2b) | [`tool-fs`](../packages/fs/tool-fs) | [`fs-observation-policy`](../packages/fs/fs-observation-policy) | tool-fs 通过 ctx.fs 执行读取/写入/编辑;fs-sandbox 按共享沙箱模式限制变更;fs-observation-policy 通过 fs/* 事件门禁贡献基于观测状态的检查。 |
| `ctx.compaction` | `seam` | [`compaction`](../packages/compaction/compaction) | [`compaction-basic`](../packages/compaction/compaction-basic) | [`compaction-basic`](../packages/compaction/compaction-basic) | - | 基础后端消费步骤后的压力事件和请求错误恢复事件;不存在面向模型的压缩工具。 |
| `ctx.subagents` | `seam` | [`subagent`](../packages/subagent/subagent) | [`subagent-spawn-in-process`](../packages/subagent/subagent-spawn-in-process), [`subagent-fork-in-process`](../packages/subagent/subagent-fork-in-process), [`subagent-acp`](../packages/subagent/subagent-acp), [`subagent-codex`](../packages/subagent/subagent-codex), [`subagent-claude-code`](../packages/subagent/subagent-claude-code), [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control), [`tool-ralph`](../packages/workflow/tool-ralph) | - | 提供方实现传输;该服务还负责可选的、基于 Activation 的延续编排,tool-subagent 选择一次性或可延续委派,tool-subagent-control 传递后续消息,而 tool-ralph 要求一条全新的结构化输出路由。 |
| `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | - | 负责隐式 Root roster、持久 peer mailbox、共享任务 DAGcontinuable child 生命周期tool-agent-team 提供作用域化模型策略和控制工具。 |
| `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team), [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | - | 负责隐式 Root roster、持久 peer mailbox、共享任务 DAGcontinuable child 生命周期与生成式 Team Remote methodtool-agent-team 提供模型控制工具,client-ui-agent-team 挂载浏览器 contribution。 |
| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-terminal`](../packages/terminal/tool-terminal), [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-jobs`](../packages/jobs/tool-jobs) | - | 生产方(后台 bash、PTY 发送和 subagent 委派)登记正在运行的工作;tool-jobs 是面向模型的控制器,用于读取、列出和终止这些工作;jobs-local 是进程本地注册表。 |
| `ctx.web` | `seam` | [`web`](../packages/web/web) | [`web-search-exa`](../packages/web/web-search-exa), [`web-search-perplexity`](../packages/web/web-search-perplexity), [`web-search-deepseek`](../packages/web/web-search-deepseek), [`web-fetch-http`](../packages/web/web-fetch-http) | [`tool-web`](../packages/web/tool-web) | - | 搜索和抓取提供方注册到同一个 ctx.web seamtool-web 负责稳定的面向模型名称。 |
| `ctx.spillStore` | `seam` | [`spill`](../packages/spill/spill) | [`spill-local`](../packages/spill/spill-local) | [`spill-policy`](../packages/spill/spill-policy) | - | 后端保存过大的工具文本,并返回面向模型的定位信息和取回提示;spill-policy 是 tools/post-execute 消费方,负责决定何时 spill。 |
+2 -2
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/config-catalog.md
config-catalog.md: e4d60a02367bb35965564ee88dcb4065c97a5cf4
config-catalog.zh.md: 9dc302705780297a4dd177174613ad3346516e2a
config-catalog.md: aaadee78a5de4a42fc28566215b9fff70a5caca4
config-catalog.zh.md: 393857b50cb7e750eb90fc6e3a605559a5ce2cad
+3 -1
View File
@@ -594,7 +594,7 @@ export interface Config {
}
```
Source: [`packages/experimental/agent-team/src/types.ts:125`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/experimental/agent-team/src/types.ts:131`](../packages/experimental/agent-team/src/types.ts)
<a id="deepseek-aidsh-experimental-tool-agent-team"></a>
@@ -3365,6 +3365,7 @@ These load from a `cordis.yml` entry with no `config:` block; they declare no co
- `@deepseek-ai/dsh-commands` ([`packages/interaction/commands/src/index.ts`](../packages/interaction/commands/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-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-client-ui-agent-team` ([`packages/experimental/client-ui-agent-team/src/index.ts`](../packages/experimental/client-ui-agent-team/src/index.ts))
- `@deepseek-ai/dsh-fs-e2b` — requires `e2b` ([`packages/e2b/fs-e2b/src/index.ts`](../packages/e2b/fs-e2b/src/index.ts))
- `@deepseek-ai/dsh-fs-observation-policy` ([`packages/fs/fs-observation-policy/src/index.ts`](../packages/fs/fs-observation-policy/src/index.ts))
- `@deepseek-ai/dsh-goal-round-driver` — requires `agents` · `goals` · `sessions` ([`packages/goal/goal-round-driver/src/index.ts`](../packages/goal/goal-round-driver/src/index.ts))
@@ -3431,6 +3432,7 @@ Imported as libraries by other packages; a `cordis.yml` cannot load them.
- `@deepseek-ai/dsh-cmdline` ([`packages/boot/cmdline/src/index.ts`](../packages/boot/cmdline/src/index.ts))
- `@deepseek-ai/dsh-code-runtime-python` ([`packages/code-runtime/code-runtime-python/src/index.ts`](../packages/code-runtime/code-runtime-python/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))
- `@deepseek-ai/dsh-experimental-agent-team-web-profile` ([`packages/experimental/agent-team-web-profile/src/index.ts`](../packages/experimental/agent-team-web-profile/src/index.ts))
- `@deepseek-ai/dsh-experimental-webworker-packer` ([`packages/experimental/webworker-packer/src/index.ts`](../packages/experimental/webworker-packer/src/index.ts))
- `@deepseek-ai/dsh-experimental-webworker-runtime` ([`packages/experimental/webworker-runtime/src/index.ts`](../packages/experimental/webworker-runtime/src/index.ts))
- `@deepseek-ai/dsh-home-paths` ([`packages/util/home-paths/src/index.ts`](../packages/util/home-paths/src/index.ts))
+2
View File
@@ -3367,6 +3367,7 @@ export interface Config {
- `@deepseek-ai/dsh-commands`[`packages/interaction/commands/src/index.ts`](../packages/interaction/commands/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-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-client-ui-agent-team`[`packages/experimental/client-ui-agent-team/src/index.ts`](../packages/experimental/client-ui-agent-team/src/index.ts)
- `@deepseek-ai/dsh-fs-e2b` — 需要 `e2b`[`packages/e2b/fs-e2b/src/index.ts`](../packages/e2b/fs-e2b/src/index.ts)
- `@deepseek-ai/dsh-fs-observation-policy`[`packages/fs/fs-observation-policy/src/index.ts`](../packages/fs/fs-observation-policy/src/index.ts)
- `@deepseek-ai/dsh-goal-round-driver` — 需要 `agents` · `goals` · `sessions`[`packages/goal/goal-round-driver/src/index.ts`](../packages/goal/goal-round-driver/src/index.ts)
@@ -3432,6 +3433,7 @@ export interface Config {
- `@deepseek-ai/dsh-cmdline`[`packages/boot/cmdline/src/index.ts`](../packages/boot/cmdline/src/index.ts)
- `@deepseek-ai/dsh-code-runtime-python`[`packages/code-runtime/code-runtime-python/src/index.ts`](../packages/code-runtime/code-runtime-python/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)
- `@deepseek-ai/dsh-experimental-agent-team-web-profile`[`packages/experimental/agent-team-web-profile/src/index.ts`](../packages/experimental/agent-team-web-profile/src/index.ts)
- `@deepseek-ai/dsh-experimental-webworker-packer`[`packages/experimental/webworker-packer/src/index.ts`](../packages/experimental/webworker-packer/src/index.ts)
- `@deepseek-ai/dsh-experimental-webworker-runtime`[`packages/experimental/webworker-runtime/src/index.ts`](../packages/experimental/webworker-runtime/src/index.ts)
- `@deepseek-ai/dsh-home-paths`[`packages/util/home-paths/src/index.ts`](../packages/util/home-paths/src/index.ts)
+2 -2
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/module-graph.md
module-graph.md: 3cafd70ae2cc982470d8594228764bf701ab687c
module-graph.zh.md: 0037321174ff91b59a3957d4bfa6f620af6dcc93
module-graph.md: e044939e4b48dee60faa03ff955c713e88ddaefa
module-graph.zh.md: d707bd63394b94f511ca40484e23e9e629521515
+19 -1
View File
@@ -206,6 +206,8 @@ flowchart TD
subgraph group_experimental["packages/experimental"]
pkg_experimental_agent_team["experimental-agent-team"]
pkg_experimental_agent_team_profile["experimental-agent-team-profile"]
pkg_experimental_agent_team_web_profile["experimental-agent-team-web-profile"]
pkg_experimental_client_ui_agent_team["experimental-client-ui-agent-team"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_webworker_packer["experimental-webworker-packer"]
pkg_experimental_webworker_runtime["experimental-webworker-runtime"]
@@ -378,6 +380,7 @@ flowchart TD
pkg_code_runtime_python --> pkg_invariants
pkg_e2b --> pkg_invariants
pkg_experimental_agent_team_profile --> pkg_invariants
pkg_experimental_agent_team_web_profile --> pkg_invariants
pkg_experimental_webworker_packer --> pkg_invariants
pkg_host_directory_picker --> pkg_invariants
pkg_host_directory_picker_browse --> pkg_invariants
@@ -1196,6 +1199,7 @@ flowchart TD
pkg_experimental_agent_team --> pkg_session
pkg_experimental_agent_team --> pkg_session_persistence
pkg_experimental_agent_team --> pkg_subagent
pkg_experimental_agent_team --> pkg_typert_protocol
pkg_host_frontend_static --> pkg_client_connection
pkg_host_frontend_static --> pkg_host_webserver
pkg_host_frontend_static --> pkg_invariants
@@ -1479,6 +1483,18 @@ flowchart TD
pkg_client_ui_user_questions --> pkg_session
pkg_client_ui_user_questions --> pkg_typert_protocol
pkg_client_ui_user_questions --> pkg_user_questions
pkg_experimental_client_ui_agent_team --> pkg_api_remotes
pkg_experimental_client_ui_agent_team --> pkg_api_session_controller
pkg_experimental_client_ui_agent_team --> pkg_client_locale
pkg_experimental_client_ui_agent_team --> pkg_client_ui_conversation
pkg_experimental_client_ui_agent_team --> pkg_client_ui_primitives
pkg_experimental_client_ui_agent_team --> pkg_client_ui_renderer
pkg_experimental_client_ui_agent_team --> pkg_client_ui_session
pkg_experimental_client_ui_agent_team --> pkg_client_ui_slots
pkg_experimental_client_ui_agent_team --> pkg_experimental_agent_team
pkg_experimental_client_ui_agent_team --> pkg_invariants
pkg_experimental_client_ui_agent_team --> pkg_session
pkg_experimental_client_ui_agent_team --> pkg_typert_protocol
pkg_client_ui_chat --> pkg_agent
pkg_client_ui_chat --> pkg_api_remotes
pkg_client_ui_chat --> pkg_api_session_controller
@@ -1684,6 +1700,7 @@ flowchart TD
| [`code-runtime-python`](../packages/code-runtime/code-runtime-python) | `code-runtime` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`e2b`](../packages/e2b/e2b) | `e2b` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`experimental-agent-team-profile`](../packages/experimental/agent-team-profile) | `experimental` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`experimental-agent-team-web-profile`](../packages/experimental/agent-team-web-profile) | `experimental` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`experimental-webworker-packer`](../packages/experimental/webworker-packer) | `experimental` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`host-directory-picker`](../packages/host/directory-picker) | `host` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`host-directory-picker-browse`](../packages/host/directory-picker-browse) | `host` | [`invariants`](../packages/runtime-diagnostics/invariants) |
@@ -1848,7 +1865,7 @@ flowchart TD
| [`tool-subagent-report`](../packages/subagent/tool-subagent-report) | `subagent` | [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
| [`hooks-claude-code`](../packages/hooks/hooks-claude-code) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools) |
| [`api-gateway`](../packages/api/gateway) | `api` | [`brand`](../packages/util/brand), [`client-connection`](../packages/client/connection), [`host-webserver`](../packages/host/webserver), [`invariants`](../packages/runtime-diagnostics/invariants), [`typert-registry`](../packages/typert/registry) |
| [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`subagent`](../packages/subagent/subagent) |
| [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol) |
| [`host-frontend-static`](../packages/host/frontend-static) | `host` | [`client-connection`](../packages/client/connection), [`host-webserver`](../packages/host/webserver), [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`sdk-protocol`](../packages/sdk/protocol) | `sdk` | [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent) |
| [`tool-ralph`](../packages/workflow/tool-ralph) | `workflow` | [`agent`](../packages/core/agent), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) |
@@ -1885,6 +1902,7 @@ flowchart TD
| [`client-ui-settings-general`](../packages/client/ui-settings-general) | `client` | [`api-remotes`](../packages/api/remotes), [`client-connection`](../packages/client/connection), [`client-locale`](../packages/client/locale), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-settings`](../packages/client/ui-settings), [`client-ui-sidebar`](../packages/client/ui-sidebar), [`invariants`](../packages/runtime-diagnostics/invariants), [`settings`](../packages/settings/settings) |
| [`client-ui-trajectory`](../packages/client/ui-trajectory) | `client` | [`agent`](../packages/core/agent), [`api-session-controller`](../packages/api/session-controller), [`attachment`](../packages/attachment/attachment), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`compaction`](../packages/compaction/compaction), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`tools`](../packages/core/tools) |
| [`client-ui-user-questions`](../packages/client/ui-user-questions) | `client` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session), [`typert-protocol`](../packages/typert/protocol), [`user-questions`](../packages/interaction/user-questions) |
| [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | `experimental` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-slots`](../packages/client/ui-slots), [`experimental-agent-team`](../packages/experimental/agent-team), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session), [`typert-protocol`](../packages/typert/protocol) |
| [`client-ui-chat`](../packages/client/ui-chat) | `client` | [`agent`](../packages/core/agent), [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`api-workspace-controller`](../packages/api/workspace-controller), [`attachment`](../packages/attachment/attachment), [`client-locale`](../packages/client/locale), [`client-ui-approval`](../packages/client/ui-approval), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-layout`](../packages/client/ui-layout), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-workspace`](../packages/client/ui-workspace), [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`llm-retry`](../packages/llm/llm-retry), [`session`](../packages/core/session), [`session-stats`](../packages/session/session-stats), [`token-meter`](../packages/llm/token-meter), [`tools`](../packages/core/tools), [`util-workspace-path`](../packages/util/workspace-path) |
| [`client-ui-commands`](../packages/client/ui-commands) | `client` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-input-trigger`](../packages/client/ui-input-trigger), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`commands`](../packages/interaction/commands), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) |
| [`client-ui-reference`](../packages/client/ui-reference) | `client` | [`api-remotes`](../packages/api/remotes), [`client-locale`](../packages/client/locale), [`client-ui-input-trigger`](../packages/client/ui-input-trigger), [`file-reference`](../packages/context/file-reference), [`invariants`](../packages/runtime-diagnostics/invariants), [`session-reference`](../packages/context/session-reference), [`typert-protocol`](../packages/typert/protocol) |
+19 -1
View File
@@ -208,6 +208,8 @@ flowchart TD
subgraph group_experimental["packages/experimental"]
pkg_experimental_agent_team["experimental-agent-team"]
pkg_experimental_agent_team_profile["experimental-agent-team-profile"]
pkg_experimental_agent_team_web_profile["experimental-agent-team-web-profile"]
pkg_experimental_client_ui_agent_team["experimental-client-ui-agent-team"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_webworker_packer["experimental-webworker-packer"]
pkg_experimental_webworker_runtime["experimental-webworker-runtime"]
@@ -380,6 +382,7 @@ flowchart TD
pkg_code_runtime_python --> pkg_invariants
pkg_e2b --> pkg_invariants
pkg_experimental_agent_team_profile --> pkg_invariants
pkg_experimental_agent_team_web_profile --> pkg_invariants
pkg_experimental_webworker_packer --> pkg_invariants
pkg_host_directory_picker --> pkg_invariants
pkg_host_directory_picker_browse --> pkg_invariants
@@ -1198,6 +1201,7 @@ flowchart TD
pkg_experimental_agent_team --> pkg_session
pkg_experimental_agent_team --> pkg_session_persistence
pkg_experimental_agent_team --> pkg_subagent
pkg_experimental_agent_team --> pkg_typert_protocol
pkg_host_frontend_static --> pkg_client_connection
pkg_host_frontend_static --> pkg_host_webserver
pkg_host_frontend_static --> pkg_invariants
@@ -1481,6 +1485,18 @@ flowchart TD
pkg_client_ui_user_questions --> pkg_session
pkg_client_ui_user_questions --> pkg_typert_protocol
pkg_client_ui_user_questions --> pkg_user_questions
pkg_experimental_client_ui_agent_team --> pkg_api_remotes
pkg_experimental_client_ui_agent_team --> pkg_api_session_controller
pkg_experimental_client_ui_agent_team --> pkg_client_locale
pkg_experimental_client_ui_agent_team --> pkg_client_ui_conversation
pkg_experimental_client_ui_agent_team --> pkg_client_ui_primitives
pkg_experimental_client_ui_agent_team --> pkg_client_ui_renderer
pkg_experimental_client_ui_agent_team --> pkg_client_ui_session
pkg_experimental_client_ui_agent_team --> pkg_client_ui_slots
pkg_experimental_client_ui_agent_team --> pkg_experimental_agent_team
pkg_experimental_client_ui_agent_team --> pkg_invariants
pkg_experimental_client_ui_agent_team --> pkg_session
pkg_experimental_client_ui_agent_team --> pkg_typert_protocol
pkg_client_ui_chat --> pkg_agent
pkg_client_ui_chat --> pkg_api_remotes
pkg_client_ui_chat --> pkg_api_session_controller
@@ -1686,6 +1702,7 @@ flowchart TD
| [`code-runtime-python`](../packages/code-runtime/code-runtime-python) | `code-runtime` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`e2b`](../packages/e2b/e2b) | `e2b` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`experimental-agent-team-profile`](../packages/experimental/agent-team-profile) | `experimental` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`experimental-agent-team-web-profile`](../packages/experimental/agent-team-web-profile) | `experimental` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`experimental-webworker-packer`](../packages/experimental/webworker-packer) | `experimental` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`host-directory-picker`](../packages/host/directory-picker) | `host` | [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`host-directory-picker-browse`](../packages/host/directory-picker-browse) | `host` | [`invariants`](../packages/runtime-diagnostics/invariants) |
@@ -1850,7 +1867,7 @@ flowchart TD
| [`tool-subagent-report`](../packages/subagent/tool-subagent-report) | `subagent` | [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
| [`hooks-claude-code`](../packages/hooks/hooks-claude-code) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools) |
| [`api-gateway`](../packages/api/gateway) | `api` | [`brand`](../packages/util/brand), [`client-connection`](../packages/client/connection), [`host-webserver`](../packages/host/webserver), [`invariants`](../packages/runtime-diagnostics/invariants), [`typert-registry`](../packages/typert/registry) |
| [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`subagent`](../packages/subagent/subagent) |
| [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol) |
| [`host-frontend-static`](../packages/host/frontend-static) | `host` | [`client-connection`](../packages/client/connection), [`host-webserver`](../packages/host/webserver), [`invariants`](../packages/runtime-diagnostics/invariants) |
| [`sdk-protocol`](../packages/sdk/protocol) | `sdk` | [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent) |
| [`tool-ralph`](../packages/workflow/tool-ralph) | `workflow` | [`agent`](../packages/core/agent), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) |
@@ -1887,6 +1904,7 @@ flowchart TD
| [`client-ui-settings-general`](../packages/client/ui-settings-general) | `client` | [`api-remotes`](../packages/api/remotes), [`client-connection`](../packages/client/connection), [`client-locale`](../packages/client/locale), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-settings`](../packages/client/ui-settings), [`client-ui-sidebar`](../packages/client/ui-sidebar), [`invariants`](../packages/runtime-diagnostics/invariants), [`settings`](../packages/settings/settings) |
| [`client-ui-trajectory`](../packages/client/ui-trajectory) | `client` | [`agent`](../packages/core/agent), [`api-session-controller`](../packages/api/session-controller), [`attachment`](../packages/attachment/attachment), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`compaction`](../packages/compaction/compaction), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`tools`](../packages/core/tools) |
| [`client-ui-user-questions`](../packages/client/ui-user-questions) | `client` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session), [`typert-protocol`](../packages/typert/protocol), [`user-questions`](../packages/interaction/user-questions) |
| [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | `experimental` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-slots`](../packages/client/ui-slots), [`experimental-agent-team`](../packages/experimental/agent-team), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session), [`typert-protocol`](../packages/typert/protocol) |
| [`client-ui-chat`](../packages/client/ui-chat) | `client` | [`agent`](../packages/core/agent), [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`api-workspace-controller`](../packages/api/workspace-controller), [`attachment`](../packages/attachment/attachment), [`client-locale`](../packages/client/locale), [`client-ui-approval`](../packages/client/ui-approval), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-layout`](../packages/client/ui-layout), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-workspace`](../packages/client/ui-workspace), [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`llm-retry`](../packages/llm/llm-retry), [`session`](../packages/core/session), [`session-stats`](../packages/session/session-stats), [`token-meter`](../packages/llm/token-meter), [`tools`](../packages/core/tools), [`util-workspace-path`](../packages/util/workspace-path) |
| [`client-ui-commands`](../packages/client/ui-commands) | `client` | [`api-remotes`](../packages/api/remotes), [`api-session-controller`](../packages/api/session-controller), [`client-locale`](../packages/client/locale), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-input-trigger`](../packages/client/ui-input-trigger), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`commands`](../packages/interaction/commands), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) |
| [`client-ui-reference`](../packages/client/ui-reference) | `client` | [`api-remotes`](../packages/api/remotes), [`client-locale`](../packages/client/locale), [`client-ui-input-trigger`](../packages/client/ui-input-trigger), [`file-reference`](../packages/context/file-reference), [`invariants`](../packages/runtime-diagnostics/invariants), [`session-reference`](../packages/context/session-reference), [`typert-protocol`](../packages/typert/protocol) |
+1 -1
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/persistence-catalog.md
persistence-catalog.md: 1ff60ebdacf198ce7bc7d7c8c13eb9278320281a
persistence-catalog.md: 593fb073022e139a13f1d642c6f12a94400b0446
persistence-catalog.zh.md: 59acfa23c81687f23498d598cb0aead3e669ceb2
+4 -4
View File
@@ -767,7 +767,7 @@ Source: [`packages/subagent/tool-subagent/src/model-selection-state.ts:13`](../p
Types: [TeamId](subsystems/agent-team.md) · [TeamMemberSnapshot](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:206`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/experimental/agent-team/src/types.ts:223`](../packages/experimental/agent-team/src/types.ts)
<a id="teammessagedelivered--log-only"></a>
@@ -785,7 +785,7 @@ Source: [`packages/experimental/agent-team/src/types.ts:206`](../packages/experi
Types: [TeamId](subsystems/agent-team.md) · [TeamMessageId](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:212`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/experimental/agent-team/src/types.ts:229`](../packages/experimental/agent-team/src/types.ts)
<a id="teammessagequeued--log-only"></a>
@@ -798,7 +798,7 @@ Source: [`packages/experimental/agent-team/src/types.ts:212`](../packages/experi
Types: [TeamId](subsystems/agent-team.md) · [TeamMessageSnapshot](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:210`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/experimental/agent-team/src/types.ts:227`](../packages/experimental/agent-team/src/types.ts)
<a id="teamtask--log-only"></a>
@@ -811,7 +811,7 @@ Source: [`packages/experimental/agent-team/src/types.ts:210`](../packages/experi
Types: [TeamId](subsystems/agent-team.md) · [TeamTaskSnapshot](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:208`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/experimental/agent-team/src/types.ts:225`](../packages/experimental/agent-team/src/types.ts)
### `todo/*`
+2 -2
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/subsystems/agent-team.md
agent-team.md: 8704bff3071d4e084e95dafcd61b7eea65278f61
agent-team.zh.md: dfa55743e5ddbde054f87180edd37a788af84663
agent-team.md: e3a746734b067bb7ef8f083c5c9af9cb3707dcf7
agent-team.zh.md: 1f885a73861c091b50d27d15080ebc09f6d382ec
+23 -23
View File
@@ -105,13 +105,6 @@ membership(agent: Agent): TeamMembership
*/
listMembers(agent: Agent): TeamMemberView[]
/**
* Read the current roster and non-deleted task board for a browser client.
* @param agent - exact live Team member used as the authority credential.
* @returns detached current roster and task views.
*/
@Remote('view') view(agent: Agent): TeamView
/**
* Create one named, continuable direct child of the Team Lead.
* @param caller - exact live Lead Agent.
@@ -136,14 +129,6 @@ async sendMessage(caller: Agent, request: SendTeamMessageRequest): Promise<SendT
*/
async createTask(caller: Agent, request: CreateTeamTaskRequest): Promise<TeamTaskView>
/**
* Create one shared task for a browser client.
* @param agent - exact live Team member creating the task.
* @param request - task text, blockers, and advisory write scopes.
* @returns the revision-one task view.
*/
@Remote('createTask') createTaskForClient(agent: Agent, request: CreateTeamTaskRequest): Promise<TeamTaskView>
/**
* Return one task, including a deleted tombstone.
* @param caller - exact live Team member reading the task.
@@ -167,14 +152,6 @@ listTasks(caller: Agent): TeamTaskView[]
*/
async updateTask(caller: Agent, request: UpdateTeamTaskRequest): Promise<TeamTaskView>
/**
* Apply one task mutation for a browser client while preserving CAS conflicts.
* @param agent - exact live Team member authorizing the mutation.
* @param request - task identity, expected revision, action, and action fields.
* @returns the committed task or a browser-safe Team rejection.
*/
@Remote('updateTask') async updateTaskForClient(agent: Agent, request: UpdateTeamTaskRequest): Promise<TeamTaskMutationResult>
/**
* Wait for the next Team-domain or member-status change.
* @param caller - exact live Team member waiting for activity.
@@ -198,6 +175,29 @@ interrupt(caller: Agent, targetName: string): { previousStatus: 'running' | 'idl
* @returns Team membership, or undefined for non-Team subagents and stale identities.
*/
tryMembership(agent: Agent): TeamMembership | undefined
/**
* Read the current roster and non-deleted task board through the generated Remote API.
* @param agent - exact live Team member used as the authority credential.
* @returns detached current roster and task views.
*/
@Remote('view') remoteView(agent: Agent): TeamView
/**
* Create one shared task through the generated Remote API.
* @param agent - exact live Team member creating the task.
* @param request - task text, blockers, and advisory write scopes.
* @returns the revision-one task or a typed Team rejection.
*/
@Remote('createTask') remoteCreateTask(agent: Agent, request: CreateTeamTaskRequest): Promise<TeamTaskMutationResult>
/**
* Apply one task mutation and preserve Team rejections as business results.
* @param agent - exact live Team member authorizing the mutation.
* @param request - task identity, expected revision, action, and action fields.
* @returns the committed task or a typed Team rejection.
*/
@Remote('updateTask') remoteUpdateTask(agent: Agent, request: UpdateTeamTaskRequest): Promise<TeamTaskMutationResult>
```
Types: [Agent](core.md)
+23 -23
View File
@@ -105,13 +105,6 @@ membership(agent: Agent): TeamMembership
*/
listMembers(agent: Agent): TeamMemberView[]
/**
* Read the current roster and non-deleted task board for a browser client.
* @param agent - exact live Team member used as the authority credential.
* @returns detached current roster and task views.
*/
@Remote('view') view(agent: Agent): TeamView
/**
* Create one named, continuable direct child of the Team Lead.
* @param caller - exact live Lead Agent.
@@ -136,14 +129,6 @@ async sendMessage(caller: Agent, request: SendTeamMessageRequest): Promise<SendT
*/
async createTask(caller: Agent, request: CreateTeamTaskRequest): Promise<TeamTaskView>
/**
* Create one shared task for a browser client.
* @param agent - exact live Team member creating the task.
* @param request - task text, blockers, and advisory write scopes.
* @returns the revision-one task view.
*/
@Remote('createTask') createTaskForClient(agent: Agent, request: CreateTeamTaskRequest): Promise<TeamTaskView>
/**
* Return one task, including a deleted tombstone.
* @param caller - exact live Team member reading the task.
@@ -167,14 +152,6 @@ listTasks(caller: Agent): TeamTaskView[]
*/
async updateTask(caller: Agent, request: UpdateTeamTaskRequest): Promise<TeamTaskView>
/**
* Apply one task mutation for a browser client while preserving CAS conflicts.
* @param agent - exact live Team member authorizing the mutation.
* @param request - task identity, expected revision, action, and action fields.
* @returns the committed task or a browser-safe Team rejection.
*/
@Remote('updateTask') async updateTaskForClient(agent: Agent, request: UpdateTeamTaskRequest): Promise<TeamTaskMutationResult>
/**
* Wait for the next Team-domain or member-status change.
* @param caller - exact live Team member waiting for activity.
@@ -198,6 +175,29 @@ interrupt(caller: Agent, targetName: string): { previousStatus: 'running' | 'idl
* @returns Team membership, or undefined for non-Team subagents and stale identities.
*/
tryMembership(agent: Agent): TeamMembership | undefined
/**
* Read the current roster and non-deleted task board through the generated Remote API.
* @param agent - exact live Team member used as the authority credential.
* @returns detached current roster and task views.
*/
@Remote('view') remoteView(agent: Agent): TeamView
/**
* Create one shared task through the generated Remote API.
* @param agent - exact live Team member creating the task.
* @param request - task text, blockers, and advisory write scopes.
* @returns the revision-one task or a typed Team rejection.
*/
@Remote('createTask') remoteCreateTask(agent: Agent, request: CreateTeamTaskRequest): Promise<TeamTaskMutationResult>
/**
* Apply one task mutation and preserve Team rejections as business results.
* @param agent - exact live Team member authorizing the mutation.
* @param request - task identity, expected revision, action, and action fields.
* @returns the committed task or a typed Team rejection.
*/
@Remote('updateTask') remoteUpdateTask(agent: Agent, request: UpdateTeamTaskRequest): Promise<TeamTaskMutationResult>
```
Types: [Agent](core.zh.md)
+2 -2
View File
@@ -756,7 +756,7 @@
"@deepseek-ai/.+"
]
},
"packages/experimental/team": {
"packages/experimental/agent-team": {
"entry": [
"tests/**/*.spec.ts",
"tests/**/*.e2e.ts"
@@ -764,7 +764,7 @@
},
"packages/experimental/agent-team-web-profile": {
"ignoreDependencies": [
"@deepseek-ai/dsh-client-ui-agent-team"
"@deepseek-ai/dsh-experimental-client-ui-agent-team"
]
},
"packages/bundle/web-app": {
+2 -2
View File
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/experimental/README.md
README.md: ad658da84303d93ddede7d383d7950d8bca3f38f
README.zh.md: a8b777b40e44c1d3b95c744a5c972a2dca7192fb
README.md: 2812388377611ebbed0f415d637bd14bffcee34c
README.zh.md: 3dcf13d9ef73b540fe4b8f3d7f6df2e623bca6f4
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/experimental/agent-team-web-profile/README.md
README.md: 696be051ab754ae157109fb9d69ba11bd6d47f16
README.zh.md: 07470c5fedbeee30a17b26d08709a2ac1f45ab89
README.md: b2ada3c2cb3c2d09ed9abf353812bb2ab168c9f5
README.zh.md: 3d7241384c14ab89f4ed9c66f3155e8c3d64149f
@@ -2,7 +2,7 @@
[English](README.md) | 中文
Agent Teams 的私有 Web profile 层。应当在 `@deepseek-ai/dsh-web-app` 与 [`@deepseek-ai/dsh-experimental-agent-team-profile`](../agent-team-profile/README.md) 之后应用。本 patch 插入 Team 会话页头 UI;它不修改稳定 Web bundle。
Agent Teams 的私有 Web profile 层。应当在 `@deepseek-ai/dsh-web-app` 与 [`@deepseek-ai/dsh-experimental-agent-team-profile`](../agent-team-profile/README.zh.md) 之后应用。本 patch 插入 Team 会话页头 UI;它不修改稳定 Web bundle。
在源码 checkout 中,将两个 Agent Teams 层添加到已初始化的 Web profile
@@ -21,8 +21,10 @@ Host profile 提供 Team domain、生成式 Remote method 与模型工具。本
无直接影响;Host 侧 Team 工具负责 prompt 与 schema 变化。
<a id="known-limitations-and-deferred-work"></a>
## 已知限制与暂缓事项
- **有序 composition**`dsh-base``dsh-web-app``dsh-experimental-agent-team-profile` 与本包必须保持该顺序。
- **Preset scope 内的 legacy control**:稳定 Web preset 仍会在 preset scope 中挂载 continuable Subagent control。顶层 Host profile override 不会替换这些 scoped registration,因此在 Web 提供 Team-aware preset 之前,Team roster 与 legacy child control 可能同时出现。[Web Agent Teams 决策记录](../../../.agents/notes/implemented/feature/2026-08-06-agent-teams-web.md)记载了这项暂缓的 composition 工作。
- **Preset scope 内的 legacy control**:稳定 Web preset 仍会在 preset scope 中挂载 continuable Subagent control。顶层 Host profile override 不会替换这些 scoped registration,因此在 Web 提供 Team-aware preset 之前,Team roster 与 legacy child control 可能同时出现。[Web Agent Teams 决策记录](../../../.agents/notes/implemented/feature/2026-08-06-agent-teams-web.zh.md)记载了这项暂缓的 composition 工作。
- **仅限源码 checkout**:正式 CLI、Web、npm 与 Python 发布产物会排除这个私有包。
@@ -3,4 +3,4 @@
- insert:
- id: ui-agent-team
name: '@deepseek-ai/dsh-client-ui-agent-team'
name: '@deepseek-ai/dsh-experimental-client-ui-agent-team'
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent-team-web-profile",
"name": "@deepseek-ai/dsh-experimental-agent-team-web-profile",
"description": "Private Web profile layer for Agent Teams Remote and UI plugins",
"version": "0.1.0-rc.7",
"version": "0.1.1-rc.2",
"private": true,
"repository": {
"type": "git",
@@ -37,7 +37,7 @@
}
},
"dependencies": {
"@deepseek-ai/dsh-client-ui-agent-team": "workspace:^"
"@deepseek-ai/dsh-experimental-client-ui-agent-team": "workspace:^"
},
"peerDependencies": {
"@deepseek-ai/dsh-invariants": "workspace:^",
@@ -3,7 +3,7 @@
import type { Context } from '@deepseek-ai/cordis'
import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'
const PACKAGE_NAME = '@deepseek-ai/dsh-agent-team-web-profile'
const PACKAGE_NAME = '@deepseek-ai/dsh-experimental-agent-team-web-profile'
/** Cordis companion plugin name. */
export const name = 'agent-team-web-profile-invariant'
@@ -4,8 +4,11 @@ import { readFileSync } from 'node:fs'
import { fileURLToPath } from 'node:url'
import { resolve } from 'node:path'
import { describe, expect, it } from 'vitest'
import { Context } from '@deepseek-ai/cordis'
import InvariantRegistry from '@deepseek-ai/dsh-invariants'
import * as yaml from 'js-yaml'
import { entryListSchema } from '@deepseek-ai/cordis-plugin-include'
import * as WebProfileInvariant from '../src/invariant.ts'
describe('Agent Teams Web profile bundle', () => {
it('declares a private parseable layer containing the Team UI', () => {
@@ -20,7 +23,7 @@ describe('Agent Teams Web profile bundle', () => {
expect(manifest.publishConfig).toBeUndefined()
expect(manifest.dsh?.bundle?.patch).toBe('./cordis.patch.yml')
expect(manifest.dependencies).toEqual({
'@deepseek-ai/dsh-client-ui-agent-team': 'workspace:^',
'@deepseek-ai/dsh-experimental-client-ui-agent-team': 'workspace:^',
})
const parsed = yaml.load(
@@ -28,7 +31,20 @@ describe('Agent Teams Web profile bundle', () => {
{ schema: entryListSchema },
) as { insert?: { id?: string; name?: string }[] }[]
expect(parsed.flatMap(patch => patch.insert ?? [])).toEqual([
{ id: 'ui-agent-team', name: '@deepseek-ai/dsh-client-ui-agent-team' },
{ id: 'ui-agent-team', name: '@deepseek-ai/dsh-experimental-client-ui-agent-team' },
])
})
it('reserves package ownership without installing a runtime audit', async () => {
const ctx = new Context()
await ctx.plugin(InvariantRegistry, { enabled: true })
const fiber = ctx.plugin(WebProfileInvariant)
await fiber.await()
expect(WebProfileInvariant.name).toBe('agent-team-web-profile-invariant')
expect(WebProfileInvariant.inject).toEqual(['invariants'])
expect(() => {
Reflect.apply(ctx.emit.bind(ctx), undefined, ['unrelated/event'])
}).not.toThrow()
await fiber.dispose()
})
})
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/experimental/agent-team/README.md
README.md: ca088a4cf30a20e8db092be76f5ada1c76ba26d0
README.zh.md: ec5f7e1f46238b4b0b3398d4ab35585fdae15bf0
README.md: bac73d873ec0856fa2b0550a7f25331c5d7035fb
README.zh.md: 2981e611a48736124dda79a8721e01c11fbcf7e6
+11 -1
View File
@@ -1,3 +1,13 @@
/** Client-safe Agent Teams request, result, and view vocabulary. */
export type * from './types.ts'
export type {
CreateTeamTaskRequest,
TeamMemberView,
TeamTaskAction,
TeamTaskId,
TeamTaskMutationResult,
TeamTaskStatus,
TeamTaskView,
TeamView,
UpdateTeamTaskRequest,
} from './types.ts'
@@ -1,8 +1,8 @@
/** Public Agent Teams identities, durable records, and service request values. */
import type { Branded } from '@deepseek-ai/dsh-brand'
import type { ContentBlock } from '@deepseek-ai/dsh-llm'
import type { SessionId } from '@deepseek-ai/dsh-session'
import type { ContentBlock } from '@deepseek-ai/dsh-llm/types'
import type { SessionId } from '@deepseek-ai/dsh-session/types'
/** Identifies the implicit team rooted at one top-level Session. */
export type TeamId = Branded<'TeamId'>
@@ -12,15 +12,15 @@ const artifact = (path: string): string => join(root, path)
const artifactUrl = (path: string): string => pathToFileURL(artifact(path)).href
const requiredArtifacts = [
'packages/experimental/team/lib/index.js',
'packages/experimental/team/lib/typert.remote-client.js',
'packages/experimental/agent-team/lib/index.js',
'packages/experimental/agent-team/lib/typert.remote-client.js',
].every(path => existsSync(artifact(path)))
describe.skipIf(!requiredArtifacts)('Agent Teams built LIB service', () => {
it('loads the Host service and its generated browser contribution under plain Node', async () => {
const urls = {
host: artifactUrl('packages/experimental/team/lib/index.js'),
remote: artifactUrl('packages/experimental/team/lib/typert.remote-client.js'),
host: artifactUrl('packages/experimental/agent-team/lib/index.js'),
remote: artifactUrl('packages/experimental/agent-team/lib/typert.remote-client.js'),
}
const script = `
const host = await import(${JSON.stringify(urls.host)})
@@ -40,9 +40,9 @@ describe.skipIf(!requiredArtifacts)('Agent Teams built LIB service', () => {
expect(output).toEqual({
className: 'TeamService',
methods: [
'@deepseek-ai/dsh-team#teams/createTask',
'@deepseek-ai/dsh-team#teams/updateTask',
'@deepseek-ai/dsh-team#teams/view',
'@deepseek-ai/dsh-experimental-agent-team#agentTeams/createTask',
'@deepseek-ai/dsh-experimental-agent-team#agentTeams/updateTask',
'@deepseek-ai/dsh-experimental-agent-team#agentTeams/view',
],
})
})
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/experimental/client-ui-agent-team/README.md
README.md: 7d26e38b7baca2234e1a0305aa2298b2718c0dc4
README.zh.md: 2d4ac6b09a8a130d16fa8d18f5d9d8591fe260fb
README.md: 8e4170c7025ed63e354013ec4f0be806da66c2cb
README.zh.md: 8a06d281400a23eea109769f634eaa23b943ebce
@@ -2,13 +2,13 @@
[English](README.md) | 中文
私有 Web Agent Teams 呈现包。它向会话页头提供一个包含当前 roster 与共享任务板的 action。Client plugin 挂载来自 [`@deepseek-ai/dsh-experimental-agent-team/remote`](../agent-team/README.md) 的生成式 `ctx.remote.agentTeams` contribution;它不扩展稳定 API Proxy,也不存储权威 Team 状态。
私有 Web Agent Teams 呈现包。它向会话页头提供一个包含当前 roster 与共享任务板的 action。Client plugin 挂载来自 [`@deepseek-ai/dsh-experimental-agent-team/remote`](../agent-team/README.zh.md) 的生成式 `ctx.remote.agentTeams` contribution;它不扩展稳定 API Proxy,也不存储权威 Team 状态。
打开 panel 会调用 `agentTeams/view`。Roster row 展示持久 name、运行时 status、model 与 diagnostics。选择健康 teammate 时,系统刷新既有直接 child catalog,并打开普通的 `{ parentSessionId, childSessionId, mode: 'continuable' }` address。History 与后续人类 prompt 继续使用稳定 addressed-subagent 会话路径;本包不会向该 address 添加 Team 专用字段。
任务板展示 task identity、owner、blocker、readiness、提示性 write scope 与重叠 warning。人类可以通过 `agentTeams/createTask``agentTeams/updateTask` 创建、编辑、分配或取消分配、完成、重开和删除任务。每次 update 都发送当前显示的 revisioncreate 与 update rejection 都保留为显式 business result。任一 operation 开始时都会让更早的 refresh 失效,成功后则重新读取完整 Team view,使所有 task 的派生字段保持最新。收到 `team-task-conflict` 结果后,UI 仅在重新读取成功后显示状态陈旧提示;如果重新读取失败,则保留该错误。Team service 将任务文本或 scope 编辑与 dependency 修改公开为两个独立 action,因此两者仍使用两个连续的 compare-and-set mutation。
Root export 在 Host 上不执行行为。Client export 负责 locale 与 slot 注册,Cordis 会随 plugin fiber dispose 两者。在稳定 Web bundle 与 Host 侧 Agent Teams profile 之后,通过 [`@deepseek-ai/dsh-experimental-agent-team-web-profile`](../agent-team-web-profile/README.md) 安装本包。
Root export 在 Host 上不执行行为。Client export 负责 locale 与 slot 注册,Cordis 会随 plugin fiber dispose 两者。在稳定 Web bundle 与 Host 侧 Agent Teams profile 之后,通过 [`@deepseek-ai/dsh-experimental-agent-team-web-profile`](../agent-team-web-profile/README.zh.md) 安装本包。
## 模型体验
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-agent-team",
"name": "@deepseek-ai/dsh-experimental-client-ui-agent-team",
"description": "Web Agent Teams roster, task board, and teammate navigation",
"version": "0.1.0-rc.7",
"version": "0.1.1-rc.2",
"private": true,
"repository": {
"type": "git",
@@ -31,8 +31,8 @@
"client": {
"inject": [
"@deepseek-ai/dsh-api-remotes",
"@deepseek-ai/dsh-api-session-controller",
"@deepseek-ai/dsh-client-locale",
"@deepseek-ai/dsh-client-runtime",
"@deepseek-ai/dsh-client-ui-conversation",
"@deepseek-ai/dsh-client-ui-primitives"
],
@@ -49,26 +49,32 @@
},
"peerDependencies": {
"@deepseek-ai/dsh-api-remotes": "workspace:^",
"@deepseek-ai/dsh-api-session-controller": "workspace:^",
"@deepseek-ai/dsh-client-locale": "workspace:^",
"@deepseek-ai/dsh-client-runtime": "workspace:^",
"@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:^",
"@deepseek-ai/dsh-client-ui-session": "workspace:^",
"@deepseek-ai/dsh-client-ui-slots": "workspace:^",
"@deepseek-ai/dsh-experimental-agent-team": "workspace:^",
"@deepseek-ai/dsh-invariants": "workspace:^",
"@deepseek-ai/dsh-team": "workspace:^",
"@deepseek-ai/dsh-session": "workspace:^",
"@deepseek-ai/dsh-typert-protocol": "workspace:^",
"@deepseek-ai/cordis": "workspace:^"
},
"devDependencies": {
"@deepseek-ai/dsh-api-remotes": "workspace:^",
"@deepseek-ai/dsh-api-session-controller": "workspace:^",
"@deepseek-ai/dsh-client-locale": "workspace:^",
"@deepseek-ai/dsh-client-runtime": "workspace:^",
"@deepseek-ai/dsh-client-test-runtime": "workspace:^",
"@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:^",
"@deepseek-ai/dsh-client-ui-session": "workspace:^",
"@deepseek-ai/dsh-client-ui-slots": "workspace:^",
"@deepseek-ai/dsh-experimental-agent-team": "workspace:^",
"@deepseek-ai/dsh-invariants": "workspace:^",
"@deepseek-ai/dsh-team": "workspace:^",
"@deepseek-ai/dsh-session": "workspace:^",
"@deepseek-ai/dsh-typert-protocol": "workspace:^",
"@testing-library/react": "^16.1.0",
"@types/react": "~18.3.1",
@@ -1,5 +1,5 @@
import { useCallback, useEffect, useRef, useState, type ChangeEvent } from 'react'
import type { SessionId } from '@deepseek-ai/dsh-client-runtime/client'
import type { SessionId } from '@deepseek-ai/dsh-session/types'
import type {
TeamMemberView as TeamRosterMember,
TeamTaskAction,
@@ -7,7 +7,7 @@ import type {
TeamTaskMutationResult,
TeamTaskView as TeamTask,
TeamView,
} from '@deepseek-ai/dsh-team/client'
} from '@deepseek-ai/dsh-experimental-agent-team/client'
import type { RemoteFailure, RemoteResult } from '@deepseek-ai/dsh-typert-protocol'
import {
IconCheckOutline14, IconCloseOutline16, IconEditOutline16, IconPlusOutline16,
@@ -15,7 +15,7 @@ import {
} from '@deepseek-ai/dsh-client-ui-primitives'
import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'
import type {} from '@deepseek-ai/dsh-client-ui-conversation/client'
import type { TeamKey } from './locales.ts'
import { NS, type TeamKey } from './locales.ts'
import css from './TeamAction.module.css'
/** Generated Remote result consumed directly by the Team UI. */
@@ -48,7 +48,7 @@ export interface TeamActionInjected {
/** Full props of the Team conversation-header action. */
export type TeamActionProps =
PropsRuntime<'conversation.session.header.actions'> & TeamActionInjected & PropsLocale<'team'>
PropsRuntime<'conversation.session.header.actions'> & TeamActionInjected & PropsLocale<typeof NS>
interface Draft {
subject: string
@@ -81,6 +81,16 @@ function statusKey(status: TeamTask['status']): TeamKey {
}
}
function memberStatusKey(status: TeamRosterMember['status']): TeamKey {
switch (status) {
case 'running': return 'memberStatus.running'
case 'idle': return 'memberStatus.idle'
case 'inactive': return 'memberStatus.inactive'
case 'provisioning': return 'memberStatus.provisioning'
case 'failed': return 'memberStatus.failed'
}
}
/** Render the live Team roster and compare-and-set task board. */
export function TeamAction({
sessionId, load, createTask, updateTask, openTeammate, t,
@@ -278,7 +288,7 @@ export function TeamAction({
<StateDot state={member.status === 'running' ? 'ongoing' : member.status === 'failed' ? 'error' : 'done'} />
<span className={css.memberText}>
<span>{member.name}</span>
<small>{member.status}{member.model === undefined ? '' : ` · ${t('model')}: ${member.model}`}</small>
<small>{t(memberStatusKey(member.status))}{member.model === undefined ? '' : ` · ${t('model')}: ${member.model}`}</small>
{member.diagnostics.map(diagnostic => <small key={diagnostic} className={css.diagnostic}>{diagnostic}</small>)}
</span>
</button>
@@ -1,7 +1,7 @@
/** Browser entry binding the generated Team Remote artifact to its Client UI. */
import agentTeamsRemote from '@deepseek-ai/dsh-experimental-agent-team/remote'
import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'
import type { Context as ClientContext } from '@deepseek-ai/cordis'
import { mountAgentTeamUi } from './mount.ts'
export { inject } from './mount.ts'
@@ -1,5 +1,8 @@
/** Agent Teams Web dictionaries. */
/** Locale namespace owned by the Agent Teams Web UI. */
export const NS = 'agent-team'
/** Simplified Chinese dictionary and key source. */
export const zh = {
trigger: 'Agent Team',
@@ -29,6 +32,11 @@ export const zh = {
ready: '可开始',
blocked: '被依赖阻塞',
conflict: '任务状态已变化,已重新加载;请检查后重试。',
'memberStatus.running': '运行中',
'memberStatus.idle': '空闲',
'memberStatus.inactive': '未运行',
'memberStatus.provisioning': '准备中',
'memberStatus.failed': '失败',
'status.pending': '待处理',
'status.in_progress': '进行中',
'status.completed': '已完成',
@@ -66,6 +74,11 @@ export const en = {
ready: 'Ready',
blocked: 'Blocked by dependencies',
conflict: 'Task state changed and was reloaded. Review it before retrying.',
'memberStatus.running': 'Running',
'memberStatus.idle': 'Idle',
'memberStatus.inactive': 'Inactive',
'memberStatus.provisioning': 'Provisioning',
'memberStatus.failed': 'Failed',
'status.pending': 'Pending',
'status.in_progress': 'In progress',
'status.completed': 'Completed',
@@ -5,20 +5,23 @@ import type {
TeamView,
} from '@deepseek-ai/dsh-experimental-agent-team/client'
import type {} from '@deepseek-ai/dsh-experimental-agent-team/remote'
import type { Context as ClientContext } from '@deepseek-ai/cordis'
import type {} from '@deepseek-ai/dsh-api-remotes/client'
import type { ClientContext, SessionId } from '@deepseek-ai/dsh-client-runtime/client'
import type {} from '@deepseek-ai/dsh-api-session-controller/client'
import type { SessionId } from '@deepseek-ai/dsh-session/types'
import type {} from '@deepseek-ai/dsh-client-ui-conversation/client'
import type {} from '@deepseek-ai/dsh-client-locale/client'
import type {} from '@deepseek-ai/dsh-client-ui-renderer/client'
import type { TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'
import {
TeamAction, type TeamActionInjected, type TeamActionResult, type TeamTaskActionResult,
} from './TeamAction.tsx'
import { en, zh, type TeamKey } from './locales.ts'
import { en, NS, zh, type TeamKey } from './locales.ts'
declare module '@deepseek-ai/dsh-client-ui-slots' {
interface LocaleNamespaceMap {
/** Agent Teams roster and task-board copy. */
team: TeamKey
'agent-team': TeamKey
}
}
@@ -26,7 +29,7 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
export const inject = ['sessions', 'remote', 'slots', 'locale']
function registerUi(ctx: ClientContext): void {
ctx.effect(() => ctx.locale.register('team', { zh, en }), 'client-ui-agent-team: dictionaries')
ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'client-ui-agent-team: dictionaries')
const sessions = ctx.sessions
const leadSessionId = (sessionId: SessionId): SessionId => {
const address = sessions.binding(sessionId)?.session.getSnapshot().subagent?.address
@@ -66,7 +69,7 @@ function registerUi(ctx: ClientContext): void {
name: 'conversation.session.header.actions',
id: 'agent-team',
order: 20,
locale: 'team',
locale: NS,
inject: () => actions,
}, TeamAction),
)
@@ -3,7 +3,7 @@
import type { Context } from '@deepseek-ai/cordis'
import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'
const PACKAGE_NAME = '@deepseek-ai/dsh-client-ui-agent-team'
const PACKAGE_NAME = '@deepseek-ai/dsh-experimental-client-ui-agent-team'
/** Cordis companion plugin name. */
export const name = 'client-ui-agent-team-invariant'
@@ -1,8 +1,8 @@
import { Context, Service } from '@deepseek-ai/cordis'
import { describe, expect, it, vi } from 'vitest'
import type { SessionId } from '@deepseek-ai/dsh-client-runtime/client'
import type { SessionId } from '@deepseek-ai/dsh-session/types'
import { LocaleRuntime } from '@deepseek-ai/dsh-client-locale/client'
import { SlotRegistry } from '@deepseek-ai/dsh-client-runtime/client'
import { SlotRegistry } from '@deepseek-ai/dsh-client-ui-renderer/client'
import type { TeamMemberView as TeamRosterMember, TeamTaskId } from '@deepseek-ai/dsh-experimental-agent-team/client'
import type {} from '@deepseek-ai/dsh-experimental-agent-team/remote'
import type { TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'
@@ -60,14 +60,14 @@ async function bench(options: {
}
ctx.provide('remote.agentTeams', {
view: (...args: unknown[]) => {
calls.push({ method: 'teams/view', args })
calls.push({ method: 'agentTeams/view', args })
return Promise.resolve(options.remoteFailure === 'view'
? failure
: { ok: true as const, value: view })
},
createTask: answer('teams/createTask', task),
createTask: answer('agentTeams/createTask', task),
updateTask: (...args: unknown[]) => {
calls.push({ method: 'teams/updateTask', args })
calls.push({ method: 'agentTeams/updateTask', args })
if (options.remoteFailure === 'update') return Promise.resolve(failure)
return Promise.resolve(options.conflict
? {
@@ -146,7 +146,7 @@ describe('ui-team browser plugin', () => {
expect(inject).toEqual(['sessions', 'remote', 'slots', 'locale'])
expect(b.entry()).toMatchObject({
options: { id: 'agent-team', order: 20 },
locale: 'team',
locale: 'agent-team',
})
expect(b.remote.mount).toHaveBeenCalledOnce()
expect(b.remote.mount).toHaveBeenCalledWith(REMOTE)
@@ -162,7 +162,7 @@ describe('ui-team browser plugin', () => {
taskId: TASK_ID, expectedRevision: 2, action: 'reassign', owner: 'worker',
})).ok).toBe(true)
expect(b.calls.map(call => call.method)).toEqual([
'teams/view', 'teams/createTask', 'teams/updateTask', 'teams/updateTask',
'agentTeams/view', 'agentTeams/createTask', 'agentTeams/updateTask', 'agentTeams/updateTask',
])
expect(b.calls.at(-1)?.args[1]).toMatchObject({ owner: 'worker' })
@@ -251,7 +251,7 @@ describe('ui-team browser plugin', () => {
status: 'inactive',
diagnostics: [],
})
expect(b.calls[0]).toEqual({ method: 'teams/view', args: [SESSION] })
expect(b.calls[0]).toEqual({ method: 'agentTeams/view', args: [SESSION] })
expect(b.navigation).toEqual([
['refresh', SESSION],
['open', {
@@ -2,8 +2,10 @@
import { afterEach, describe, expect, it, vi } from 'vitest'
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
import type { SessionId } from '@deepseek-ai/dsh-client-runtime/client'
import type { TeamTaskId, TeamTaskView as TeamTask, TeamView } from '@deepseek-ai/dsh-team/client'
import type { SessionId } from '@deepseek-ai/dsh-session/types'
import type {
TeamTaskId, TeamTaskView as TeamTask, TeamView,
} from '@deepseek-ai/dsh-experimental-agent-team/client'
import { makeTranslate } from '@deepseek-ai/dsh-client-test-runtime'
import { zh as commonZh } from '@deepseek-ai/dsh-client-locale/src/locales/zh.ts'
import {
@@ -501,7 +503,7 @@ describe('TeamAction', () => {
expect(screen.getByRole<HTMLButtonElement>('button', { name: /failed-worker/u }).disabled).toBe(true)
expect(screen.getByRole<HTMLButtonElement>('button', { name: /provisioning-worker/u }).disabled).toBe(true)
fireEvent.click(screen.getByRole('button', { name: /^workerrunning/u }))
fireEvent.click(screen.getByRole('button', { name: /^worker/u }))
expect(await screen.findByText('Error: navigation failed')).toBeTruthy()
fireEvent.click(screen.getByRole('button', { name: zh.refresh }))
await waitFor(() => { expect(load).toHaveBeenCalledTimes(2) })
@@ -7,13 +7,16 @@
"include": ["src"],
"references": [
{ "path": "../../../vendor/cordis" },
{ "path": "../team" },
{ "path": "../agent-team" },
{ "path": "../../api/remotes/tsconfig.client.json" },
{ "path": "../../api/session-controller/tsconfig.client.json" },
{ "path": "../../client/locale" },
{ "path": "../../client/runtime" },
{ "path": "../../client/ui-conversation" },
{ "path": "../../client/ui-primitives" },
{ "path": "../../client/ui-renderer" },
{ "path": "../../client/ui-session" },
{ "path": "../../client/ui-slots" },
{ "path": "../../core/session" },
{ "path": "../../typert/protocol" },
{ "path": "../../runtime-diagnostics/invariants" }
]
@@ -1,3 +1,3 @@
import { clientBundle } from '../../client/tsdown.client.ts'
export default clientBundle('@deepseek-ai/dsh-client-ui-agent-team', ['lib/types/index.js', 'lib/types/invariant.js'])
export default clientBundle('@deepseek-ai/dsh-experimental-client-ui-agent-team', ['lib/types/index.js', 'lib/types/invariant.js'])
@@ -1144,6 +1144,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
occupants: [
'client-ui-agent-preset AgentPresetLabel id \'agent-preset\'',
'client-ui-jobs JobListAction id \'job-list\'',
'experimental-client-ui-agent-team TeamAction id \'agent-team\'',
],
replaceRisk: 'none',
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'conversation.session.header.actions\', () => ctx.slots.register(\n { name: \'conversation.session.header.actions\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
@@ -375,6 +375,24 @@ export const SERVICE_API: readonly ServiceApiEntry[] = [
parameters: [{ name: 'agent', description: 'candidate exact live Agent.' }],
returns: 'Team membership, or undefined for non-Team subagents and stale identities.',
},
{
signature: '@Remote(\'view\') remoteView(agent: Agent): TeamView',
description: 'Read the current roster and non-deleted task board through the generated Remote API.',
parameters: [{ name: 'agent', description: 'exact live Team member used as the authority credential.' }],
returns: 'detached current roster and task views.',
},
{
signature: '@Remote(\'createTask\') remoteCreateTask(agent: Agent, request: CreateTeamTaskRequest): Promise<TeamTaskMutationResult>',
description: 'Create one shared task through the generated Remote API.',
parameters: [{ name: 'agent', description: 'exact live Team member creating the task.' }, { name: 'request', description: 'task text, blockers, and advisory write scopes.' }],
returns: 'the revision-one task or a typed Team rejection.',
},
{
signature: '@Remote(\'updateTask\') remoteUpdateTask(agent: Agent, request: UpdateTeamTaskRequest): Promise<TeamTaskMutationResult>',
description: 'Apply one task mutation and preserve Team rejections as business results.',
parameters: [{ name: 'agent', description: 'exact live Team member authorizing the mutation.' }, { name: 'request', description: 'task identity, expected revision, action, and action fields.' }],
returns: 'the committed task or a typed Team rejection.',
},
],
},
{
@@ -5171,6 +5189,10 @@ export const TYPE_API: readonly TypeApiEntry[] = [
name: 'TeamTaskId',
declaration: 'export type TeamTaskId = Branded<\'TeamTaskId\'>;',
},
{
name: 'TeamTaskMutationResult',
declaration: 'export type TeamTaskMutationResult = {\n readonly ok: true;\n readonly value: TeamTaskView;\n} | {\n readonly ok: false;\n readonly error: {\n readonly code: \'team-task-conflict\' | \'team-rejected\';\n readonly message: string;\n };\n};',
},
{
name: 'TeamTaskStatus',
declaration: 'export type TeamTaskStatus = \'pending\' | \'in_progress\' | \'completed\' | \'deleted\';',
@@ -5179,6 +5201,10 @@ export const TYPE_API: readonly TypeApiEntry[] = [
name: 'TeamTaskView',
declaration: 'export interface TeamTaskView {\n readonly id: TeamTaskId;\n readonly revision: number;\n readonly subject: string;\n readonly description: string;\n readonly status: TeamTaskStatus;\n readonly blockedBy: TeamTaskId[];\n readonly writeScopes: string[];\n readonly ownerName?: string;\n readonly ready: boolean;\n readonly writeScopeWarnings: string[];\n}',
},
{
name: 'TeamView',
declaration: 'export interface TeamView {\n readonly members: TeamMemberView[];\n readonly tasks: TeamTaskView[];\n}',
},
{
name: 'TeamWaitResult',
declaration: 'export interface TeamWaitResult {\n readonly timedOut: boolean;\n}',
+80
View File
@@ -4591,6 +4591,9 @@ importers:
'@deepseek-ai/dsh-subagent-spawn-in-process':
specifier: workspace:^
version: link:../../subagent/subagent-spawn-in-process
'@deepseek-ai/dsh-typert-protocol':
specifier: workspace:^
version: link:../../typert/protocol
packages/experimental/agent-team-profile:
dependencies:
@@ -4614,6 +4617,83 @@ importers:
specifier: ^4.2.0
version: 4.3.1
packages/experimental/agent-team-web-profile:
dependencies:
'@deepseek-ai/dsh-experimental-client-ui-agent-team':
specifier: workspace:^
version: link:../client-ui-agent-team
devDependencies:
'@deepseek-ai/cordis':
specifier: workspace:^
version: link:../../../vendor/cordis
'@deepseek-ai/cordis-plugin-include':
specifier: workspace:^
version: link:../../../vendor/include
'@deepseek-ai/dsh-invariants':
specifier: workspace:^
version: link:../../runtime-diagnostics/invariants
js-yaml:
specifier: ^4.2.0
version: 4.3.1
packages/experimental/client-ui-agent-team:
dependencies:
react:
specifier: ^18.2.0
version: 18.3.1
devDependencies:
'@deepseek-ai/cordis':
specifier: workspace:^
version: link:../../../vendor/cordis
'@deepseek-ai/dsh-api-remotes':
specifier: workspace:^
version: link:../../api/remotes
'@deepseek-ai/dsh-api-session-controller':
specifier: workspace:^
version: link:../../api/session-controller
'@deepseek-ai/dsh-client-locale':
specifier: workspace:^
version: link:../../client/locale
'@deepseek-ai/dsh-client-test-runtime':
specifier: workspace:^
version: link:../../test-support/client-runtime
'@deepseek-ai/dsh-client-ui-conversation':
specifier: workspace:^
version: link:../../client/ui-conversation
'@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-session':
specifier: workspace:^
version: link:../../client/ui-session
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:^
version: link:../../client/ui-slots
'@deepseek-ai/dsh-experimental-agent-team':
specifier: workspace:^
version: link:../agent-team
'@deepseek-ai/dsh-invariants':
specifier: workspace:^
version: link:../../runtime-diagnostics/invariants
'@deepseek-ai/dsh-session':
specifier: workspace:^
version: link:../../core/session
'@deepseek-ai/dsh-typert-protocol':
specifier: workspace:^
version: link:../../typert/protocol
'@testing-library/react':
specifier: ^16.1.0
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react-dom:
specifier: ^18.2.0
version: 18.3.1(react@18.3.1)
packages/experimental/tool-agent-team:
dependencies:
'@deepseek-ai/schemastery':
+1 -1
View File
@@ -525,7 +525,7 @@ const SERVICE_ROLES: ServiceRole[] = [
pkg: 'experimental-agent-team',
title: 'Agent Teams coordination domain',
mode: 'core',
consumers: ['tool-agent-team', 'client-ui-agent-team'],
consumers: ['experimental-tool-agent-team', 'experimental-client-ui-agent-team'],
note: 'Owns the implicit-root roster, durable peer mailbox, shared task DAG, continuable-child lifecycle, and generated Team Remote methods; tool-agent-team contributes model controls and client-ui-agent-team mounts the browser contribution.',
},
{
+1 -1
View File
@@ -445,7 +445,7 @@ describe('Node 24 lane ownership', () => {
expect.arrayContaining([
'packages/subagent/subagent-codex/tests/loader-composition.e2e.ts',
'packages/subagent/subagent-claude-code/tests/loader-composition.e2e.ts',
'packages/experimental/team/tests/built-lib.e2e.ts',
'packages/experimental/agent-team/tests/built-lib.e2e.ts',
]),
)
expect(subject.find(item => item.id === 'web-snapshot')).toMatchObject({
+1 -1
View File
@@ -750,7 +750,7 @@ function builtBinSmokeGate(needs: string[] = ['build']): Gate {
'packages/subagent/subagent-codex/tests/loader-composition.e2e.ts',
'packages/subagent/subagent-claude-code/tests/loader-composition.e2e.ts',
'packages/api/remotes/tests/built-lib.e2e.ts',
'packages/experimental/team/tests/built-lib.e2e.ts',
'packages/experimental/agent-team/tests/built-lib.e2e.ts',
// Built execution consumers: the only automated proof that package-name
// imports reach their lib/ entrypoints under plain Node. The e2e lane runs
// unbuilt, so these files self-skip there.
+1 -1
View File
@@ -245,7 +245,7 @@
"@deepseek-ai/dsh-client-ui-permission-presets": ["./packages/client/ui-permission-presets/src"],
"@deepseek-ai/dsh-client-ui-skill": ["./packages/client/ui-skill/src"],
"@deepseek-ai/dsh-client-ui-subagent": ["./packages/client/ui-subagent/src"],
"@deepseek-ai/dsh-client-ui-agent-team": ["./packages/experimental/client-ui-agent-team/src"],
"@deepseek-ai/dsh-experimental-client-ui-agent-team": ["./packages/experimental/client-ui-agent-team/src"],
"@deepseek-ai/dsh-client-ui-settings-plugins": ["./packages/client/ui-settings-plugins/src"],
"@deepseek-ai/dsh-client-ui-jobs": ["./packages/client/ui-jobs/src"],
"@deepseek-ai/dsh-client-ui-plan": ["./packages/client/ui-plan/src"],