diff --git a/.agents/notes/implemented/architecture/2026-08-18-experimental-agent-teams-packages.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-18-experimental-agent-teams-packages.i18n.yaml index d5fdbcc63f..3318134b3b 100644 --- a/.agents/notes/implemented/architecture/2026-08-18-experimental-agent-teams-packages.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-08-18-experimental-agent-teams-packages.i18n.yaml @@ -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 diff --git a/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.i18n.yaml b/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.i18n.yaml index 2ab9171008..9e42275b6f 100644 --- a/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.i18n.yaml @@ -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 diff --git a/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.md b/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.md index d194c98075..5002146f7d 100644 --- a/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.md +++ b/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.md @@ -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. diff --git a/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.zh.md b/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.zh.md index 57ec6770f5..d05f221418 100644 --- a/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.zh.md +++ b/.agents/notes/implemented/feature/2026-08-06-agent-teams-web.zh.md @@ -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。 diff --git a/apps/web/tests/agent-team-panel.overlay.yml b/apps/web/tests/agent-team-panel.overlay.yml index 46d8637c1b..ddc86b0947 100644 --- a/apps/web/tests/agent-team-panel.overlay.yml +++ b/apps/web/tests/agent-team-panel.overlay.yml @@ -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' diff --git a/apps/web/tests/snapshots/agent-team-panel/task.expected.md b/apps/web/tests/snapshots/agent-team-panel/task.expected.md index 42543b8027..7b7eecd5d0 100644 --- a/apps/web/tests/snapshots/agent-team-panel/task.expected.md +++ b/apps/web/tests/snapshots/agent-team-panel/task.expected.md @@ -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 diff --git a/docs/capability-seams.i18n.yaml b/docs/capability-seams.i18n.yaml index 3a8354d7f4..683f690e37 100644 --- a/docs/capability-seams.i18n.yaml +++ b/docs/capability-seams.i18n.yaml @@ -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 diff --git a/docs/capability-seams.md b/docs/capability-seams.md index d86a05e240..2ee2d1b989 100644 --- a/docs/capability-seams.md +++ b/docs/capability-seams.md @@ -172,6 +172,7 @@ flowchart LR pkg_experimental_agent_team["experimental-agent-team"] svc_agentTeams["ctx.agentTeams
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
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. | diff --git a/docs/capability-seams.zh.md b/docs/capability-seams.zh.md index 1050191d69..7ecda568ef 100644 --- a/docs/capability-seams.zh.md +++ b/docs/capability-seams.zh.md @@ -174,6 +174,7 @@ flowchart LR pkg_experimental_agent_team["experimental-agent-team"] svc_agentTeams["ctx.agentTeams
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
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、共享任务 DAG 与 continuable 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、共享任务 DAG、continuable child 生命周期与生成式 Team Remote method;tool-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 seam;tool-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。 | diff --git a/docs/config-catalog.i18n.yaml b/docs/config-catalog.i18n.yaml index 6f01d13ecf..331fd66a3f 100644 --- a/docs/config-catalog.i18n.yaml +++ b/docs/config-catalog.i18n.yaml @@ -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 diff --git a/docs/config-catalog.md b/docs/config-catalog.md index e4d60a0236..aaadee78a5 100644 --- a/docs/config-catalog.md +++ b/docs/config-catalog.md @@ -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) @@ -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)) diff --git a/docs/config-catalog.zh.md b/docs/config-catalog.zh.md index 9dc3027057..393857b50c 100644 --- a/docs/config-catalog.zh.md +++ b/docs/config-catalog.zh.md @@ -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)) diff --git a/docs/module-graph.i18n.yaml b/docs/module-graph.i18n.yaml index 3eadb7c1a9..ae3d6422d8 100644 --- a/docs/module-graph.i18n.yaml +++ b/docs/module-graph.i18n.yaml @@ -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 diff --git a/docs/module-graph.md b/docs/module-graph.md index 3cafd70ae2..e044939e4b 100644 --- a/docs/module-graph.md +++ b/docs/module-graph.md @@ -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) | diff --git a/docs/module-graph.zh.md b/docs/module-graph.zh.md index 0037321174..d707bd6339 100644 --- a/docs/module-graph.zh.md +++ b/docs/module-graph.zh.md @@ -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) | diff --git a/docs/persistence-catalog.i18n.yaml b/docs/persistence-catalog.i18n.yaml index 30e46445f3..c42d6c4b13 100644 --- a/docs/persistence-catalog.i18n.yaml +++ b/docs/persistence-catalog.i18n.yaml @@ -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 diff --git a/docs/persistence-catalog.md b/docs/persistence-catalog.md index 1ff60ebdac..593fb07302 100644 --- a/docs/persistence-catalog.md +++ b/docs/persistence-catalog.md @@ -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) @@ -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) @@ -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) @@ -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/*` diff --git a/docs/subsystems/agent-team.i18n.yaml b/docs/subsystems/agent-team.i18n.yaml index 1aaeea97b7..37a3cbfb1c 100644 --- a/docs/subsystems/agent-team.i18n.yaml +++ b/docs/subsystems/agent-team.i18n.yaml @@ -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 diff --git a/docs/subsystems/agent-team.md b/docs/subsystems/agent-team.md index 84becd182c..e3a746734b 100644 --- a/docs/subsystems/agent-team.md +++ b/docs/subsystems/agent-team.md @@ -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 -/** - * 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 - /** * 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 -/** - * 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 - /** * 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 + +/** + * 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 ``` Types: [Agent](core.md) diff --git a/docs/subsystems/agent-team.zh.md b/docs/subsystems/agent-team.zh.md index 4fb5e4fb7b..1f885a7386 100644 --- a/docs/subsystems/agent-team.zh.md +++ b/docs/subsystems/agent-team.zh.md @@ -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 -/** - * 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 - /** * 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 -/** - * 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 - /** * 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 + +/** + * 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 ``` Types: [Agent](core.zh.md) diff --git a/knip.json b/knip.json index 334b633f73..e5e331194b 100644 --- a/knip.json +++ b/knip.json @@ -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": { diff --git a/packages/experimental/README.i18n.yaml b/packages/experimental/README.i18n.yaml index b191b04710..3636475c1a 100644 --- a/packages/experimental/README.i18n.yaml +++ b/packages/experimental/README.i18n.yaml @@ -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 diff --git a/packages/experimental/agent-team-web-profile/README.i18n.yaml b/packages/experimental/agent-team-web-profile/README.i18n.yaml index 32b81b75cb..671abdde4b 100644 --- a/packages/experimental/agent-team-web-profile/README.i18n.yaml +++ b/packages/experimental/agent-team-web-profile/README.i18n.yaml @@ -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 diff --git a/packages/experimental/agent-team-web-profile/README.zh.md b/packages/experimental/agent-team-web-profile/README.zh.md index ae5e541d85..3d7241384c 100644 --- a/packages/experimental/agent-team-web-profile/README.zh.md +++ b/packages/experimental/agent-team-web-profile/README.zh.md @@ -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 变化。 + + ## 已知限制与暂缓事项 - **有序 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 发布产物会排除这个私有包。 diff --git a/packages/experimental/agent-team-web-profile/cordis.patch.yml b/packages/experimental/agent-team-web-profile/cordis.patch.yml index bde50d45a6..19323fb559 100644 --- a/packages/experimental/agent-team-web-profile/cordis.patch.yml +++ b/packages/experimental/agent-team-web-profile/cordis.patch.yml @@ -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' diff --git a/packages/experimental/agent-team-web-profile/package.json b/packages/experimental/agent-team-web-profile/package.json index a793cbd3d0..bc0e0c36b9 100644 --- a/packages/experimental/agent-team-web-profile/package.json +++ b/packages/experimental/agent-team-web-profile/package.json @@ -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:^", diff --git a/packages/experimental/agent-team-web-profile/src/invariant.ts b/packages/experimental/agent-team-web-profile/src/invariant.ts index 42531dd04d..6a219f5961 100644 --- a/packages/experimental/agent-team-web-profile/src/invariant.ts +++ b/packages/experimental/agent-team-web-profile/src/invariant.ts @@ -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' diff --git a/packages/experimental/agent-team-web-profile/tests/profile.spec.ts b/packages/experimental/agent-team-web-profile/tests/profile.spec.ts index e76d8c827c..6cd0a31ef4 100644 --- a/packages/experimental/agent-team-web-profile/tests/profile.spec.ts +++ b/packages/experimental/agent-team-web-profile/tests/profile.spec.ts @@ -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() + }) }) diff --git a/packages/experimental/agent-team/README.i18n.yaml b/packages/experimental/agent-team/README.i18n.yaml index 15941b2919..508a041176 100644 --- a/packages/experimental/agent-team/README.i18n.yaml +++ b/packages/experimental/agent-team/README.i18n.yaml @@ -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 diff --git a/packages/experimental/agent-team/src/client.ts b/packages/experimental/agent-team/src/client.ts index c76bab501d..122af45a0b 100644 --- a/packages/experimental/agent-team/src/client.ts +++ b/packages/experimental/agent-team/src/client.ts @@ -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' diff --git a/packages/experimental/agent-team/src/types.ts b/packages/experimental/agent-team/src/types.ts index 767e59a3e2..8d5b2a8d62 100644 --- a/packages/experimental/agent-team/src/types.ts +++ b/packages/experimental/agent-team/src/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'> diff --git a/packages/experimental/agent-team/tests/built-lib.e2e.ts b/packages/experimental/agent-team/tests/built-lib.e2e.ts index dfa9862181..5ae0619172 100644 --- a/packages/experimental/agent-team/tests/built-lib.e2e.ts +++ b/packages/experimental/agent-team/tests/built-lib.e2e.ts @@ -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', ], }) }) diff --git a/packages/experimental/client-ui-agent-team/README.i18n.yaml b/packages/experimental/client-ui-agent-team/README.i18n.yaml index e5de3820ee..f28cc7d16f 100644 --- a/packages/experimental/client-ui-agent-team/README.i18n.yaml +++ b/packages/experimental/client-ui-agent-team/README.i18n.yaml @@ -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 diff --git a/packages/experimental/client-ui-agent-team/README.zh.md b/packages/experimental/client-ui-agent-team/README.zh.md index 533350624c..8a06d28140 100644 --- a/packages/experimental/client-ui-agent-team/README.zh.md +++ b/packages/experimental/client-ui-agent-team/README.zh.md @@ -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 都发送当前显示的 revision,create 与 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) 安装本包。 ## 模型体验 diff --git a/packages/experimental/client-ui-agent-team/package.json b/packages/experimental/client-ui-agent-team/package.json index 5898ef2c00..dccaf91caa 100644 --- a/packages/experimental/client-ui-agent-team/package.json +++ b/packages/experimental/client-ui-agent-team/package.json @@ -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", diff --git a/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx b/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx index 010ba2fae3..1de340561b 100644 --- a/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx +++ b/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx @@ -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 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({ {member.name} - {member.status}{member.model === undefined ? '' : ` · ${t('model')}: ${member.model}`} + {t(memberStatusKey(member.status))}{member.model === undefined ? '' : ` · ${t('model')}: ${member.model}`} {member.diagnostics.map(diagnostic => {diagnostic})} diff --git a/packages/experimental/client-ui-agent-team/src/client/index.ts b/packages/experimental/client-ui-agent-team/src/client/index.ts index 37ca28acdd..5e2093105e 100644 --- a/packages/experimental/client-ui-agent-team/src/client/index.ts +++ b/packages/experimental/client-ui-agent-team/src/client/index.ts @@ -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' diff --git a/packages/experimental/client-ui-agent-team/src/client/locales.ts b/packages/experimental/client-ui-agent-team/src/client/locales.ts index a8ca89418f..692df60d64 100644 --- a/packages/experimental/client-ui-agent-team/src/client/locales.ts +++ b/packages/experimental/client-ui-agent-team/src/client/locales.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', diff --git a/packages/experimental/client-ui-agent-team/src/client/mount.ts b/packages/experimental/client-ui-agent-team/src/client/mount.ts index 0d2b1bac17..c23bb88063 100644 --- a/packages/experimental/client-ui-agent-team/src/client/mount.ts +++ b/packages/experimental/client-ui-agent-team/src/client/mount.ts @@ -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), ) diff --git a/packages/experimental/client-ui-agent-team/src/invariant.ts b/packages/experimental/client-ui-agent-team/src/invariant.ts index 954600b3ed..c40b74d759 100644 --- a/packages/experimental/client-ui-agent-team/src/invariant.ts +++ b/packages/experimental/client-ui-agent-team/src/invariant.ts @@ -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' diff --git a/packages/experimental/client-ui-agent-team/tests/browser-plugin.client.spec.ts b/packages/experimental/client-ui-agent-team/tests/browser-plugin.client.spec.ts index ee749e987e..60109f5b24 100644 --- a/packages/experimental/client-ui-agent-team/tests/browser-plugin.client.spec.ts +++ b/packages/experimental/client-ui-agent-team/tests/browser-plugin.client.spec.ts @@ -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', { diff --git a/packages/experimental/client-ui-agent-team/tests/team-action.client.spec.tsx b/packages/experimental/client-ui-agent-team/tests/team-action.client.spec.tsx index c07338fa26..c1c7bb99f8 100644 --- a/packages/experimental/client-ui-agent-team/tests/team-action.client.spec.tsx +++ b/packages/experimental/client-ui-agent-team/tests/team-action.client.spec.tsx @@ -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('button', { name: /failed-worker/u }).disabled).toBe(true) expect(screen.getByRole('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) }) diff --git a/packages/experimental/client-ui-agent-team/tsconfig.json b/packages/experimental/client-ui-agent-team/tsconfig.json index 5bdb88c674..edd7ca15c0 100644 --- a/packages/experimental/client-ui-agent-team/tsconfig.json +++ b/packages/experimental/client-ui-agent-team/tsconfig.json @@ -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" } ] diff --git a/packages/experimental/client-ui-agent-team/tsdown.config.ts b/packages/experimental/client-ui-agent-team/tsdown.config.ts index e806cafcdc..ee51c1326f 100644 --- a/packages/experimental/client-ui-agent-team/tsdown.config.ts +++ b/packages/experimental/client-ui-agent-team/tsdown.config.ts @@ -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']) diff --git a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts index fd4aece269..2229183074 100644 --- a/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts +++ b/packages/extensions/cordis-client-runner/src/client/slot-catalog.ts @@ -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}', diff --git a/packages/extensions/tool-cordis/src/api-catalog.ts b/packages/extensions/tool-cordis/src/api-catalog.ts index 4ea9e6820d..3256371016 100644 --- a/packages/extensions/tool-cordis/src/api-catalog.ts +++ b/packages/extensions/tool-cordis/src/api-catalog.ts @@ -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', + 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', + 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}', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1333ccfb18..8bea0355bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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': diff --git a/scripts/gen-doc-graphs.ts b/scripts/gen-doc-graphs.ts index 8d1d890101..9e0dd0c8bf 100644 --- a/scripts/gen-doc-graphs.ts +++ b/scripts/gen-doc-graphs.ts @@ -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.', }, { diff --git a/scripts/run-gates.spec.ts b/scripts/run-gates.spec.ts index 9754420fa2..d893809659 100644 --- a/scripts/run-gates.spec.ts +++ b/scripts/run-gates.spec.ts @@ -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({ diff --git a/scripts/run-gates.ts b/scripts/run-gates.ts index 9ab1870f92..487bd7a35e 100644 --- a/scripts/run-gates.ts +++ b/scripts/run-gates.ts @@ -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. diff --git a/tsconfig.base.json b/tsconfig.base.json index 847ba00580..f591eaed91 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -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"],