refactor(team): keep session UI and task tools keyed by IDs

This commit is contained in:
Dudu-0223
2026-10-30 14:25:27 +08:00
parent 999f30aae9
commit 0eb1bb52e2
315 changed files with 5825 additions and 4067 deletions
@@ -0,0 +1,19 @@
# Bilingual-pair consistency record for 2026-10-20-session-team-mode.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-10-20-session-team-mode.md
/agent-note-team-availability-is-selected-per-session:
en: 5f36d81bd414ea67
zh: 71883b0fe2afd1b6
/agent-note-team-availability-is-selected-per-session/problem:
en: db7a81ab452fdd0f
zh: a14fdcdb8ff4cd47
/agent-note-team-availability-is-selected-per-session/decision:
en: f4e4ba7be0eda796
zh: 410649e86ff5ca72
/agent-note-team-availability-is-selected-per-session/alternatives-considered:
en: cd3cc1f3fab84f80
zh: 6d7792742d62f9fe
/agent-note-team-availability-is-selected-per-session/consequences:
en: b56a6a1c8ad1aa7a
zh: 43bdd8a5bccce8bf
@@ -0,0 +1,29 @@
# Agent Note: Team availability is selected per Session
Status: implemented
English | [中文](2026-10-20-session-team-mode.zh.md)
## Problem
A plugin-level Team switch requires users to change the shared profile before choosing collaboration for one conversation. It can disable another Session’s capability and leaves a second control beside the Session selection. Ordinary tasks still need their existing tool catalog, and disabling collaboration must not discard task history or children.
## Decision
The base bundle loads the Team service and task tools, and the Web bundle loads the Team UI. The packages belong to the subagent and client product groups. A saved root-Session selection gates task tools and Team guidance throughout the tree, and the shared board in the root conversation; new Sessions default off. Ordinary subagent creation, communication, and navigation remain available.
The model and reasoning menu owns the user’s selection. The root conversation’s Subagent panel displays members above shared tasks. Disabling Team keeps the journal and children; re-enabling restores the board. Historical task boards without a saved selection stay enabled. Profile loading removes the retired optional bundle selection, retaining row overrides.
This supersedes the explicit-composition choice in [Agent Teams](../feature/2026-08-05-agent-teams.md). Its durability, ownership, and lifecycle decisions remain active. [Optional bundles](../process/2026-09-15-shipped-optional-bundles.md) still governs other experimental features.
## Alternatives considered
**Keep both switches.** Capability installation remains a prerequisite that the conversation control cannot explain or resolve; users must manage shared profile state for a Session decision.
**Hide the plugin card without loading Team.** New profiles would have no way to obtain the capability. Loading experimental packages in the default profile would violate product isolation; moving them to their owning product groups makes the delivered support explicit.
## Consequences
Default profiles carry the Team implementation while exposing no task tools until enabled. The removed package names require custom compositions to migrate; durable event names and task data remain unchanged. [The upgrade guide](../../../../docs/upgrade-guide/v0.2.1-rc.2/session-team-mode/guide.md) owns those steps.
Verification covers default startup, new-Session opt-in, independent roots, persisted selections, retained tasks, old profile migration, and absence of the plugin switch. Product-isolation checks retain an unrelated experimental plugin as their negative control.
@@ -0,0 +1,29 @@
# Agent Note: 按 Session 选择 Team 能力
Status: implemented
[English](2026-10-20-session-team-mode.md) | 中文
## Problem
插件级 Team 开关要求用户先修改共享 profile,才能为一个会话选择协作。它可能关闭另一个 Session 的能力,并在会话选项之外留下第二个控件。普通任务仍需要原有工具目录,关闭协作也不能丢弃任务历史或子智能体。
## Decision
基础 bundle 加载 Team 服务与任务工具,Web bundle 加载 Team UI。相关包归属 subagent 与 client 产品组。根 Session 保存的选择控制整棵树的任务工具与 Team 指引,以及根会话中的共享任务板;新 Session 默认关闭。普通 subagent 创建、通信与导航继续可用。
模型与推理等级菜单承载用户选择。根会话的 Subagent 面板在成员下方显示共享任务。关闭 Team 保留日志与子智能体;重新开启恢复任务板。没有保存选择的历史任务板保持开启。profile 加载时移除已停用的可选 bundle 选择,保留配置行覆盖。
本决策替代 [Agent Teams](../feature/2026-08-05-agent-teams.zh.md) 中显式选择组合的部分;其持久性、归属与生命周期决策继续有效。[可选 bundle](../process/2026-09-15-shipped-optional-bundles.zh.md)仍约束其他实验性功能。
## Alternatives considered
**保留两个开关。** 安装能力仍是会话控件无法解释或解决的前置条件;用户必须为 Session 决策管理共享 profile 状态。
**隐藏插件卡片但不加载 Team。** 新 profile 将无法获得该能力。默认 profile 加载实验性包会违反产品隔离;将相关包移入所属产品组可明确随产品提供的支持。
## Consequences
默认 profile 包含 Team 实现,但开启前不暴露任务工具。自定义组合必须迁移已移除的包名;持久事件名称与任务数据保持不变。[升级指南](../../../../docs/upgrade-guide/v0.2.1-rc.2/session-team-mode/guide.zh.md)负责具体步骤。
验证覆盖默认启动、新 Session 手动开启、独立根、选择持久化、任务保留、旧 profile 迁移和插件开关移除。产品隔离检查使用另一个无关实验性插件作为负对照。
@@ -6,14 +6,14 @@
en: c914d8148bfc4bf9
zh: a8115f87c0ac6cae
/agent-note-durable-agent-teams-over-continuable-children/problem:
en: bab62798c2dc07b4
zh: fe42c5abf9127d37
en: 567b68ab8eb4b5b2
zh: 31a40aa22821d63a
/agent-note-durable-agent-teams-over-continuable-children/decision:
en: fb13f2ba96339bd5
zh: 9f4391a2b6004d57
en: 85b185779886bf3d
zh: 201588eda21cc005
/agent-note-durable-agent-teams-over-continuable-children/profile-delegation:
en: 5e938a21b2785b4c
zh: 4e85e7e2cdbcf7e0
en: f4c8d8760c7ebcf4
zh: 32ccca202a7769ac
/agent-note-durable-agent-teams-over-continuable-children/team-identity:
en: d79f4425f2c1929f
zh: 6586410db4a02cd1
@@ -21,8 +21,8 @@
en: 624e9d42af1af859
zh: 020dcbb26211ea67
/agent-note-durable-agent-teams-over-continuable-children/mailbox-and-task-transactions:
en: a80f5b07e3b704c4
zh: 19296eb95bd58e3b
en: ee27e04d2c84782e
zh: 4b5b07f64e53efb1
/agent-note-durable-agent-teams-over-continuable-children/shared-checkout-boundary:
en: 384f75638b0f1fb6
zh: b7ab1191784d3d27
@@ -33,8 +33,8 @@
en: 446fa0404d5df81b
zh: 46121e6971bf53a7
/agent-note-durable-agent-teams-over-continuable-children/testing:
en: 1f99ff4e740cdeac
zh: 28818401618671b9
en: 7151cc5f849c7ef1
zh: c70c2283c731ff31
/agent-note-durable-agent-teams-over-continuable-children/consequences:
en: c071fa2ccdb911b5
zh: 3b8cf0d3303a4d40
@@ -10,19 +10,19 @@ The subagent seam supplies fresh/fork providers, durable child Sessions, FIFO fo
All same-process Agents also share one checkout. Filesystem edit tools can reject an observed stale version, but Bash, formatters, generators, and external writers bypass that fence. Treating a teammate name or task owner as a file lock would hide rather than solve this concurrency boundary.
Agent Teams needs an explicit opt-in composition while its public contracts remain experimental. The default tool catalog and simple-task behavior must remain unchanged, while an explicitly requested Team must survive child Activation settlement and mailbox delivery races long enough for the Lead to aggregate the result before process teardown.
Team collaboration requires explicit opt-in; [Session selection](../architecture/2026-10-20-session-team-mode.md) owns its granularity and default composition. The default tool catalog and simple-task behavior must remain unchanged, while an explicitly requested Team must survive child Activation settlement and mailbox delivery races long enough for the Lead to aggregate the result before process teardown.
## Decision
Every ordinary root and its descendants form the Team identified by the root `SessionId`; durable task state begins with the first task event. [Subagent teammates](../architecture/2026-10-15-agent-teams-as-subagents.md) owns the single agent identity. [Task-board wait coordination](../architecture/2026-10-19-team-task-board-inbox.md) owns task-board signals and ordinary inbox waiting. An ordinary Session fork leads a new tree and excludes inherited Team authority.
The implementation is split into `@deepseek-ai/dsh-experimental-agent-team`, which owns `ctx.agentTeams` and durable semantics, and `@deepseek-ai/dsh-experimental-tool-agent-team`, which owns scoped schemas and model guidance. Every Team tool declares its complete result schema and renders that value as compact JSON, so the compiler checks each `execute` against what the model is promised and no result spends tokens on indentation. Deployments mount both plugins explicitly; Team registers no tool that shares a name with the subagent controls. The shared policy announces Team availability and describes coordination responsibilities. Both packages are public members of `packages/experimental/`; the [experimental package reference](../../../../packages/experimental/AGENTS.md) owns publication, dependency isolation, and promotion.
The implementation is split into `@deepseek-ai/dsh-agent-team`, which owns `ctx.agentTeams` and durable semantics, and `@deepseek-ai/dsh-tool-agent-team`, which owns scoped schemas and model guidance. Every Team tool declares its complete result schema and renders that value as compact JSON, so the compiler checks each `execute` against what the model is promised and no result spends tokens on indentation. The base bundle mounts both plugins; Team registers no tool that shares a name with the subagent controls. The shared policy announces Team availability and describes coordination responsibilities. Both packages belong to the [subagent family](../../../../packages/subagent/README.md); the root Session’s saved selection gates the task tools and policy. The [Session-mode upgrade guide](../../../../docs/upgrade-guide/v0.2.1-rc.2/session-team-mode/guide.md) describes profile migration.
The Lead must wait for required work before its final answer. Process teardown remains the final lifecycle owner and drains continuation Activations; a Team task owner is durable state and is not automatically released by idle, interruption, or process exit.
## Profile delegation
The [Team profile](../../../../packages/experimental/agent-team-profile/README.md) inserts the Team rows and keeps the base delegation and control tools; teammates are started with those tools as described in [subagents](../architecture/2026-10-15-agent-teams-as-subagents.md). Ordinary Session forks retain their history; [current identity handling](../architecture/2026-10-13-team-identity-runtime-context.md) supplies the fork's own role.
The [base bundle](../../../../packages/bundle/base/README.md) inserts the Team rows and keeps the base delegation and control tools; teammates are started with those tools as described in [subagents](../architecture/2026-10-15-agent-teams-as-subagents.md). Ordinary Session forks retain their history; [current identity handling](../architecture/2026-10-13-team-identity-runtime-context.md) supplies the fork's own role.
## Team identity
@@ -34,9 +34,7 @@ Teammate creation and cold resume belong to the subagent runtime ([subagent team
## Mailbox and task transactions
The historical Lead-log mailbox remains a readable format: queued and delivered records keep their stable identity and sender, and Team payload validation still applies to them. Team never delivers or acknowledges them; messages between members use the target Agent inbox through the subagent operation ([subagents](../architecture/2026-10-15-agent-teams-as-subagents.md)).
Unknown mailbox content stays as decoded JSON during event projection and checkpoint admission. Validation inspects its type without rebuilding its fields, because generic object parsing can omit a valid own `__proto__` key. Locally declared content variants undergo structural validation; opaque plugin fields do not gain Team semantics. Cache invalidation is necessary because parser correction alone cannot recover keys omitted from cached state. The [Team documentation](../../../../packages/experimental/agent-team/README.md) owns the restore behavior.
The historical Lead-log mailbox remains readable in original Session logs. The [task-only projection decision](../simplification/2026-10-29-team-task-only-projection.md) supersedes mailbox projection, checkpoint retention, and Team payload validation. Historical queued messages are never delivered or acknowledged.
Member messages use the subagent `send_message` operation, which steers running, idle, and cold targets and returns inbox acceptance.
@@ -78,7 +76,7 @@ Publication requires `apply` to return a new state per applied event and replace
Package tests cover task transitions, tree-based assignment, historical roster and mailbox decoding, and post-commit wait signals. Ordinary subagent tests cover inbox waiting; recorded Team compositions cover identity, task policy, and tools.
Inbox waiting follows [subagent controls](../../../../packages/subagent/tool-subagent-control/README.md); Team identity and task policy follow the [Team tool reference](../../../../packages/experimental/tool-agent-team/README.md).
Inbox waiting follows [subagent controls](../../../../packages/subagent/tool-subagent-control/README.md); Team identity and task policy follow the [Team tool reference](../../../../packages/team/tool-agent-team/README.md).
## Consequences
@@ -10,19 +10,19 @@ subagent seam 已提供 fresh/fork provider、持久 child Session、FIFO foll
同进程 Agent 还共享一个 checkout。文件系统 edit 工具可以拒绝已观察到的陈旧版本,但 Bash、formatter、generator 与外部 writer 会绕过该屏障。把 teammate name 或 task owner 当作文件锁只会掩盖而不是解决该并发边界。
Agent Teams 的公开约定仍处于实验阶段,因此需要显式启用的组合。默认工具目录与简单任务行为必须保持不变;而显式请求的 Team 必须能跨越 child Activation settlement 与 mailbox 投递竞争,使 Lead 在进程 teardown 前汇总结果。
Team 协作需要显式开启;[Session 选择](../architecture/2026-10-20-session-team-mode.zh.md)负责选择粒度与默认组合。默认工具目录与简单任务行为必须保持不变;而显式请求的 Team 必须能跨越 child Activation settlement 与 mailbox 投递竞争,使 Lead 在进程 teardown 前汇总结果。
## Decision
每个普通根及其后代组成以根 `SessionId` 标识的 Team;持久任务状态从首个任务事件开始。[subagent 队友](../architecture/2026-10-15-agent-teams-as-subagents.zh.md)负责单一 agent 身份。[任务板等待协调](../architecture/2026-10-19-team-task-board-inbox.zh.md)负责任务板信号和普通收件箱等待。普通 Session fork 成为一棵新树的根,并排除继承的 Team 权限。
实现拆分为 `@deepseek-ai/dsh-experimental-agent-team` 与 `@deepseek-ai/dsh-experimental-tool-agent-team`:前者负责 `ctx.agentTeams` 和持久语义,后者负责 scoped schema 与模型指引。每个 Team 工具都声明完整的结果 schema,并把该值渲染为紧凑 JSON,因此编译器会检查每个 `execute` 是否符合对模型的承诺,也没有结果把 token 花在缩进上。部署显式挂载两个插件;Team 不注册与 subagent control 同名的工具。共享策略声明 Team 可用,并说明协调责任。两个包都是 `packages/experimental/` 的公开成员;[实验性包参考](../../../../packages/experimental/AGENTS.md)负责发布、依赖隔离与 promotion。
实现拆分为 `@deepseek-ai/dsh-agent-team` 与 `@deepseek-ai/dsh-tool-agent-team`:前者负责 `ctx.agentTeams` 和持久语义,后者负责 scoped schema 与模型指引。每个 Team 工具都声明完整的结果 schema,并把该值渲染为紧凑 JSON,因此编译器会检查每个 `execute` 是否符合对模型的承诺,也没有结果把 token 花在缩进上。基础 bundle 挂载两个插件;Team 不注册与 subagent control 同名的工具。共享策略声明 Team 可用,并说明协调责任。两个包属于 [subagent 家族](../../../../packages/subagent/README.zh.md);根 Session 保存的选择控制任务工具与策略。[Session 模式升级指南](../../../../docs/upgrade-guide/v0.2.1-rc.2/session-team-mode/guide.zh.md)说明 profile 迁移。
Lead 必须等待所需工作后才能给出最终答案。进程 teardown 仍是最终生命周期 owner,并会 drain continuation Activation;Team task owner 是持久状态,不会因 idle、interrupt 或进程退出自动释放。
## Profile delegation
[Team profile](../../../../packages/experimental/agent-team-profile/README.zh.md) 插入 Team 行,并保留 base 的委派与控制工具;teammate 按[subagent](../architecture/2026-10-15-agent-teams-as-subagents.zh.md)所述使用这些工具启动。普通 Session fork 保留历史;[当前身份处理](../architecture/2026-10-13-team-identity-runtime-context.zh.md)提供 fork 自己的角色。
[基础 bundle](../../../../packages/bundle/base/README.zh.md) 插入 Team 行,并保留 base 的委派与控制工具;teammate 按[subagent](../architecture/2026-10-15-agent-teams-as-subagents.zh.md)所述使用这些工具启动。普通 Session fork 保留历史;[当前身份处理](../architecture/2026-10-13-team-identity-runtime-context.zh.md)提供 fork 自己的角色。
## Team identity
@@ -34,9 +34,7 @@ Lead 必须等待所需工作后才能给出最终答案。进程 teardown 仍
## Mailbox and task transactions
历史 Lead-log mailbox 仍是可读格式:queued 与 delivered 记录保留稳定身份与发送者,Team payload 校验仍适用于它们。Team 从不投递或确认这些记录;member 之间的消息通过 subagent 操作进入目标 Agent inbox([subagent](../architecture/2026-10-15-agent-teams-as-subagents.zh.md))。
事件投影和 checkpoint 准入期间,未知 mailbox 内容保持为已解码 JSON。校验只检查其 type,不重建字段,因为通用对象解析可能省略有效的自有 `__proto__` 键。本地声明的内容变体接受结构校验;不透明的插件字段不获得 Team 语义。缓存失效是必要的,因为只修正解析器无法恢复缓存状态中省略的键。[Team 文档](../../../../packages/experimental/agent-team/README.zh.md)拥有恢复行为的说明。
历史 Lead-log mailbox 仍可从原始 Session 日志读取。[仅投影任务的决策](../simplification/2026-10-29-team-task-only-projection.zh.md)取代邮箱投影、检查点保留和 Team 载荷校验。历史排队消息绝不再投递或确认。
member 消息使用 subagent 的 `send_message` 操作,它对 running、idle 和 cold target 使用 Steer,并返回 inbox 接收结果。
@@ -78,7 +76,7 @@ Web panel 读取 Lead Session 的 `agentTeam` 传输投影,因为现有投影
包测试覆盖任务转换、基于树的分配、历史名册和邮箱解码,以及提交后等待信号。普通 subagent 测试覆盖收件箱等待;录制 Team 组合覆盖身份、任务策略和工具。
收件箱等待遵循 [subagent 控制工具](../../../../packages/subagent/tool-subagent-control/README.zh.md);Team 身份和任务策略遵循 [Team 工具参考](../../../../packages/experimental/tool-agent-team/README.zh.md)。
收件箱等待遵循 [subagent 控制工具](../../../../packages/subagent/tool-subagent-control/README.zh.md);Team 身份和任务策略遵循 [Team 工具参考](../../../../packages/team/tool-agent-team/README.zh.md)。
## Consequences
@@ -9,8 +9,8 @@
en: dc43ba84345e1405
zh: dbc03572ab7710d2
/agent-note-ship-optional-bundles-with-the-installation/decision:
en: 2f20e356517715a6
zh: 35c7ff8c4cd8a712
en: 0f3e0daee65b6510
zh: 2e9c8000da75fb6c
/agent-note-ship-optional-bundles-with-the-installation/alternatives-considered:
en: 95b48b61757f1f13
zh: e9fb2d6ea492a4bc
@@ -14,7 +14,6 @@ The launcher names in `OPTIONAL_BUNDLES` (`packages/util/official-bundles/src/bu
Default-product isolation keeps its rules with one declared exception: an optional bundle's dependency graph is outside the default product. The static gate skips the `dependencies` edge from `@deepseek-ai/dsh` to a listed bundle and still rejects a runtime import, a shipped composition, a preset, or a default template that names it, an experimental dependency the list does not name, and a listed name that is not a runtime dependency or not a bundle. The workspace-constraints check accepts the same `dependencies` edges and no other runtime section, and the packed-install release check skips them from the installed entry package while requiring each listed bundle to be installed.
The [single-bundle reference](../../../../packages/experimental/agent-team-profile/README.md) supersedes the two Agent Teams selections with one `@deepseek-ai/dsh-experimental-agent-team-profile` selection. This note retains the installation-owned optional-bundle policy; the [optional-bundle decision for experimental capabilities](../architecture/2026-09-21-experimental-capabilities-as-optional-bundles.md) owns composition and display metadata; `OPTIONAL_BUNDLES` owns the current shipped list.
## Alternatives considered
@@ -14,7 +14,6 @@ Web 插件页只管理用户装进 profile 的组合包。像 Agent Teams 这样
默认产品隔离的规则保持不变,只声明一个例外:可选组合包的依赖图在默认产品之外。静态门禁跳过从 `@deepseek-ai/dsh` 到列表中组合包的 `dependencies` 边,仍然拒绝运行时 import、随附组合、preset 或默认模板对它的引用,拒绝列表没有点名的实验依赖,也拒绝不是运行时依赖或不是组合包的列表项。workspace 约束检查接受同样的 `dependencies` 边而不接受其他运行时依赖段;发布时的 packed-install 检查对已安装入口包跳过这些边,并要求列表中的每个组合包都已安装。
[单组合包参考](../../../../packages/experimental/agent-team-profile/README.zh.md)将两个 Agent Teams 选项替换为一个 `@deepseek-ai/dsh-experimental-agent-team-profile` 选项。本记录保留由安装方决定可选组合包的策略;[实验能力的可选 bundle 决策](../architecture/2026-09-21-experimental-capabilities-as-optional-bundles.zh.md)定义组合与显示元数据;当前随附名单由 `OPTIONAL_BUNDLES` 管理。
## 考虑过的替代方案
@@ -0,0 +1,19 @@
# Bilingual-pair consistency record for 2026-10-29-team-task-only-projection.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-10-29-team-task-only-projection.md
/agent-note-team-projection-retains-only-tasks-and-mode:
en: 030f2abb8b5137fe
zh: e661455f374c8b1f
/agent-note-team-projection-retains-only-tasks-and-mode/problem:
en: 43bd1c0daacd2b86
zh: a35efb4e84cd9288
/agent-note-team-projection-retains-only-tasks-and-mode/decision:
en: dd21640eb965f332
zh: 345bc4df573cbadf
/agent-note-team-projection-retains-only-tasks-and-mode/alternatives-considered:
en: 96a0f421f9f92746
zh: 314f4557f391f90d
/agent-note-team-projection-retains-only-tasks-and-mode/consequences:
en: 1c1b767b7905869f
zh: 1241351bfc433b70
@@ -0,0 +1,29 @@
# Agent Note: Team projection retains only tasks and mode
Status: implemented
English | [中文](2026-10-29-team-task-only-projection.zh.md)
## Problem
The Team projection retained historical member, message, and delivery collections after subagent discovery and messaging replaced their runtime consumers. Its retired lifecycle and mailbox validators could still fail the current task board, while checkpoints retained message bodies with no current reader.
## Decision
Project only tasks, saved mode, and their recovery metadata. Ignore `team/member` and `team/message/*` payloads without rebuilding or validating their former state machines. This deliberately gives up historical teammate and mailbox state recovery and the associated validation failures. The user accepted that loss; task recovery remains required.
Checkpoint version 7 invalidates prior state, including failures caused by retired records. The registry rebuilds from the unchanged Session log. Historical event declarations, format migrations, message sources, and attachment export remain supported; no Session format bump or log conversion is needed.
This partially supersedes the projection and mailbox-validation decisions in [Agent Teams](../feature/2026-08-05-agent-teams.md). The [subagent identity](../architecture/2026-10-15-agent-teams-as-subagents.md) and [inbox-only wait](2026-10-29-inbox-only-agent-wait.md) decisions remain active, as do task durability and shared-checkout semantics.
## Alternatives considered
**Retain decode-only roster and mailbox projections.** No production consumer reads these collections. Keeping them preserves message history in checkpoints and lets obsolete validation stop current task operations.
**Migrate or delete historical log events.** The task board can ignore these records directly. Rewriting them adds migration work and would discard archival data that existing format readers and exports can still use.
## Consequences
Old teammate and mailbox state is unavailable through Team projection. Original log records remain readable, but neither grant authority nor trigger delivery. Reintroducing recovery requires a concrete consumer and an explicit decision about its retained data and failure scope.
Tests cover ignored legacy payloads, version-6 checkpoint invalidation, current checkpoint suffix replay, JSONL restart with task mutation, stable view references, and a recorded headless profile accepting a task after retired lifecycle and mailbox records. Task and mode validation still fail visibly.
@@ -0,0 +1,29 @@
# Agent Note: Team 投影仅保留任务与模式
Status: implemented
[English](2026-10-29-team-task-only-projection.md) | 中文
## Problem
子代理发现和通信替代运行时消费者后,Team 投影仍保留历史成员、消息与投递集合。已退役的生命周期和邮箱校验器仍可能使当前任务板失败,而检查点保留着没有当前读取方的消息正文。
## Decision
仅投影任务、保存的模式及其恢复元数据。忽略 `team/member` 和 `team/message/*` 载荷,不再重建或校验原有状态机。这明确放弃历史队友与邮箱状态恢复,以及相应的校验失败行为。用户接受这一能力损失;任务恢复仍为必要能力。
检查点版本 7 使旧状态失效,包括退役记录导致的失败。注册表从未改写的 Session 日志重建状态。历史事件声明、格式迁移、消息来源和附件导出仍受支持;无需提升 Session 格式版本或转换日志。
本决策部分取代 [Agent Teams](../feature/2026-08-05-agent-teams.zh.md) 的投影与邮箱校验决策。[子代理身份](../architecture/2026-10-15-agent-teams-as-subagents.zh.md)和[仅等待收件箱](2026-10-29-inbox-only-agent-wait.zh.md)决策仍有效,任务持久性与共享检出语义也保持有效。
## Alternatives considered
**保留仅供解码的名册与邮箱投影。** 没有生产消费者读取这些集合。保留它们会在检查点中保存消息历史,并允许过时校验阻断当前任务操作。
**迁移或删除历史日志事件。** 任务板可以直接忽略这些记录。改写增加迁移工作,还会丢失现有格式读取器和导出功能仍可使用的归档数据。
## Consequences
Team 投影不再提供旧队友与邮箱状态。原始日志记录仍可读取,但不授予权限,也不触发投递。重新引入恢复需要具体消费者,并明确决定保留的数据和失败影响范围。
测试覆盖忽略旧载荷、版本 6 检查点失效、当前检查点后缀重放、JSONL 重启后修改任务、稳定视图引用,以及录制的 headless profile 在退役生命周期与邮箱记录之后接受任务。任务和模式校验仍可见地报错。
+1
View File
@@ -37,6 +37,7 @@ packages/ @deepseek-ai/dsh-<pkg> workspaces at packages/<group>/<pkg>/
compaction/ context compaction
context/ request context
subagent/ delegated agents
team/ shared task coordination
jobs/ background jobs
bundle/ profile bundles
workflow/ workflow execution
+6
View File
@@ -140,6 +140,10 @@ flowchart LR
cfg --> plugin_dsh_base_command_compact
plugin_dsh_base_subagent["subagent<br/>@deepseek-ai/dsh-subagent"]
cfg --> plugin_dsh_base_subagent
plugin_dsh_base_agent_team["agent-team<br/>@deepseek-ai/dsh-agent-team"]
cfg --> plugin_dsh_base_agent_team
plugin_dsh_base_tool_agent_team["tool-agent-team<br/>@deepseek-ai/dsh-tool-agent-team"]
cfg --> plugin_dsh_base_tool_agent_team
plugin_dsh_base_subagent_spawn_in_process["subagent-spawn-in-process<br/>@deepseek-ai/dsh-subagent-spawn-in-process"]
cfg --> plugin_dsh_base_subagent_spawn_in_process
plugin_dsh_base_subagent_fork_in_process["subagent-fork-in-process<br/>@deepseek-ai/dsh-subagent-fork-in-process"]
@@ -272,6 +276,8 @@ flowchart LR
| `compaction-basic` | `@deepseek-ai/dsh-compaction-basic` |
| `command-compact` | `@deepseek-ai/dsh-command-compact` |
| `subagent` | `@deepseek-ai/dsh-subagent` |
| `agent-team` | `@deepseek-ai/dsh-agent-team` |
| `tool-agent-team` | `@deepseek-ai/dsh-tool-agent-team` |
| `subagent-spawn-in-process` | `@deepseek-ai/dsh-subagent-spawn-in-process` |
| `subagent-fork-in-process` | `@deepseek-ai/dsh-subagent-fork-in-process` |
| `tool-subagent-control` | `@deepseek-ai/dsh-tool-subagent-control` |
+2 -3
View File
@@ -38,7 +38,6 @@
"@deepseek-ai/dsh-compaction-basic": "workspace:*",
"@deepseek-ai/dsh-compaction-tool-result-pruner": "workspace:*",
"@deepseek-ai/dsh-cordis-client-runner": "workspace:*",
"@deepseek-ai/dsh-experimental-agent-team-profile": "workspace:*",
"@deepseek-ai/dsh-experimental-inspector-profile": "workspace:*",
"@deepseek-ai/dsh-fs-local": "workspace:*",
"@deepseek-ai/dsh-goal": "workspace:*",
@@ -127,9 +126,9 @@
"@deepseek-ai/dsh-bash-local": "workspace:*",
"@deepseek-ai/dsh-credentials-local": "workspace:*",
"@deepseek-ai/dsh-deepseek-llm-api-extensions": "workspace:*",
"@deepseek-ai/dsh-experimental-agent-team": "workspace:*",
"@deepseek-ai/dsh-agent-team": "workspace:*",
"@deepseek-ai/dsh-experimental-ptc-runtime-python": "workspace:*",
"@deepseek-ai/dsh-experimental-tool-agent-team": "workspace:*",
"@deepseek-ai/dsh-tool-agent-team": "workspace:*",
"@deepseek-ai/dsh-fs-observation-policy": "workspace:*",
"@deepseek-ai/dsh-fs-sandbox": "workspace:*",
"@deepseek-ai/dsh-host-frontend-static": "workspace:*",
+9 -7
View File
@@ -27,15 +27,12 @@ describe('dsh run with Agent Teams enabled', () => {
await writeFile(join(profileDir, 'package.json'), JSON.stringify({
name: 'dsh-profile-headless',
private: true,
dependencies: {
'@deepseek-ai/dsh-experimental-agent-team-profile': 'workspace:^',
},
dependencies: {},
dsh: {
profile: {
bundles: [
'@deepseek-ai/dsh-base',
'@deepseek-ai/dsh-headless',
'@deepseek-ai/dsh-experimental-agent-team-profile',
],
},
},
@@ -91,8 +88,8 @@ describe('dsh run with Agent Teams enabled', () => {
const workflowChild = parsed.find(log => log.some(record => record.type === 'user/message'
&& JSON.stringify((record.data as { content: unknown }).content) === JSON.stringify([{ type: 'text', text: 'TEAM_WORKFLOW_CHILD' }])))
expect(workflowChild).toBeDefined()
expect(workflowChild!.find(record => record.type === 'subagent/descriptor')?.data)
.toMatchObject({ mode: 'continuable', provider: 'spawn' })
const workflowDescriptor = workflowChild!.find(record => record.type === 'subagent/descriptor')?.data as Record<string, unknown>
expect(workflowDescriptor).toMatchObject({ mode: 'continuable', provider: 'spawn' })
expect(workflowChild!.filter(record => record.type === 'user/message'
&& (record.data as { source: { kind: string } }).source.kind === 'user').map(record => record.data))
.toEqual([expect.objectContaining({ content: [{ type: 'text', text: 'TEAM_WORKFLOW_CHILD' }] })])
@@ -105,10 +102,15 @@ describe('dsh run with Agent Teams enabled', () => {
expect(eventTypes).not.toContain('team/member')
const catalog = root!.filter(record => record.type === 'subagent/catalog').map(record => record.data)
expect(catalog).toEqual(expect.arrayContaining([
expect.objectContaining({ version: 0, childId: workflowChild![0]?.id }),
expect.objectContaining({ version: 0, label: 'Own deterministic implementation.' }),
expect.objectContaining({ version: 0, label: 'Own deterministic research.' }),
]))
for (const entry of catalog) expect(entry).not.toHaveProperty('name')
const names = root!.filter(record => record.type === 'subagent-name/bound').map(record => record.data)
expect(names).toEqual(expect.arrayContaining([
expect.objectContaining({ version: 1, name: 'lead/implementer' }),
expect.objectContaining({ version: 1, name: 'lead/researcher' }),
]))
expect(eventTypes).not.toContain('team/message/queued')
expect(eventTypes).not.toContain('team/message/delivered')
const peerMessages = parsed.flatMap(log => log.filter(record => record.type === 'user/message'
@@ -171,8 +171,8 @@ describe.skipIf(!existsSync(join(root, 'apps/cli/lib/bin.js')))('Official option
it('keeps the default host and minimal tool catalogs while every optional bundle is off', async () => {
const minimal = await agent('minimal')
const standard = await agent()
expect(names()).toEqual(['working_directory'])
expect(names(minimal.agent)).toEqual([process.platform === 'win32' ? 'pwsh' : 'bash', 'read_image', 'working_directory'])
expect(names()).toEqual(['team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
expect(names(minimal.agent)).toEqual([process.platform === 'win32' ? 'pwsh' : 'bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
for (const name of ['str_replace_editor', 'session_search', 'terminal_open', 'ralph']) expect(names(standard.agent)).not.toContain(name)
expect((await ctx.skills.list({ cwd: workspace, scope: standard.agent })).some(skill => skill.name === 'dsh-badge')).toBe(false)
})
@@ -246,7 +246,7 @@ describe.skipIf(!existsSync(join(root, 'apps/cli/lib/bin.js')))('Official option
expect(toolResult(owner.agent, 'badge-on')).toContain('dsh-badge.png')
const minimal = await agent('minimal')
expect((await ctx.skills.list({ cwd: workspace, scope: minimal.agent })).map(skill => skill.name)).toContain('dsh-badge')
expect(names(minimal.agent)).toEqual([process.platform === 'win32' ? 'pwsh' : 'bash', 'read_image', 'working_directory'])
expect(names(minimal.agent)).toEqual([process.platform === 'win32' ? 'pwsh' : 'bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
await select(bundles.badge, false)
expect((await load('badge-after')).isError).toBe(true)
})
@@ -22,14 +22,6 @@
compression: none
- insert:
- id: agent-team
name: '@deepseek-ai/dsh-experimental-agent-team'
config:
maxTasks: 256
- id: tool-agent-team
name: '@deepseek-ai/dsh-experimental-tool-agent-team'
- id: team-fixture-llm
name: './tests/fixtures/team-llm.mjs'
@@ -215,10 +215,13 @@ class TeamFixtureAdapter extends LlmAdapter {
/** Cordis plugin name. */
export const name = 'team-fixture-llm'
/** LLM registry dependency. */
export const inject = ['llm', 'tools']
export const inject = ['llm', 'tools', 'agentTeams']
/** Register the keyless adapter on the shipped default provider route. */
export function apply(ctx) {
ctx.on('agent/created', async ({ agent }) => {
if (agent.session.header.parentSession === undefined) await ctx.agentTeams.setEnabled(agent, true)
})
const implementerWaiting = Promise.withResolvers()
const leadWaiting = Promise.withResolvers()
for (const gate of [implementerWaiting, leadWaiting]) void gate.promise.catch(() => undefined)
@@ -55,7 +55,7 @@ export async function withDefaultWeb(
await writeFile(patch, JSON.stringify([{ insert: [{
id: 'runtime-roster-observer',
name: pathToFileURL(join(root, 'fixtures/runtime-roster-observer.js')).href,
config: { negativeControl: pathToFileURL(join(repoRoot, 'packages/experimental/client-ui-agent-team/lib/index.js')).href },
config: { negativeControl: pathToFileURL(join(repoRoot, 'packages/experimental/client-ui-voice-input/lib/index.js')).href },
}] }]) + '\n')
const launch = resolveExampleLaunch({
srcBin: join(repoRoot, 'apps/cli/src/bin.ts'),
@@ -7,7 +7,7 @@ import { modulePackage } from './runtime-roster.ts'
import { experimentalRuntimeReferences } from './runtime-roster-isolation.ts'
import { withDefaultWeb, webGet } from './default-web-process.ts'
const experimentalName = '@deepseek-ai/dsh-experimental-client-ui-agent-team'
const experimentalName = '@deepseek-ai/dsh-experimental-client-ui-voice-input'
it('boots default Web with the shipped Schedule rows, without experimental modules, time context, or an active built-in Browser', async (test) => {
await withDefaultWeb(test, async ({ url, request }) => {
@@ -37,6 +37,9 @@ it('boots default Web with the shipped Schedule rows, without experimental modul
// The shipped composition mounts the Host Schedule service and its task
// page; the clock stays preset-level, so neither plane carries a row for it.
expect(roster.entries).toEqual(expect.arrayContaining([
expect.objectContaining({ name: '@deepseek-ai/dsh-agent-team', state: FiberState.ACTIVE }),
expect.objectContaining({ name: '@deepseek-ai/dsh-tool-agent-team', state: FiberState.ACTIVE }),
expect.objectContaining({ name: '@deepseek-ai/dsh-client-ui-agent-team', state: FiberState.ACTIVE }),
expect.objectContaining({ name: '@deepseek-ai/dsh-schedule', state: FiberState.ACTIVE }),
expect.objectContaining({ name: '@deepseek-ai/dsh-client-ui-schedule', state: FiberState.ACTIVE }),
]))
@@ -50,7 +53,7 @@ it('boots default Web with the shipped Schedule rows, without experimental modul
const mounted = contaminated.plugins.filter(plugin => plugin.modules.some(url => modulePackage(url) === experimentalName))
expect(mounted).toEqual([expect.objectContaining({ state: FiberState.ACTIVE })])
expect(experimentalRuntimeReferences(contaminated)).toEqual(expect.arrayContaining([
expect.stringContaining('/packages/experimental/client-ui-agent-team/'),
expect.stringContaining('/packages/experimental/client-ui-voice-input/'),
]))
})
})
+15 -16
View File
@@ -248,9 +248,9 @@ beforeAll(async () => {
}, 120_000)
describe('the shipped Web composition', () => {
it('exposes only the directory tool in the global layer', () => {
// Directory selection is global; action tools belong to their Agent presets.
expect(toolNames(ctx)).toEqual(['working_directory'])
it('registers the directory and conditional Team tools in the global layer', () => {
// Team registrations are shared; session mode controls their step-time availability.
expect(toolNames(ctx)).toEqual(['team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
})
it('keeps the token meter and its context-meter projections on the host plane', async () => {
@@ -304,7 +304,7 @@ describe('the shipped Web composition', () => {
'get_goal', 'interrupt_agent', 'job_kill', 'job_list', 'job_output', 'list_agents', 'list_subagent_models', 'plugin_manager', 'present', 'read', 'read_image',
'schedule_create', 'schedule_edit', 'schedule_list', 'schedule_view',
'send_message', 'skill',
'subagent', 'subagent_fork', 'todo_write', 'update_goal', 'wait_agent', 'web_fetch', 'web_search',
'subagent', 'subagent_fork', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'todo_write', 'update_goal', 'wait_agent', 'web_fetch', 'web_search',
'workflow', 'working_directory', 'write',
])
expect(ctx.commands.find(handle.agent, 'goal')).toBeDefined()
@@ -408,7 +408,7 @@ describe('the shipped Web composition', () => {
expect(assembly.sections).toEqual([
{ name: 'deployment:persona-prefix', text: MINIMAL_PROMPT },
])
expect(assembly.tools.map(tool => tool.name)).toEqual(['bash', 'read_image', 'working_directory'])
expect(assembly.tools.map(tool => tool.name)).toEqual(['bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
expect(assembly.tools.find(tool => tool.name === 'bash')?.description).toBe(MINIMAL_BASH_DESCRIPTION)
expect(ctx.commands.find(handle.agent, 'goal')).toBeUndefined()
// serviceFor reports preset-owned providers; unisolated consumers inherit the host fs.
@@ -485,7 +485,7 @@ describe('the shipped Web composition', () => {
const last = adapter.requests.at(-1)
expect(last?.messages.flatMap(message => message.content)
.some(block => block.type === 'text' && block.text.includes('Preserve the requested project task.'))).toBe(true)
expect(toolNames(ctx, handle.agent)).toEqual(['bash', 'read_image', 'working_directory'])
expect(toolNames(ctx, handle.agent)).toEqual(['bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
} finally {
await handle.dispose()
}
@@ -529,7 +529,7 @@ describe('the shipped Web composition', () => {
setup: agentCtx => ctx.agentPresets.mount(agentCtx, 'minimal').then(() => undefined),
})
try {
expect(toolNames(ctx, minimal.agent)).toEqual(['bash', 'read_image', 'working_directory'])
expect(toolNames(ctx, minimal.agent)).toEqual(['bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
expect(toolNames(ctx, full.agent).length).toBeGreaterThan(10)
expect(ctx.agentPresets.serviceFor(minimal.agent, 'compaction'))
.not.toBe(ctx.agentPresets.serviceFor(full.agent, 'compaction'))
@@ -538,7 +538,7 @@ describe('the shipped Web composition', () => {
// Tearing the minimal session down leaves the full one whole.
expect(toolNames(ctx, full.agent).length).toBeGreaterThan(10)
expect(toolNames(ctx)).toEqual(['working_directory'])
expect(toolNames(ctx)).toEqual(['team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
} finally {
await full.dispose()
}
@@ -697,7 +697,7 @@ describe('the shipped Web composition', () => {
// stays the preset's choice — minimal mounts no `tool-skill`, so its
// tool table has no loader even though the global layer is readable.
expect((await ctx.skills.list({ scope: handle.agent })).map(skill => skill.name)).toContain('dsh-badge')
expect(toolNames(ctx, handle.agent)).toEqual(['bash', 'read_image', 'working_directory'])
expect(toolNames(ctx, handle.agent)).toEqual(['bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
} finally {
await handle.dispose()
}
@@ -881,6 +881,8 @@ describe('a user preset declared from the shipped cordis rows', () => {
// The `Tool` provider is the one built over the host context: it
// answers with the shared registry's view of the REQUESTING agent,
// so the copy sees its own preset's tools, not the host's empty set.
const spills = vi.spyOn(copyCtx.spillStore, 'saveText')
onTestFinished(() => { spills.mockRestore() })
const queried = await executeToolFixture(copyCtx, {
callId: ToolCallId('copied-preset-inspect-tools'),
name: 'cordis_inspect_query',
@@ -889,11 +891,8 @@ describe('a user preset declared from the shipped cordis rows', () => {
agent: copied.agent,
})
expect(queried.isError).toBe(false)
// The whole-table answer can pass the inline token budget once the
// preset's tool table grows, and the spill policy then replaces its
// middle with a gap plus a spill footer. What this case proves is the
// provider's answer, so assert the names it must carry.
const queriedText = resultText(queried)
// The tool catalog may exceed the inline budget; assert its complete stored text.
const queriedText = spills.mock.calls.at(-1)?.[0].content ?? resultText(queried)
for (const toolName of ['bash', 'cordis_inspect_list', 'cordis_inspect_query', 'plugin_manager']) {
expect(queriedText).toContain(`"name": "${toolName}"`)
}
@@ -1088,7 +1087,7 @@ describe('the default preset as a user setting', () => {
})
try {
// An omitted preset id resolves the stored default instead of the composed default.
expect(toolNames(ctx, handle.agent)).toEqual(['bash', 'read_image', 'working_directory'])
expect(toolNames(ctx, handle.agent)).toEqual(['bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
} finally {
await handle.dispose()
}
@@ -1134,7 +1133,7 @@ describe('a profile patch stored before Developer tools owned preset selection',
setup: agentCtx => legacy.agentPresets.mount(agentCtx).then(() => undefined),
})
try {
expect(toolNames(legacy, handle.agent)).toEqual(['bash', 'read_image', 'working_directory'])
expect(toolNames(legacy, handle.agent)).toEqual(['bash', 'read_image', 'team_task_create', 'team_task_get', 'team_task_list', 'team_task_update', 'working_directory'])
} finally {
await handle.dispose()
}
+1 -1
View File
@@ -43,7 +43,7 @@
"@deepseek-ai/dsh-client-web": "workspace:*",
"@deepseek-ai/dsh-cmdline": "workspace:*",
"@deepseek-ai/dsh-pwsh-local": "workspace:*",
"@deepseek-ai/dsh-experimental-agent-team": "workspace:*",
"@deepseek-ai/dsh-agent-team": "workspace:*",
"@deepseek-ai/dsh-experimental-webworker-packer": "workspace:*",
"@deepseek-ai/dsh-experimental-webworker-runtime": "workspace:*",
"@deepseek-ai/dsh-remote-mock": "workspace:*",
+92 -35
View File
@@ -1,17 +1,15 @@
// Keyless assembled-browser coverage for the opt-in Agent Teams bundle
// Keyless assembled-browser coverage for per-Session Agent Teams
// over the real Host projection frame flow.
import { fileURLToPath } from 'node:url'
import { join } from 'node:path'
import { readFileSync } from 'node:fs'
import type { Browser, Page } from 'playwright'
import { chromium } from 'playwright'
import { afterAll, beforeAll, describe, expect, it, onTestFailed, onTestFinished, vi } from 'vitest'
import * as yaml from 'js-yaml'
import { entryListSchema } from '@deepseek-ai/cordis-plugin-include'
import type {} from '@deepseek-ai/dsh-experimental-agent-team'
import type {} from '@deepseek-ai/dsh-agent-team'
import { SessionId } from '@deepseek-ai/dsh-session'
import { createMessage, createUserMessage } from '@deepseek-ai/dsh-llm'
import {
assertFixtureInventory, captureStableAria, compareOrRefreshGolden,
acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden,
launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold,
} from './scaffold.ts'
import { connectFreshWorkspace, newEnglishPage, saveFailureShot } from './support.ts'
@@ -19,25 +17,8 @@ import { connectFreshWorkspace, newEnglishPage, saveFailureShot } from './suppor
const SNAPSHOT_DIR = fileURLToPath(new URL('./snapshots/agent-team-panel', import.meta.url))
const PANEL_EXPECTED = join(SNAPSHOT_DIR, 'task.expected.md')
const RESIZE_EXPECTED = join(SNAPSHOT_DIR, 'resize.expected.md')
const OVERLAY = fileURLToPath(new URL('./agent-team-panel.overlay.yml', import.meta.url))
const TEAM_PATCH = fileURLToPath(new URL('../../../packages/experimental/agent-team-profile/cordis.patch.yml', import.meta.url))
const INSTALL_ANCHORS = [
fileURLToPath(new URL('../../../packages/experimental/agent-team-profile/package.json', import.meta.url)),
]
const MODE = webSnapshotMode()
function profileEntries(path: string): unknown[] {
const parsed = yaml.load(readFileSync(path, 'utf8'), { schema: entryListSchema })
if (!Array.isArray(parsed)) throw new Error(`profile layer at ${path} must be a list`)
return parsed
}
describe('Agent Teams panel overlay', () => {
it('matches the shipped Agent Teams bundle', () => {
expect(profileEntries(OVERLAY)).toEqual(profileEntries(TEAM_PATCH))
})
})
describe('web e2e: Agent Teams panel', () => {
let scaffold: WebScaffold
let browser: Browser
@@ -45,7 +26,7 @@ describe('web e2e: Agent Teams panel', () => {
let tripwire: ReturnType<typeof watchConsole>
beforeAll(async () => {
scaffold = await launchWebScaffold({ extraOverlayPath: OVERLAY, extraInstallAnchors: INSTALL_ANCHORS })
scaffold = await launchWebScaffold()
browser = await chromium.launch()
page = await newEnglishPage(browser)
tripwire = watchConsole(page)
@@ -81,12 +62,43 @@ describe('web e2e: Agent Teams panel', () => {
await scaffold?.close()
})
it('displays agent-owned task changes through a read-only board without a refresh action', async () => {
it('defaults off and saves a Session selection in the model menu', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-team-mode'))
expect(await page.locator('[data-subagent-action]').count()).toBe(0)
await page.getByRole('button', { name: /^Select model/u }).click()
const toggle = page.getByRole('switch', { name: 'Use Agent Teams', exact: true })
await toggle.waitFor()
expect(await toggle.getAttribute('aria-checked')).toBe('false')
await toggle.focus()
await page.keyboard.press('ArrowUp')
expect(await toggle.evaluate(element => element === document.activeElement)).toBe(false)
await page.keyboard.press('ArrowDown')
expect(await toggle.evaluate(element => element === document.activeElement)).toBe(true)
await page.keyboard.press('Space')
await expect.poll(() => toggle.getAttribute('aria-checked')).toBe('true')
await page.keyboard.press('Escape')
await page.locator('[data-subagent-action]').waitFor()
const agent = scaffold.ctx.agents.list()[0]!
expect(scaffold.ctx.commands.list(agent).some(command => command.name === 'team')).toBe(false)
expect(agent.session.ownEvents().some(event => event.type === 'command/run')).toBe(false)
const other = await scaffold.ctx.agents.create({ sessionId: SessionId('other-team-mode'), agentOptions: agent.options })
expect(scaffold.ctx.agentTeams.isEnabled(other.agent)).toBe(false)
await other.dispose()
const beforeReload = tripwire.warnings.length
await page.reload({ waitUntil: 'load' })
await page.locator('[data-subagent-action]').waitFor()
await page.getByRole('button', { name: /^Select model/u }).click()
expect(await toggle.getAttribute('aria-checked')).toBe('true')
await page.keyboard.press('Escape')
acknowledgeReloadConnectionLoss(tripwire, beforeReload)
}, 60_000)
it('opens the member tree and live read-only tasks in one panel', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-agent-team-panel'))
const projectionReads = vi.spyOn(scaffold.ctx.sessionController, 'projections')
onTestFinished(() => { projectionReads.mockRestore() })
await page.locator('[data-team-action]').getByRole('button', { name: 'Task board', exact: true }).click()
const action = page.getByRole('dialog', { name: 'Task board', exact: true })
await page.locator('[data-subagent-action]').getByRole('button', { name: /subagents?$/u }).click()
const action = page.locator('[data-subagent-panel]')
await action.getByText('No shared tasks yet. Create them through the conversation.').waitFor()
expect(await action.getByRole('heading', { name: 'Members', exact: true }).count()).toBe(0)
expect(projectionReads).not.toHaveBeenCalled()
@@ -96,6 +108,19 @@ describe('web e2e: Agent Teams panel', () => {
// Host-side Team mutations reach the open panel through projection frames only.
const agent = scaffold.ctx.agents.list()[0]!
const memberId = SessionId('team-panel-researcher')
agent.session.append('subagent/catalog', {
version: 2, childId: memberId, childCreatedAt: Date.now(), mode: 'external',
label: 'Researcher: investigate the construction and verify every bound before reporting the result. '.repeat(8).trim(),
})
await action.getByRole('treeitem', { name: /Researcher/u }).waitFor()
expect(await page.locator('[data-subagent-panel]').count()).toBe(1)
expect(await page.getByRole('button', { name: 'Task board', exact: true }).count()).toBe(0)
expect(await action.evaluate((element) => {
const tree = element.querySelector('[role="tree"]')!
const board = element.querySelector('[data-team-panel]')!
return Boolean(tree.compareDocumentPosition(board) & Node.DOCUMENT_POSITION_FOLLOWING)
})).toBe(true)
const task = await scaffold.ctx.agentTeams.createTask(agent, {
subject: 'Agent task', description: 'Created by the root agent', writeScopes: ['src/web'],
})
@@ -109,7 +134,7 @@ describe('web e2e: Agent Teams panel', () => {
expect(await action.getByRole('button', { name: /^(New task|Edit|Complete|Reopen|Delete)$/u }).count()).toBe(0)
expect(await action.locator('input, select, textarea').count()).toBe(0)
const snapshot = await captureStableAria(page, '[data-team-panel]', scaffold.workspaceCwd)
const snapshot = await captureStableAria(page, '[data-subagent-panel]', scaffold.workspaceCwd)
await compareOrRefreshGolden(PANEL_EXPECTED, snapshot, MODE)
expect(projectionReads).not.toHaveBeenCalled()
expect(tripwire.pageErrors).toEqual([])
@@ -117,10 +142,30 @@ describe('web e2e: Agent Teams panel', () => {
await page.keyboard.press('Escape')
}, 60_000)
it('hides the board while disabled and restores its tasks when re-enabled', async () => {
await page.getByRole('button', { name: /^Select model/u }).click()
const toggle = page.getByRole('switch', { name: 'Use Agent Teams', exact: true })
await toggle.click()
await expect.poll(() => toggle.getAttribute('aria-checked')).toBe('false')
expect(await page.locator('[data-subagent-action]').count()).toBe(1)
await page.keyboard.press('Escape')
await page.locator('[data-subagent-action]').getByRole('button', { name: '1 subagent', exact: true }).click()
await page.getByRole('treeitem', { name: /Researcher/u }).waitFor()
expect(await page.locator('[data-team-panel]').count()).toBe(0)
await page.keyboard.press('Escape')
await page.getByRole('button', { name: /^Select model/u }).click()
await toggle.click()
await expect.poll(() => toggle.getAttribute('aria-checked')).toBe('true')
await page.keyboard.press('Escape')
await page.locator('[data-subagent-action]').getByRole('button', { name: /subagents?$/u }).click()
await page.locator('[data-subagent-panel]').getByText('Agent task', { exact: true }).waitFor()
await page.keyboard.press('Escape')
})
it('keeps the panel inside the viewport and closes on outside click or Escape', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-agent-team-panel-keyboard'))
const panel = page.getByRole('dialog', { name: 'Task board', exact: true })
const trigger = page.locator('[data-team-action]').getByRole('button', { name: 'Task board', exact: true })
const panel = page.locator('[data-subagent-panel]')
const trigger = page.locator('[data-subagent-action]').getByRole('button', { name: /subagents?$/u })
const viewport = page.viewportSize()!
await trigger.click()
await panel.getByRole('heading', { name: /Shared tasks/u }).waitFor()
@@ -136,6 +181,18 @@ describe('web e2e: Agent Teams panel', () => {
.every(([x, y]) => element.contains(document.elementFromPoint(x!, y!)))
})).toBe(true)
}
const description = panel.getByRole('button', { name: 'Expand description for team-panel-researcher', exact: true })
const preview = description.locator('span')
expect(await preview.evaluate(element => element.scrollWidth > element.clientWidth)).toBe(true)
await description.focus()
await page.keyboard.press('Enter')
const expanded = panel.getByRole('button', { name: 'Collapse description for team-panel-researcher', exact: true })
expect(await expanded.getAttribute('aria-expanded')).toBe('true')
expect(await expanded.locator('span').evaluate(element => element.scrollWidth <= element.clientWidth)).toBe(true)
expect(await panel.evaluate(element => element.scrollWidth <= element.clientWidth)).toBe(true)
expect(await expanded.evaluate(element => element === document.activeElement)).toBe(true)
await expanded.click()
expect(await description.getAttribute('aria-expanded')).toBe('false')
await panel.getByRole('heading', { name: /Shared tasks/u }).click()
expect(await panel.count()).toBe(1)
await page.mouse.click(2, 2)
@@ -162,8 +219,8 @@ describe('web e2e: Agent Teams panel', () => {
})
it('keeps the hovered panel open when the pointer returns directly to its trigger', async () => {
const trigger = page.locator('[data-team-action]').getByRole('button', { name: 'Task board', exact: true })
const panel = page.getByRole('dialog', { name: 'Task board', exact: true })
const trigger = page.locator('[data-subagent-action]').getByRole('button', { name: /subagents?$/u })
const panel = page.locator('[data-subagent-panel]')
await trigger.hover()
await panel.waitFor()
await panel.hover()
@@ -182,8 +239,8 @@ describe('web e2e: Agent Teams panel', () => {
writeScopes: [],
})
const viewport = page.viewportSize()!
const trigger = page.locator('[data-team-action]').getByRole('button', { name: 'Task board', exact: true })
const panel = page.getByRole('dialog', { name: 'Task board', exact: true })
const trigger = page.locator('[data-subagent-action]').getByRole('button', { name: /subagents?$/u })
const panel = page.locator('[data-subagent-panel]')
const card = panel.locator('article').filter({ hasText: 'Responsive task' })
await trigger.click()
await card.waitFor()
@@ -192,7 +249,7 @@ describe('web e2e: Agent Teams panel', () => {
await page.setViewportSize({ width: 390, height: 700 })
await card.getByRole('button', { name: 'Show more' }).waitFor()
expect(await card.locator('p').evaluate(p => p.scrollHeight > p.clientHeight)).toBe(true)
await compareOrRefreshGolden(RESIZE_EXPECTED, await captureStableAria(page, '[data-team-panel]', scaffold.workspaceCwd), MODE)
await compareOrRefreshGolden(RESIZE_EXPECTED, await captureStableAria(page, '[data-subagent-panel]', scaffold.workspaceCwd), MODE)
await card.getByRole('button', { name: 'Show more' }).click()
expect(await card.locator('p').evaluate(p => p.scrollHeight === p.clientHeight)).toBe(true)
await card.getByRole('button', { name: 'Show less' }).click()
@@ -1,12 +0,0 @@
# Equivalent to the Agent Teams bundle over the stable base and Web bundles.
- insert:
- id: agent-team
name: '@deepseek-ai/dsh-experimental-agent-team'
config:
maxTasks: 256
- id: tool-agent-team
name: '@deepseek-ai/dsh-experimental-tool-agent-team'
- id: ui-agent-team
name: '@deepseek-ai/dsh-experimental-client-ui-agent-team'
+2 -1
View File
@@ -170,7 +170,8 @@ describe('web e2e: the composer model switch is the default for later sessions',
expect(popupBounds!.width).toBeCloseTo(commandMenuBounds!.width)
expect(popupBounds!.x).toBeCloseTo(commandMenuBounds!.x)
expect(await search.getAttribute('placeholder')).toBe('搜索模型…')
await page.getByRole('option').first().waitFor()
// Command menu height changes where the pointer lands in the model popup.
await page.getByRole('option', { name: 'Acme Large', exact: true }).hover()
await compareOrRefreshGolden(
fileURLToPath(new URL('./expected/default-model/command-picker.expected.md', import.meta.url)),
await captureStableAria(page, '[aria-label="/model 选项"]', scaffold.workspaceCwd),
@@ -94,7 +94,7 @@ it('activates the actual default Client registry without experimental packages',
expect(roster.plugins.some(plugin => plugin.modules.includes('@deepseek-ai/dsh-client-ui-layout'))).toBe(true)
expect(experimentalClientReferences(roster)).toEqual([])
const contaminatedHost = await request('mount-experimental-entry')
const experimentalName = '@deepseek-ai/dsh-experimental-client-ui-agent-team'
const experimentalName = '@deepseek-ai/dsh-experimental-client-ui-voice-input'
expect(contaminatedHost.client.entries.map(entry => entry.id)).toContain(experimentalName)
await page.reload()
await expect.poll(async () => {
@@ -22,11 +22,6 @@
- heading "实验性插件" [level=3]
- button "更多"
- list:
- listitem:
- button "查看 智能体团队": 智能体团队
- text: 实验性 为子智能体树添加共享任务板工具与任务面板。
- status
- switch "启用 智能体团队"
- listitem:
- button "查看 语音输入": 语音输入
- text: 实验性 在本机使用 SenseVoice 转写录音,首次使用需安装依赖。
@@ -1,6 +1,6 @@
Third-party bundle card: image, 36×36, decoded
Disabled Agent Teams card: image, 36×36, decoded
Agent Teams detail: image, 36×36, decoded
Disabled Voice Input card: image, 36×36, decoded
Voice Input detail: image, 36×36, decoded
Third-party bundle detail: image, 36×36, decoded
Independent search row: image, 30×30, decoded
Independent review row: generic artwork
@@ -22,11 +22,6 @@
- heading "实验性插件" [level=3]
- button "更多"
- list:
- listitem:
- button "查看 智能体团队": 智能体团队
- text: 实验性 为子智能体树添加共享任务板工具与任务面板。
- status
- switch "启用 智能体团队"
- listitem:
- button "查看 语音输入": 语音输入
- text: 实验性 在本机使用 SenseVoice 转写录音,首次使用需安装依赖。
@@ -22,11 +22,6 @@
- heading "实验性插件" [level=3]
- button "更多"
- list:
- listitem:
- button "查看 智能体团队": 智能体团队
- text: 实验性 为子智能体树添加共享任务板工具与任务面板。
- status
- switch "启用 智能体团队"
- listitem:
- button "查看 语音输入": 语音输入
- text: 实验性 在本机使用 SenseVoice 转写录音,首次使用需安装依赖。
@@ -6,7 +6,7 @@ Focus at 500ms:
- tooltip "刷新"
failure: pending
- button "刷新" [disabled]
{"busy":"true","spinners":1,"cards":12,"skeletons":0,"alerts":[],"retry":0,"toasts":[]}
{"busy":"true","spinners":1,"cards":11,"skeletons":0,"alerts":[],"retry":0,"toasts":[]}
failure: settled
- button "刷新"
{"busy":"false","spinners":0,"cards":12,"skeletons":0,"alerts":[],"retry":0,"toasts":["刷新失败,请重试"]}
{"busy":"false","spinners":0,"cards":11,"skeletons":0,"alerts":[],"retry":0,"toasts":["刷新失败,请重试"]}
@@ -2,12 +2,12 @@
- tree "Subagent sessions":
- treeitem "historical researcher Migration required · not running" [level=1]:
- text: historical researcher Migration required · not running
- text: historical researcher Migration required
- button "Open historical researcher in sidebar"
# After opening the child
- tree "Subagent sessions":
- treeitem "historical editor Migration required · not running" [level=1]:
- text: historical editor Migration required · not running
- text: historical editor Migration required
- button "Open historical editor in sidebar"
@@ -0,0 +1,10 @@
- dialog "Subagent sessions":
- tree "Subagent sessions":
- treeitem "researcher event-sourcing researcher · continuable · not running 15.7K tok · {{duration}}" [level=1]:
- button "Expand researcher descendants"
- text: researcher
- button "Expand description for researcher": event-sourcing researcher
- text: 15.7K tok {{duration}}
- treeitem "event-sourcing reviewer one-shot · completed 0 tok · {{duration}}" [level=1]:
- text: event-sourcing reviewer 0 tok ~6mo 12d
- button "Open event-sourcing reviewer in sidebar"
+4 -1
View File
@@ -142,8 +142,11 @@ describe('minimal agent preset', () => {
],
}
`)
const requestedTools = new Set(requestHeader.tools?.map(tool => tool.name))
expect(requestHeader.tools?.toSorted((left, right) => left.name.localeCompare(right.name)))
.toEqual(scaffold.ctx.tools.schemas(agentHandle.agent).toSorted((left, right) => left.name.localeCompare(right.name)))
.toEqual(scaffold.ctx.tools.schemas(agentHandle.agent)
.filter(tool => requestedTools.has(tool.name))
.toSorted((left, right) => left.name.localeCompare(right.name)))
})
it.skipIf(MODE === 'record')('expands the completed persistent Bash call in the Web conversation', async () => {
+27 -68
View File
@@ -9,7 +9,6 @@ import type { Browser, Locator, Page } from 'playwright'
import { chromium } from 'playwright'
import { FiberState } from '@deepseek-ai/cordis'
import { readProfileManifest } from '@deepseek-ai/dsh-app-boot'
import { createUserMessage } from '@deepseek-ai/dsh-llm'
import { afterAll, beforeAll, describe, expect, it, onTestFailed, onTestFinished, vi } from 'vitest'
import { join } from 'node:path'
import {
@@ -869,7 +868,6 @@ describe('web e2e: plugin manager', () => {
await card.getAttribute('data-plugin-package'),
await card.getByText('实验性', { exact: true }).count(),
]))).toEqual([
['@deepseek-ai/dsh-experimental-agent-team-profile', 1],
['@deepseek-ai/dsh-experimental-voice-input-bundle', 1],
['@deepseek-ai/dsh-experimental-plugin-market-bundle', 1],
['@deepseek-ai/dsh-experimental-auto-review', 1],
@@ -973,7 +971,7 @@ describe('web e2e: plugin manager', () => {
onTestFinished(closeSettings)
const fixtureIcon = `data:image/svg+xml;base64,${(await readFile(join(FIXTURE_PLUGINS, 'fixture-bundle/icon.svg'))).toString('base64')}`
const fallbackIcon = `data:image/svg+xml;base64,${(await readFile(join(FIXTURE_PLUGINS, 'fixture-bundle/fallback-icon.svg'))).toString('base64')}`
const teamIcon = `data:image/svg+xml;base64,${(await readFile(fileURLToPath(new URL('../../../packages/experimental/agent-team-profile/icon.svg', import.meta.url)))).toString('base64')}`
const voiceIcon = `data:image/svg+xml;base64,${(await readFile(fileURLToPath(new URL('../../../packages/experimental/voice-input-bundle/icon.svg', import.meta.url)))).toString('base64')}`
const images: string[] = []
const checkImage = async (selector: string, source: string, label: string) => {
const image = panel.locator(`${selector} img`).first()
@@ -987,9 +985,9 @@ describe('web e2e: plugin manager', () => {
images.push(`${label}: image, ${size.width}×${size.height}, decoded`)
}
await checkImage('[data-plugin-package="@fixture/bundle"]', fixtureIcon, 'Third-party bundle card')
const team = panel.locator('[data-plugin-package="@deepseek-ai/dsh-experimental-agent-team-profile"]')
const team = panel.locator('[data-plugin-package="@deepseek-ai/dsh-experimental-voice-input-bundle"]')
expect(await team.getByRole('switch').getAttribute('aria-checked')).toBe('false')
await checkImage('[data-plugin-package="@deepseek-ai/dsh-experimental-agent-team-profile"]', teamIcon, 'Disabled Agent Teams card')
await checkImage('[data-plugin-package="@deepseek-ai/dsh-experimental-voice-input-bundle"]', voiceIcon, 'Disabled Voice Input card')
try {
for (const colorScheme of ['light', 'dark'] as const) {
await page.emulateMedia({ colorScheme })
@@ -1003,8 +1001,8 @@ describe('web e2e: plugin manager', () => {
} finally {
await page.emulateMedia({ colorScheme: null })
}
await panel.getByRole('button', { name: '查看 智能体团队', exact: true }).click()
await checkImage('[data-plugin-detail]', teamIcon, 'Agent Teams detail')
await panel.getByRole('button', { name: '查看 语音输入', exact: true }).click()
await checkImage('[data-plugin-detail]', voiceIcon, 'Voice Input detail')
await panel.getByRole('button', { name: '返回插件' }).click()
await panel.getByRole('button', { name: '查看 @fixture/bundle', exact: true }).click()
await checkImage('[data-plugin-detail]', fixtureIcon, 'Third-party bundle detail')
@@ -1104,23 +1102,18 @@ describe('web e2e: plugin manager', () => {
onTestFinished(closeSettings)
onTestFailed(() => saveFailureShot(page, 'web-e2e-plugin-manager-locale'))
const panel = await openPluginsPanel()
await panel.getByRole('button', { name: '查看 智能体团队', exact: true }).click()
await panel.getByRole('button', { name: '查看 语音输入', exact: true }).click()
const packageName = panel.locator('[data-plugin-name]')
expect(await packageName.textContent()).toBe('@deepseek-ai/dsh-experimental-agent-team-profile')
expect(await panel.getByText(experimentalBundleDescription('agent-team-profile', 'zh')).count()).toBe(1)
const child = panel.locator('[data-plugin-row]', { hasText: 'tool-agent-team' })
await child.getByText('团队工具', { exact: true }).waitFor()
expect(await child.getByText('为智能体提供共享任务板管理工具。', { exact: true }).count()).toBe(1)
expect(await packageName.textContent()).toBe('@deepseek-ai/dsh-experimental-voice-input-bundle')
expect(await panel.getByText('在本机使用 SenseVoice 转写录音,首次使用需安装依赖。').count()).toBe(1)
try {
await setLanguage('en')
await panel.getByRole('heading', { name: 'Agent teams', exact: true }).waitFor()
expect(await packageName.textContent()).toBe('@deepseek-ai/dsh-experimental-agent-team-profile')
expect(await panel.getByText(experimentalBundleDescription('agent-team-profile', 'en')).count()).toBe(1)
await child.getByText('Team tools', { exact: true }).waitFor()
expect(await child.getByText('Give agents tools to manage their shared task board.', { exact: true }).count()).toBe(1)
await panel.getByRole('heading', { name: 'Voice input', exact: true }).waitFor()
expect(await packageName.textContent()).toBe('@deepseek-ai/dsh-experimental-voice-input-bundle')
expect(await panel.getByText('Transcribe recordings locally with SenseVoice; first use requires installing dependencies').count()).toBe(1)
await panel.getByRole('button', { name: 'Back to plugins' }).click()
await panel.getByRole('button', { name: 'View Agent teams', exact: true }).waitFor()
expect(await panel.getByRole('switch', { name: 'Enable Agent teams', exact: true }).count()).toBe(1)
await panel.getByRole('button', { name: 'View Voice input', exact: true }).waitFor()
expect(await panel.getByRole('switch', { name: 'Enable Voice input', exact: true }).count()).toBe(1)
// Schedule ships in the delivered composition, so no bundle card carries it in either language.
expect(await panel.getByRole('button', { name: 'View Automation tasks', exact: true }).count()).toBe(0)
// The official configuration pages follow the language too, from their own dictionary.
@@ -1130,69 +1123,35 @@ describe('web e2e: plugin manager', () => {
} finally {
await setLanguage('zh')
}
await panel.getByRole('button', { name: '查看 智能体团队', exact: true }).waitFor()
await panel.getByRole('button', { name: '查看 语音输入', exact: true }).waitFor()
expect(tripwire.pageErrors).toEqual([])
}, 60_000)
it('enables the Team tools and browser plugin with one bundle switch', async () => {
it('provides Team mode per Session without an experimental plugin switch', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-plugin-manager-team'))
onTestFinished(closeSettings)
const panel = await openPluginsPanel()
const toggle = panel.getByRole('switch', { name: '启用 智能体团队', exact: true })
const teamRows = () => [...scaffold.ctx.loader.entries()]
.filter(entry => ['agent-team', 'tool-agent-team', 'ui-agent-team'].includes(entry.options.id))
expect(await panel.getByRole('switch', { name: '启用 智能体团队', exact: true }).count()).toBe(0)
expect(await panel.locator('[data-plugin-package="@deepseek-ai/dsh-experimental-agent-team-profile"]').count()).toBe(0)
expect([...scaffold.ctx.loader.entries()].filter(entry =>
['agent-team', 'tool-agent-team', 'ui-agent-team'].includes(entry.options.id)
&& entry.fiber?.state === FiberState.ACTIVE)).toHaveLength(3)
const teamPage = await browser.newPage({ viewport: { width: 1680, height: 1000 }, locale: ZH_BROWSER_LOCALE })
const teamTripwire = watchConsole(teamPage)
try {
await teamPage.goto(scaffold.authenticatedUrl, { waitUntil: 'load' })
await connectFreshWorkspaceZh(teamPage, scaffold.workspaceCwd)
const agent = scaffold.ctx.agents.list()[0]
if (agent === undefined) throw new Error('connected Team workspace did not create an Agent')
// Session actions render only after the conversation leaves its blank state.
agent.session.append('turn/start', { turn: 1 })
agent.session.append('user/message', createUserMessage({
content: [{ type: 'text', text: 'Team UI lifecycle' }], source: { kind: 'user' },
}), { surfaceOp: 'append' })
agent.session.append('turn/end', { turn: 1, reason: { kind: 'completed' } })
await scaffold.ctx.sessions.flush(agent.session)
// The current crumb renders as plain text inside the zh-labeled hierarchy nav.
await teamPage.getByRole('navigation', { name: '会话层级' })
.getByText('Team UI lifecycle', { exact: true }).waitFor()
const action = teamPage.locator('[data-team-action]')
expect(await action.count()).toBe(0)
await toggle.click()
try {
await expect.poll(() => teamRows().filter(entry => entry.fiber?.state === FiberState.ACTIVE).length, { timeout: 20_000 }).toBe(3)
await expect.poll(() => toggle.getAttribute('aria-checked'), { timeout: PLUGIN_TOGGLE_SETTLE_MS }).toBe('true')
await action.waitFor({ timeout: 20_000 })
await action.getByRole('button', { name: '任务板', exact: true }).click()
const teamPanel = teamPage.getByRole('dialog', { name: '任务板', exact: true })
await teamPanel.getByText('任务板暂不可用', { exact: true }).waitFor()
await teamPage.reload({ waitUntil: 'load' })
await action.getByRole('button', { name: '任务板', exact: true }).click()
await teamPanel.getByText('暂无共享任务,可以通过对话创建').waitFor()
expect(await teamPanel.getByRole('heading', { name: '成员', exact: true }).count()).toBe(0)
const manifest = JSON.parse(await homeFile('profiles', 'scaffold', 'package.json')) as {
dsh: { profile: { bundles: string[] } }
}
expect(manifest.dsh.profile.bundles).toEqual([...SCAFFOLD_BUNDLES, '@deepseek-ai/dsh-experimental-agent-team-profile'])
await panel.getByRole('button', { name: '查看 智能体团队', exact: true }).click()
for (const id of ['agent-team', 'tool-agent-team', 'ui-agent-team']) {
await panel.locator('[data-plugin-row]', { hasText: id }).first().waitFor()
}
await panel.getByRole('button', { name: '返回插件' }).click()
} finally {
const back = panel.getByRole('button', { name: '返回插件' })
if (await back.count() > 0) await back.click()
if (await toggle.getAttribute('aria-checked') === 'true') await toggle.click()
await expect.poll(() => teamRows().filter(entry => entry.fiber?.state === FiberState.ACTIVE).length, { timeout: 20_000 }).toBe(0)
await expect.poll(() => action.count(), { timeout: 20_000 }).toBe(0)
}
await teamPage.getByRole('button', { name: /^选择模型/u }).click()
const mode = teamPage.getByRole('switch', { name: '使用智能体团队', exact: true })
await mode.waitFor()
expect(await mode.getAttribute('aria-checked')).toBe('false')
await mode.click()
await expect.poll(() => mode.getAttribute('aria-checked')).toBe('true')
expect(teamTripwire.pageErrors).toEqual([])
expect(teamTripwire.warnings).toEqual([])
} finally {
await teamPage.close()
}
expect(tripwire.pageErrors).toEqual([])
}, 60_000)
it('mounts the delivered Automation tasks rows without a bundle switch', async () => {
+8 -2
View File
@@ -497,6 +497,10 @@ const EXPECTED_TOOLS = [
'skill',
'subagent',
'subagent_fork',
'team_task_create',
'team_task_get',
'team_task_list',
'team_task_update',
'todo_write',
'update_goal',
'wait_agent',
@@ -593,8 +597,10 @@ it('assembles the shipped Web transport, catalog, guidance, and defaults', async
"mode": "always",
}
`)
// The directory tool is global; the deployment's default preset supplies the agent's remaining tools.
expect(ctx.tools.schemas().map(schema => schema.name)).toEqual(['working_directory'])
// Directory and conditional Team tools are global; presets supply the remaining registrations.
expect(ctx.tools.schemas().map(schema => schema.name)).toEqual([
'working_directory', 'team_task_create', 'team_task_list', 'team_task_get', 'team_task_update',
])
const handle = await ctx.agents.create({
sessionId: SessionId('shipped-composition'),
setup: agentCtx => ctx.agentPresets.mount(agentCtx).then(() => undefined),
@@ -1,13 +1,18 @@
- dialog "Task board":
- heading "Shared tasks 2" [level=3]
- article:
- strong: Agent task
- text: In progress
- paragraph: Created by the root agent
- text: "task-1Owner: LeadWrite scopes: src/web"
- article:
- strong: Responsive task
- text: Pending
- paragraph: Check the task description before you start work. Check the task description before you start work. Check the task description before you start work.
- button "Show more"
- text: "task-2Owner: UnownedReady"
- dialog "Subagent sessions":
- tree "Subagent sessions":
- 'treeitem "researcher Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. · External task" [disabled] [level=1]':
- text: researcher
- button "Expand description for researcher": "Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result."
- region "Task board":
- heading "Shared tasks 2" [level=3]
- article:
- strong: Agent task
- text: In progress
- paragraph: Created by the root agent
- text: "task-1Owner: LeadWrite scopes: src/web"
- article:
- strong: Responsive task
- text: Pending
- paragraph: Check the task description before you start work. Check the task description before you start work. Check the task description before you start work.
- button "Show more"
- text: "task-2Owner: UnownedReady"
@@ -1,7 +1,12 @@
- dialog "Task board":
- heading "Shared tasks 1" [level=3]
- article:
- strong: Agent task
- text: In progress
- paragraph: Created by the root agent
- text: "task-1Owner: LeadWrite scopes: src/web"
- dialog "Subagent sessions":
- tree "Subagent sessions":
- 'treeitem "researcher Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. · External task" [disabled] [level=1]':
- text: researcher
- button "Expand description for researcher": "Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result. Researcher: investigate the construction and verify every bound before reporting the result."
- region "Task board":
- heading "Shared tasks 1" [level=3]
- article:
- strong: Agent task
- text: In progress
- paragraph: Created by the root agent
- text: "task-1Owner: LeadWrite scopes: src/web"
+64 -13
View File
@@ -5,7 +5,7 @@ import { dirname, join } from 'node:path'
import { zstdCompressSync } from 'node:zlib'
import type { Browser, Page } from 'playwright'
import { chromium } from 'playwright'
import { afterAll, beforeAll, describe, expect, it, onTestFailed, vi } from 'vitest'
import { afterAll, beforeAll, describe, expect, it, onTestFailed, onTestFinished, vi } from 'vitest'
import { prepareSessionSnapshotFixtureForComparison } from '@deepseek-ai/dsh-llm-replay'
import {
SESSION_FORMAT_VERSION, SessionId as sessionId, SessionLogOffset, SessionSeq,
@@ -102,6 +102,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
let browser: Browser
let page: Page
let sidecarRoot: string
let parentId: SessionId
let childId: SessionId
let oneShotId: SessionId
let grandchildId: SessionId
@@ -141,6 +142,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
const parent = scaffold.ctx.agents.list().filter(agent => agent.session.header.origin !== 'subagent')[0]
if (parent === undefined) throw new Error('fresh workspace did not publish its parent Agent')
parentId = parent.id
const parentSettled = scaffold.whenTurnSettled()
const parentInput = page.locator('[data-composer-input][contenteditable="true"]').first()
await parentInput.fill(PARENT_PROMPT)
@@ -375,6 +377,27 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
await writeComposerDraft(page, input, '')
})
it('enters the member tree after pointer or keyboard activation of its trigger', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-subagent-trigger-focus'))
const trigger = page.getByRole('button', { name: '2 subagents', exact: true })
const panel = page.locator('[data-subagent-panel]')
try {
for (const activation of ['click', 'Enter', 'Space']) {
if (activation === 'click') await trigger.click()
else await trigger.press(activation)
await expect.poll(() => panel.evaluate(element => element === document.activeElement)).toBe(true)
await page.keyboard.press('ArrowDown')
expect(await panel.locator('[role="treeitem"]:not([aria-disabled="true"])').first()
.evaluate(element => element === document.activeElement)).toBe(true)
await page.keyboard.press('Escape')
await panel.waitFor({ state: 'detached' })
expect(await trigger.evaluate(element => element === document.activeElement)).toBe(true)
}
} finally {
await page.locator('[data-composer-input]').first().hover()
}
})
it('recovers a current-format cold child catalog cache miss without activating either level', async () => {
onTestFailed(() => saveFailureShot(page, 'screenshots/non-migrating-session-reads/web-e2e-subagent-tree'))
await page.getByRole('button', { name: '2 subagents' }).hover()
@@ -395,7 +418,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
const observe = vi.spyOn(scaffold.ctx.sessionQuery, 'observeSession')
try {
const projections = page.waitForResponse(response => new URL(response.url()).pathname === '/api/session/projections')
await page.getByRole('button', { name: `Expand ${LABEL} descendants` }).click()
await page.getByRole('button', { name: 'Expand researcher descendants' }).click()
await projections
await page.getByRole('treeitem', { name: new RegExp(NESTED_LABEL) }).waitFor({ timeout: 15_000 })
expect(observe.mock.calls.some(([id]) => id === childId)).toBe(true)
@@ -407,7 +430,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
const childLabel = await childRow.getAttribute('aria-label')
await page.waitForTimeout(1_100)
expect(await childRow.getAttribute('aria-label')).toBe(childLabel)
expect(await page.getByRole('treeitem', { name: new RegExp(NESTED_LABEL) }).textContent()).toContain('continuable')
expect(await page.getByRole('treeitem', { name: new RegExp(NESTED_LABEL) }).getAttribute('aria-label')).toContain('continuable')
expect(scaffold.ctx.agents.get(childId)).toBeUndefined()
expect(scaffold.ctx.agents.get(grandchildId)).toBeUndefined()
const snapshot = await captureStableAria(
@@ -419,7 +442,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
await page.getByRole('treeitem', { name: new RegExp(NESTED_LABEL) }).click()
await page.getByText(NESTED_PROMPT).waitFor()
const hierarchy = page.getByRole('navigation', { name: 'Session hierarchy' })
await hierarchy.getByRole('button', { name: `Switch subagent: ${LABEL}`, exact: true }).waitFor()
await hierarchy.getByRole('button', { name: 'Switch subagent: researcher', exact: true }).waitFor()
expect(scaffold.ctx.agents.get(childId)).toBeUndefined()
expect(scaffold.ctx.agents.get(grandchildId)).toBeUndefined()
await hierarchy.getByRole('button').first().click()
@@ -429,7 +452,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
it('opens child history in the right Sidebar and releases it when closed', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-subagent-sidebar-chat'))
await page.getByRole('button', { name: '2 subagents' }).hover()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).getByRole('button', { name: `Open ${LABEL} in sidebar`, exact: true }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).getByRole('button', { name: 'Open researcher in sidebar', exact: true }).click()
const sidebarChat = page.locator('[data-sidebar-chat]')
await sidebarChat.getByText(/^Explain event sourcing in one sentence\./).waitFor({ timeout: 15_000 })
await compareOrRefreshGolden(
@@ -452,7 +475,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
it('opens the completed child from persistence without activating it', async () => {
onTestFailed(() => saveFailureShot(page, 'web-e2e-subagent-open'))
await page.getByRole('button', { name: '2 subagents' }).hover()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).getByText('researcher', { exact: true }).click()
await expect.poll(
() => page.getByText(/^Explain event sourcing in one sentence\./).count(),
{ timeout: 15_000 },
@@ -461,7 +484,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
throw new Error(`viewing the child activated it; API calls: ${apiCalls.join(', ')}`)
}
const hierarchy = page.getByRole('navigation', { name: 'Session hierarchy' })
await hierarchy.getByRole('button', { name: `Switch subagent: ${LABEL}` }).waitFor()
await hierarchy.getByRole('button', { name: 'Switch subagent: researcher' }).waitFor()
const sidebar = await captureStableAria(
page,
'[role="tree"][aria-label="Sessions"]',
@@ -492,7 +515,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
expect(await page.getByRole('navigation', { name: 'Session hierarchy' }).count()).toBe(0)
expect(await page.getByText(/^Explain event sourcing in one sentence\./).count()).toBe(0)
releaseCatalog()
await page.getByRole('button', { name: `Switch subagent: ${LABEL}` }).waitFor({ timeout: 15_000 })
await page.getByRole('button', { name: 'Switch subagent: researcher' }).waitFor({ timeout: 15_000 })
const input = page.getByRole('textbox', { name: 'Message or run a task, / commands, @ files or sessions' })
await input.waitFor({ timeout: 15_000 })
await expect.poll(() => input.isEnabled(), { timeout: 15_000 }).toBe(true)
@@ -558,7 +581,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
const clickArea = nestedRow.locator(':scope > div')
expect(await clickArea.count()).toBe(1)
const [menuBox, clickAreaBox] = await Promise.all([
tree.locator('..').boundingBox(),
page.locator('[data-subagent-panel]').boundingBox(),
clickArea.boundingBox(),
])
expect(menuBox).not.toBeNull()
@@ -578,7 +601,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
expect(await page.getByRole('textbox', { name: 'Message or run a task, / commands, @ files or sessions' }).isEnabled()).toBe(true)
const hierarchy = page.getByRole('navigation', { name: 'Session hierarchy' })
const crumbs = await hierarchy.getByRole('button').allTextContents()
expect(crumbs.slice(-2)).toEqual([LABEL, NESTED_LABEL])
expect(crumbs.slice(-2)).toEqual(['researcher', NESTED_LABEL])
expect(scaffold.ctx.agents.get(childId)).toBeUndefined()
expect(scaffold.ctx.agents.get(grandchildId)).toBeUndefined()
await compareOrRefreshGolden(
@@ -605,7 +628,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
.getByRole('treeitem', { name: /Ask a research subagent to/ })
.click()
await page.getByRole('button', { name: '2 subagents' }).hover()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).getByText('researcher', { exact: true }).click()
await page.getByRole('textbox', { name: 'Message or run a task, / commands, @ files or sessions' }).waitFor()
const forkResponse = page.waitForResponse(response =>
new URL(response.url()).pathname === '/api/session/fork')
@@ -634,7 +657,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
const sessions = page.getByRole('tree', { name: 'Sessions' })
await sessions.getByRole('treeitem', { name: /Ask a research subagent to/ }).click()
await page.getByRole('button', { name: '2 subagents' }).hover()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).getByText('researcher', { exact: true }).click()
await page.locator('[data-composer-input][contenteditable="true"]').first().waitFor()
expect(scaffold.ctx.agents.get(childId)).toBeUndefined()
@@ -651,7 +674,7 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
await sessions.getByRole('treeitem', { name: /Ask a research subagent to/ }).click()
await page.getByRole('button', { name: '2 subagents' }).press('ArrowDown')
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).getByText('researcher', { exact: true }).click()
const input = page.locator('[data-composer-input][contenteditable="true"]').first()
await input.waitFor()
const promptResponse = page.waitForResponse(response =>
@@ -675,6 +698,34 @@ describe('web e2e: persisted subagent conversation and human continuation', () =
expect(scaffold.ctx.agents.get(forkId)).not.toBeUndefined()
await expect.poll(() => scaffold.ctx.agents.get(childId), { timeout: 10_000 }).toBeUndefined()
})
it('shows shared tasks only in the root conversation while keeping child navigation', async () => {
const parent = scaffold.ctx.agents.get(parentId)
if (parent === undefined) throw new Error('task-board fixture requires the live parent')
const enabled = scaffold.ctx.agentTeams.isEnabled(parent)
onTestFinished(() => scaffold.ctx.agentTeams.setEnabled(parent, enabled))
await scaffold.ctx.agentTeams.setEnabled(parent, true)
await scaffold.ctx.agentTeams.createTask(parent, {
subject: 'Root-only shared task', description: 'Inspect from the root conversation.', writeScopes: [],
})
await page.getByRole('tree', { name: 'Sessions' })
.getByRole('treeitem', { name: /Ask a research subagent to/ }).click()
await page.getByRole('button', { name: '2 subagents', exact: true }).click()
await page.locator('[data-team-panel]').getByText('Root-only shared task', { exact: true }).waitFor()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).getByText('researcher', { exact: true }).click()
const switcher = page.getByRole('button', { name: 'Switch subagent: researcher', exact: true })
await switcher.click()
const panel = page.locator('[data-subagent-panel]')
await panel.getByRole('treeitem', { name: new RegExp(ONE_SHOT_LABEL) }).waitFor()
expect(await panel.locator('[data-team-panel]').count()).toBe(0)
await compareOrRefreshGolden(
fileURLToPath(new URL('./expected/subagent-conversation/navigation-only.expected.md', import.meta.url)),
await captureStableAria(page, '[data-subagent-panel]', scaffold.workspaceCwd), MODE,
)
await page.keyboard.press('Escape')
})
})
describe('web e2e: migration-required subagent catalog', () => {
+2 -2
View File
@@ -210,7 +210,7 @@ describe.skipIf(MODE === 'record')('web e2e: composer interrupt for a running co
await page.waitForSelector('[class*="frame"]', { timeout: 30_000 })
acknowledgeReloadConnectionLoss(tripwire, warningStart)
await page.getByRole('button', { name: /1 subagent/ }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).press('Enter')
const input = page.locator('[data-composer-input]').first()
await input.waitFor({ timeout: 15_000 })
await page.getByText(/^Explain event sourcing in one sentence\./)
@@ -270,7 +270,7 @@ describe.skipIf(MODE === 'record')('web e2e: composer interrupt for a running co
await page.getByRole('navigation', { name: 'Session hierarchy' })
.getByRole('button').first().click()
await page.getByRole('button', { name: /1 subagent/ }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).click()
await page.getByRole('treeitem', { name: new RegExp(LABEL) }).press('Enter')
// A live continuable child advertises the ordinary steer-all gesture, so
// that placeholder is the composer's accessible name in this window. It
// changes back as the queue drains, so later interactions address the
+1 -1
View File
@@ -220,7 +220,7 @@ describe.skipIf(MODE === 'record')('web e2e: durable workflow run in Chat', () =
await page.getByRole('button', { name: '1 subagent', exact: true }).hover()
const catalog = page.getByRole('tree', { name: 'Subagent sessions' })
await catalog.getByRole('treeitem', { name: /snapshot-flow child 1/ }).click()
await catalog.getByRole('treeitem', { name: /snapshot-flow child 1/ }).press('Enter')
await page.getByText(CHILD_PROMPT, { exact: true }).waitFor({ timeout: 15_000 })
expect(await page.locator('[data-composer-input][contenteditable="true"]').count()).toBe(1)
}, 60_000)
+4 -4
View File
@@ -267,7 +267,7 @@ flowchart LR
pkg_experimental_speech_to_text["experimental-speech-to-text"]
svc_speechToText["ctx.speechToText<br/>Experimental speech recognition providers"]
pkg_experimental_speech_to_text_sensevoice["experimental-speech-to-text-sensevoice"]
pkg_experimental_agent_team["experimental-agent-team"]
pkg_agent_team["agent-team"]
svc_agentTeams["ctx.agentTeams<br/>Agent Teams coordination domain"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_claude_code_mods["experimental-claude-code-mods"]
@@ -320,6 +320,7 @@ flowchart LR
pkg_agent_default_model --> svc_agentDefaultModel
pkg_agent_loop --> svc_agentLoop
pkg_agent_preset_registry --> svc_agentPresets
pkg_agent_team --> svc_agentTeams
pkg_api_gateway --> svc_typertGateway
pkg_api_job_controller --> svc_jobController
pkg_api_remote_access --> svc_remoteAccess
@@ -359,7 +360,6 @@ flowchart LR
pkg_deepseek_account --> svc_deepseekAccount
pkg_deepseek_account_platform --> svc_deepseekAccount
pkg_deepseek_llm_api_extensions --> svc_deepseekLlmApiExtensions
pkg_experimental_agent_team --> svc_agentTeams
pkg_experimental_api_speech_to_text --> svc_speechController
pkg_experimental_browser_use_chrome_devtools_mcp --> svc_browserUse
pkg_experimental_browser_use_playwright_mcp --> svc_browserUse
@@ -488,7 +488,7 @@ flowchart LR
svc_agentDefaultModel --> pkg_headless
svc_agentLoop --> pkg_base
svc_agentLoop --> pkg_sdk_minimal
svc_agentTeams --> pkg_experimental_tool_agent_team
svc_agentTeams --> pkg_tool_agent_team
svc_agents --> pkg_acp
svc_agents --> pkg_agent_loop
svc_agents --> pkg_subagent
@@ -742,7 +742,7 @@ flowchart LR
| `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/experimental/tool-ralph) | - | Providers prepare local children or execute external tasks; one activation manager owns both lifecycles. The delegation tool selects a backend, control tools deliver local follow-ups, and workflows await activation results. |
| `ctx.speechToText` | `seam` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text) | [`experimental-speech-to-text-sensevoice`](../packages/experimental/speech-to-text-sensevoice) | [`experimental-api-speech-to-text`](../packages/experimental/api-speech-to-text) | - | Routes explicit recognizers; the browser uses the authenticated Remote and keeps transcripts in the draft until submission. |
| `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | - | Owns the shared task DAG for a subagent tree; tool-agent-team contributes task controls. |
| `ctx.agentTeams` | `core` | [`agent-team`](../packages/team/agent-team) | - | [`tool-agent-team`](../packages/team/tool-agent-team) | - | Owns the shared task DAG for a subagent tree; tool-agent-team contributes task controls. |
| `ctx.claudeCodeMods` | `core` | [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods) | - | - | - | Loads mods that defineMod plugins add, raises their hook chains from harness extension points, and draws the band above the prompt over its Remote. |
| `ctx.inspector` | `core` | `inspector` | - | - | - | Owns the Worker-hosted CDP target and the transport-independent Host and Client observation and Cordis-tree query API. |
| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-jobs`](../packages/jobs/tool-jobs), [`api-job-controller`](../packages/api/job-controller) | - | Producers (background bash/pwsh and PTY sends) register running work; record-declaring jobs additionally stream raw output for non-consuming observers; tool-jobs is the model-facing controller that reads, lists, and kills it; jobs-local is the process-local registry. |
+4 -4
View File
@@ -269,7 +269,7 @@ flowchart LR
pkg_experimental_speech_to_text["experimental-speech-to-text"]
svc_speechToText["ctx.speechToText<br/>Experimental speech recognition providers"]
pkg_experimental_speech_to_text_sensevoice["experimental-speech-to-text-sensevoice"]
pkg_experimental_agent_team["experimental-agent-team"]
pkg_agent_team["agent-team"]
svc_agentTeams["ctx.agentTeams<br/>Agent Teams coordination domain"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_claude_code_mods["experimental-claude-code-mods"]
@@ -322,6 +322,7 @@ flowchart LR
pkg_agent_default_model --> svc_agentDefaultModel
pkg_agent_loop --> svc_agentLoop
pkg_agent_preset_registry --> svc_agentPresets
pkg_agent_team --> svc_agentTeams
pkg_api_gateway --> svc_typertGateway
pkg_api_job_controller --> svc_jobController
pkg_api_remote_access --> svc_remoteAccess
@@ -361,7 +362,6 @@ flowchart LR
pkg_deepseek_account --> svc_deepseekAccount
pkg_deepseek_account_platform --> svc_deepseekAccount
pkg_deepseek_llm_api_extensions --> svc_deepseekLlmApiExtensions
pkg_experimental_agent_team --> svc_agentTeams
pkg_experimental_api_speech_to_text --> svc_speechController
pkg_experimental_browser_use_chrome_devtools_mcp --> svc_browserUse
pkg_experimental_browser_use_playwright_mcp --> svc_browserUse
@@ -490,7 +490,7 @@ flowchart LR
svc_agentDefaultModel --> pkg_headless
svc_agentLoop --> pkg_base
svc_agentLoop --> pkg_sdk_minimal
svc_agentTeams --> pkg_experimental_tool_agent_team
svc_agentTeams --> pkg_tool_agent_team
svc_agents --> pkg_acp
svc_agents --> pkg_agent_loop
svc_agents --> pkg_subagent
@@ -744,7 +744,7 @@ flowchart LR
| `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/experimental/tool-ralph) | - | 提供方准备本地子级或执行外部任务;一个 activation 管理器持有两类生命周期。委派工具选择后端,控制工具投递本地后续消息,工作流等待 activation 结果。 |
| `ctx.speechToText` | `seam` | [`experimental-speech-to-text`](../packages/experimental/speech-to-text) | [`experimental-speech-to-text-sensevoice`](../packages/experimental/speech-to-text-sensevoice) | [`experimental-api-speech-to-text`](../packages/experimental/api-speech-to-text) | - | 路由显式选择的识别器;浏览器使用带认证的 Remote,并在提交前将转写保留在草稿中。 |
| `ctx.agentTeams` | `core` | [`experimental-agent-team`](../packages/experimental/agent-team) | - | [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | - | 负责子代理树共享的任务 DAG;tool-agent-team 提供任务控制工具。 |
| `ctx.agentTeams` | `core` | [`agent-team`](../packages/team/agent-team) | - | [`tool-agent-team`](../packages/team/tool-agent-team) | - | 负责子代理树共享的任务 DAG;tool-agent-team 提供任务控制工具。 |
| `ctx.claudeCodeMods` | `core` | [`experimental-claude-code-mods`](../packages/experimental/claude-code-mods) | - | - | - | 加载 defineMod 插件添加的模组,从 harness 扩展点触发其钩子链,并通过其 Remote 绘制提示框上方的横幅。 |
| `ctx.inspector` | `core` | `inspector` | - | - | - | 负责 Worker 托管的 CDP target,以及独立于传输的 Host 和 Client observation 与 Cordis tree query API。 |
| `ctx.jobs` | `seam` | [`jobs`](../packages/jobs/jobs) | [`jobs-local`](../packages/jobs/jobs-local) | [`tool-bash`](../packages/shell/tool-bash), [`tool-pwsh`](../packages/shell/tool-pwsh), [`tool-terminal`](../packages/experimental/tool-terminal), [`tool-jobs`](../packages/jobs/tool-jobs), [`api-job-controller`](../packages/api/job-controller) | - | 生产方(后台 bash/pwsh 与 PTY 发送)登记正在运行的工作;声明 record 的 job 还为非消费观察者流式提供原始输出;tool-jobs 是面向模型的控制器,用于读取、列出和终止这些工作;jobs-local 是进程本地注册表。 |
+32 -19
View File
@@ -171,6 +171,23 @@ export interface Config {
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-agent-preset-registry -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-agent-team -->
<a id="deepseek-aidsh-agent-team"></a>
## `@deepseek-ai/dsh-agent-team`
- `inject`: `agents` · `sessions` · `sessionPersistence` · `sessionProjections` · `subagents`
- `source`: [`packages/team/agent-team/src/types.ts:132`](../packages/team/agent-team/src/types.ts)
```ts config-catalog
/** Team-service deployment limits. */
export interface Config {
/** Maximum non-deleted tasks retained by one Team. */
readonly maxTasks?: number
}
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-agent-team -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-agent-tool-presentation -->
<a id="deepseek-aidsh-agent-tool-presentation"></a>
@@ -875,23 +892,6 @@ export interface Config {
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-deepseek-account-platform -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-experimental-agent-team -->
<a id="deepseek-aidsh-experimental-agent-team"></a>
## `@deepseek-ai/dsh-experimental-agent-team`
- `inject`: `agents` · `sessions` · `sessionPersistence` · `sessionProjections` · `subagents`
- `source`: [`packages/experimental/agent-team/src/types.ts:131`](../packages/experimental/agent-team/src/types.ts)
```ts config-catalog
/** Team-service deployment limits. */
export interface Config {
/** Maximum non-deleted tasks retained by one Team. */
readonly maxTasks?: number
}
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-experimental-agent-team -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-experimental-api-speech-to-text -->
<a id="deepseek-aidsh-experimental-api-speech-to-text"></a>
@@ -3899,6 +3899,20 @@ export type TokenMeterConfig = Record<string, never>
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-token-meter -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-tool-agent-team -->
<a id="deepseek-aidsh-tool-agent-team"></a>
## `@deepseek-ai/dsh-tool-agent-team`
- `inject`: `agentTeams` · `subagents` · `subagentNames` · `tools` · `systemPrompt`
- `source`: [`packages/team/tool-agent-team/src/index.ts:19`](../packages/team/tool-agent-team/src/index.ts)
```ts config-catalog
/** The Team tool plugin takes no configuration. */
export type Config = Record<never, never>
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-tool-agent-team -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-tool-ask-user -->
<a id="deepseek-aidsh-tool-ask-user"></a>
@@ -4836,6 +4850,7 @@ These load from a `cordis.yml` entry with no `config:` block; they declare no co
| `@deepseek-ai/dsh-client-resources` | — | [`packages/client/resources/src/index.ts`](../packages/client/resources/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-action-cards` | — | [`packages/experimental/client-ui-action-cards/src/index.ts`](../packages/experimental/client-ui-action-cards/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-agent-preset` | — | [`packages/client/ui-agent-preset/src/index.ts`](../packages/client/ui-agent-preset/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-agent-team` | — | [`packages/client/ui-agent-team/src/index.ts`](../packages/client/ui-agent-team/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-approval` | — | [`packages/client/ui-approval/src/index.ts`](../packages/client/ui-approval/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-attachment` | — | [`packages/client/ui-attachment/src/index.ts`](../packages/client/ui-attachment/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-brand-official` | — | [`packages/client/ui-brand-official/src/index.ts`](../packages/client/ui-brand-official/src/index.ts) |
@@ -4901,7 +4916,6 @@ These load from a `cordis.yml` entry with no `config:` block; they declare no co
| `@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-deliverable-file-references` | `systemPrompt` | [`packages/deliverables/deliverable-file-references/src/index.ts`](../packages/deliverables/deliverable-file-references/src/index.ts) |
| `@deepseek-ai/dsh-experimental-auto-review` | `approval` · `llm` · `permissionPresets` · `sessions` · `tools` · `workingDirectory` | [`packages/experimental/auto-review/src/index.ts`](../packages/experimental/auto-review/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-agent-team` | — | [`packages/experimental/client-ui-agent-team/src/index.ts`](../packages/experimental/client-ui-agent-team/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-claude-code-mods` | — | [`packages/experimental/client-ui-claude-code-mods/src/index.ts`](../packages/experimental/client-ui-claude-code-mods/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-stats` | — | [`packages/experimental/client-ui-stats/src/index.ts`](../packages/experimental/client-ui-stats/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-voice-input` | — | [`packages/experimental/client-ui-voice-input/src/index.ts`](../packages/experimental/client-ui-voice-input/src/index.ts) |
@@ -4992,7 +5006,6 @@ 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-cua-bundle` | — | [`packages/experimental/cua-bundle/src/index.ts`](../packages/experimental/cua-bundle/src/index.ts) |
| `@deepseek-ai/dsh-deque` | — | [`packages/util/deque/src/index.ts`](../packages/util/deque/src/index.ts) |
| `@deepseek-ai/dsh-experimental-agent-team-profile` | — | [`packages/experimental/agent-team-profile/src/index.ts`](../packages/experimental/agent-team-profile/src/index.ts) |
| `@deepseek-ai/dsh-experimental-badge-skill-bundle` | — | [`packages/experimental/badge-skill-bundle/src/index.ts`](../packages/experimental/badge-skill-bundle/src/index.ts) |
| `@deepseek-ai/dsh-experimental-browser-use-runtime` | — | [`packages/experimental/browser-use-runtime/src/index.ts`](../packages/experimental/browser-use-runtime/src/index.ts) |
| `@deepseek-ai/dsh-experimental-cot-translation-bundle` | — | [`packages/experimental/cot-translation-bundle/src/index.ts`](../packages/experimental/cot-translation-bundle/src/index.ts) |
+32 -19
View File
@@ -173,6 +173,23 @@ export interface Config {
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-agent-preset-registry -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-agent-team -->
<a id="deepseek-aidsh-agent-team"></a>
## `@deepseek-ai/dsh-agent-team`
- `inject`: `agents` · `sessions` · `sessionPersistence` · `sessionProjections` · `subagents`
- `source`: [`packages/team/agent-team/src/types.ts:132`](../packages/team/agent-team/src/types.ts)
```ts config-catalog
/** Team-service deployment limits. */
export interface Config {
/** Maximum non-deleted tasks retained by one Team. */
readonly maxTasks?: number
}
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-agent-team -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-agent-tool-presentation -->
<a id="deepseek-aidsh-agent-tool-presentation"></a>
@@ -877,23 +894,6 @@ export interface Config {
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-deepseek-account-platform -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-experimental-agent-team -->
<a id="deepseek-aidsh-experimental-agent-team"></a>
## `@deepseek-ai/dsh-experimental-agent-team`
- `inject`: `agents` · `sessions` · `sessionPersistence` · `sessionProjections` · `subagents`
- `source`: [`packages/experimental/agent-team/src/types.ts:131`](../packages/experimental/agent-team/src/types.ts)
```ts config-catalog
/** Team-service deployment limits. */
export interface Config {
/** Maximum non-deleted tasks retained by one Team. */
readonly maxTasks?: number
}
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-experimental-agent-team -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-experimental-api-speech-to-text -->
<a id="deepseek-aidsh-experimental-api-speech-to-text"></a>
@@ -3901,6 +3901,20 @@ export type TokenMeterConfig = Record<string, never>
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-token-meter -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-tool-agent-team -->
<a id="deepseek-aidsh-tool-agent-team"></a>
## `@deepseek-ai/dsh-tool-agent-team`
- `inject`: `agentTeams` · `subagents` · `subagentNames` · `tools` · `systemPrompt`
- `source`: [`packages/team/tool-agent-team/src/index.ts:19`](../packages/team/tool-agent-team/src/index.ts)
```ts config-catalog
/** The Team tool plugin takes no configuration. */
export type Config = Record<never, never>
```
<!-- END GENERATED config-catalog:@deepseek-ai/dsh-tool-agent-team -->
<!-- BEGIN GENERATED config-catalog:@deepseek-ai/dsh-tool-ask-user -->
<a id="deepseek-aidsh-tool-ask-user"></a>
@@ -4838,6 +4852,7 @@ export interface Config {
| `@deepseek-ai/dsh-client-resources` | — | [`packages/client/resources/src/index.ts`](../packages/client/resources/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-action-cards` | — | [`packages/experimental/client-ui-action-cards/src/index.ts`](../packages/experimental/client-ui-action-cards/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-agent-preset` | — | [`packages/client/ui-agent-preset/src/index.ts`](../packages/client/ui-agent-preset/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-agent-team` | — | [`packages/client/ui-agent-team/src/index.ts`](../packages/client/ui-agent-team/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-approval` | — | [`packages/client/ui-approval/src/index.ts`](../packages/client/ui-approval/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-attachment` | — | [`packages/client/ui-attachment/src/index.ts`](../packages/client/ui-attachment/src/index.ts) |
| `@deepseek-ai/dsh-client-ui-brand-official` | — | [`packages/client/ui-brand-official/src/index.ts`](../packages/client/ui-brand-official/src/index.ts) |
@@ -4903,7 +4918,6 @@ export interface Config {
| `@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-deliverable-file-references` | `systemPrompt` | [`packages/deliverables/deliverable-file-references/src/index.ts`](../packages/deliverables/deliverable-file-references/src/index.ts) |
| `@deepseek-ai/dsh-experimental-auto-review` | `approval` · `llm` · `permissionPresets` · `sessions` · `tools` · `workingDirectory` | [`packages/experimental/auto-review/src/index.ts`](../packages/experimental/auto-review/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-agent-team` | — | [`packages/experimental/client-ui-agent-team/src/index.ts`](../packages/experimental/client-ui-agent-team/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-claude-code-mods` | — | [`packages/experimental/client-ui-claude-code-mods/src/index.ts`](../packages/experimental/client-ui-claude-code-mods/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-stats` | — | [`packages/experimental/client-ui-stats/src/index.ts`](../packages/experimental/client-ui-stats/src/index.ts) |
| `@deepseek-ai/dsh-experimental-client-ui-voice-input` | — | [`packages/experimental/client-ui-voice-input/src/index.ts`](../packages/experimental/client-ui-voice-input/src/index.ts) |
@@ -4994,7 +5008,6 @@ export interface Config {
| `@deepseek-ai/dsh-cmdline` | — | [`packages/boot/cmdline/src/index.ts`](../packages/boot/cmdline/src/index.ts) |
| `@deepseek-ai/dsh-cua-bundle` | — | [`packages/experimental/cua-bundle/src/index.ts`](../packages/experimental/cua-bundle/src/index.ts) |
| `@deepseek-ai/dsh-deque` | — | [`packages/util/deque/src/index.ts`](../packages/util/deque/src/index.ts) |
| `@deepseek-ai/dsh-experimental-agent-team-profile` | — | [`packages/experimental/agent-team-profile/src/index.ts`](../packages/experimental/agent-team-profile/src/index.ts) |
| `@deepseek-ai/dsh-experimental-badge-skill-bundle` | — | [`packages/experimental/badge-skill-bundle/src/index.ts`](../packages/experimental/badge-skill-bundle/src/index.ts) |
| `@deepseek-ai/dsh-experimental-browser-use-runtime` | — | [`packages/experimental/browser-use-runtime/src/index.ts`](../packages/experimental/browser-use-runtime/src/index.ts) |
| `@deepseek-ai/dsh-experimental-cot-translation-bundle` | — | [`packages/experimental/cot-translation-bundle/src/index.ts`](../packages/experimental/cot-translation-bundle/src/index.ts) |
+2 -2
View File
@@ -13,8 +13,8 @@ Application listeners are outside this package matrix. Desktop Host subscribes t
| `agent-loop/config-start-failed` | `emit` | [`packages/core/agent-loop/src/index.ts:198`](../packages/core/agent-loop/src/index.ts) | [`agent-loop`](../packages/core/agent-loop) (`events.dispatch`) | - |
| `agent-preset/selected` | `emit` | [`packages/preset/agent-preset-registry/src/types.ts:66`](../packages/preset/agent-preset-registry/src/types.ts) | [`agent-preset-registry`](../packages/preset/agent-preset-registry) (`emit`) | [`cua`](../packages/experimental/cua), `remotes` |
| `agent/assistant-stream` | `emit` | [`packages/core/agent/src/runtime-types.ts:399`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`headless`](../packages/bundle/headless), `session-controller` |
| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:290`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `browser-use-runtime`, `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`cua`](../packages/experimental/cua), [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), `liveshare`, [`loader-smoke`](../packages/test-support/loader-smoke), [`permission-presets`](../packages/interaction/permission-presets), `session-controller`, `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) |
| `agent/disposed` | `emit` | [`packages/core/agent/src/runtime-types.ts:299`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`events.dispatch`) | [`action-cards`](../packages/experimental/action-cards), [`agent-loop`](../packages/core/agent-loop), `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`file-reference-local`](../packages/context/file-reference-local), [`goal-round-driver`](../packages/goal/goal-round-driver), `server`, `session-controller`, [`subagent`](../packages/subagent/subagent), `tool-agent-team`, [`tool-subagent-control`](../packages/subagent/tool-subagent-control) |
| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:290`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `browser-use-runtime`, `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`cua`](../packages/experimental/cua), [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), `liveshare`, [`loader-smoke`](../packages/test-support/loader-smoke), [`permission-presets`](../packages/interaction/permission-presets), `session-controller`, [`tool-subagent`](../packages/subagent/tool-subagent) |
| `agent/disposed` | `emit` | [`packages/core/agent/src/runtime-types.ts:299`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`events.dispatch`) | [`action-cards`](../packages/experimental/action-cards), [`agent-loop`](../packages/core/agent-loop), `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`file-reference-local`](../packages/context/file-reference-local), [`goal-round-driver`](../packages/goal/goal-round-driver), `server`, `session-controller`, [`subagent`](../packages/subagent/subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control) |
| `agent/error` | `emit` | [`packages/core/agent/src/runtime-types.ts:429`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`deepseek-account`](../packages/credentials/deepseek-account), [`goal-round-driver`](../packages/goal/goal-round-driver), [`headless`](../packages/bundle/headless), `server`, `session-controller`, [`session-telemetry`](../packages/session/session-telemetry), [`subagent`](../packages/subagent/subagent) |
| `agent/inbox/claimed` | `emit` | [`packages/core/agent/src/runtime-types.ts:328`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`tool-jobs`](../packages/jobs/tool-jobs), [`user-questions`](../packages/interaction/user-questions) |
| `agent/inbox/discarded` | `emit` | [`packages/core/agent/src/runtime-types.ts:336`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`user-questions`](../packages/interaction/user-questions) |
+2 -2
View File
@@ -15,8 +15,8 @@
| `agent-loop/config-start-failed` | `emit` | [`packages/core/agent-loop/src/index.ts:198`](../packages/core/agent-loop/src/index.ts) | [`agent-loop`](../packages/core/agent-loop) (`events.dispatch`) | - |
| `agent-preset/selected` | `emit` | [`packages/preset/agent-preset-registry/src/types.ts:66`](../packages/preset/agent-preset-registry/src/types.ts) | [`agent-preset-registry`](../packages/preset/agent-preset-registry) (`emit`) | [`cua`](../packages/experimental/cua), `remotes` |
| `agent/assistant-stream` | `emit` | [`packages/core/agent/src/runtime-types.ts:399`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`headless`](../packages/bundle/headless), `session-controller` |
| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:290`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `browser-use-runtime`, `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`cua`](../packages/experimental/cua), [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), `liveshare`, [`loader-smoke`](../packages/test-support/loader-smoke), [`permission-presets`](../packages/interaction/permission-presets), `session-controller`, `tool-agent-team`, [`tool-subagent`](../packages/subagent/tool-subagent) |
| `agent/disposed` | `emit` | [`packages/core/agent/src/runtime-types.ts:299`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`events.dispatch`) | [`action-cards`](../packages/experimental/action-cards), [`agent-loop`](../packages/core/agent-loop), `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`file-reference-local`](../packages/context/file-reference-local), [`goal-round-driver`](../packages/goal/goal-round-driver), `server`, `session-controller`, [`subagent`](../packages/subagent/subagent), `tool-agent-team`, [`tool-subagent-control`](../packages/subagent/tool-subagent-control) |
| `agent/created` | `serial` | [`packages/core/agent/src/runtime-types.ts:290`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`serial`) | `browser-use-runtime`, `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`cua`](../packages/experimental/cua), [`file-reference-local`](../packages/context/file-reference-local), [`goal`](../packages/goal/goal), [`goal-round-driver`](../packages/goal/goal-round-driver), [`hooks-claude-code`](../packages/experimental/hooks-claude-code), [`hooks-codex`](../packages/experimental/hooks-codex), `liveshare`, [`loader-smoke`](../packages/test-support/loader-smoke), [`permission-presets`](../packages/interaction/permission-presets), `session-controller`, [`tool-subagent`](../packages/subagent/tool-subagent) |
| `agent/disposed` | `emit` | [`packages/core/agent/src/runtime-types.ts:299`](../packages/core/agent/src/runtime-types.ts) | [`agent`](../packages/core/agent) (`events.dispatch`) | [`action-cards`](../packages/experimental/action-cards), [`agent-loop`](../packages/core/agent-loop), `claude-code-mods`, [`creation-recommendations`](../packages/experimental/creation-recommendations), [`file-reference-local`](../packages/context/file-reference-local), [`goal-round-driver`](../packages/goal/goal-round-driver), `server`, `session-controller`, [`subagent`](../packages/subagent/subagent), [`tool-subagent-control`](../packages/subagent/tool-subagent-control) |
| `agent/error` | `emit` | [`packages/core/agent/src/runtime-types.ts:429`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`deepseek-account`](../packages/credentials/deepseek-account), [`goal-round-driver`](../packages/goal/goal-round-driver), [`headless`](../packages/bundle/headless), `server`, `session-controller`, [`session-telemetry`](../packages/session/session-telemetry), [`subagent`](../packages/subagent/subagent) |
| `agent/inbox/claimed` | `emit` | [`packages/core/agent/src/runtime-types.ts:328`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`acp`](../packages/acp/acp), [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`tool-jobs`](../packages/jobs/tool-jobs), [`user-questions`](../packages/interaction/user-questions) |
| `agent/inbox/discarded` | `emit` | [`packages/core/agent/src/runtime-types.ts:336`](../packages/core/agent/src/runtime-types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`goal-round-driver`](../packages/goal/goal-round-driver), [`subagent`](../packages/subagent/subagent), [`user-questions`](../packages/interaction/user-questions) |
+22 -13
View File
@@ -160,6 +160,7 @@ flowchart TD
pkg_client_shortcuts["client-shortcuts"]
pkg_client_store["client-store"]
pkg_client_ui_agent_preset["client-ui-agent-preset"]
pkg_client_ui_agent_team["client-ui-agent-team"]
pkg_client_ui_approval["client-ui-approval"]
pkg_client_ui_attachment["client-ui-attachment"]
pkg_client_ui_brand_official["client-ui-brand-official"]
@@ -262,8 +263,6 @@ flowchart TD
pkg_creation_recommendations["creation-recommendations"]
pkg_cua["cua"]
pkg_cua_bundle["cua-bundle"]
pkg_experimental_agent_team["experimental-agent-team"]
pkg_experimental_agent_team_profile["experimental-agent-team-profile"]
pkg_experimental_api_speech_to_text["experimental-api-speech-to-text"]
pkg_experimental_auto_review["experimental-auto-review"]
pkg_experimental_badge_skill_bundle["experimental-badge-skill-bundle"]
@@ -272,7 +271,6 @@ flowchart TD
pkg_experimental_browser_use_runtime["experimental-browser-use-runtime"]
pkg_experimental_browser_use_stagehand_native["experimental-browser-use-stagehand-native"]
pkg_experimental_claude_code_mods["experimental-claude-code-mods"]
pkg_experimental_client_ui_agent_team["experimental-client-ui-agent-team"]
pkg_experimental_client_ui_claude_code_mods["experimental-client-ui-claude-code-mods"]
pkg_experimental_client_ui_cot_translation["experimental-client-ui-cot-translation"]
pkg_experimental_client_ui_forge["experimental-client-ui-forge"]
@@ -300,7 +298,6 @@ flowchart TD
pkg_experimental_speech_to_text_sensevoice["experimental-speech-to-text-sensevoice"]
pkg_experimental_subagent_oar["experimental-subagent-oar"]
pkg_experimental_terminal_bundle["experimental-terminal-bundle"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_tool_subagent_oar["experimental-tool-subagent-oar"]
pkg_experimental_tool_worktree["experimental-tool-worktree"]
pkg_experimental_translator["experimental-translator"]
@@ -451,6 +448,10 @@ flowchart TD
pkg_subprocess_local["subprocess-local"]
pkg_win32_process["win32-process"]
end
subgraph group_team["packages/team"]
pkg_agent_team["agent-team"]
pkg_tool_agent_team["tool-agent-team"]
end
subgraph group_telemetry["packages/telemetry"]
pkg_otel["otel"]
end
@@ -1395,12 +1396,6 @@ flowchart TD
pkg_session_reference --> pkg_subagent
pkg_session_reference --> pkg_system_prompt
pkg_session_reference --> pkg_typert_protocol
pkg_experimental_agent_team --> pkg_agent
pkg_experimental_agent_team --> pkg_llm
pkg_experimental_agent_team --> pkg_session
pkg_experimental_agent_team --> pkg_session_persistence
pkg_experimental_agent_team --> pkg_session_projection
pkg_experimental_agent_team --> pkg_subagent
pkg_experimental_subagent_oar --> pkg_llm
pkg_experimental_subagent_oar --> pkg_session
pkg_experimental_subagent_oar --> pkg_subagent
@@ -1425,6 +1420,13 @@ flowchart TD
pkg_sdk_protocol --> pkg_session
pkg_sdk_protocol --> pkg_subagent
pkg_sdk_protocol --> pkg_user_questions
pkg_agent_team --> pkg_agent
pkg_agent_team --> pkg_llm
pkg_agent_team --> pkg_session
pkg_agent_team --> pkg_session_persistence
pkg_agent_team --> pkg_session_projection
pkg_agent_team --> pkg_subagent
pkg_agent_team --> pkg_typert_protocol
pkg_workflow_ptc --> pkg_agent
pkg_workflow_ptc --> pkg_llm
pkg_workflow_ptc --> pkg_ptc_runtime
@@ -1457,6 +1459,13 @@ flowchart TD
pkg_sdk_client --> pkg_llm
pkg_sdk_client --> pkg_sdk_protocol
pkg_sdk_client --> pkg_session
pkg_tool_agent_team --> pkg_agent
pkg_tool_agent_team --> pkg_agent_team
pkg_tool_agent_team --> pkg_session
pkg_tool_agent_team --> pkg_subagent
pkg_tool_agent_team --> pkg_subagent_names
pkg_tool_agent_team --> pkg_system_prompt
pkg_tool_agent_team --> pkg_tools
pkg_client_test_runtime --> pkg_api_gateway
pkg_client_test_runtime --> pkg_api_session_controller
pkg_client_test_runtime --> pkg_api_workspace_controller
@@ -1549,6 +1558,7 @@ flowchart TD
| [`client-shortcuts`](../packages/client/shortcuts) | `client` | — |
| [`client-store`](../packages/client/store) | `client` | — |
| [`client-ui-agent-preset`](../packages/client/ui-agent-preset) | `client` | — |
| [`client-ui-agent-team`](../packages/client/ui-agent-team) | `client` | — |
| [`client-ui-approval`](../packages/client/ui-approval) | `client` | — |
| [`client-ui-attachment`](../packages/client/ui-attachment) | `client` | — |
| [`client-ui-brand-official`](../packages/client/ui-brand-official) | `client` | — |
@@ -1614,9 +1624,7 @@ flowchart TD
| [`client-ui-creation-recommendations`](../packages/experimental/client-ui-creation-recommendations) | `experimental` | — |
| [`client-ui-plugin-recommendations`](../packages/experimental/client-ui-plugin-recommendations) | `experimental` | — |
| [`cua-bundle`](../packages/experimental/cua-bundle) | `experimental` | — |
| [`experimental-agent-team-profile`](../packages/experimental/agent-team-profile) | `experimental` | — |
| [`experimental-badge-skill-bundle`](../packages/experimental/badge-skill-bundle) | `experimental` | — |
| [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | `experimental` | — |
| [`experimental-client-ui-claude-code-mods`](../packages/experimental/client-ui-claude-code-mods) | `experimental` | — |
| [`experimental-client-ui-stats`](../packages/experimental/client-ui-stats) | `experimental` | — |
| [`experimental-client-ui-voice-input`](../packages/experimental/client-ui-voice-input) | `experimental` | — |
@@ -1864,16 +1872,17 @@ flowchart TD
| [`headless`](../packages/bundle/headless) | `bundle` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session`](../packages/core/session), [`session-query`](../packages/session-query/session-query), [`subagent`](../packages/subagent/subagent), [`user-approval`](../packages/interaction/user-approval) |
| [`compaction-basic`](../packages/compaction/compaction-basic) | `compaction` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction), [`compaction-tool-result-pruner`](../packages/compaction/compaction-tool-result-pruner), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`token-meter`](../packages/llm/token-meter) |
| [`session-reference`](../packages/context/session-reference) | `context` | [`agent`](../packages/core/agent), [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-query`](../packages/session-query/session-query), [`session-title`](../packages/session/session-title), [`spill`](../packages/spill/spill), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`typert-protocol`](../packages/typert/protocol) |
| [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent) |
| [`experimental-subagent-oar`](../packages/experimental/subagent-oar) | `experimental` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess) |
| [`experimental-tool-subagent-oar`](../packages/experimental/tool-subagent-oar) | `experimental` | [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools) |
| [`hooks-claude-code`](../packages/experimental/hooks-claude-code) | `experimental` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/experimental/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) |
| [`tool-ralph`](../packages/experimental/tool-ralph) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) |
| [`sdk-protocol`](../packages/sdk/protocol) | `sdk` | [`commands`](../packages/interaction/commands), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`user-questions`](../packages/interaction/user-questions) |
| [`agent-team`](../packages/team/agent-team) | `team` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol) |
| [`workflow-ptc`](../packages/workflow/workflow-ptc) | `workflow` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`ptc-runtime`](../packages/ptc-runtime/ptc-runtime), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow), [`working-directory`](../packages/session/working-directory) |
| [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | `experimental` | [`agent`](../packages/core/agent), [`experimental-agent-team`](../packages/experimental/agent-team), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
| [`schedule`](../packages/schedule/schedule) | `schedule` | [`agent`](../packages/core/agent), [`api-session-controller`](../packages/api/session-controller), [`brand`](../packages/util/brand), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`storage-domain`](../packages/storage/storage-domain), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol), [`util-time`](../packages/util/time), [`workspace`](../packages/workspace/workspace) |
| [`sdk-client`](../packages/sdk/client) | `sdk` | [`llm`](../packages/llm/llm), [`sdk-protocol`](../packages/sdk/protocol), [`session`](../packages/core/session) |
| [`tool-agent-team`](../packages/team/tool-agent-team) | `team` | [`agent`](../packages/core/agent), [`agent-team`](../packages/team/agent-team), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subagent-names`](../packages/subagent/subagent-names), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
| [`client-test-runtime`](../packages/test-support/client-runtime) | `test-support` | [`api-gateway`](../packages/api/gateway), [`api-session-controller`](../packages/api/session-controller), [`api-workspace-controller`](../packages/api/workspace-controller), [`attachment`](../packages/attachment/attachment), [`client-connection`](../packages/client/connection), [`client-hmr`](../packages/client/hmr), [`client-modules`](../packages/client/modules), [`client-store`](../packages/client/store), [`client-ui-chat`](../packages/client/ui-chat), [`client-ui-context-menu`](../packages/client/ui-context-menu), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-settings`](../packages/client/ui-settings), [`client-ui-slots`](../packages/client/ui-slots), [`client-web`](../packages/client/web), [`remote-mock`](../packages/test-support/remote-mock), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol) |
| [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | `subagent` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`sdk-client`](../packages/sdk/client), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess) |
| [`tool-schedule`](../packages/schedule/tool-schedule) | `schedule` | [`llm`](../packages/llm/llm), [`schedule`](../packages/schedule/schedule), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
+22 -13
View File
@@ -162,6 +162,7 @@ flowchart TD
pkg_client_shortcuts["client-shortcuts"]
pkg_client_store["client-store"]
pkg_client_ui_agent_preset["client-ui-agent-preset"]
pkg_client_ui_agent_team["client-ui-agent-team"]
pkg_client_ui_approval["client-ui-approval"]
pkg_client_ui_attachment["client-ui-attachment"]
pkg_client_ui_brand_official["client-ui-brand-official"]
@@ -264,8 +265,6 @@ flowchart TD
pkg_creation_recommendations["creation-recommendations"]
pkg_cua["cua"]
pkg_cua_bundle["cua-bundle"]
pkg_experimental_agent_team["experimental-agent-team"]
pkg_experimental_agent_team_profile["experimental-agent-team-profile"]
pkg_experimental_api_speech_to_text["experimental-api-speech-to-text"]
pkg_experimental_auto_review["experimental-auto-review"]
pkg_experimental_badge_skill_bundle["experimental-badge-skill-bundle"]
@@ -274,7 +273,6 @@ flowchart TD
pkg_experimental_browser_use_runtime["experimental-browser-use-runtime"]
pkg_experimental_browser_use_stagehand_native["experimental-browser-use-stagehand-native"]
pkg_experimental_claude_code_mods["experimental-claude-code-mods"]
pkg_experimental_client_ui_agent_team["experimental-client-ui-agent-team"]
pkg_experimental_client_ui_claude_code_mods["experimental-client-ui-claude-code-mods"]
pkg_experimental_client_ui_cot_translation["experimental-client-ui-cot-translation"]
pkg_experimental_client_ui_forge["experimental-client-ui-forge"]
@@ -302,7 +300,6 @@ flowchart TD
pkg_experimental_speech_to_text_sensevoice["experimental-speech-to-text-sensevoice"]
pkg_experimental_subagent_oar["experimental-subagent-oar"]
pkg_experimental_terminal_bundle["experimental-terminal-bundle"]
pkg_experimental_tool_agent_team["experimental-tool-agent-team"]
pkg_experimental_tool_subagent_oar["experimental-tool-subagent-oar"]
pkg_experimental_tool_worktree["experimental-tool-worktree"]
pkg_experimental_translator["experimental-translator"]
@@ -453,6 +450,10 @@ flowchart TD
pkg_subprocess_local["subprocess-local"]
pkg_win32_process["win32-process"]
end
subgraph group_team["packages/team"]
pkg_agent_team["agent-team"]
pkg_tool_agent_team["tool-agent-team"]
end
subgraph group_telemetry["packages/telemetry"]
pkg_otel["otel"]
end
@@ -1397,12 +1398,6 @@ flowchart TD
pkg_session_reference --> pkg_subagent
pkg_session_reference --> pkg_system_prompt
pkg_session_reference --> pkg_typert_protocol
pkg_experimental_agent_team --> pkg_agent
pkg_experimental_agent_team --> pkg_llm
pkg_experimental_agent_team --> pkg_session
pkg_experimental_agent_team --> pkg_session_persistence
pkg_experimental_agent_team --> pkg_session_projection
pkg_experimental_agent_team --> pkg_subagent
pkg_experimental_subagent_oar --> pkg_llm
pkg_experimental_subagent_oar --> pkg_session
pkg_experimental_subagent_oar --> pkg_subagent
@@ -1427,6 +1422,13 @@ flowchart TD
pkg_sdk_protocol --> pkg_session
pkg_sdk_protocol --> pkg_subagent
pkg_sdk_protocol --> pkg_user_questions
pkg_agent_team --> pkg_agent
pkg_agent_team --> pkg_llm
pkg_agent_team --> pkg_session
pkg_agent_team --> pkg_session_persistence
pkg_agent_team --> pkg_session_projection
pkg_agent_team --> pkg_subagent
pkg_agent_team --> pkg_typert_protocol
pkg_workflow_ptc --> pkg_agent
pkg_workflow_ptc --> pkg_llm
pkg_workflow_ptc --> pkg_ptc_runtime
@@ -1459,6 +1461,13 @@ flowchart TD
pkg_sdk_client --> pkg_llm
pkg_sdk_client --> pkg_sdk_protocol
pkg_sdk_client --> pkg_session
pkg_tool_agent_team --> pkg_agent
pkg_tool_agent_team --> pkg_agent_team
pkg_tool_agent_team --> pkg_session
pkg_tool_agent_team --> pkg_subagent
pkg_tool_agent_team --> pkg_subagent_names
pkg_tool_agent_team --> pkg_system_prompt
pkg_tool_agent_team --> pkg_tools
pkg_client_test_runtime --> pkg_api_gateway
pkg_client_test_runtime --> pkg_api_session_controller
pkg_client_test_runtime --> pkg_api_workspace_controller
@@ -1551,6 +1560,7 @@ flowchart TD
| [`client-shortcuts`](../packages/client/shortcuts) | `client` | — |
| [`client-store`](../packages/client/store) | `client` | — |
| [`client-ui-agent-preset`](../packages/client/ui-agent-preset) | `client` | — |
| [`client-ui-agent-team`](../packages/client/ui-agent-team) | `client` | — |
| [`client-ui-approval`](../packages/client/ui-approval) | `client` | — |
| [`client-ui-attachment`](../packages/client/ui-attachment) | `client` | — |
| [`client-ui-brand-official`](../packages/client/ui-brand-official) | `client` | — |
@@ -1616,9 +1626,7 @@ flowchart TD
| [`client-ui-creation-recommendations`](../packages/experimental/client-ui-creation-recommendations) | `experimental` | — |
| [`client-ui-plugin-recommendations`](../packages/experimental/client-ui-plugin-recommendations) | `experimental` | — |
| [`cua-bundle`](../packages/experimental/cua-bundle) | `experimental` | — |
| [`experimental-agent-team-profile`](../packages/experimental/agent-team-profile) | `experimental` | — |
| [`experimental-badge-skill-bundle`](../packages/experimental/badge-skill-bundle) | `experimental` | — |
| [`experimental-client-ui-agent-team`](../packages/experimental/client-ui-agent-team) | `experimental` | — |
| [`experimental-client-ui-claude-code-mods`](../packages/experimental/client-ui-claude-code-mods) | `experimental` | — |
| [`experimental-client-ui-stats`](../packages/experimental/client-ui-stats) | `experimental` | — |
| [`experimental-client-ui-voice-input`](../packages/experimental/client-ui-voice-input) | `experimental` | — |
@@ -1866,16 +1874,17 @@ flowchart TD
| [`headless`](../packages/bundle/headless) | `bundle` | [`agent`](../packages/core/agent), [`agent-default-model`](../packages/core/agent-default-model), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`permission-presets`](../packages/interaction/permission-presets), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session`](../packages/core/session), [`session-query`](../packages/session-query/session-query), [`subagent`](../packages/subagent/subagent), [`user-approval`](../packages/interaction/user-approval) |
| [`compaction-basic`](../packages/compaction/compaction-basic) | `compaction` | [`agent`](../packages/core/agent), [`commands`](../packages/interaction/commands), [`compaction`](../packages/compaction/compaction), [`compaction-tool-result-pruner`](../packages/compaction/compaction-tool-result-pruner), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`token-meter`](../packages/llm/token-meter) |
| [`session-reference`](../packages/context/session-reference) | `context` | [`agent`](../packages/core/agent), [`compaction`](../packages/compaction/compaction), [`llm`](../packages/llm/llm), [`output-retention`](../packages/util/output-retention), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-query`](../packages/session-query/session-query), [`session-title`](../packages/session/session-title), [`spill`](../packages/spill/spill), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`typert-protocol`](../packages/typert/protocol) |
| [`experimental-agent-team`](../packages/experimental/agent-team) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent) |
| [`experimental-subagent-oar`](../packages/experimental/subagent-oar) | `experimental` | [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess) |
| [`experimental-tool-subagent-oar`](../packages/experimental/tool-subagent-oar) | `experimental` | [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools) |
| [`hooks-claude-code`](../packages/experimental/hooks-claude-code) | `experimental` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/experimental/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`working-directory`](../packages/session/working-directory) |
| [`tool-ralph`](../packages/experimental/tool-ralph) | `experimental` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) |
| [`sdk-protocol`](../packages/sdk/protocol) | `sdk` | [`commands`](../packages/interaction/commands), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`user-questions`](../packages/interaction/user-questions) |
| [`agent-team`](../packages/team/agent-team) | `team` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol) |
| [`workflow-ptc`](../packages/workflow/workflow-ptc) | `workflow` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`ptc-runtime`](../packages/ptc-runtime/ptc-runtime), [`sandbox`](../packages/sandbox/sandbox), [`sandbox-policy`](../packages/sandbox/sandbox-policy), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow), [`working-directory`](../packages/session/working-directory) |
| [`experimental-tool-agent-team`](../packages/experimental/tool-agent-team) | `experimental` | [`agent`](../packages/core/agent), [`experimental-agent-team`](../packages/experimental/agent-team), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
| [`schedule`](../packages/schedule/schedule) | `schedule` | [`agent`](../packages/core/agent), [`api-session-controller`](../packages/api/session-controller), [`brand`](../packages/util/brand), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence`](../packages/session/session-persistence), [`session-projection`](../packages/session/session-projection), [`storage-domain`](../packages/storage/storage-domain), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`typert-protocol`](../packages/typert/protocol), [`util-time`](../packages/util/time), [`workspace`](../packages/workspace/workspace) |
| [`sdk-client`](../packages/sdk/client) | `sdk` | [`llm`](../packages/llm/llm), [`sdk-protocol`](../packages/sdk/protocol), [`session`](../packages/core/session) |
| [`tool-agent-team`](../packages/team/tool-agent-team) | `team` | [`agent`](../packages/core/agent), [`agent-team`](../packages/team/agent-team), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subagent-names`](../packages/subagent/subagent-names), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
| [`client-test-runtime`](../packages/test-support/client-runtime) | `test-support` | [`api-gateway`](../packages/api/gateway), [`api-session-controller`](../packages/api/session-controller), [`api-workspace-controller`](../packages/api/workspace-controller), [`attachment`](../packages/attachment/attachment), [`client-connection`](../packages/client/connection), [`client-hmr`](../packages/client/hmr), [`client-modules`](../packages/client/modules), [`client-store`](../packages/client/store), [`client-ui-chat`](../packages/client/ui-chat), [`client-ui-context-menu`](../packages/client/ui-context-menu), [`client-ui-conversation`](../packages/client/ui-conversation), [`client-ui-renderer`](../packages/client/ui-renderer), [`client-ui-session`](../packages/client/ui-session), [`client-ui-settings`](../packages/client/ui-settings), [`client-ui-slots`](../packages/client/ui-slots), [`client-web`](../packages/client/web), [`remote-mock`](../packages/test-support/remote-mock), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`typert-protocol`](../packages/typert/protocol) |
| [`subagent-dsh-sdk`](../packages/subagent/subagent-dsh-sdk) | `subagent` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`sdk-client`](../packages/sdk/client), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subprocess`](../packages/subprocess/subprocess) |
| [`tool-schedule`](../packages/schedule/tool-schedule) | `schedule` | [`llm`](../packages/llm/llm), [`schedule`](../packages/schedule/schedule), [`subagent`](../packages/subagent/subagent), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools) |
+54 -42
View File
@@ -9,8 +9,8 @@
en: 1387c4505dde2faf
zh: 48570fa1c13d6910
/session-persistence-event-catalog/persistence-type-fingerprints:
en: 31c6dab0878b05a8
zh: 176d0f7cbdc3fce3
en: 66330e1827762689
zh: c6585351a958ddac
/session-persistence-event-catalog/event-envelope:
en: 56414ffd00cdc32a
zh: 6dc11eb013e95e41
@@ -225,17 +225,20 @@
en: a640800a38b3c874
zh: a640800a38b3c874
/session-persistence-event-catalog/events/team/team-member-log-only:
en: 8710c60e94d6115c
zh: ca1c923e2c43ea3c
en: de16dcf2046b402c
zh: b6c73eb866413523
/session-persistence-event-catalog/events/team/team-message-delivered-log-only:
en: 79ecdb0f03a0f310
zh: d0db8dc2b0414fa1
en: 9c9d9238de0eeb89
zh: 1f52e5da217dae3d
/session-persistence-event-catalog/events/team/team-message-queued-log-only:
en: 29baf1c57a73e0e6
zh: 0275630a61028e59
en: 184b700f0a0363ae
zh: 74b7939bf1bface1
/session-persistence-event-catalog/events/team/team-mode-log-only:
en: 9481b9f0697707e4
zh: 83aa2d33782a7b00
/session-persistence-event-catalog/events/team/team-task-log-only:
en: 2c0bab8d5420ed5e
zh: 79b203f7a341a43f
en: 16a961e45e7ff021
zh: c61e51809823dc17
/session-persistence-event-catalog/events/todo:
en: 308d4bb4b6b96e35
zh: 308d4bb4b6b96e35
@@ -816,8 +819,11 @@
en: 6795a23aa9bc8d2e
zh: 6795a23aa9bc8d2e
/session-persistence-event-catalog/resolved-persistence-types/team-message-queued:
en: d683235390472024
zh: d683235390472024
en: efe4678972a1a64e
zh: efe4678972a1a64e
/session-persistence-event-catalog/resolved-persistence-types/team-mode:
en: 91a387e367e07f73
zh: 91a387e367e07f73
/session-persistence-event-catalog/resolved-persistence-types/team-task:
en: 7aa9286372341561
zh: 7aa9286372341561
@@ -1248,26 +1254,26 @@
en: 94876079d6696df9
zh: d25c7ad9f5054eb7
/session-persistence-event-catalog/resolved-persistence-types/systempromptmessagesource:
en: a3eabd0e9fc565dd
zh: fa763aefdbc1bdb8
en: 967c82dcda03d0d4
zh: ad590611be701d97
/session-persistence-event-catalog/resolved-persistence-types/teammemberphase:
en: 562d6349db44cc77
zh: 5a6839b217a3fa34
en: bf78ae1a14d64469
zh: 0d5c34aff23a133c
/session-persistence-event-catalog/resolved-persistence-types/teammembersnapshot:
en: fa7208409888557c
zh: 01f948c369fd2973
en: 1815ad87650025e6
zh: d2a0dceabcc2090e
/session-persistence-event-catalog/resolved-persistence-types/teammessagesnapshot:
en: 216b8c901ee69d3f
zh: b80bb7aa936a1b69
en: d7ba2fe5b24c90cb
zh: b26f7e1ef0eccce0
/session-persistence-event-catalog/resolved-persistence-types/teammessagesource:
en: e0025c306befe6d3
zh: 59bc543e134f0dbf
en: 2ca6c43fc056fd37
zh: 3d5b5f2917f326fc
/session-persistence-event-catalog/resolved-persistence-types/teamtasksnapshot:
en: fba012d93cb1a16a
zh: e3b0461d6e251a59
en: 0c6aac89e3dcb25c
zh: d772017667ffc2a1
/session-persistence-event-catalog/resolved-persistence-types/teamtaskstatus:
en: a5fefaa709230c60
zh: e08a6d4ef753aa1b
en: b6bd8e9986773217
zh: ed177c2f090964af
/session-persistence-event-catalog/resolved-persistence-types/textblock:
en: 7ad0f4915397b511
zh: bcaa8bd449927989
@@ -1350,11 +1356,11 @@
en: 0223d7ffb67ac272
zh: c2a8221caab6d350
/session-persistence-event-catalog/resolved-persistence-types/number~2:
en: 2786fef560851bb4
zh: 5d787475356b2606
en: 4147b170f52814af
zh: e78991ac1c41ebec
/session-persistence-event-catalog/resolved-persistence-types/string:
en: e5a7ee4569d7d428
zh: 9c7b9d92151feb2f
en: c178efefdf01cade
zh: 200b1ab00ed8bfd3
/session-persistence-event-catalog/resolved-persistence-types/string~2:
en: 0089620bf4638263
zh: 1922bef1713094bb
@@ -1491,8 +1497,11 @@
en: 9748b4f0facfe9f8
zh: 83ae2cd2cd02b804
/session-persistence-event-catalog/resolved-persistence-types/displayname-providerid-subjectid-tenantid:
en: d2c98ed9b98325ae
zh: bf8c2f7967cf9cc8
en: c6fbe4268a4430db
zh: 8fec9d6def3c775c
/session-persistence-event-catalog/resolved-persistence-types/enabled:
en: b8b8f28b5bfcd153
zh: 602d970c3c090522
/session-persistence-event-catalog/resolved-persistence-types/end-start:
en: 4b7a8793663d3fef
zh: 249459c825d330c3
@@ -1905,17 +1914,17 @@
en: 3216b23c131d0070
zh: 73ca171c6014f16e
/session-persistence-event-catalog/resolved-persistence-types/member-teamid-version:
en: fa8d55aef7cbc4ee
zh: aff1a32316984f09
en: 815fc4d70ba0375b
zh: ae9f6d2a163ff62b
/session-persistence-event-catalog/resolved-persistence-types/message-step-turn:
en: 86fe91fe83eeb08a
zh: 2ebf2f1904829753
/session-persistence-event-catalog/resolved-persistence-types/message-teamid-version:
en: a563c1f1cd1a5091
zh: f1dc81b4b46fe088
en: edb364403e9e9f84
zh: d1298ec2e67a0eeb
/session-persistence-event-catalog/resolved-persistence-types/messageid-targetid-teamid-version:
en: e3de1d2c12631337
zh: 50f98d422c7f9de0
en: 42a1e343b5e87854
zh: ae777d3cd40835a6
/session-persistence-event-catalog/resolved-persistence-types/mode-source:
en: 3028b222670ce5ad
zh: cae4c9437e560d61
@@ -1947,8 +1956,8 @@
en: 5360af614fe753e3
zh: 96427c489cc71de6
/session-persistence-event-catalog/resolved-persistence-types/task-teamid-version:
en: 03858dd78e884161
zh: 73e7da84b85be71c
en: 4952b12d354b8aaf
zh: b8c2ef51b7ab082e
/session-persistence-event-catalog/resolved-persistence-types/todos:
en: 8ab873d30e062fd5
zh: a138832c6e299ebb
@@ -2112,8 +2121,11 @@
en: 2a00c9dbe70dcd8e
zh: 96573157cd613c91
/session-persistence-event-catalog/resolved-persistence-types/type-team-message-queued:
en: 3baf69fe52f2d751
zh: 185be1b973fac77e
en: 735e6acfb6180948
zh: de7626c523ae57a2
/session-persistence-event-catalog/resolved-persistence-types/type-team-mode:
en: 0b50dd6b99450d8e
zh: a9f8d2b85e2092af
/session-persistence-event-catalog/resolved-persistence-types/type-team-task:
en: 872aad5b748d70d5
zh: 396f986a703b76fd
+75 -27
View File
@@ -68,6 +68,7 @@ The [format references](persistence-changes/historical-formats/README.md) cover
| `event:team/member` | event | `4fb59762612c3e3ac3a3bd4f84c9c148d3c3893bd422ba2b201cc039fabd49bc` | [`{ type: "team/member" }`](#persistence-type-sha256-4fb59762612c3e3ac3a3bd4f84c9c148d3c3893bd422ba2b201cc039fabd49bc) |
| `event:team/message/delivered` | event | `48f9c19417a1abbedfa59f4667bba36b93ac2db407adf5e84cb3ba0de30942cb` | [`{ type: "team/message/delivered" }`](#persistence-type-sha256-48f9c19417a1abbedfa59f4667bba36b93ac2db407adf5e84cb3ba0de30942cb) |
| `event:team/message/queued` | event | `21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d` | [`{ type: "team/message/queued" }`](#persistence-type-sha256-21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d) |
| `event:team/mode` | event | `920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75` | [`{ type: "team/mode" }`](#persistence-type-sha256-920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75) |
| `event:team/task` | event | `d595ec73b32b016a6055333c67a5d646032b22e672da1d4a09c5b1ae398a093a` | [`{ type: "team/task" }`](#persistence-type-sha256-d595ec73b32b016a6055333c67a5d646032b22e672da1d4a09c5b1ae398a093a) |
| `event:todo/write` | event | `b978cff734e62143eb56c9125423ec275405eda969802d42aaf73ecb987d3b26` | [`{ type: "todo/write" }`](#persistence-type-sha256-b978cff734e62143eb56c9125423ec275405eda969802d42aaf73ecb987d3b26) |
| `event:tool-workflow/agent-end` | event | `babf9ee4d1af62bf6c3a8103737f7a5e4e78ce179be835ce05a38803e15884b7` | [`{ type: "tool-workflow/agent-end" }`](#persistence-type-sha256-babf9ee4d1af62bf6c3a8103737f7a5e4e78ce179be835ce05a38803e15884b7) |
@@ -1014,7 +1015,7 @@ Source: [`packages/core/session/src/types.ts:338`](../packages/core/session/src/
Types: [TeamId](subsystems/agent-team.md) · [TeamMemberSnapshot](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:170`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/team/agent-team/src/types.ts:173`](../packages/team/agent-team/src/types.ts)
<a id="teammessagedelivered--log-only"></a>
@@ -1032,7 +1033,7 @@ Source: [`packages/experimental/agent-team/src/types.ts:170`](../packages/experi
Types: [TeamId](subsystems/agent-team.md) · [TeamMessageId](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:176`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/team/agent-team/src/types.ts:179`](../packages/team/agent-team/src/types.ts)
<a id="teammessagequeued--log-only"></a>
@@ -1045,7 +1046,18 @@ Source: [`packages/experimental/agent-team/src/types.ts:176`](../packages/experi
Types: [TeamId](subsystems/agent-team.md) · [TeamMessageSnapshot](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:174`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/team/agent-team/src/types.ts:177`](../packages/team/agent-team/src/types.ts)
<a id="teammode--log-only"></a>
#### `team/mode` — log-only
```ts persistence-catalog
/** User-selected Team mode; child Agents use the selection of their runtime root. */
'team/mode': { enabled: boolean }
```
Source: [`packages/team/agent-team/src/types.ts:171`](../packages/team/agent-team/src/types.ts)
<a id="teamtask--log-only"></a>
@@ -1058,7 +1070,7 @@ Source: [`packages/experimental/agent-team/src/types.ts:174`](../packages/experi
Types: [TeamId](subsystems/agent-team.md) · [TeamTaskSnapshot](subsystems/agent-team.md)
Source: [`packages/experimental/agent-team/src/types.ts:172`](../packages/experimental/agent-team/src/types.ts)
Source: [`packages/team/agent-team/src/types.ts:175`](../packages/team/agent-team/src/types.ts)
### `todo/*`
@@ -2706,6 +2718,14 @@ SHA-256: `4e011753f8263f436efaabfbb3b4db53a98fc55342c5ded2daf7208b217be159`
`"team/message/queued"`
<a id="persistence-type-sha256-d8a476d2c6fd30df6ec0e799f91716d1518c780d23b4121dce545abfcfb7c5a5"></a>
### `"team/mode"`
SHA-256: `d8a476d2c6fd30df6ec0e799f91716d1518c780d23b4121dce545abfcfb7c5a5`
`"team/mode"`
<a id="persistence-type-sha256-b57ae1b37e52bee0a21cbdace168dc6a15582bcda8c306dad962c5dcc8a8e28b"></a>
### `"team/task"`
@@ -4956,7 +4976,7 @@ Sources: [`packages/llm/llm/src/message.ts:35`](../packages/llm/llm/src/message.
<a id="persistence-type-sha256-dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammemberphase"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammemberphase"></a>
<a id="persistence-type-teammemberphase"></a>
@@ -4964,7 +4984,7 @@ Sources: [`packages/llm/llm/src/message.ts:35`](../packages/llm/llm/src/message.
SHA-256: `dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd`
Sources: [`packages/experimental/agent-team/src/types.ts:47`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:47`](../packages/team/agent-team/src/types.ts)
One of:
@@ -4974,7 +4994,7 @@ One of:
<a id="persistence-type-sha256-6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammembersnapshot"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammembersnapshot"></a>
<a id="persistence-type-teammembersnapshot"></a>
@@ -4982,7 +5002,7 @@ One of:
SHA-256: `6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25`
Sources: [`packages/experimental/agent-team/src/types.ts:50`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:50`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -4996,7 +5016,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:50`](../packages/experi
<a id="persistence-type-sha256-2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammessagesnapshot"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammessagesnapshot"></a>
<a id="persistence-type-teammessagesnapshot"></a>
@@ -5004,7 +5024,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:50`](../packages/experi
SHA-256: `2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e`
Sources: [`packages/experimental/agent-team/src/types.ts:107`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:108`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -5016,7 +5036,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:107`](../packages/exper
<a id="persistence-type-sha256-2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammessagesource"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammessagesource"></a>
<a id="persistence-type-teammessagesource"></a>
@@ -5024,7 +5044,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:107`](../packages/exper
SHA-256: `2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0`
Sources: [`packages/experimental/agent-team/src/types.ts:116`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:117`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -5036,7 +5056,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:116`](../packages/exper
<a id="persistence-type-sha256-51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamtasksnapshot"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamtasksnapshot"></a>
<a id="persistence-type-teamtasksnapshot"></a>
@@ -5044,7 +5064,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:116`](../packages/exper
SHA-256: `51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357`
Sources: [`packages/experimental/agent-team/src/types.ts:64`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:64`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -5059,7 +5079,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:64`](../packages/experi
<a id="persistence-type-sha256-b2d2a01e51341a3bfec809198952c8c830a7899f4cb6ecd3c1dc0b5d9a2af943"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamtaskstatus"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamtaskstatus"></a>
<a id="persistence-type-teamtaskstatus"></a>
@@ -5067,7 +5087,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:64`](../packages/experi
SHA-256: `b2d2a01e51341a3bfec809198952c8c830a7899f4cb6ecd3c1dc0b5d9a2af943`
Sources: [`packages/experimental/agent-team/src/types.ts:61`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:61`](../packages/team/agent-team/src/types.ts)
One of:
@@ -5536,12 +5556,6 @@ Array of `number`.
<a id="persistence-type-packagescoresessionsrctypestssessionid"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamid"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammessageid"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamtaskid"></a>
<a id="persistence-type-packagesexperimentalwebhooksrcbrandtswebhookdeliveryid"></a>
<a id="persistence-type-packagesexperimentalwebhooksrcbrandtswebhookruleid"></a>
@@ -5574,6 +5588,12 @@ Array of `number`.
<a id="persistence-type-packagessessionsession-titlesrctypestssessiontitleproviderid"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamid"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammessageid"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamtaskid"></a>
<a id="persistence-type-packagesworkflowworkflowsrctypestsworkflowrunid"></a>
<a id="persistence-type-providerrequestid"></a>
@@ -5610,7 +5630,7 @@ Array of `number`.
SHA-256: `4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b`
Sources: [`packages/api/session-controller/src/types.ts:388`](../packages/api/session-controller/src/types.ts) · [`packages/attachment/attachment/src/brand.ts:6`](../packages/attachment/attachment/src/brand.ts) · [`packages/compaction/compaction/src/brand.ts:4`](../packages/compaction/compaction/src/brand.ts) · [`packages/core/session/src/types.ts:21`](../packages/core/session/src/types.ts) · [`packages/experimental/agent-team/src/types.ts:20`](../packages/experimental/agent-team/src/types.ts) · [`packages/experimental/agent-team/src/types.ts:32`](../packages/experimental/agent-team/src/types.ts) · [`packages/experimental/agent-team/src/types.ts:8`](../packages/experimental/agent-team/src/types.ts) · [`packages/experimental/webhook/src/brand.ts:12`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:6`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:9`](../packages/experimental/webhook/src/brand.ts) · [`packages/feedback/message-feedback/src/types.ts:14`](../packages/feedback/message-feedback/src/types.ts) · [`packages/goal/goal/src/types.ts:17`](../packages/goal/goal/src/types.ts) · [`packages/interaction/commands/src/brand.ts:31`](../packages/interaction/commands/src/brand.ts) · [`packages/interaction/user-approval/src/types.ts:17`](../packages/interaction/user-approval/src/types.ts) · [`packages/jobs/jobs/src/brand.ts:19`](../packages/jobs/jobs/src/brand.ts) · [`packages/llm/llm-retry/src/brand.ts:4`](../packages/llm/llm-retry/src/brand.ts) · [`packages/llm/llm/src/brand.ts:16`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:31`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:43`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:67`](../packages/llm/llm/src/brand.ts) · [`packages/schedule/schedule/src/types.ts:14`](../packages/schedule/schedule/src/types.ts) · [`packages/session/session-title/src/index.ts:42`](../packages/session/session-title/src/index.ts) · [`packages/session/session-title/src/types.ts:17`](../packages/session/session-title/src/types.ts) · [`packages/workflow/workflow/src/types.ts:13`](../packages/workflow/workflow/src/types.ts)
Sources: [`packages/api/session-controller/src/types.ts:388`](../packages/api/session-controller/src/types.ts) · [`packages/attachment/attachment/src/brand.ts:6`](../packages/attachment/attachment/src/brand.ts) · [`packages/compaction/compaction/src/brand.ts:4`](../packages/compaction/compaction/src/brand.ts) · [`packages/core/session/src/types.ts:21`](../packages/core/session/src/types.ts) · [`packages/experimental/webhook/src/brand.ts:12`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:6`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:9`](../packages/experimental/webhook/src/brand.ts) · [`packages/feedback/message-feedback/src/types.ts:14`](../packages/feedback/message-feedback/src/types.ts) · [`packages/goal/goal/src/types.ts:17`](../packages/goal/goal/src/types.ts) · [`packages/interaction/commands/src/brand.ts:31`](../packages/interaction/commands/src/brand.ts) · [`packages/interaction/user-approval/src/types.ts:17`](../packages/interaction/user-approval/src/types.ts) · [`packages/jobs/jobs/src/brand.ts:19`](../packages/jobs/jobs/src/brand.ts) · [`packages/llm/llm-retry/src/brand.ts:4`](../packages/llm/llm-retry/src/brand.ts) · [`packages/llm/llm/src/brand.ts:16`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:31`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:43`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:67`](../packages/llm/llm/src/brand.ts) · [`packages/schedule/schedule/src/types.ts:14`](../packages/schedule/schedule/src/types.ts) · [`packages/session/session-title/src/index.ts:42`](../packages/session/session-title/src/index.ts) · [`packages/session/session-title/src/types.ts:17`](../packages/session/session-title/src/types.ts) · [`packages/team/agent-team/src/types.ts:20`](../packages/team/agent-team/src/types.ts) · [`packages/team/agent-team/src/types.ts:32`](../packages/team/agent-team/src/types.ts) · [`packages/team/agent-team/src/types.ts:8`](../packages/team/agent-team/src/types.ts) · [`packages/workflow/workflow/src/types.ts:13`](../packages/workflow/workflow/src/types.ts)
`string`
@@ -6233,6 +6253,18 @@ Sources: [`packages/experimental/liveshare/src/host/viewer-principal.ts:29`](../
| `subjectId` | required | `string` |
| `tenantId` | required | `string` |
<a id="persistence-type-sha256-c2a13242efc3bea4b36a843ddf1524ff4d33c765a71b582fa1fdbfa4fa148434"></a>
### `{ enabled }`
SHA-256: `c2a13242efc3bea4b36a843ddf1524ff4d33c765a71b582fa1fdbfa4fa148434`
Sources: [`packages/team/agent-team/src/types.ts:171`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
| `enabled` | required | `boolean` |
<a id="persistence-type-sha256-9e41386b3a0c9572b0d63078492ebb3997da7d3a830d44e0259418bd02f4bcb2"></a>
### `{ end, start }`
@@ -7857,7 +7889,7 @@ Sources: [`packages/web/web-search-deepseek/src/provider.ts:61`](../packages/web
SHA-256: `b1ebd5cda47d90d980bb05bffc3f970c51537b9aff15b3bc3d639811727741b1`
Sources: [`packages/experimental/agent-team/src/types.ts:170`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:173`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -7885,7 +7917,7 @@ Sources: [`packages/core/session/src/types.ts:338`](../packages/core/session/src
SHA-256: `ea08ec1df0c33108fd03345b9af199cf04dea450aa045d3c683f216311403403`
Sources: [`packages/experimental/agent-team/src/types.ts:174`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:177`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -7899,7 +7931,7 @@ Sources: [`packages/experimental/agent-team/src/types.ts:174`](../packages/exper
SHA-256: `0bcfaf5566d271028429ac7b562cb59053c9d78b8ae14708c35fac835108d1b1`
Sources: [`packages/experimental/agent-team/src/types.ts:176`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:179`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -8045,7 +8077,7 @@ Sources: [`packages/compaction/compaction-image-offload/src/projection.ts:25`](.
SHA-256: `a40d12070f6f4a124f32fb3cc86e7857554702e32f0eda3080a25c4b9ac9b18c`
Sources: [`packages/experimental/agent-team/src/types.ts:172`](../packages/experimental/agent-team/src/types.ts)
Sources: [`packages/team/agent-team/src/types.ts:175`](../packages/team/agent-team/src/types.ts)
| Property | Presence | Type |
|---|---|---|
@@ -8916,6 +8948,22 @@ SHA-256: `21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d`
| `time` | required | `number` |
| `type` | required | `"team/message/queued"` |
<a id="persistence-type-sha256-920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75"></a>
<a id="persistence-type-eventteammode"></a>
### `{ type: "team/mode" }`
SHA-256: `920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75`
| Property | Presence | Type |
|---|---|---|
| `data` | required | [`{ enabled }`](#persistence-type-sha256-c2a13242efc3bea4b36a843ddf1524ff4d33c765a71b582fa1fdbfa4fa148434) |
| `ignorable` | optional | `true` |
| `seq` | required | `number` |
| `time` | required | `number` |
| `type` | required | `"team/mode"` |
<a id="persistence-type-sha256-d595ec73b32b016a6055333c67a5d646032b22e672da1d4a09c5b1ae398a093a"></a>
<a id="persistence-type-eventteamtask"></a>
+75 -27
View File
@@ -70,6 +70,7 @@
| `event:team/member` | event | `4fb59762612c3e3ac3a3bd4f84c9c148d3c3893bd422ba2b201cc039fabd49bc` | [`{ type: "team/member" }`](#persistence-type-sha256-4fb59762612c3e3ac3a3bd4f84c9c148d3c3893bd422ba2b201cc039fabd49bc) |
| `event:team/message/delivered` | event | `48f9c19417a1abbedfa59f4667bba36b93ac2db407adf5e84cb3ba0de30942cb` | [`{ type: "team/message/delivered" }`](#persistence-type-sha256-48f9c19417a1abbedfa59f4667bba36b93ac2db407adf5e84cb3ba0de30942cb) |
| `event:team/message/queued` | event | `21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d` | [`{ type: "team/message/queued" }`](#persistence-type-sha256-21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d) |
| `event:team/mode` | event | `920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75` | [`{ type: "team/mode" }`](#persistence-type-sha256-920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75) |
| `event:team/task` | event | `d595ec73b32b016a6055333c67a5d646032b22e672da1d4a09c5b1ae398a093a` | [`{ type: "team/task" }`](#persistence-type-sha256-d595ec73b32b016a6055333c67a5d646032b22e672da1d4a09c5b1ae398a093a) |
| `event:todo/write` | event | `b978cff734e62143eb56c9125423ec275405eda969802d42aaf73ecb987d3b26` | [`{ type: "todo/write" }`](#persistence-type-sha256-b978cff734e62143eb56c9125423ec275405eda969802d42aaf73ecb987d3b26) |
| `event:tool-workflow/agent-end` | event | `babf9ee4d1af62bf6c3a8103737f7a5e4e78ce179be835ce05a38803e15884b7` | [`{ type: "tool-workflow/agent-end" }`](#persistence-type-sha256-babf9ee4d1af62bf6c3a8103737f7a5e4e78ce179be835ce05a38803e15884b7) |
@@ -1016,7 +1017,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
类型:[TeamId](subsystems/agent-team.zh.md) · [TeamMemberSnapshot](subsystems/agent-team.zh.md)
来源:[`packages/experimental/agent-team/src/types.ts:170`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:173`](../packages/team/agent-team/src/types.ts)
<a id="teammessagedelivered--log-only"></a>
@@ -1034,7 +1035,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
类型:[TeamId](subsystems/agent-team.zh.md) · [TeamMessageId](subsystems/agent-team.zh.md)
来源:[`packages/experimental/agent-team/src/types.ts:176`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:179`](../packages/team/agent-team/src/types.ts)
<a id="teammessagequeued--log-only"></a>
@@ -1047,7 +1048,18 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
类型:[TeamId](subsystems/agent-team.zh.md) · [TeamMessageSnapshot](subsystems/agent-team.zh.md)
来源:[`packages/experimental/agent-team/src/types.ts:174`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:177`](../packages/team/agent-team/src/types.ts)
<a id="teammode--log-only"></a>
#### `team/mode` — log-only
```ts persistence-catalog
/** User-selected Team mode; child Agents use the selection of their runtime root. */
'team/mode': { enabled: boolean }
```
来源:[`packages/team/agent-team/src/types.ts:171`](../packages/team/agent-team/src/types.ts)
<a id="teamtask--log-only"></a>
@@ -1060,7 +1072,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
类型:[TeamId](subsystems/agent-team.zh.md) · [TeamTaskSnapshot](subsystems/agent-team.zh.md)
来源:[`packages/experimental/agent-team/src/types.ts:172`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:175`](../packages/team/agent-team/src/types.ts)
### `todo/*`
@@ -2708,6 +2720,14 @@ SHA-256: `4e011753f8263f436efaabfbb3b4db53a98fc55342c5ded2daf7208b217be159`
`"team/message/queued"`
<a id="persistence-type-sha256-d8a476d2c6fd30df6ec0e799f91716d1518c780d23b4121dce545abfcfb7c5a5"></a>
### `"team/mode"`
SHA-256: `d8a476d2c6fd30df6ec0e799f91716d1518c780d23b4121dce545abfcfb7c5a5`
`"team/mode"`
<a id="persistence-type-sha256-b57ae1b37e52bee0a21cbdace168dc6a15582bcda8c306dad962c5dcc8a8e28b"></a>
### `"team/task"`
@@ -4958,7 +4978,7 @@ SHA-256: `65a8400e451e667e5b6e34df72ceb81fca8c12330330fa72083ad40279b189ad`
<a id="persistence-type-sha256-dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammemberphase"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammemberphase"></a>
<a id="persistence-type-teammemberphase"></a>
@@ -4966,7 +4986,7 @@ SHA-256: `65a8400e451e667e5b6e34df72ceb81fca8c12330330fa72083ad40279b189ad`
SHA-256: `dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd`
来源:[`packages/experimental/agent-team/src/types.ts:47`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:47`](../packages/team/agent-team/src/types.ts)
以下类型之一:
@@ -4976,7 +4996,7 @@ SHA-256: `dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd`
<a id="persistence-type-sha256-6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammembersnapshot"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammembersnapshot"></a>
<a id="persistence-type-teammembersnapshot"></a>
@@ -4984,7 +5004,7 @@ SHA-256: `dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd`
SHA-256: `6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25`
来源:[`packages/experimental/agent-team/src/types.ts:50`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:50`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -4998,7 +5018,7 @@ SHA-256: `6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25`
<a id="persistence-type-sha256-2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammessagesnapshot"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammessagesnapshot"></a>
<a id="persistence-type-teammessagesnapshot"></a>
@@ -5006,7 +5026,7 @@ SHA-256: `6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25`
SHA-256: `2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e`
来源:[`packages/experimental/agent-team/src/types.ts:107`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:108`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -5018,7 +5038,7 @@ SHA-256: `2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e`
<a id="persistence-type-sha256-2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammessagesource"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammessagesource"></a>
<a id="persistence-type-teammessagesource"></a>
@@ -5026,7 +5046,7 @@ SHA-256: `2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e`
SHA-256: `2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0`
来源:[`packages/experimental/agent-team/src/types.ts:116`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:117`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -5038,7 +5058,7 @@ SHA-256: `2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0`
<a id="persistence-type-sha256-51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamtasksnapshot"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamtasksnapshot"></a>
<a id="persistence-type-teamtasksnapshot"></a>
@@ -5046,7 +5066,7 @@ SHA-256: `2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0`
SHA-256: `51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357`
来源:[`packages/experimental/agent-team/src/types.ts:64`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:64`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -5061,7 +5081,7 @@ SHA-256: `51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357`
<a id="persistence-type-sha256-b2d2a01e51341a3bfec809198952c8c830a7899f4cb6ecd3c1dc0b5d9a2af943"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamtaskstatus"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamtaskstatus"></a>
<a id="persistence-type-teamtaskstatus"></a>
@@ -5069,7 +5089,7 @@ SHA-256: `51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357`
SHA-256: `b2d2a01e51341a3bfec809198952c8c830a7899f4cb6ecd3c1dc0b5d9a2af943`
来源:[`packages/experimental/agent-team/src/types.ts:61`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:61`](../packages/team/agent-team/src/types.ts)
以下类型之一:
@@ -5538,12 +5558,6 @@ SHA-256: `5d03ba38734809bcbd2a55221bd938b3b3fc34b49bb686c6113e9e4931e3aa78`
<a id="persistence-type-packagescoresessionsrctypestssessionid"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamid"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeammessageid"></a>
<a id="persistence-type-packagesexperimentalagent-teamsrctypeststeamtaskid"></a>
<a id="persistence-type-packagesexperimentalwebhooksrcbrandtswebhookdeliveryid"></a>
<a id="persistence-type-packagesexperimentalwebhooksrcbrandtswebhookruleid"></a>
@@ -5576,6 +5590,12 @@ SHA-256: `5d03ba38734809bcbd2a55221bd938b3b3fc34b49bb686c6113e9e4931e3aa78`
<a id="persistence-type-packagessessionsession-titlesrctypestssessiontitleproviderid"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamid"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeammessageid"></a>
<a id="persistence-type-packagesteamagent-teamsrctypeststeamtaskid"></a>
<a id="persistence-type-packagesworkflowworkflowsrctypestsworkflowrunid"></a>
<a id="persistence-type-providerrequestid"></a>
@@ -5612,7 +5632,7 @@ SHA-256: `5d03ba38734809bcbd2a55221bd938b3b3fc34b49bb686c6113e9e4931e3aa78`
SHA-256: `4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b`
来源:[`packages/api/session-controller/src/types.ts:388`](../packages/api/session-controller/src/types.ts) · [`packages/attachment/attachment/src/brand.ts:6`](../packages/attachment/attachment/src/brand.ts) · [`packages/compaction/compaction/src/brand.ts:4`](../packages/compaction/compaction/src/brand.ts) · [`packages/core/session/src/types.ts:21`](../packages/core/session/src/types.ts) · [`packages/experimental/agent-team/src/types.ts:20`](../packages/experimental/agent-team/src/types.ts) · [`packages/experimental/agent-team/src/types.ts:32`](../packages/experimental/agent-team/src/types.ts) · [`packages/experimental/agent-team/src/types.ts:8`](../packages/experimental/agent-team/src/types.ts) · [`packages/experimental/webhook/src/brand.ts:12`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:6`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:9`](../packages/experimental/webhook/src/brand.ts) · [`packages/feedback/message-feedback/src/types.ts:14`](../packages/feedback/message-feedback/src/types.ts) · [`packages/goal/goal/src/types.ts:17`](../packages/goal/goal/src/types.ts) · [`packages/interaction/commands/src/brand.ts:31`](../packages/interaction/commands/src/brand.ts) · [`packages/interaction/user-approval/src/types.ts:17`](../packages/interaction/user-approval/src/types.ts) · [`packages/jobs/jobs/src/brand.ts:19`](../packages/jobs/jobs/src/brand.ts) · [`packages/llm/llm-retry/src/brand.ts:4`](../packages/llm/llm-retry/src/brand.ts) · [`packages/llm/llm/src/brand.ts:16`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:31`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:43`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:67`](../packages/llm/llm/src/brand.ts) · [`packages/schedule/schedule/src/types.ts:14`](../packages/schedule/schedule/src/types.ts) · [`packages/session/session-title/src/index.ts:42`](../packages/session/session-title/src/index.ts) · [`packages/session/session-title/src/types.ts:17`](../packages/session/session-title/src/types.ts) · [`packages/workflow/workflow/src/types.ts:13`](../packages/workflow/workflow/src/types.ts)
来源:[`packages/api/session-controller/src/types.ts:388`](../packages/api/session-controller/src/types.ts) · [`packages/attachment/attachment/src/brand.ts:6`](../packages/attachment/attachment/src/brand.ts) · [`packages/compaction/compaction/src/brand.ts:4`](../packages/compaction/compaction/src/brand.ts) · [`packages/core/session/src/types.ts:21`](../packages/core/session/src/types.ts) · [`packages/experimental/webhook/src/brand.ts:12`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:6`](../packages/experimental/webhook/src/brand.ts) · [`packages/experimental/webhook/src/brand.ts:9`](../packages/experimental/webhook/src/brand.ts) · [`packages/feedback/message-feedback/src/types.ts:14`](../packages/feedback/message-feedback/src/types.ts) · [`packages/goal/goal/src/types.ts:17`](../packages/goal/goal/src/types.ts) · [`packages/interaction/commands/src/brand.ts:31`](../packages/interaction/commands/src/brand.ts) · [`packages/interaction/user-approval/src/types.ts:17`](../packages/interaction/user-approval/src/types.ts) · [`packages/jobs/jobs/src/brand.ts:19`](../packages/jobs/jobs/src/brand.ts) · [`packages/llm/llm-retry/src/brand.ts:4`](../packages/llm/llm-retry/src/brand.ts) · [`packages/llm/llm/src/brand.ts:16`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:31`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:43`](../packages/llm/llm/src/brand.ts) · [`packages/llm/llm/src/brand.ts:67`](../packages/llm/llm/src/brand.ts) · [`packages/schedule/schedule/src/types.ts:14`](../packages/schedule/schedule/src/types.ts) · [`packages/session/session-title/src/index.ts:42`](../packages/session/session-title/src/index.ts) · [`packages/session/session-title/src/types.ts:17`](../packages/session/session-title/src/types.ts) · [`packages/team/agent-team/src/types.ts:20`](../packages/team/agent-team/src/types.ts) · [`packages/team/agent-team/src/types.ts:32`](../packages/team/agent-team/src/types.ts) · [`packages/team/agent-team/src/types.ts:8`](../packages/team/agent-team/src/types.ts) · [`packages/workflow/workflow/src/types.ts:13`](../packages/workflow/workflow/src/types.ts)
`string`
@@ -6235,6 +6255,18 @@ SHA-256: `0a92c5bdfa06c2e2615b777728f3aa95f408d43b9012e7b754568311251db623`
| `subjectId` | 必需 | `string` |
| `tenantId` | 必需 | `string` |
<a id="persistence-type-sha256-c2a13242efc3bea4b36a843ddf1524ff4d33c765a71b582fa1fdbfa4fa148434"></a>
### `{ enabled }`
SHA-256: `c2a13242efc3bea4b36a843ddf1524ff4d33c765a71b582fa1fdbfa4fa148434`
来源:[`packages/team/agent-team/src/types.ts:171`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
| `enabled` | 必需 | `boolean` |
<a id="persistence-type-sha256-9e41386b3a0c9572b0d63078492ebb3997da7d3a830d44e0259418bd02f4bcb2"></a>
### `{ end, start }`
@@ -7859,7 +7891,7 @@ SHA-256: `9c001ecb5e1d3c3894410db2a1e383842e5f8454fb52182338686158abc1b3ee`
SHA-256: `b1ebd5cda47d90d980bb05bffc3f970c51537b9aff15b3bc3d639811727741b1`
来源:[`packages/experimental/agent-team/src/types.ts:170`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:173`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -7887,7 +7919,7 @@ SHA-256: `6bc8e51124d0874bc89e1d0ceff381a9c3cd0fc240667d69f841ce4f60f65fe5`
SHA-256: `ea08ec1df0c33108fd03345b9af199cf04dea450aa045d3c683f216311403403`
来源:[`packages/experimental/agent-team/src/types.ts:174`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:177`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -7901,7 +7933,7 @@ SHA-256: `ea08ec1df0c33108fd03345b9af199cf04dea450aa045d3c683f216311403403`
SHA-256: `0bcfaf5566d271028429ac7b562cb59053c9d78b8ae14708c35fac835108d1b1`
来源:[`packages/experimental/agent-team/src/types.ts:176`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:179`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -8047,7 +8079,7 @@ SHA-256: `477614bca595a9e7adb5a1870be446b9a8684f3ba8950259d6289f2d3b74f028`
SHA-256: `a40d12070f6f4a124f32fb3cc86e7857554702e32f0eda3080a25c4b9ac9b18c`
来源:[`packages/experimental/agent-team/src/types.ts:172`](../packages/experimental/agent-team/src/types.ts)
来源:[`packages/team/agent-team/src/types.ts:175`](../packages/team/agent-team/src/types.ts)
| 属性 | 存在性 | 类型 |
|---|---|---|
@@ -8918,6 +8950,22 @@ SHA-256: `21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d`
| `time` | 必需 | `number` |
| `type` | 必需 | `"team/message/queued"` |
<a id="persistence-type-sha256-920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75"></a>
<a id="persistence-type-eventteammode"></a>
### `{ type: "team/mode" }`
SHA-256: `920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75`
| 属性 | 存在性 | 类型 |
|---|---|---|
| `data` | 必需 | [`{ enabled }`](#persistence-type-sha256-c2a13242efc3bea4b36a843ddf1524ff4d33c765a71b582fa1fdbfa4fa148434) |
| `ignorable` | 可选 | `true` |
| `seq` | 必需 | `number` |
| `time` | 必需 | `number` |
| `type` | 必需 | `"team/mode"` |
<a id="persistence-type-sha256-d595ec73b32b016a6055333c67a5d646032b22e672da1d4a09c5b1ae398a093a"></a>
<a id="persistence-type-eventteamtask"></a>
@@ -0,0 +1,28 @@
# Bilingual-pair consistency record for 2026-10-19-session-team-mode.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/persistence-changes/2026-10-19-session-team-mode.md
/:
en: 3d5a424ae7d7e46b
zh: c22a8e4a62d8cc1a
/2026-10-19-session-team-mode:
en: a882cc1bc383bf80
zh: 33f40913b70ad97b
/2026-10-19-session-team-mode/summary:
en: 665465829d68c487
zh: 2d5bd37335c79aad
/2026-10-19-session-team-mode/table-of-contents:
en: 6cf314a069ceb451
zh: 9adff678e9ecab3b
/2026-10-19-session-team-mode/declaration:
en: 6907136f28e48c90
zh: 02f8298485f3d8e7
/2026-10-19-session-team-mode/compatibility:
en: c0ca565e19ad32a7
zh: 548c334b7e15b464
/2026-10-19-session-team-mode/verification:
en: 7f3a3e4b1ffb9f85
zh: dd9258af01f40937
/2026-10-19-session-team-mode/dev-note:
en: b75c8458928b72b9
zh: 003ba4e17b4b5269
@@ -0,0 +1,48 @@
---
description: "Records a persistence type transition and its compatibility acknowledgement."
kind: persistence-change
---
# 2026-10-19-session-team-mode
English | [中文](2026-10-19-session-team-mode.zh.md)
## Summary
Records the root Session’s Agent Teams selection with the required team/mode event.
## Table of Contents
- [Declaration](#declaration)
- [Compatibility](#compatibility)
- [Verification](#verification)
- [Dev Note](#dev-note)
<a id="declaration"></a>
## Declaration
```yaml persistence-change
schemaVersion: 1
id: 2026-10-19-session-team-mode
baseline: false
changes:
- root: "event:team/mode"
previous: null
after: "920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75"
decision: same-version
```
<a id="compatibility"></a>
## Compatibility
Existing V4 logs remain readable. Without a selection, historical tasks enable Team; without historical tasks it remains disabled. Readers predating team/mode refuse the unknown required discriminator, so they cannot silently restore the wrong mode. Ordinary forks ignore inherited mode selections and start disabled. No existing payload or Session header version changes.
<a id="verification"></a>
## Verification
197 focused Team, tool, model-menu and client tests passed; the Web mode and task-board scenario passed 8 tests. The authored team-session-mode headless and TypeScript SDK snapshots exercise on/off commands; Python SDK raw-event projection retains both selections.
<a id="dev-note"></a>
## Dev Note
None.
@@ -0,0 +1,15 @@
{
"formatVersion": 2,
"roots": [
{"key":"event:team/mode","kind":"event","event":"team/mode","surface":false,"digest":"920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75"}
],
"types": [],
"nodes": {
"0657d3ca5ac4e7bf": {"kind":"primitive","type":"number"},
"920d87e22b7409bc": {"kind":"object","properties":[{"name":"data","type":"c2a13242efc3bea4","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"d8a476d2c6fd30df","optional":false}],"indices":[]},
"aa93010d0e521ad7": {"kind":"primitive","type":"boolean"},
"c2a13242efc3bea4": {"kind":"object","properties":[{"name":"enabled","type":"aa93010d0e521ad7","optional":false}],"indices":[]},
"d8a476d2c6fd30df": {"kind":"literal","value":"team/mode"},
"dacf3d5f3e4ff619": {"kind":"literal","value":true}
}
}
@@ -0,0 +1,48 @@
---
description: "记录持久化类型更改及其兼容性确认。"
kind: persistence-change
---
# 2026-10-19-session-team-mode
[English](2026-10-19-session-team-mode.md) | 中文
## 概述
通过必读的 team/mode 事件记录根 Session 的智能体团队选择。
## 目录
- [声明](#declaration)
- [兼容性](#compatibility)
- [验证](#verification)
- [开发备注](#dev-note)
<a id="declaration"></a>
## 声明
```yaml persistence-change
schemaVersion: 1
id: 2026-10-19-session-team-mode
baseline: false
changes:
- root: "event:team/mode"
previous: null
after: "920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75"
decision: same-version
```
<a id="compatibility"></a>
## 兼容性
已有 V4 日志仍可读取。没有显式选择时,历史任务使 Team 开启;没有历史任务时保持关闭。旧读取器拒绝未知的必读 team/mode 判别值,避免静默恢复错误模式。普通分叉忽略继承的模式选择,初始保持关闭。不修改已有载荷或 Session 头部版本。
<a id="verification"></a>
## 验证
197 个 Team、工具、模型菜单和客户端定向测试通过;Web 开关与任务板场景的 8 个测试通过。team-session-mode 的 headless 和 TypeScript SDK 人工编写快照覆盖开关命令;Python SDK 原始事件投影保留两次选择。
<a id="dev-note"></a>
## 开发备注
无。
+18 -11
View File
@@ -50,6 +50,7 @@
{"key":"event:team/member","kind":"event","event":"team/member","surface":false,"digest":"4fb59762612c3e3ac3a3bd4f84c9c148d3c3893bd422ba2b201cc039fabd49bc"},
{"key":"event:team/message/delivered","kind":"event","event":"team/message/delivered","surface":false,"digest":"48f9c19417a1abbedfa59f4667bba36b93ac2db407adf5e84cb3ba0de30942cb"},
{"key":"event:team/message/queued","kind":"event","event":"team/message/queued","surface":false,"digest":"21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d"},
{"key":"event:team/mode","kind":"event","event":"team/mode","surface":false,"digest":"920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75"},
{"key":"event:team/task","kind":"event","event":"team/task","surface":false,"digest":"d595ec73b32b016a6055333c67a5d646032b22e672da1d4a09c5b1ae398a093a"},
{"key":"event:todo/write","kind":"event","event":"todo/write","surface":false,"digest":"b978cff734e62143eb56c9125423ec275405eda969802d42aaf73ecb987d3b26"},
{"key":"event:tool-workflow/agent-end","kind":"event","event":"tool-workflow/agent-end","surface":false,"digest":"babf9ee4d1af62bf6c3a8103737f7a5e4e78ce179be835ce05a38803e15884b7"},
@@ -90,7 +91,7 @@
{"digest":"0af3ecfb8c60d416fc40a7cc4fb2c4851a8e46608b2b38ab9e510670c971aa1f","names":[],"sources":[]},
{"digest":"0b6d718c693fdf7f06dcccb0bcbbabe78cc63514eafc62d6b2a3899735279d6f","names":["packages/goal/goal/src/types.ts#GoalRef"],"sources":["packages/goal/goal/src/types.ts:20"]},
{"digest":"0b9b8facbe2c19773b3fb0ecc824ccbcc603d41b8f18069faa3807d449572fce","names":[],"sources":[]},
{"digest":"0bcfaf5566d271028429ac7b562cb59053c9d78b8ae14708c35fac835108d1b1","names":[],"sources":["packages/experimental/agent-team/src/types.ts:176"]},
{"digest":"0bcfaf5566d271028429ac7b562cb59053c9d78b8ae14708c35fac835108d1b1","names":[],"sources":["packages/team/agent-team/src/types.ts:179"]},
{"digest":"0bdaf9cb63594be4ef034b68901fffe792fe09d6d5f6bac42d7f56f6e7834fb9","names":[],"sources":[]},
{"digest":"0c4205180f75b9ee1e0d878bd9a9851628b5dc18448486389d9c5fdc3f1ccda3","names":[],"sources":[]},
{"digest":"0c556c9b9f2a96238a6b9bbb99e748206cbff2ed6203041c9571f04ae5802f52","names":[],"sources":[]},
@@ -153,7 +154,7 @@
{"digest":"1fdad624334d354820dfb3a26e28d0bc9fc1b62a33f87bab63f715b3f4391bfd","names":[],"sources":[]},
{"digest":"20a57544bbf204dacd1ae6beb2ab29444365c3c869f2afdf489dcdcbc3d9c8c5","names":[],"sources":["packages/plan/plan-mode/src/index.ts:53"]},
{"digest":"2142e391b9ccb60d487afcf373ce74db98d952f69e8289eddb352a7e16e996c5","names":[],"sources":[]},
{"digest":"2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0","names":["packages/experimental/agent-team/src/types.ts#TeamMessageSource"],"sources":["packages/experimental/agent-team/src/types.ts:116"]},
{"digest":"2152caf1a71e588e4df2358a806dea24936c1c47131134f01a12939d12cdc0c0","names":["packages/team/agent-team/src/types.ts#TeamMessageSource"],"sources":["packages/team/agent-team/src/types.ts:117"]},
{"digest":"21fb6a90d5068f6a0003b7ab316ed2f56342477146a65c00db0f13c4d8df667d","names":[],"sources":[]},
{"digest":"2235d957bf4b7c6cf959231d480f0ba1f3a6d72d82981493fb6c7c963021d3d5","names":[],"sources":["packages/session/working-directory/src/index.ts:29"]},
{"digest":"224aa11d4d5f88c450822d01b99e6ca5e3a9c7f26a5ede10bae33384a09ef4dc","names":[],"sources":[]},
@@ -184,7 +185,7 @@
{"digest":"2e3523541e942ef6cc9fbc5b91f242e0ca4c6ada479b79b96025b797f6e41f3f","names":["packages/schedule/schedule/src/types.ts#ScheduleChange"],"sources":["packages/schedule/schedule/src/types.ts:232"]},
{"digest":"2e4debca12f2c449f96dc6574f3fbf2fb346193443114a241d01a236362ec48c","names":[],"sources":[]},
{"digest":"2e505098f9209e52eebd577f1a6f9d4e773ec4d78987aff28a7c786442b9f54c","names":[],"sources":[]},
{"digest":"2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e","names":["packages/experimental/agent-team/src/types.ts#TeamMessageSnapshot"],"sources":["packages/experimental/agent-team/src/types.ts:107"]},
{"digest":"2eafefdc6f79a4922d68a787a09eaf4dd2b2369c3777fba4c05e800b5678ac8e","names":["packages/team/agent-team/src/types.ts#TeamMessageSnapshot"],"sources":["packages/team/agent-team/src/types.ts:108"]},
{"digest":"2f1e6a7ebace43d727ae138ddcd352eb3813960009e5805b8c5ac84300c97716","names":["packages/attachment/attachment/src/types.ts#ImageMediaType"],"sources":["packages/attachment/attachment/src/types.ts:8"]},
{"digest":"2f3f201c8846e19c20bb75c02280e3d4eb3c57509e4715f0c0a4d1d4f91a7a06","names":[],"sources":[]},
{"digest":"2fe5026daf14bd4ff2b7bfb7cf9791c302d9cbba06802178b6dfec00b892698f","names":["packages/core/tool-executor-ptc/src/types.ts#PtcDispatchStartEventData"],"sources":["packages/core/tool-executor-ptc/src/types.ts:12"]},
@@ -252,7 +253,7 @@
{"digest":"4b259f7f8f0a44ad5e90b70a73553ced1df27012d126921d397ff403b6c86731","names":["packages/llm/llm/src/message.ts#ToolResultMessage"],"sources":["packages/llm/llm/src/message.ts:173"]},
{"digest":"4b7ddaf3710b88ff9b8df66304f5f97bf03688fd19730eedc2e9535203c820ea","names":[],"sources":[]},
{"digest":"4bb451330ff699f36b45539ceb0eb2606ead72084e2c5bb637c36cc80e2252db","names":[],"sources":["packages/core/session/src/types.ts:198"]},
{"digest":"4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b","names":["packages/api/session-controller/src/types.ts#SessionRequestId","packages/attachment/attachment/src/brand.ts#AttachmentId","packages/compaction/compaction/src/brand.ts#CompactionId","packages/core/session/src/types.ts#SessionId","packages/experimental/agent-team/src/types.ts#TeamId","packages/experimental/agent-team/src/types.ts#TeamMessageId","packages/experimental/agent-team/src/types.ts#TeamTaskId","packages/experimental/webhook/src/brand.ts#WebhookDeliveryId","packages/experimental/webhook/src/brand.ts#WebhookRuleId","packages/experimental/webhook/src/brand.ts#WebhookSourceId","packages/feedback/message-feedback/src/types.ts#MessageFeedbackVersion","packages/goal/goal/src/types.ts#GoalId","packages/interaction/commands/src/brand.ts#CommandId","packages/interaction/user-approval/src/types.ts#ApprovalRequestId","packages/jobs/jobs/src/brand.ts#JobId","packages/llm/llm-retry/src/brand.ts#RetryId","packages/llm/llm/src/brand.ts#MessageId","packages/llm/llm/src/brand.ts#ProviderRequestId","packages/llm/llm/src/brand.ts#ReasoningEffortId","packages/llm/llm/src/brand.ts#ToolCallId","packages/schedule/schedule/src/types.ts#ScheduleId","packages/session/session-title/src/index.ts#SessionTitleProviderId","packages/session/session-title/src/types.ts#SessionTitleProviderId","packages/workflow/workflow/src/types.ts#WorkflowRunId"],"sources":["packages/api/session-controller/src/types.ts:388","packages/attachment/attachment/src/brand.ts:6","packages/compaction/compaction/src/brand.ts:4","packages/core/session/src/types.ts:21","packages/experimental/agent-team/src/types.ts:20","packages/experimental/agent-team/src/types.ts:32","packages/experimental/agent-team/src/types.ts:8","packages/experimental/webhook/src/brand.ts:12","packages/experimental/webhook/src/brand.ts:6","packages/experimental/webhook/src/brand.ts:9","packages/feedback/message-feedback/src/types.ts:14","packages/goal/goal/src/types.ts:17","packages/interaction/commands/src/brand.ts:31","packages/interaction/user-approval/src/types.ts:17","packages/jobs/jobs/src/brand.ts:19","packages/llm/llm-retry/src/brand.ts:4","packages/llm/llm/src/brand.ts:16","packages/llm/llm/src/brand.ts:31","packages/llm/llm/src/brand.ts:43","packages/llm/llm/src/brand.ts:67","packages/schedule/schedule/src/types.ts:14","packages/session/session-title/src/index.ts:42","packages/session/session-title/src/types.ts:17","packages/workflow/workflow/src/types.ts:13"]},
{"digest":"4cd48f3e5108bd6ebedf7301c3638839b8b2b9db8dbd493974177fbdeb91a01b","names":["packages/api/session-controller/src/types.ts#SessionRequestId","packages/attachment/attachment/src/brand.ts#AttachmentId","packages/compaction/compaction/src/brand.ts#CompactionId","packages/core/session/src/types.ts#SessionId","packages/experimental/webhook/src/brand.ts#WebhookDeliveryId","packages/experimental/webhook/src/brand.ts#WebhookRuleId","packages/experimental/webhook/src/brand.ts#WebhookSourceId","packages/feedback/message-feedback/src/types.ts#MessageFeedbackVersion","packages/goal/goal/src/types.ts#GoalId","packages/interaction/commands/src/brand.ts#CommandId","packages/interaction/user-approval/src/types.ts#ApprovalRequestId","packages/jobs/jobs/src/brand.ts#JobId","packages/llm/llm-retry/src/brand.ts#RetryId","packages/llm/llm/src/brand.ts#MessageId","packages/llm/llm/src/brand.ts#ProviderRequestId","packages/llm/llm/src/brand.ts#ReasoningEffortId","packages/llm/llm/src/brand.ts#ToolCallId","packages/schedule/schedule/src/types.ts#ScheduleId","packages/session/session-title/src/index.ts#SessionTitleProviderId","packages/session/session-title/src/types.ts#SessionTitleProviderId","packages/team/agent-team/src/types.ts#TeamId","packages/team/agent-team/src/types.ts#TeamMessageId","packages/team/agent-team/src/types.ts#TeamTaskId","packages/workflow/workflow/src/types.ts#WorkflowRunId"],"sources":["packages/api/session-controller/src/types.ts:388","packages/attachment/attachment/src/brand.ts:6","packages/compaction/compaction/src/brand.ts:4","packages/core/session/src/types.ts:21","packages/experimental/webhook/src/brand.ts:12","packages/experimental/webhook/src/brand.ts:6","packages/experimental/webhook/src/brand.ts:9","packages/feedback/message-feedback/src/types.ts:14","packages/goal/goal/src/types.ts:17","packages/interaction/commands/src/brand.ts:31","packages/interaction/user-approval/src/types.ts:17","packages/jobs/jobs/src/brand.ts:19","packages/llm/llm-retry/src/brand.ts:4","packages/llm/llm/src/brand.ts:16","packages/llm/llm/src/brand.ts:31","packages/llm/llm/src/brand.ts:43","packages/llm/llm/src/brand.ts:67","packages/schedule/schedule/src/types.ts:14","packages/session/session-title/src/index.ts:42","packages/session/session-title/src/types.ts:17","packages/team/agent-team/src/types.ts:20","packages/team/agent-team/src/types.ts:32","packages/team/agent-team/src/types.ts:8","packages/workflow/workflow/src/types.ts:13"]},
{"digest":"4d60dddaa65d3da8d4cd014d85ce3d2c2875664dd0433e331d8e9d395289686b","names":["packages/experimental/liveshare/src/host/viewer-principal.ts#ShareViewerPrincipal"],"sources":["packages/experimental/liveshare/src/host/viewer-principal.ts:24"]},
{"digest":"4e011753f8263f436efaabfbb3b4db53a98fc55342c5ded2daf7208b217be159","names":[],"sources":[]},
{"digest":"4e44c9118152f6829634bfd508e47669ab0497caffa380c94b4be91f9390d35d","names":[],"sources":[]},
@@ -265,7 +266,7 @@
{"digest":"50cf02d875f8a1f1411f4a6fbcffab9120ccef5f74a47331fbf29480e5f68f48","names":[],"sources":[]},
{"digest":"511801b0a6470d98566e8385d3dffddb2b67f79fcf73ed6056f46c3cc0a245a7","names":[],"sources":[]},
{"digest":"516da4cdd6d2f1e5ce488e648578ca51f40e458f707b803e5b24de870e799415","names":[],"sources":[]},
{"digest":"51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357","names":["packages/experimental/agent-team/src/types.ts#TeamTaskSnapshot"],"sources":["packages/experimental/agent-team/src/types.ts:64"]},
{"digest":"51edec100659da3a9bd9c3f6ba1180f5e64ec9a1585e5057080df45c180bd357","names":["packages/team/agent-team/src/types.ts#TeamTaskSnapshot"],"sources":["packages/team/agent-team/src/types.ts:64"]},
{"digest":"525254db03b1d1e6b74cf55aced52817568331ac1f96c0818728910b6692e336","names":[],"sources":[]},
{"digest":"529e0ccd0e34079ab4ff21ed87f810cee0388246263bf22e8aba5986b56fae05","names":[],"sources":["packages/util/values/src/index.ts:4"]},
{"digest":"52c6113cb0e53f345324bf84f01928bea5d5df57ee80bc0dd65407b8bc5a3734","names":[],"sources":[]},
@@ -316,7 +317,7 @@
{"digest":"62ecb62dc0fe1b5e70217f8a80c39256a40ee3a1917be14e5ca899d20c35f7fd","names":[],"sources":[]},
{"digest":"6487b10ba7542f3c447b1e41a1c6a590b7bfafe0b9b66b49f34028da85bb970f","names":["packages/subagent/subagent/src/descriptor.ts#ContinuableSubagentDescriptorData"],"sources":["packages/subagent/subagent/src/descriptor.ts:72"]},
{"digest":"64ef542b1bfc988382d337f2ea85aab8ad76ea55341cf082163919d315688428","names":["packages/llm/llm/src/message.ts#DeveloperMessage"],"sources":["packages/llm/llm/src/message.ts:157"]},
{"digest":"6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25","names":["packages/experimental/agent-team/src/types.ts#TeamMemberSnapshot"],"sources":["packages/experimental/agent-team/src/types.ts:50"]},
{"digest":"6598cd6da253948d6b207c6374a45335804c79b576866d6215649c2d1bc85e25","names":["packages/team/agent-team/src/types.ts#TeamMemberSnapshot"],"sources":["packages/team/agent-team/src/types.ts:50"]},
{"digest":"65a8400e451e667e5b6e34df72ceb81fca8c12330330fa72083ad40279b189ad","names":["packages/llm/llm/src/message.ts#SystemPromptMessageSource"],"sources":["packages/llm/llm/src/message.ts:35"]},
{"digest":"65d583e66518c5236015e0846470fb32efcf92375ed306aef14e50a9d2cd2099","names":["packages/skill/tool-skill/src/index.ts#SkillCatalogSource"],"sources":["packages/skill/tool-skill/src/index.ts:35"]},
{"digest":"66ba70f6f068da443f969a0b947a013c3addd776b9b60a0a393759c19825e9a2","names":["packages/llm/llm/src/types.ts#ToolSchema"],"sources":["packages/llm/llm/src/types.ts:517"]},
@@ -425,6 +426,7 @@
{"digest":"8f6d609794bf5afc01d7ccf3e03811d32f4b8047f58a2c9a98db0154c2ad7cb9","names":[],"sources":[]},
{"digest":"8fcb0b44a575e998665c053643d1ab04c82f39253ebd190ac0c975b78e40b543","names":[],"sources":["packages/core/tools/src/index.ts:28"]},
{"digest":"904bf499d98be4a3a5f836fcac533b6c4899569b018071e6604e1d32657d00fd","names":[],"sources":[]},
{"digest":"920d87e22b7409bcc7224f8b1dc7f5101c33574c75627c65baab12b85cc96e75","names":[],"sources":[]},
{"digest":"930c1cd289def119d443e19dd90008916bf035f0a4d23e07241e7f050f2b89b7","names":["packages/interaction/user-approval/src/types.ts#ApprovalOutcome"],"sources":["packages/interaction/user-approval/src/types.ts:32"]},
{"digest":"935c8d486292b13c87b57ca280eb8c58b5b2f5239be86fcd4334c33fdeb87682","names":[],"sources":[]},
{"digest":"938f7c7357bc403ea3b281a9dd016939df7a0880fc8db12612585be574d0d615","names":[],"sources":[]},
@@ -471,7 +473,7 @@
{"digest":"a3a259a1aa5401af786ce08c4a8419681d3000d73467991b5fc563389bc4ebd2","names":[],"sources":[]},
{"digest":"a3c6f1ea38e9a61d7a9706057ba65aabe02dfe6d9dd90d4736aa62325d874531","names":[],"sources":[]},
{"digest":"a3edd1efd1fef21b72c55e213c8a8b24196b091abde2b89db52be0b2aaae3cfa","names":[],"sources":[]},
{"digest":"a40d12070f6f4a124f32fb3cc86e7857554702e32f0eda3080a25c4b9ac9b18c","names":[],"sources":["packages/experimental/agent-team/src/types.ts:172"]},
{"digest":"a40d12070f6f4a124f32fb3cc86e7857554702e32f0eda3080a25c4b9ac9b18c","names":[],"sources":["packages/team/agent-team/src/types.ts:175"]},
{"digest":"a4afec59b75aad5d13ef82d6931f35cc2d98918503916cf069355b77c5e42302","names":[],"sources":["packages/api/session-controller/src/types.ts:397"]},
{"digest":"a6567ccb2e530606b775371eb4fa31468d72084339968e8b0440a516a23b39dc","names":[],"sources":[]},
{"digest":"a6b41f5bede8094d7bf635be5d69b1bd7a25e006ca9cf9415bceb9322f1a7feb","names":["packages/experimental/hook-protocol/src/types.ts#HookDialect"],"sources":["packages/experimental/hook-protocol/src/types.ts:48"]},
@@ -510,12 +512,12 @@
{"digest":"b0b0eb1b16490f6bee135b2377e8f8c39227974c799ad7d49ff418af23ecbc35","names":["packages/attachment/attachment/src/types.ts#ImageAttachmentRef"],"sources":["packages/attachment/attachment/src/types.ts:11"]},
{"digest":"b158f3ff6923714807c0d73882f0b05dc87f8fa85c9e90814852d48bbc866081","names":["packages/core/session/src/types.ts#RequestContext"],"sources":["packages/core/session/src/types.ts:260"]},
{"digest":"b1664fa89f8eab49a14e7e3168d8bc4da4aa9fd76332f6c4a053d839e5276ae7","names":[],"sources":[]},
{"digest":"b1ebd5cda47d90d980bb05bffc3f970c51537b9aff15b3bc3d639811727741b1","names":[],"sources":["packages/experimental/agent-team/src/types.ts:170"]},
{"digest":"b1ebd5cda47d90d980bb05bffc3f970c51537b9aff15b3bc3d639811727741b1","names":[],"sources":["packages/team/agent-team/src/types.ts:173"]},
{"digest":"b1f62380f6746fedd629e71065e3583cef83334875b499ac9665c2eb87acfbf5","names":[],"sources":[]},
{"digest":"b222069eea2d768065161c1147b1f2c78c1b54328c84b3586ae5c8f91b8ed35e","names":[],"sources":[]},
{"digest":"b2245a906e13aa94f2d3cc6cf7b04cfa0267f7b7f4d468de1b00b1a314e54626","names":[],"sources":[]},
{"digest":"b2a5c8c008a31e3dc6c3013502f2356aca13894b31c8e70601fa92f2d40d1dba","names":[],"sources":[]},
{"digest":"b2d2a01e51341a3bfec809198952c8c830a7899f4cb6ecd3c1dc0b5d9a2af943","names":["packages/experimental/agent-team/src/types.ts#TeamTaskStatus"],"sources":["packages/experimental/agent-team/src/types.ts:61"]},
{"digest":"b2d2a01e51341a3bfec809198952c8c830a7899f4cb6ecd3c1dc0b5d9a2af943","names":["packages/team/agent-team/src/types.ts#TeamTaskStatus"],"sources":["packages/team/agent-team/src/types.ts:61"]},
{"digest":"b3681c026a0b98e98b103f057dfd217fbe904129c090efd668253ec9aea7fece","names":[],"sources":[]},
{"digest":"b38f206d59bad891fa58c89f97a0036987b3defe7685acbd318fa55eb85f9751","names":[],"sources":[]},
{"digest":"b4ec0af39fd52ed971990e42f04e5be3204882e555c409eb330f8238eec21569","names":[],"sources":[]},
@@ -558,6 +560,7 @@
{"digest":"c1f0f17b6493b85db6453bb30e01b208d703731b25bc1e68e5d4fc72eea9cdea","names":["packages/llm/llm/src/types.ts#ToolCallBlock"],"sources":["packages/llm/llm/src/types.ts:112"]},
{"digest":"c1f9e0405de6d18cabb9ee70782a027f9bbdc57e5abec9dcccdd56119e2e9058","names":[],"sources":[]},
{"digest":"c219efbdfd53b836786202ab4532913d555798f0a8615a4e9629736e3799fb70","names":[],"sources":[]},
{"digest":"c2a13242efc3bea4b36a843ddf1524ff4d33c765a71b582fa1fdbfa4fa148434","names":[],"sources":["packages/team/agent-team/src/types.ts:171"]},
{"digest":"c2deb7c9183735d4e0fffddf5c623f4e34daa1c8e96b111982e957dfcbbcf896","names":["packages/workflow/workflow/src/types.ts#WorkflowAgentOutcome"],"sources":["packages/workflow/workflow/src/types.ts:110"]},
{"digest":"c2f49004d9ae38a964e80850c87bc6849d6a872091a1d43e99eedf00c641e2a3","names":[],"sources":[]},
{"digest":"c43b119ce579b3e9983a0d3adc4ba402ebb9ba773d89738a2dab01ecf5813943","names":[],"sources":[]},
@@ -593,6 +596,7 @@
{"digest":"d66e11dddf5dfa3c71547e2cbd7b0608824cd8d6243fc16f532017ff28e8fba5","names":[],"sources":[]},
{"digest":"d6e654b88b584fcdf290a56802b1730bc7b9847ae86baa4265ab7769eb48990c","names":[],"sources":[]},
{"digest":"d85590a5675c6e2fd8164e5792a6cceac714605b8ac228adae5ee668facb1490","names":[],"sources":[]},
{"digest":"d8a476d2c6fd30df6ec0e799f91716d1518c780d23b4121dce545abfcfb7c5a5","names":[],"sources":[]},
{"digest":"d9196086e41e4dd5c2ce87f5c25529c8112a1731d258cf0728747d41a9ee3241","names":[],"sources":[]},
{"digest":"d9c462b9f62fdd3efc76a44b9524dc8781f6b91cd9c7e584b17d971defafebab","names":["packages/llm/llm/src/message.ts#ToolMessageSource"],"sources":["packages/llm/llm/src/message.ts:29"]},
{"digest":"d9edf1862e4471d6ad8a106a3f4160e0643874368707d50ecd8e27e5ee7a2567","names":[],"sources":[]},
@@ -614,7 +618,7 @@
{"digest":"deebfc7c62177ea840f23c6362b8615bc78ffa93377dd5d243c04e541c413af5","names":[],"sources":["packages/typert/protocol/src/types.ts:457"]},
{"digest":"df5d9709b7db2a72510dc52052a23f0c38f39730af1504bab8bccabc14fae528","names":[],"sources":[]},
{"digest":"df843efd87c78cf8de98f8e0d0216956cd568d0d0e56a22c853663e274aa1a18","names":[],"sources":[]},
{"digest":"dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd","names":["packages/experimental/agent-team/src/types.ts#TeamMemberPhase"],"sources":["packages/experimental/agent-team/src/types.ts:47"]},
{"digest":"dfce5db4aa42b7ebe0bb79eca92553587287e18c06b9eba85cbfb9d332e26acd","names":["packages/team/agent-team/src/types.ts#TeamMemberPhase"],"sources":["packages/team/agent-team/src/types.ts:47"]},
{"digest":"e0a787e6ec76c7c94fecbc501b489164ab0293db05bc947914077ad01e674f05","names":[],"sources":[]},
{"digest":"e2ad8f5bcd813f268ffef1b10a12d7ddd2b8ced8b9b6d0275b3f6b7ed094a187","names":[],"sources":[]},
{"digest":"e2d0367e5716bc188435e51718ebff8ce873190625fa93b1c5331102d98758fa","names":[],"sources":[]},
@@ -640,7 +644,7 @@
{"digest":"e7f4cbb3a57f4cbdb61ea41e95bcba626ad1fff6bb9b1e063b1d50a32da6e864","names":[],"sources":[]},
{"digest":"e8de0f457fed5b9ff94dc4950b59ef75fd8ba8af665cc7899485924a62653367","names":[],"sources":[]},
{"digest":"e95f957154b2b1b58692af53d4131180b6dd19e2264869f876dbaa959991494e","names":[],"sources":[]},
{"digest":"ea08ec1df0c33108fd03345b9af199cf04dea450aa045d3c683f216311403403","names":[],"sources":["packages/experimental/agent-team/src/types.ts:174"]},
{"digest":"ea08ec1df0c33108fd03345b9af199cf04dea450aa045d3c683f216311403403","names":[],"sources":["packages/team/agent-team/src/types.ts:177"]},
{"digest":"eaa71be0fbf0f702df8ea6c11d0aa2f9782263d45a10d0fb14eda662f4bfe04c","names":[],"sources":["packages/core/session/src/types.ts:201"]},
{"digest":"ebb768d85ec87fb68e42fc14fd7d8535b5ac11791b14d04c6770180f0a719bf8","names":[],"sources":[]},
{"digest":"ec38b5949af8eacaf00df002f4acbe344f934f8a061e9cdc65a52a48e5f6dd93","names":[],"sources":[]},
@@ -1053,6 +1057,7 @@
"8f6d609794bf5afc": {"kind":"tuple","elements":[{"type":"4e88776858652856","optional":false,"rest":false}]},
"8fcb0b44a575e998": {"kind":"object","properties":[{"name":"kind","type":"a720757f704a2512","optional":false}],"indices":[]},
"904bf499d98be4a3": {"kind":"union","types":["7382c4fc95fe8c5d","b765ee31033cea46","f6cb462f808309e3"]},
"920d87e22b7409bc": {"kind":"object","properties":[{"name":"data","type":"c2a13242efc3bea4","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"d8a476d2c6fd30df","optional":false}],"indices":[]},
"930c1cd289def119": {"kind":"union","types":["2142e391b9ccb60d","2c4c21f19f426a58","811229eedcec5797","fab35c4520883c0d"]},
"935c8d486292b13c": {"kind":"literal","value":"web_search"},
"938f7c7357bc403e": {"kind":"primitive","type":"null"},
@@ -1186,6 +1191,7 @@
"c1f0f17b6493b85d": {"kind":"object","properties":[{"name":"arguments","type":"4cd48f3e5108bd6e","optional":false},{"name":"id","type":"4cd48f3e5108bd6e","optional":false},{"name":"name","type":"4cd48f3e5108bd6e","optional":false},{"name":"type","type":"1f0133217eeeffd8","optional":false}],"indices":[]},
"c1f9e0405de6d18c": {"kind":"object","properties":[{"name":"data","type":"a6da9ad5d42ae83a","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"cdca80b8dad24d4e","optional":false}],"indices":[]},
"c219efbdfd53b836": {"kind":"literal","value":"step/end"},
"c2a13242efc3bea4": {"kind":"object","properties":[{"name":"enabled","type":"aa93010d0e521ad7","optional":false}],"indices":[]},
"c2deb7c9183735d4": {"kind":"union","types":["1ebc6f9ff3aa9e3a","2142e391b9ccb60d","b57a2889408de36e"]},
"c2f49004d9ae38a9": {"kind":"union","types":["1ebc6f9ff3aa9e3a","b57a2889408de36e","ef226a90ddac6cd8"]},
"c43b119ce579b3e9": {"kind":"literal","value":"paused"},
@@ -1221,6 +1227,7 @@
"d66e11dddf5dfa3c": {"kind":"object","properties":[{"name":"data","type":"cef171adf021a186","optional":false},{"name":"ignorable","type":"dacf3d5f3e4ff619","optional":true},{"name":"seq","type":"0657d3ca5ac4e7bf","optional":false},{"name":"time","type":"0657d3ca5ac4e7bf","optional":false},{"name":"type","type":"fb5e0517050d2c6d","optional":false}],"indices":[]},
"d6e654b88b584fcd": {"kind":"literal","value":"fallback"},
"d85590a5675c6e2f": {"kind":"object","properties":[{"name":"form","type":"aec150797b655c5f","optional":false},{"name":"kind","type":"1f1385dbc3e875c0","optional":false}],"indices":[]},
"d8a476d2c6fd30df": {"kind":"literal","value":"team/mode"},
"d9196086e41e4dd5": {"kind":"literal","value":"complete"},
"d9c462b9f62fdd3e": {"kind":"object","properties":[{"name":"callId","type":"4cd48f3e5108bd6e","optional":false},{"name":"kind","type":"a13d8f379222ece8","optional":false}],"indices":[]},
"d9edf1862e4471d6": {"kind":"literal","value":"schedule"},
+6 -6
View File
@@ -3,8 +3,8 @@
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/subsystems/agent-team.md
/agent-teams:
en: e88336ccc7a42f3a
zh: 9a5c1381d3ca2559
en: 152195aeb3b5dea1
zh: 1cf6b3b36bd6f02c
/agent-teams/identity-and-historical-roster:
en: 3a574287e378ecf9
zh: 818667289271c1af
@@ -15,8 +15,8 @@
en: c70f0fd199fc7db5
zh: c6b77cb5a5cfd1c2
/agent-teams/web-projection:
en: 3fce926f1d135d5a
zh: a835885262792d89
en: fcee011d13daf409
zh: 47000c16b3517291
/agent-teams/replay:
en: 9a3cc5b173014a3b
zh: 531632d2a7eefe94
en: 448d32856f87b067
zh: 7fafd96314c7e2c5
+28 -4
View File
@@ -2,7 +2,7 @@
English | [中文](agent-team.zh.md)
Types shared by the experimental task board, model tools, and host adapters. The [task-board wait decision](../../.agents/notes/implemented/architecture/2026-10-19-team-task-board-inbox.md) owns coordination semantics; this page records durable and client-visible forms from [`packages/experimental/agent-team/src/types.ts`](../../packages/experimental/agent-team/src/types.ts).
Types shared by the shared task board, model tools, and host adapters. The [task-board wait decision](../../.agents/notes/implemented/architecture/2026-10-19-team-task-board-inbox.md) owns coordination semantics; this page records durable and client-visible forms from [`packages/team/agent-team/src/types.ts`](../../packages/team/agent-team/src/types.ts).
## Identity and historical roster
@@ -75,7 +75,9 @@ interface TeamTaskSnapshot {
## Web projection
The root Session publishes non-deleted task views through `SessionProjectionMap.agentTeam`. `failure` reports a rejected persisted Team record beside the last valid state. Historical member fields remain in persisted projection state but are omitted from the browser view. The task panel labels the root as Lead and other owners from catalog labels, Session titles, or ids.
`agentTeam.enabled` exposes the root Session’s saved selection. New Sessions default to false; `team/mode` records explicit selections. Historical tasks imply enabled until an explicit selection. Only the root can call `setEnabled`; descendants share that mode. The Web menu calls the same method through `remote.agentTeams.setEnabled`, with the root Session id resolved to its live Agent by the Gateway. Mode writes take effect before awaiting persistence. Tools resolve availability at step preparation; prompt providers read the selection when evaluated. Task mutations check the current mode when their queued operation starts; admitted mutations may finish. Mode changes do not end inbox waits. A failed flush leaves the appended selection active; retrying the same selection flushes it without a duplicate event.
The root Session publishes non-deleted task views through `SessionProjectionMap.agentTeam`. `failure` reports a rejected persisted task or mode record beside the last valid state. Historical roster and mailbox records are not projected. The task panel labels the root as Lead and other owners from catalog labels, Session titles, or ids.
```ts type-equiv
/** Runtime-enriched task view returned to tools and hosts. */
@@ -100,6 +102,7 @@ interface TeamTaskView {
* record; tasks then stay at the last valid state.
*/
interface TeamProjection {
readonly enabled: boolean
readonly tasks: TeamTaskView[]
readonly failure?: string
}
@@ -107,7 +110,7 @@ interface TeamProjection {
## Replay
The `agentTeam` projection replays historical roster, task, and mailbox records selected by `TeamId`. Subagent discovery owns current tree membership and ignores inherited catalog authority. Session event `seq` and `time` own ordering and timing. Committed durable generations are preserved. The [package README](../../packages/experimental/agent-team/README.md) defines task operations and limits.
The `agentTeam` projection replays task records selected by `TeamId` and the Session’s own mode selections. Subagent discovery owns current tree membership and ignores inherited catalog authority. Session event `seq` and `time` own ordering and timing. Committed durable generations are preserved. The [package README](../../packages/team/agent-team/README.md) defines task operations and limits.
<!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
@@ -124,6 +127,27 @@ Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnp
Agent Teams service backed by the exact live Lead Session log.
```ts cordis-catalog
/**
* Read the Team selection shared by the caller's subagent tree.
* @param caller - exact live root or descendant.
* @returns whether Team tools and guidance are enabled.
*/
isEnabled(caller: Agent): boolean
/**
* Save a root Session's Team selection without stopping children or deleting tasks.
* The selection takes effect before awaiting persistence. Tools resolve availability at
* step preparation; prompt providers read the selection when evaluated. Task mutations
* check the current mode when their queued operation starts; admitted operations finish.
* @param agent - exact live root whose tree receives the selection.
* @param enabled - selected Team mode.
* @param signal - cancellation checked before changing the selection.
* @returns fulfillment after the selection flushes.
* @throws when called by a descendant or persistence fails. An appended selection remains active;
* retrying the same selection flushes without a duplicate event.
*/
@Remote async setEnabled(agent: Agent, enabled: boolean, signal?: AbortSignal): Promise<void>
/**
* Create one unowned pending task in the Team Lead log.
* @param caller - exact live Team member creating the task.
@@ -162,5 +186,5 @@ async updateTask(caller: Agent, request: UpdateTeamTaskRequest, signal?: AbortSi
Types: [Agent](core.md)
Source: [`packages/experimental/agent-team/src/index.ts`](../../packages/experimental/agent-team/src/index.ts)
Source: [`packages/team/agent-team/src/index.ts`](../../packages/team/agent-team/src/index.ts)
<!-- END GENERATED cordis-surface -->
+28 -4
View File
@@ -2,7 +2,7 @@
[English](agent-team.md) | 中文
实验性任务板、模型工具和 host 适配器共享的类型。[任务板等待决策](../../.agents/notes/implemented/architecture/2026-10-19-team-task-board-inbox.zh.md)负责协调语义;本页记录 [`packages/experimental/agent-team/src/types.ts`](../../packages/experimental/agent-team/src/types.ts) 中的持久化和客户端可见形式。
共享任务板、模型工具和 host 适配器共享的类型。[任务板等待决策](../../.agents/notes/implemented/architecture/2026-10-19-team-task-board-inbox.zh.md)负责协调语义;本页记录 [`packages/team/agent-team/src/types.ts`](../../packages/team/agent-team/src/types.ts) 中的持久化和客户端可见形式。
## 身份与历史名册
@@ -75,7 +75,9 @@ interface TeamTaskSnapshot {
## Web 投影
根 Session 通过 `SessionProjectionMap.agentTeam` 发布未删除任务视图。`failure` 在最后有效状态旁报告被拒绝的持久化 Team 记录。历史成员字段保留在持久化投影状态中,但不发送到浏览器。任务面板将根标记为主代理,其他负责人依次使用目录标签、Session 标题或 id。
`agentTeam.enabled` 提供根 Session 保存的选择。新 Session 默认为 false;`team/mode` 记录显式选择。历史任务在显式选择前视为开启。仅根可调用 `setEnabled`;后代共享该模式。Web 菜单通过 `remote.agentTeams.setEnabled` 调用同一方法,Gateway 将根 Session id 解析为其存活 Agent。模式写入先立即生效,再等待刷盘。工具在步骤准备时确定可用性;提示词提供方在求值时读取选择。任务修改在排队操作开始时检查当前模式;已获准的修改可继续完成。模式变更不会结束收件箱等待。刷盘失败时已追加的选择仍然生效;重试相同选择会再次刷盘,不重复追加事件。
根 Session 通过 `SessionProjectionMap.agentTeam` 发布未删除任务视图。`failure` 在最后有效状态旁报告被拒绝的持久化任务或模式记录。历史名册与邮箱记录不参与投影。任务面板将根标记为主代理,其他负责人依次使用目录标签、Session 标题或 id。
```ts type-equiv
/** Runtime-enriched task view returned to tools and hosts. */
@@ -100,6 +102,7 @@ interface TeamTaskView {
* record; tasks then stay at the last valid state.
*/
interface TeamProjection {
readonly enabled: boolean
readonly tasks: TeamTaskView[]
readonly failure?: string
}
@@ -107,7 +110,7 @@ interface TeamProjection {
## 回放
`agentTeam` 投影按 `TeamId` 重放历史名册、任务和邮箱记录。subagent 发现负责当前树成员关系,不将继承目录作为权限来源。Session 事件的 `seq` 和 `time` 负责排序和时间。已提交的持久化代次保持不变。[包 README](../../packages/experimental/agent-team/README.zh.md)定义任务操作和限制。
`agentTeam` 投影按 `TeamId` 重放任务记录,并重放 Session 自身的模式选择。subagent 发现负责当前树成员关系,不将继承目录作为权限来源。Session 事件的 `seq` 和 `time` 负责排序和时间。已提交的持久化代次保持不变。[包 README](../../packages/team/agent-team/README.zh.md)定义任务操作和限制。
<!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
@@ -124,6 +127,27 @@ Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnp
Agent Teams service backed by the exact live Lead Session log.
```ts cordis-catalog
/**
* Read the Team selection shared by the caller's subagent tree.
* @param caller - exact live root or descendant.
* @returns whether Team tools and guidance are enabled.
*/
isEnabled(caller: Agent): boolean
/**
* Save a root Session's Team selection without stopping children or deleting tasks.
* The selection takes effect before awaiting persistence. Tools resolve availability at
* step preparation; prompt providers read the selection when evaluated. Task mutations
* check the current mode when their queued operation starts; admitted operations finish.
* @param agent - exact live root whose tree receives the selection.
* @param enabled - selected Team mode.
* @param signal - cancellation checked before changing the selection.
* @returns fulfillment after the selection flushes.
* @throws when called by a descendant or persistence fails. An appended selection remains active;
* retrying the same selection flushes without a duplicate event.
*/
@Remote async setEnabled(agent: Agent, enabled: boolean, signal?: AbortSignal): Promise<void>
/**
* Create one unowned pending task in the Team Lead log.
* @param caller - exact live Team member creating the task.
@@ -162,5 +186,5 @@ async updateTask(caller: Agent, request: UpdateTeamTaskRequest, signal?: AbortSi
Types: [Agent](core.zh.md)
Source: [`packages/experimental/agent-team/src/index.ts`](../../packages/experimental/agent-team/src/index.ts)
Source: [`packages/team/agent-team/src/index.ts`](../../packages/team/agent-team/src/index.ts)
<!-- END GENERATED cordis-surface -->
+17 -17
View File
@@ -273,23 +273,23 @@
en: 0c37fb1fed979d72
zh: 5ea9d07f5a4a8a6c
/tool-schema-catalog/deepseek-ai-dsh-tool-jobs/job-output:
en: 1e084359a8cd42b3
zh: 3f6c245dbbb2b920
/tool-schema-catalog/deepseek-ai-dsh-experimental-tool-agent-team:
en: 6b1106f417b50db6
zh: 6b1106f417b50db6
/tool-schema-catalog/deepseek-ai-dsh-experimental-tool-agent-team/team-task-create:
en: 91e84febe063c3bd
zh: 550555d0f44f603b
/tool-schema-catalog/deepseek-ai-dsh-experimental-tool-agent-team/team-task-get:
en: 1c6ae0aba0b8041d
zh: f8d634387b74121d
/tool-schema-catalog/deepseek-ai-dsh-experimental-tool-agent-team/team-task-list:
en: 2084d494aae8798a
zh: e4c136c91028a7b1
/tool-schema-catalog/deepseek-ai-dsh-experimental-tool-agent-team/team-task-update:
en: 7c1e0b1f9a33fe13
zh: 16260fb20d6f210e
en: 2977f731fb90d147
zh: 4f422613ff720055
/tool-schema-catalog/deepseek-ai-dsh-tool-agent-team:
en: 3f1a9c3509853972
zh: 3f1a9c3509853972
/tool-schema-catalog/deepseek-ai-dsh-tool-agent-team/team-task-create:
en: ac9ed819b705b4b8
zh: 306477d2d457369a
/tool-schema-catalog/deepseek-ai-dsh-tool-agent-team/team-task-get:
en: bca1abf330638c19
zh: 903bfa977f75c046
/tool-schema-catalog/deepseek-ai-dsh-tool-agent-team/team-task-list:
en: 8001eda7e9ff6a25
zh: 2414761029f21404
/tool-schema-catalog/deepseek-ai-dsh-tool-agent-team/team-task-update:
en: 7363eeff5e5e1a56
zh: 97a8fd0100c5de0f
/tool-schema-catalog/deepseek-ai-dsh-tool-todo:
en: dea62d26fb18ff68
zh: dea62d26fb18ff68
+7 -7
View File
@@ -2227,9 +2227,9 @@ Source: [`packages/jobs/tool-jobs/src/index.ts`](../packages/jobs/tool-jobs/src/
The kind-agnostic background-job controller: background bash commands and PTY sends are read, listed, and killed through the same three tools. Loading the plugin attaches the controller that arms producers' `ctx.jobs.start()`.
<a id="deepseek-aidsh-experimental-tool-agent-team"></a>
<a id="deepseek-aidsh-tool-agent-team"></a>
## `@deepseek-ai/dsh-experimental-tool-agent-team`
## `@deepseek-ai/dsh-tool-agent-team`
### `team_task_create`
@@ -2269,7 +2269,7 @@ Create one unowned pending task on the shared Team task board.
}
```
Source: [`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
Source: [`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
### `team_task_get`
@@ -2290,7 +2290,7 @@ Read the complete latest value of one shared task before changing or executing i
}
```
Source: [`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
Source: [`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
### `team_task_list`
@@ -2329,7 +2329,7 @@ List shared tasks, including readiness, owner, revision, blockers, and write-sco
}
```
Source: [`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
Source: [`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
### `team_task_update`
@@ -2396,9 +2396,9 @@ Compare-and-set a shared task action using the latest revision from team_task_ge
}
```
Source: [`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
Source: [`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
Four task-board tools share the subagent tree’s root Session. The optional Agent Teams profile adds task-board guidance and required Team identity derived from the subagent root, alongside standard subagent delegation and control tools.
Four task-board tools share the subagent tree’s root Session. Enabling Team mode on the root Session adds task-board guidance and required Team identity alongside standard subagent delegation and control tools.
<a id="deepseek-aidsh-tool-todo"></a>
+7 -7
View File
@@ -2233,9 +2233,9 @@ subagent_oar 工具在为外部提供方配置的别名之间选择。本目录
与任务种类无关的后台任务控制器:后台 bash 命令与 PTY 发送 都通过相同的 3 个工具读取、列出和终止。加载该插件会挂接控制器,从而启用生产方的 `ctx.jobs.start()`。
<a id="deepseek-aidsh-experimental-tool-agent-team"></a>
<a id="deepseek-aidsh-tool-agent-team"></a>
## `@deepseek-ai/dsh-experimental-tool-agent-team`
## `@deepseek-ai/dsh-tool-agent-team`
### `team_task_create`
@@ -2275,7 +2275,7 @@ subagent_oar 工具在为外部提供方配置的别名之间选择。本目录
}
```
来源:[`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
来源:[`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
### `team_task_get`
@@ -2296,7 +2296,7 @@ subagent_oar 工具在为外部提供方配置的别名之间选择。本目录
}
```
来源:[`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
来源:[`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
### `team_task_list`
@@ -2335,7 +2335,7 @@ subagent_oar 工具在为外部提供方配置的别名之间选择。本目录
}
```
来源:[`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
来源:[`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
### `team_task_update`
@@ -2402,9 +2402,9 @@ subagent_oar 工具在为外部提供方配置的别名之间选择。本目录
}
```
来源:[`packages/experimental/tool-agent-team/src/index.ts`](../packages/experimental/tool-agent-team/src/index.ts)
来源:[`packages/team/tool-agent-team/src/index.ts`](../packages/team/tool-agent-team/src/index.ts)
四个任务板工具共享 subagent 树的根 Session。可选 Agent Teams profile 在标准子代理委派和控制工具之外增加任务板指导,以及从 subagent 根派生的必需 Team 身份。
四个任务板工具共享 subagent 树的根 Session。在根 Session 开启 Team 模式后,会在标准子代理委派和控制工具之外增加任务板指导与必需的 Team 身份。
<a id="deepseek-aidsh-tool-todo"></a>
@@ -12,5 +12,5 @@
en: 9968decf3dd340af
zh: 736a32caac4b5103
/agent-teams-messages-use-target-inboxes/migration:
en: 7ffd442bfd55769e
zh: ffb11a143f11ce7f
en: a4b8999943c76cc4
zh: 042927b5c857c8d5
@@ -18,4 +18,4 @@ The `maxPendingMessagesPerMember` configuration key is removed. Historical `team
1. Before upgrading, let pending Team messages finish and confirm that their targets received them. After upgrading, explicitly resend any required undelivered message; check the target's history first to avoid duplicates. Do not edit historical Session records.
2. Remove `maxPendingMessagesPerMember` from the `@deepseek-ai/dsh-experimental-agent-team` plugin configuration in your `cordis.yml` or overlays. There is no replacement Team queue limit; `maxMessageBytes` still bounds each complete sender-framed message.
3. Update any consumer of `send_message` results to read `sent` instead of message IDs or delivery statuses, and handle send errors explicitly. Do not treat success as completed target work. The `ctx.agentTeams.sendMessage()` service still returns `messageId`.
4. Start your Team-enabled profile, send a message to another member, and confirm that the tool returns `{ "sent": true }` and that the target receives it. Consult the [package reference](../../../../packages/experimental/agent-team/README.md#use-this-package) for delivery semantics.
4. Start your Team-enabled profile, send a message to another member, and confirm that the tool returns `{ "sent": true }` and that the target receives it. Consult the [package reference](../../../../packages/team/agent-team/README.md#use-this-package) for delivery semantics.
@@ -18,4 +18,4 @@ description: "Agent Teams 移除待投递消息数量限制,并停止投递历
1. 升级前,让待投递的 Team 消息完成投递,并确认目标已收到。升级后,显式重发仍需处理的未投递消息;先检查目标历史,避免重复。不要编辑历史 Session 记录。
2. 从 `cordis.yml` 或覆盖配置中 `@deepseek-ai/dsh-experimental-agent-team` 插件的配置移除 `maxPendingMessagesPerMember`。没有替代的 Team 队列限制;`maxMessageBytes` 仍限制包含发送者标识的完整消息大小。
3. 更新所有读取 `send_message` 结果的调用方,改为读取 `sent` 而非消息 ID 或投递状态,并显式处理发送错误。不要把发送成功视为目标工作已完成。`ctx.agentTeams.sendMessage()` 服务仍返回 `messageId`。
4. 启动启用 Team 的 profile,向其他成员发送消息,确认工具返回 `{ "sent": true }` 且目标收到消息。投递语义参见[包参考](../../../../packages/experimental/agent-team/README.zh.md#use-this-package)。
4. 启动启用 Team 的 profile,向其他成员发送消息,确认工具返回 `{ "sent": true }` 且目标收到消息。投递语义参见[包参考](../../../../packages/team/agent-team/README.zh.md#use-this-package)。
@@ -0,0 +1,16 @@
# Bilingual-pair consistency record for guide.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-rc.2/session-team-mode/guide.md
/:
en: 2b713df685f8b593
zh: 4e185e636a3b5d99
/select-agent-teams-per-session:
en: 9e82418f46f6275b
zh: d1282eec79b37b59
/select-agent-teams-per-session/change:
en: 3ba5920179726841
zh: 940e0d956a523dbc
/select-agent-teams-per-session/migration:
en: 972659e493910060
zh: a7a87c7327b9b8fe
@@ -0,0 +1,22 @@
---
kind: upgrade-guide
description: "Agent Teams defaults off for new Sessions and uses a saved per-Session selection."
---
# Select Agent Teams per Session
English | [中文](guide.zh.md)
## Change
Agent Teams ships with base-backed profiles; new Sessions default to off. The Plugins page has no separate Agent Teams switch. The root Session’s selection controls task tools and Team guidance throughout its subagent tree. The model and reasoning menu offers **Use Agent Teams**, and the root conversation’s Subagent header control opens members above shared tasks in one panel while enabled. Child conversations retain navigation without a shared task board.
Disabling Team retains tasks and subagents. Admitted task operations finish; queued operations check the current mode when they start. The selection survives restart. A historical task board without a saved selection remains enabled. The required `team/mode` event records selections; older readers reject this unfamiliar event. See the [persistence acknowledgement](../../../persistence-changes/2026-10-19-session-team-mode.md).
## Migration
1. Start each existing profile once. Profile loading removes the retired `@deepseek-ai/dsh-experimental-agent-team-profile` bundle selection; the base and Web bundles supply its plugins. Keep `agent-team`, `tool-agent-team`, and `ui-agent-team` row overrides. Custom compositions replace package names `@deepseek-ai/dsh-experimental-agent-team`, `@deepseek-ai/dsh-experimental-tool-agent-team`, and `@deepseek-ai/dsh-experimental-client-ui-agent-team` with `@deepseek-ai/dsh-agent-team`, `@deepseek-ai/dsh-tool-agent-team`, and `@deepseek-ai/dsh-client-ui-agent-team`.
2. Enable **Use Agent Teams** in the root conversation’s model and reasoning menu, or execute `/team on`. Use `/team off` to disable it.
3. Verify that enabling shows shared tasks in the root conversation below the Subagent tree in the same panel and exposes four task tools. Reload the Session to confirm the saved selection. Re-enabling after disabling restores the existing tasks.
Client plugin consumers replace `TeamActionProps` with `TeamBoardProps`; task content registers in `conversation.session.header.actions.subagent.footer` instead of the header actions slot.
@@ -0,0 +1,22 @@
---
kind: upgrade-guide
description: "Agent Teams 在新 Session 中默认关闭,并使用按 Session 保存的选择。"
---
# 按 Session 选择智能体团队
[English](guide.md) | 中文
## 变更
Agent Teams 随基于 base 的 profile 提供;新 Session 默认关闭。插件页不再提供独立的智能体团队开关。根 Session 的选择控制整棵子代理树中的任务工具和 Team 提示词。模型与推理等级菜单提供**使用智能体团队**开关,开启后通过根会话的 Subagent 页头入口,在同一面板中查看上方成员与下方共享任务。子会话保留导航,不显示共享任务板。
关闭 Team 保留任务和子代理。已经进入执行的任务操作继续完成;排队中的操作在开始时检查当前模式。选择在重启后仍有效。没有保存选择的历史任务板保持开启。必读事件 `team/mode` 记录选择;旧读取器会拒绝该未知事件。参见[持久化变更确认](../../../persistence-changes/2026-10-19-session-team-mode.zh.md)。
## 迁移
1. 启动每个已有 profile 一次。加载时会移除已停用的 `@deepseek-ai/dsh-experimental-agent-team-profile` 组合选项;base 与 Web 组合提供对应插件。保留 `agent-team`、`tool-agent-team` 与 `ui-agent-team` 行覆盖。自定义组合将包名 `@deepseek-ai/dsh-experimental-agent-team`、`@deepseek-ai/dsh-experimental-tool-agent-team`、`@deepseek-ai/dsh-experimental-client-ui-agent-team` 分别替换为 `@deepseek-ai/dsh-agent-team`、`@deepseek-ai/dsh-tool-agent-team`、`@deepseek-ai/dsh-client-ui-agent-team`。
2. 在根会话的模型与推理等级菜单中打开**使用智能体团队**,或执行 `/team on`。使用 `/team off` 关闭。
3. 在根会话中确认开启后通过 Subagent 入口在树下方查看共享任务板,并提供四个任务工具。重新加载 Session,确认选择已保存。关闭后再开启会恢复已有任务。
Client 插件消费者将 `TeamActionProps` 替换为 `TeamBoardProps`;任务内容注册到 `conversation.session.header.actions.subagent.footer`,而非页头操作插槽。
@@ -0,0 +1,16 @@
# Bilingual-pair consistency record for guide.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-rc.3/team-mode-menu/guide.md
/:
en: 1c39dada6c6162a7
zh: ab2f5e2824bfbf0c
/select-team-mode-from-the-conversation-menu:
en: d570d0f970f6a77a
zh: 7a722461f27bc620
/select-team-mode-from-the-conversation-menu/change:
en: 37b569a98d41587d
zh: ce9c8ee4c35ac634
/select-team-mode-from-the-conversation-menu/migration:
en: d548bbca6276ed74
zh: 2468a89bd342b3ff
@@ -0,0 +1,18 @@
---
kind: upgrade-guide
description: "The Team mode slash command is removed; use the root conversation menu."
---
# Select Team mode from the conversation menu
English | [中文](guide.zh.md)
## Change
`/team on` and `/team off` are no longer registered. The root conversation’s **Use Agent Teams** switch calls `remote.agentTeams.setEnabled` directly. Saved selections, task retention, and root-only authorization are unchanged.
## Migration
1. Enable or disable **Use Agent Teams** in the root conversation’s model and reasoning menu.
2. Plugins that execute the command should call `ctx.agentTeams.setEnabled(rootAgent, enabled)` instead; browser clients call `remote.agentTeams.setEnabled(rootSessionId, enabled)`.
3. Confirm the switch reflects the saved selection after reloading the Session.
@@ -0,0 +1,18 @@
---
kind: upgrade-guide
description: "Team 模式斜杠命令已移除,请使用根会话菜单。"
---
# 从会话菜单选择 Team 模式
[English](guide.md) | 中文
## 变更
`/team on` 和 `/team off` 不再注册。根会话的**使用智能体团队**开关直接调用 `remote.agentTeams.setEnabled`。保存的选择、任务保留以及仅允许根会话修改的授权规则不变。
## 迁移
1. 在根会话的模型与推理等级菜单中打开或关闭**使用智能体团队**。
2. 执行该命令的插件改为调用 `ctx.agentTeams.setEnabled(rootAgent, enabled)`;浏览器客户端调用 `remote.agentTeams.setEnabled(rootSessionId, enabled)`。
3. 重新加载 Session,确认开关反映已保存的选择。
@@ -0,0 +1,16 @@
# Bilingual-pair consistency record for guide.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-rc.3/team-projection/guide.md
/:
en: 185304d86b229610
zh: b98e40567653a55f
/team-projection-retains-tasks-and-mode:
en: c20510084cf9d412
zh: ee26f2365ab5d216
/team-projection-retains-tasks-and-mode/change:
en: 5b92baca861b7281
zh: 57b4162fb425163c
/team-projection-retains-tasks-and-mode/migration:
en: 6c30148dea17af5e
zh: 81b7fa72cc118252
@@ -0,0 +1,20 @@
---
kind: upgrade-guide
description: "Team projection stops restoring historical teammates and mailbox state while retaining tasks and saved mode."
---
# Team projection retains tasks and mode
English | [中文](guide.zh.md)
## Change
The `agentTeam` projection no longer restores `members`, `messages`, or `delivered` from historical `team/member` and `team/message/*` events. It ignores their payloads, so historical roster or mailbox validation failures no longer block task reads or writes. Historical teammates are not restored and queued mail is not delivered.
Task revisions, task owners, deleted-task records, and the saved Team mode remain supported. Ordinary subagent discovery and messaging are unchanged. The Session format and committed log files do not change; projection checkpoint version 7 rebuilds older cached state from the log.
## Migration
1. No data conversion or configuration change is required. Open the Session normally to rebuild incompatible projection checkpoints.
2. Use `list_agents` and `send_message` for current teammates. Read historical roster or mailbox events from the original Session log if you need an archive; the Team projection no longer supplies these collections.
3. Confirm that the task board and saved Team mode are restored. Historical roster and mailbox records do not grant task-assignment authority.
@@ -0,0 +1,20 @@
---
kind: upgrade-guide
description: "Team 投影停止恢复历史队友与邮箱状态,同时保留任务和保存的模式。"
---
# Team 投影保留任务与模式
[English](guide.md) | 中文
## 变更
`agentTeam` 投影不再从历史 `team/member` 和 `team/message/*` 事件恢复 `members`、`messages` 或 `delivered`。投影忽略这些载荷,因此历史名册或邮箱校验失败不再阻止任务读写。不恢复历史队友,也不投递排队邮件。
任务修订、任务所有者、已删除任务记录和保存的 Team 模式仍受支持。普通子代理发现与通信保持不变。Session 格式和已提交日志文件不变;投影检查点版本 7 从日志重建旧缓存状态。
## 迁移
1. 无需转换数据或修改配置。正常打开 Session 即可重建不兼容的投影检查点。
2. 使用 `list_agents` 和 `send_message` 与当前队友协作。需要归档信息时,从原始 Session 日志读取历史名册或邮箱事件;Team 投影不再提供这些集合。
3. 确认任务板和保存的 Team 模式已恢复。历史名册与邮箱记录不授予任务分配权限。
+2 -2
View File
@@ -15,8 +15,8 @@
en: ffc55792d6e922e1
zh: 83bd759638857e2d
/packages/package-groups:
en: c397fc0c1885058a
zh: c720d0e91dd1d15e
en: 60a6056460b8d4c1
zh: fce319504ae9b6ef
/packages/release-expectations:
en: 236081c1659b25ab
zh: 809110adf003802e
+1
View File
@@ -52,6 +52,7 @@ Every package lives in exactly one group; new packages join existing groups, and
| [`compaction/`](compaction/README.md) | Compaction capability family: Service Definition + basic provider + command Consumer |
| [`context/`](context/README.md) | Model-visible request context: workspace instructions, time context, references |
| [`subagent/`](subagent/README.md) | Subagent capability family: provider-registry contract and model-facing delegation tools |
| [`team/`](team/README.md) | Team coordination: shared task boards and model-facing task tools |
| [`jobs/`](jobs/README.md) | Generic background-job runtime and model-facing job control tools |
| [`experimental/`](experimental/README.md) | Capabilities under evaluation; [status and support policy](experimental/README.md#status) |
| [`workflow/`](workflow/README.md) | Workflow seam, PTC process engine, and the model-facing `workflow` tool |
+1
View File
@@ -52,6 +52,7 @@ harness 由 `packages/` 下的 npm 包组装而成,按能力系列分组:会
| [`compaction/`](compaction/README.zh.md) | 压缩(compaction)能力系列:Service Definition + 基础提供方 + 命令 Consumer |
| [`context/`](context/README.zh.md) | 模型可见请求上下文:workspace 指令、时间上下文、引用 |
| [`subagent/`](subagent/README.zh.md) | subagent 能力系列:提供方注册表约定和面向模型的委托工具 |
| [`team/`](team/README.zh.md) | Team 协调:共享任务板与面向模型的任务工具 |
| [`jobs/`](jobs/README.zh.md) | 通用后台任务运行时和面向模型的作业控制工具 |
| [`experimental/`](experimental/README.zh.md) | 仍在评估中的能力;[状态与支持策略](experimental/README.zh.md#status) |
| [`workflow/`](workflow/README.zh.md) | 工作流 seam、PTC 进程引擎、面向模型的 `workflow` 工具 |
+2 -2
View File
@@ -15,8 +15,8 @@
en: a7a78c6d1aeebeb3
zh: 4bb69f32d8b05ba3
/deepseek-ai-dsh-api-remotes/use-this-package:
en: a80d44e0683768a5
zh: 379833ac180e5418
en: 6e3448339c646a7e
zh: 5dc00ff4cceaa88c
/deepseek-ai-dsh-api-remotes/forwarded-host-events:
en: 31bb9a2f50094b84
zh: 226c055739d5def7
+1 -1
View File
@@ -29,7 +29,7 @@ Two-sided BFF for Host Remote capabilities selected by this application. The Hos
[`@deepseek-ai/dsh-api-session-controller`](../session-controller/README.md) owns Agent and Session identity policy, including the Typert lookup resolvers used by other namespaces. This package selects and mounts that generated Session contribution without a direct runtime dependency on `@deepseek-ai/dsh-session`; activation policy stays with Session Controller.
The Client assembly mounts Office conversion, Commands, credentials, settings, Goal, Schedule, dynamic Cordis, file and Session references, read-only Host plugin inventory, plugin-installation registry response comparison, message feedback, permission presets, Session Controller, subagents, and Workspace Controller contributions. The `permissionPresets` namespace returns the complete process-level catalog used by current-session controls. Cordis effect ownership withdraws every contribution when this assembly unloads, while `@deepseek-ai/dsh-api-gateway/client` owns descriptor validation, traced namespace Services, direct and scoped methods, invocation, streams, and cancellation. The Client entry consumes the shared `TypertClientRemote` interface through Cordis and does not import the concrete Gateway. It re-exports the Gateway Client face's declaration merges type-only, so a consumer reaching the forwarded-event vocabulary through this facade gains no runtime edge to the Gateway implementation.
The Client assembly mounts Office conversion, Commands, Agent Teams, credentials, settings, Goal, Schedule, dynamic Cordis, file and Session references, read-only Host plugin inventory, plugin-installation registry response comparison, message feedback, permission presets, Session Controller, subagents, and Workspace Controller contributions. The `permissionPresets` namespace returns the complete process-level catalog used by current-session controls. Cordis effect ownership withdraws every contribution when this assembly unloads, while `@deepseek-ai/dsh-api-gateway/client` owns descriptor validation, traced namespace Services, direct and scoped methods, invocation, streams, and cancellation. The Client entry consumes the shared `TypertClientRemote` interface through Cordis and does not import the concrete Gateway. It re-exports the Gateway Client face's declaration merges type-only, so a consumer reaching the forwarded-event vocabulary through this facade gains no runtime edge to the Gateway implementation.
This facade is also the front door for the wire type vocabulary a Client package names. It re-exports, type-only, the Remote failure vocabulary (`RemoteResult`, `RemoteFailure`, `RemoteErrorCode`, `RemoteErrorDetailsMap`), the Host facts (`RemoteHostFacts`), and each selected domain's client-safe payload types, so a Client feature package imports one specifier instead of reaching into `dsh-typert-protocol`, the Gateway, or an owner's Host entry. Two kinds of package deliberately skip this door: the API-layer packages this assembly itself selects — importing it back would close a dependency cycle — and their tests, which take the failure vocabulary from `dsh-typert-protocol` directly. A UI package's tests instead take the `RemoteError` constructor from [`dsh-client-test-runtime`](../../test-support/client-runtime/README.md).
+1 -1
View File
@@ -29,7 +29,7 @@ kind: "package-reference"
[`@deepseek-ai/dsh-api-session-controller`](../session-controller/README.zh.md) 拥有 agent(智能体)与会话身份策略,包括供其他 namespace 使用的 Typert lookup 解析器。本包选择并挂载生成的会话 contribution,无需直接依赖 `@deepseek-ai/dsh-session` 的运行时;激活策略由会话控制器负责。
Client 组合挂载 Office 转换、Commands、凭据、settings、Goal、Schedule、动态 Cordis、文件与会话引用、只读 Host 插件清单、插件安装源响应比较、消息反馈、权限预设、会话控制器、subagents 和 Workspace 控制器 contribution。`permissionPresets` namespace 返回 current-session 控件使用的完整进程级目录。该组合卸载时,Cordis effect 的所有权机制会撤回所有贡献;`@deepseek-ai/dsh-api-gateway/client` 负责描述符校验、可追踪的 namespace 服务、直接与作用域方法、调用、流与取消。Client 入口通过 Cordis 消费共享的 `TypertClientRemote` 接口,不导入具体 Gateway;它只以 type-only 形式重新导出 Gateway Client face 的声明合并,因此消费端经由本外观取到转发事件词汇时,运行时不会多出一条通往 Gateway 实现的边。
Client 组合挂载 Office 转换、Commands、Agent Teams、凭据、settings、Goal、Schedule、动态 Cordis、文件与会话引用、只读 Host 插件清单、插件安装源响应比较、消息反馈、权限预设、会话控制器、subagents 和 Workspace 控制器 contribution。`permissionPresets` namespace 返回 current-session 控件使用的完整进程级目录。该组合卸载时,Cordis effect 的所有权机制会撤回所有贡献;`@deepseek-ai/dsh-api-gateway/client` 负责描述符校验、可追踪的 namespace 服务、直接与作用域方法、调用、流与取消。Client 入口通过 Cordis 消费共享的 `TypertClientRemote` 接口,不导入具体 Gateway;它只以 type-only 形式重新导出 Gateway Client face 的声明合并,因此消费端经由本外观取到转发事件词汇时,运行时不会多出一条通往 Gateway 实现的边。
本 facade 同时是 Client 包指称 wire 类型词汇的正门。它以 type-only 方式转出 Remote 失败词汇(`RemoteResult`、`RemoteFailure`、`RemoteErrorCode`、`RemoteErrorDetailsMap`)、Host 事实(`RemoteHostFacts`),以及各已选领域对 Client 安全的载荷类型,因此 Client 功能包只 import 一个 specifier,不必伸手进 `dsh-typert-protocol`、Gateway 或某个拥有方的 Host 入口。有两类包刻意不走这道门:本装配自己选中的 API 层包——反向 import 会形成依赖环——以及它们的测试,后者直接从 `dsh-typert-protocol` 取失败词汇。UI 包的测试则从 [`dsh-client-test-runtime`](../../test-support/client-runtime/README.zh.md) 取 `RemoteError` 构造器。
+1
View File
@@ -99,6 +99,7 @@
"@deepseek-ai/dsh-api-account-controller": "workspace:*",
"@deepseek-ai/dsh-deepseek-account": "workspace:*",
"@deepseek-ai/dsh-client-product-analytics": "workspace:*",
"@deepseek-ai/dsh-agent-team": "workspace:*",
"@deepseek-ai/dsh-client-ui-trajectory": "workspace:*"
}
}
+3 -1
View File
@@ -6,6 +6,8 @@ export type {} from '@deepseek-ai/dsh-client-product-analytics/remote'
import agentPresetsRemote from '@deepseek-ai/dsh-agent-preset-registry/remote'
import userQuestionsRemote from '@deepseek-ai/dsh-user-questions/remote'
import commandsRemote from '@deepseek-ai/dsh-commands/remote'
import agentTeamsRemote from '@deepseek-ai/dsh-agent-team/remote'
export type {} from '@deepseek-ai/dsh-agent-team/remote'
import accountRemote from '@deepseek-ai/dsh-api-account-controller/remote'
import settingsControllerRemote from '@deepseek-ai/dsh-api-settings-controller/remote'
import officeToPdfRemote from '@deepseek-ai/dsh-office-to-pdf/remote'
@@ -189,7 +191,7 @@ export async function apply(ctx: Context): Promise<() => Promise<void>> {
const disposers: Array<() => Promise<void>> = []
try {
for (const contribution of [
productAnalyticsRemote, agentPresetsRemote, commandsRemote, settingsControllerRemote, accountRemote,
productAnalyticsRemote, agentPresetsRemote, commandsRemote, agentTeamsRemote, settingsControllerRemote, accountRemote,
goalsRemote, llmRemote, dynamicRemote, scheduleRemote,
pluginInventoryRemote, pluginManagerRemote, pluginMarketRemote, pluginRegistryProbeRemote, toolResultsRemote,
messageFeedbackRemote, sessionFeedbackRemote,
@@ -11,6 +11,7 @@
"src/types.ts"
],
"references": [
{ "path": "../../team/agent-team" },
{ "path": "../../client/product-analytics/tsconfig.client.json" },
{
"path": "../../../vendor/cordis"
+2 -2
View File
@@ -15,8 +15,8 @@
en: d152484eb41ac6b4
zh: 09388d293f9be9cb
/deepseek-ai-dsh-app-boot/use-this-package:
en: f6fa378225009c8f
zh: 324c0e4640bb1358
en: 8e42ac55d685e0f1
zh: e9e8804af1b2df2b
/deepseek-ai-dsh-app-boot/use-this-package/when-to-use-it:
en: 2fdfe02f2ed4a258
zh: d748228ece579c4a
+2
View File
@@ -27,6 +27,8 @@ English | [中文](README.zh.md)
Starting an app with this package is a small, explicit entry point: you give it a config file and it runs the whole boot. This section covers what you can do and what you get; the helper calls behind each outcome are documented in the folded implementation section.
Profile loading removes retired installation-bundle selections from `dsh.profile.bundles` and rewrites the manifest only when needed, preserving other fields. [Team migration](../../../docs/upgrade-guide/v0.2.1-rc.2/session-team-mode/guide.md) describes the default composition and retained row overrides.
### When to use it
Use it when implementing the shared `dsh` launcher or embedding its lower-level boot helpers. Product features belong in profile bundles instead of new application bins; code that only adds plugins to an already-running app mounts those plugins directly.
+2
View File
@@ -27,6 +27,8 @@ kind: "package-library"
用此包启动应用是一个小而显式的入口:你给它一个配置文件,它运行整个启动过程。本节说明你能做什么、能得到什么;每个结果背后的 helper 调用记录在下方可折叠的实现章节中。
profile 加载时会从 `dsh.profile.bundles` 移除已停用的安装方 bundle 选项,仅在需要时重写 manifest,保留其他字段。[Team 迁移](../../../docs/upgrade-guide/v0.2.1-rc.2/session-team-mode/guide.zh.md)说明默认组合与保留的行覆盖。
### 何时使用
在实现共享 `dsh` launcher 或嵌入其低层启动 helper 时使用它。产品功能应放入 profile 组合包,而不是新增应用 bin;只向已运行应用添加插件的代码直接挂载插件即可。
+2 -2
View File
@@ -394,13 +394,13 @@ describe('loadProfile', () => {
])
})
it('removes a retired bundle from an application-owned profile and keeps the rest of the manifest', () => {
it.each(['@deepseek-ai/dsh-experimental-schedule-bundle', '@deepseek-ai/dsh-experimental-agent-team-profile'])('removes retired %s and keeps the rest of an application-owned manifest', (retired) => {
const anchor = stageInstallation({
'@deepseek-ai/dsh-base': { patch: '[]\n' },
'custom-bundle': { patch: '[]\n' },
})
const dir = join(tmp(), 'app-profile')
initProfile(dir, ['@deepseek-ai/dsh-base', '@deepseek-ai/dsh-experimental-schedule-bundle', 'custom-bundle'])
initProfile(dir, ['@deepseek-ai/dsh-base', retired, 'custom-bundle'])
writeProfileManifest(dir, { ...readProfileManifest('t', dir), dependencies: { 'custom-bundle': '^1.0.0' } })
const profile = loadProfileDirectory('t', dir, anchor)
expect(profile.skippedBundles).toEqual([])
+2
View File
@@ -51,6 +51,8 @@ Out of the box, every profile built on this core provides: a DeepSeek model conn
Both `subagent` and `subagent_fork` create managed children and return a child id immediately. Use `send_message` to steer active children or continue their conversations after completion. [Delegation-tool behavior](../../subagent/tool-subagent/README.md) describes result delivery and backend capabilities.
The bundle also mounts [Agent Teams](../../team/agent-team/README.md) and its task tools. Team mode defaults off per root Session; the root conversation’s **Use Agent Teams** menu switch enables collaboration for that tree without changing the profile.
The built-in `working_directory` tool changes the directory for subsequent operations while existing processes and write permissions remain independent. Current directory information appears in user context. Default file editing uses `read`, `write`, and `edit`. The `str_replace_editor` tool remains available as an explicit opt-in. To add it to a base-backed profile, put this entry in the profile, home, or invocation patch:
```yaml
+2
View File
@@ -51,6 +51,8 @@ kind: "package-bundle"
`subagent` 与 `subagent_fork` 都创建受管理的子任务,并立即返回 child id。使用 `send_message` 可引导活跃子任务,或在完成后继续其对话。[委派工具行为](../../subagent/tool-subagent/README.zh.md)说明了结果交付和后端能力。
此 bundle 还挂载 [Agent Teams](../../team/agent-team/README.zh.md) 及其任务工具。每个根 Session 的 Team 模式默认关闭;根会话菜单中的**使用智能体团队**开关为当前树开启协作,无需修改 profile。
内置 `working_directory` 工具改变后续操作使用的目录,已有进程与写权限保持独立。当前目录信息出现在用户上下文中。默认文件编辑使用 `read`、`write` 和 `edit`。`str_replace_editor` 工具仍可显式启用。要将它加入基于 base 的 profile,请在 profile、home 或逐次调用 patch 中添加以下条目:
```yaml
+8
View File
@@ -359,6 +359,14 @@
- id: subagent
name: '@deepseek-ai/dsh-subagent'
- id: agent-team
name: '@deepseek-ai/dsh-agent-team'
config:
maxTasks: 256
- id: tool-agent-team
name: '@deepseek-ai/dsh-tool-agent-team'
- id: subagent-spawn-in-process
name: '@deepseek-ai/dsh-subagent-spawn-in-process'
config:
+23 -21
View File
@@ -34,13 +34,16 @@
}
},
"dependencies": {
"@deepseek-ai/dsh-hmr": "workspace:*",
"@deepseek-ai/cordis-plugin-timer": "workspace:~",
"@deepseek-ai/dsh-agent": "workspace:*",
"@deepseek-ai/dsh-agent-default-model": "workspace:*",
"@deepseek-ai/dsh-agent-instructions": "workspace:*",
"@deepseek-ai/dsh-agent-loop": "workspace:*",
"@deepseek-ai/dsh-agent-team": "workspace:*",
"@deepseek-ai/dsh-api-gateway": "workspace:*",
"@deepseek-ai/dsh-api-remote-access": "workspace:*",
"@deepseek-ai/dsh-attachment-local": "workspace:*",
"@deepseek-ai/dsh-shell-env": "workspace:*",
"@deepseek-ai/dsh-authorization": "workspace:*",
"@deepseek-ai/dsh-bash-sandbox": "workspace:*",
"@deepseek-ai/dsh-command-compact": "workspace:*",
"@deepseek-ai/dsh-command-feedback": "workspace:*",
@@ -49,24 +52,29 @@
"@deepseek-ai/dsh-compaction-basic": "workspace:*",
"@deepseek-ai/dsh-compaction-image-offload": "workspace:*",
"@deepseek-ai/dsh-compaction-tool-result-pruner": "workspace:*",
"@deepseek-ai/dsh-config-editor": "workspace:*",
"@deepseek-ai/dsh-credentials-local": "workspace:*",
"@deepseek-ai/dsh-deepseek-account-platform": "workspace:*",
"@deepseek-ai/dsh-deepseek-llm-api-extensions": "workspace:*",
"@deepseek-ai/dsh-plugin-package-inventory-deepseek": "workspace:*",
"@deepseek-ai/dsh-fs-local": "workspace:*",
"@deepseek-ai/dsh-fs-observation-policy": "workspace:*",
"@deepseek-ai/dsh-fs-sandbox": "workspace:*",
"@deepseek-ai/dsh-goal": "workspace:*",
"@deepseek-ai/dsh-goal-round-driver": "workspace:*",
"@deepseek-ai/dsh-api-gateway": "workspace:*",
"@deepseek-ai/dsh-api-remote-access": "workspace:*",
"@deepseek-ai/dsh-hmr": "workspace:*",
"@deepseek-ai/dsh-jobs-local": "workspace:*",
"@deepseek-ai/dsh-llm": "workspace:*",
"@deepseek-ai/dsh-llm-deepseek-api-key": "workspace:*",
"@deepseek-ai/dsh-llm-deepseek-account": "workspace:*",
"@deepseek-ai/dsh-llm-deepseek-api-key": "workspace:*",
"@deepseek-ai/dsh-llm-pi-ai": "workspace:*",
"@deepseek-ai/dsh-llm-retry": "workspace:*",
"@deepseek-ai/dsh-mcp-resources": "workspace:*",
"@deepseek-ai/dsh-otel": "workspace:*",
"@deepseek-ai/dsh-permission-presets": "workspace:*",
"@deepseek-ai/dsh-plan-mode": "workspace:*",
"@deepseek-ai/dsh-plugin-manager": "workspace:*",
"@deepseek-ai/dsh-plugin-package-inventory-deepseek": "workspace:*",
"@deepseek-ai/dsh-ptc-runtime-node": "workspace:*",
"@deepseek-ai/dsh-pwsh-sandbox": "workspace:*",
"@deepseek-ai/dsh-repeat-tool-reminder": "workspace:*",
"@deepseek-ai/dsh-sandbox-local": "workspace:*",
@@ -81,6 +89,8 @@
"@deepseek-ai/dsh-session-telemetry-otel": "workspace:*",
"@deepseek-ai/dsh-session-title": "workspace:*",
"@deepseek-ai/dsh-session-title-first-prompt-llm": "workspace:*",
"@deepseek-ai/dsh-settings": "workspace:*",
"@deepseek-ai/dsh-shell-env": "workspace:*",
"@deepseek-ai/dsh-skill": "workspace:*",
"@deepseek-ai/dsh-skill-filesystem": "workspace:*",
"@deepseek-ai/dsh-spill-local": "workspace:*",
@@ -93,44 +103,36 @@
"@deepseek-ai/dsh-subagent-spawn-in-process": "workspace:*",
"@deepseek-ai/dsh-subprocess-local": "workspace:*",
"@deepseek-ai/dsh-system-prompt": "workspace:*",
"@deepseek-ai/dsh-jobs-local": "workspace:*",
"@deepseek-ai/dsh-tool-call-timeout-policy": "workspace:*",
"@deepseek-ai/dsh-token-meter": "workspace:*",
"@deepseek-ai/dsh-tool-agent-team": "workspace:*",
"@deepseek-ai/dsh-tool-bash": "workspace:*",
"@deepseek-ai/dsh-tool-present": "workspace:*",
"@deepseek-ai/dsh-tool-call-timeout-policy": "workspace:*",
"@deepseek-ai/dsh-tool-executor-native": "workspace:*",
"@deepseek-ai/dsh-tool-executor-ptc": "workspace:*",
"@deepseek-ai/dsh-tool-fs": "workspace:*",
"@deepseek-ai/dsh-tool-fs-search": "workspace:*",
"@deepseek-ai/dsh-tool-goal": "workspace:*",
"@deepseek-ai/dsh-tool-jobs": "workspace:*",
"@deepseek-ai/dsh-tool-present": "workspace:*",
"@deepseek-ai/dsh-tool-pwsh": "workspace:*",
"@deepseek-ai/dsh-tool-skill": "workspace:*",
"@deepseek-ai/dsh-tool-subagent": "workspace:*",
"@deepseek-ai/dsh-tool-subagent-control": "workspace:*",
"@deepseek-ai/dsh-tool-jobs": "workspace:*",
"@deepseek-ai/dsh-tool-todo": "workspace:*",
"@deepseek-ai/dsh-tool-web": "workspace:*",
"@deepseek-ai/dsh-tool-workflow": "workspace:*",
"@deepseek-ai/dsh-tool-working-directory": "workspace:*",
"@deepseek-ai/dsh-tools": "workspace:*",
"@deepseek-ai/dsh-typert-loader": "workspace:*",
"@deepseek-ai/dsh-typert-registry": "workspace:*",
"@deepseek-ai/dsh-user-approval": "workspace:*",
"@deepseek-ai/dsh-user-questions": "workspace:*",
"@deepseek-ai/dsh-web": "workspace:*",
"@deepseek-ai/dsh-web-deepseek-api": "workspace:*",
"@deepseek-ai/dsh-web-fetch-http": "workspace:*",
"@deepseek-ai/dsh-web-search-deepseek": "workspace:*",
"@deepseek-ai/dsh-workflow-ptc": "workspace:*",
"@deepseek-ai/dsh-agent-instructions": "workspace:*",
"@deepseek-ai/dsh-ptc-runtime-node": "workspace:*",
"@deepseek-ai/dsh-plugin-manager": "workspace:*",
"@deepseek-ai/dsh-authorization": "workspace:*",
"@deepseek-ai/dsh-deepseek-account-platform": "workspace:*",
"@deepseek-ai/dsh-config-editor": "workspace:*",
"@deepseek-ai/dsh-settings": "workspace:*",
"@deepseek-ai/dsh-otel": "workspace:*",
"@deepseek-ai/dsh-working-directory": "workspace:*",
"@deepseek-ai/dsh-tool-working-directory": "workspace:*",
"@deepseek-ai/dsh-web-deepseek-api": "workspace:*"
"@deepseek-ai/dsh-working-directory": "workspace:*"
},
"peerDependencies": {
"@deepseek-ai/cordis": "workspace:~"
+2 -2
View File
@@ -15,8 +15,8 @@
en: d152484eb41ac6b4
zh: 09388d293f9be9cb
/deepseek-ai-dsh-web-app/use-this-package:
en: 3bd37b85139d2fa7
zh: ba86c807eb83866e
en: 1f69a4c52a27e7e5
zh: e4431a252fb86f7c
/deepseek-ai-dsh-web-app/use-this-package/starting-the-web-gui:
en: e3cac911f080d8ef
zh: 60749e9f5c39c1bc
+2
View File
@@ -31,6 +31,8 @@ Run `dsh --profile web` for browser chat, model and settings management, and ses
Start the GUI, open your browser, and start talking to the agent. The flags fine-tune the invocation.
[Agent Teams UI](../../client/ui-agent-team/README.md) loads with this bundle. Enable it per Session in the model and reasoning menu; shared tasks open below the member tree from the Subagent control.
### Starting the Web GUI
```sh
+2
View File
@@ -31,6 +31,8 @@ kind: "package-bundle"
启动 GUI、打开浏览器,然后开始与 agent(智能体)对话。flag 用于微调本次调用。
[Agent Teams UI](../../client/ui-agent-team/README.zh.md) 随本 bundle 加载。在模型与推理等级菜单中按 Session 开启;通过 Subagent 控件打开成员树,下方显示共享任务。
### 启动 Web GUI
```sh
+3
View File
@@ -382,6 +382,9 @@
- id: ui-skill
name: '@deepseek-ai/dsh-client-ui-skill'
- id: ui-agent-team
name: '@deepseek-ai/dsh-client-ui-agent-team'
- id: ui-subagent
name: '@deepseek-ai/dsh-client-ui-subagent'
+12 -2
View File
@@ -58,6 +58,7 @@
"@deepseek-ai/dsh-agent-instructions": "workspace:*",
"@deepseek-ai/dsh-agent-preset": "workspace:*",
"@deepseek-ai/dsh-agent-preset-registry": "workspace:*",
"@deepseek-ai/dsh-agent-tool-presentation": "workspace:*",
"@deepseek-ai/dsh-api-job-controller": "workspace:*",
"@deepseek-ai/dsh-api-remotes": "workspace:*",
"@deepseek-ai/dsh-api-session-controller": "workspace:*",
@@ -71,8 +72,11 @@
"@deepseek-ai/dsh-client-hmr": "workspace:*",
"@deepseek-ai/dsh-client-locale": "workspace:*",
"@deepseek-ai/dsh-client-modules": "workspace:*",
"@deepseek-ai/dsh-client-product-analytics": "workspace:*",
"@deepseek-ai/dsh-client-resources": "workspace:*",
"@deepseek-ai/dsh-client-shortcuts": "workspace:*",
"@deepseek-ai/dsh-client-ui-agent-preset": "workspace:*",
"@deepseek-ai/dsh-client-ui-agent-team": "workspace:*",
"@deepseek-ai/dsh-client-ui-approval": "workspace:*",
"@deepseek-ai/dsh-client-ui-attachment": "workspace:*",
"@deepseek-ai/dsh-client-ui-brand-official": "workspace:*",
@@ -97,18 +101,21 @@
"@deepseek-ai/dsh-client-ui-plugin-manager": "workspace:*",
"@deepseek-ai/dsh-client-ui-reference": "workspace:*",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-schedule": "workspace:*",
"@deepseek-ai/dsh-client-ui-secret-mask": "workspace:*",
"@deepseek-ai/dsh-client-ui-session": "workspace:*",
"@deepseek-ai/dsh-client-ui-schedule": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-account": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-agent-loop": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-general": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-models": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-plugin-inventory": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-plugins": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-session-log": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-shell": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-agent-loop": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-subagent": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings-web-search": "workspace:*",
"@deepseek-ai/dsh-client-ui-shortcuts": "workspace:*",
"@deepseek-ai/dsh-client-ui-sidebar": "workspace:*",
"@deepseek-ai/dsh-client-ui-sidebar-browser": "workspace:*",
"@deepseek-ai/dsh-client-ui-sidebar-documentpreview": "workspace:*",
@@ -130,14 +137,17 @@
"@deepseek-ai/dsh-compaction-tool-result-pruner": "workspace:*",
"@deepseek-ai/dsh-cordis-client-runner": "workspace:*",
"@deepseek-ai/dsh-cordis-host-runner": "workspace:*",
"@deepseek-ai/dsh-deliverable-file-references": "workspace:*",
"@deepseek-ai/dsh-file-reference": "workspace:*",
"@deepseek-ai/dsh-file-reference-local": "workspace:*",
"@deepseek-ai/dsh-harness-dev-context": "workspace:*",
"@deepseek-ai/dsh-host-directory-picker-auto": "workspace:*",
"@deepseek-ai/dsh-host-directory-picker-browse": "workspace:*",
"@deepseek-ai/dsh-host-directory-picker-native": "workspace:*",
"@deepseek-ai/dsh-host-frontend-static": "workspace:*",
"@deepseek-ai/dsh-host-open-in-app": "workspace:*",
"@deepseek-ai/dsh-host-plugin-inventory": "workspace:*",
"@deepseek-ai/dsh-host-product-telemetry-otel": "workspace:*",
"@deepseek-ai/dsh-host-webserver": "workspace:*",
"@deepseek-ai/dsh-launch-environment": "workspace:*",
"@deepseek-ai/dsh-message-feedback": "workspace:*",
+2 -2
View File
@@ -15,8 +15,8 @@
en: 1eb35b015a6c423f
zh: a8a3dceee2c9e943
/client-web-gui-browser-half/packages:
en: b6fae58a79112e2b
zh: c95394e541d421ba
en: d7adae6baeed495b
zh: 9e49fb00adc8eec1
/client-web-gui-browser-half/related-documentation:
en: d1d506e68fab7333
zh: 1a90fe6f3f8f24a9
+1
View File
@@ -64,6 +64,7 @@ The kernel packages boot and serve the page; the UI feature packages present it.
| [`ui-skill/`](ui-skill/README.md) | Adds skill references to inline suggestions | — |
| [`ui-reference/`](ui-reference/README.md) | Unified Web `@file` / `@session` reference source | — |
| [`ui-secret-mask/`](ui-secret-mask/README.md) | Masks recognized credentials in sent user text | — |
| [`ui-agent-team/`](ui-agent-team/README.md) | Session Team switch and shared tasks below the Subagent tree | — |
| [`ui-subagent/`](ui-subagent/README.md) | Provides subagent navigation, child transcript states, and inline references | — |
| [`ui-jobs/`](ui-jobs/README.md) | Lists this session's background jobs with on-demand streaming record panels | — |
| [`ui-schedule/`](ui-schedule/README.md) | Provides the sidebar Automation tasks page and right Sidebar task tab, which create, edit, run, pause, resume, and delete Host scheduled tasks, plus the Session header clock and row mark | — |

Some files were not shown because too many files have changed in this diff Show More