@nanmicoder/dsh-agent-teams 0.1.16-rc.3 → 0.1.17-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,7 +30,7 @@ Ask in natural language. The plugin provides the team protocol, 13 coordination
30
30
 
31
31
  ## Releases
32
32
 
33
- [v0.1.16-rc.3](./release-notes/v0.1.16-rc.3.md) targets npm `next`, with a concise fixed team protocol, existing-team reuse guidance, Web approval wakeups, and team-lock cleanup. Choose a version pair below.
33
+ [v0.1.17-rc.1](./release-notes/v0.1.17-rc.1.md) supports DeepSeek Harness `0.1.5-rc.1` on the npm `next` channel. It adapts subagent delivery, explicit member initialization, and Web panel navigation while retaining three older host targets.
34
34
 
35
35
  ## Why AgentTeams?
36
36
 
@@ -49,18 +49,19 @@ The conversation card and activity panel use Harness's official locale service.
49
49
 
50
50
  ## Install and choose versions
51
51
 
52
- **Recommended pair: DeepSeek Harness `0.1.2-rc.1` + AgentTeams `0.1.16-rc.3`. Both are still prereleases.**
52
+ **Recommended pair: DeepSeek Harness `0.1.5-rc.1` + AgentTeams `0.1.17-rc.1`. Both are prereleases.**
53
53
 
54
54
  | Use case | DeepSeek Harness | AgentTeams plugin |
55
55
  | --- | --- | --- |
56
- | **Recommended installation** | **`0.1.2-rc.1`** | **`0.1.16-rc.3`** |
57
- | Developer Alpha testing | `0.1.2-alpha.5` | `0.1.16-rc.3` |
58
- | Retaining an older Alpha | `0.1.2-alpha.2` | `0.1.16-rc.3` |
56
+ | **Recommended installation** | **`0.1.5-rc.1`** | **`0.1.17-rc.1`** |
57
+ | Retaining an older RC | `0.1.2-rc.1` | `0.1.17-rc.1` |
58
+ | Developer Alpha testing | `0.1.2-alpha.5` | `0.1.17-rc.1` |
59
+ | Retaining an older Alpha | `0.1.2-alpha.2` | `0.1.17-rc.1` |
59
60
 
60
61
  ### 1. Install DeepSeek Harness
61
62
 
62
63
  ```sh
63
- npm install --global @deepseek-ai/dsh@0.1.2-rc.1
64
+ npm install --global @deepseek-ai/dsh@0.1.5-rc.1
64
65
  dsh --version
65
66
  ```
66
67
 
@@ -68,15 +69,15 @@ Skip this if you already run this version. Alpha is opt-in: select an exact Alph
68
69
 
69
70
  ### 2. Install the AgentTeams plugin
70
71
 
71
- This installs into the `web` profile. Replace `web` with your actual profile name if different:
72
+ Install into the `web` profile. Replace the profile name if needed:
72
73
 
73
74
  ```sh
74
- dsh plugin --profile web add --save-exact @nanmicoder/dsh-agent-teams@0.1.16-rc.3
75
+ dsh plugin --profile web add --save-exact @nanmicoder/dsh-agent-teams@0.1.17-rc.1
75
76
  ```
76
77
 
77
78
  **After installation, stop and restart Harness for that profile, then refresh the browser.**
78
79
 
79
- Plugin `0.1.16-rc.3` uses the `next` channel; `latest` still points to `0.1.15`, which targets Alpha.2. Use the exact-version command above. Future plugin prereleases use `next`; only stable plugin releases that pass the full verification matrix may use `latest`.
80
+ Plugin prereleases use npm `next`; use the exact-version command above. `latest` is not the recommended entry for this host pair. See the [source installation guide](./docs/maintenance-workflow.md) and [release verification](./docs/releases/v0.1.17-rc.1/README.md).
80
81
 
81
82
  > Desktop users must check the app's embedded Harness core; upgrading the global CLI does not upgrade it. For older `0.1.0-*` / `0.1.1-*` or unlisted hosts, keep a working pair and follow the [older-version and diagnostic guide](./docs/maintenance-workflow.md).
82
83
 
@@ -123,6 +124,8 @@ same deterministic activation through a gesture boundary: any genuine user
123
124
  message starting with `/agent-teams` activates the protocol for the rest of
124
125
  the text. Mid-sentence mentions stay ordinary prose.
125
126
 
127
+ Historical panels require saved team state or archives. Sessions from early versions that deleted teams without retaining archives do not yet support reconstructing the full panel from logs.
128
+
126
129
  ## Configuration
127
130
 
128
131
  Defaults work without extra setup. A trusted profile can override member behavior:
package/README_ZH.md CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  ## 版本更新
32
32
 
33
- [v0.1.16-rc.3](./release-notes/v0.1.16-rc.3.md) 面向 npm `next` 渠道,精简固定团队协议、引导复用已有团队,并修复 Web 批准通知和团队锁清理。安装版本见下方配对表。
33
+ [v0.1.17-rc.1](./release-notes/v0.1.17-rc.1.md) 适配 DeepSeek Harness `0.1.5-rc.1`,发布到 npm `next` 渠道。新增子代理投递、成员初始化和 Web 面板导航适配,保留三个旧宿主目标。
34
34
 
35
35
  ## 为什么需要 AgentTeams?
36
36
 
@@ -48,18 +48,19 @@
48
48
 
49
49
  ## 安装与版本选择
50
50
 
51
- **推荐组合:DeepSeek Harness `0.1.2-rc.1` + AgentTeams `0.1.16-rc.3`。两者都仍是预发布版本。**
51
+ **推荐组合:DeepSeek Harness `0.1.5-rc.1` + AgentTeams `0.1.17-rc.1`。两者均为预发布版本。**
52
52
 
53
53
  | 使用场景 | DeepSeek Harness | AgentTeams 插件 |
54
54
  | --- | --- | --- |
55
- | **推荐安装** | **`0.1.2-rc.1`** | **`0.1.16-rc.3`** |
56
- | 开发者测试 Alpha | `0.1.2-alpha.5` | `0.1.16-rc.3` |
57
- | 保留旧 Alpha | `0.1.2-alpha.2` | `0.1.16-rc.3` |
55
+ | **推荐安装** | **`0.1.5-rc.1`** | **`0.1.17-rc.1`** |
56
+ | 保留旧 RC | `0.1.2-rc.1` | `0.1.17-rc.1` |
57
+ | 开发者测试 Alpha | `0.1.2-alpha.5` | `0.1.17-rc.1` |
58
+ | 保留旧 Alpha | `0.1.2-alpha.2` | `0.1.17-rc.1` |
58
59
 
59
60
  ### 1. 安装 DeepSeek Harness
60
61
 
61
62
  ```sh
62
- npm install --global @deepseek-ai/dsh@0.1.2-rc.1
63
+ npm install --global @deepseek-ai/dsh@0.1.5-rc.1
63
64
  dsh --version
64
65
  ```
65
66
 
@@ -67,15 +68,15 @@ dsh --version
67
68
 
68
69
  ### 2. 安装 AgentTeams 插件
69
70
 
70
- 以下安装到 `web` profile;使用其他 profile 时,将 `web` 换成实际名称:
71
+ 安装到 `web` profile;使用其他 profile 时替换名称:
71
72
 
72
73
  ```sh
73
- dsh plugin --profile web add --save-exact @nanmicoder/dsh-agent-teams@0.1.16-rc.3
74
+ dsh plugin --profile web add --save-exact @nanmicoder/dsh-agent-teams@0.1.17-rc.1
74
75
  ```
75
76
 
76
77
  **安装后,停止并重新启动该 profile 的 Harness 进程,再刷新浏览器。**
77
78
 
78
- 插件 `0.1.16-rc.3` 使用 `next` 渠道;当前 `latest` 仍是面向 Alpha.2 的 `0.1.15`。请使用上面的精确版本命令。后续插件预发布版本继续进入 `next`,通过完整验证的正式版本才进入 `latest`。
79
+ 插件预发布使用 npm `next`,请使用上面的精确版本命令;`latest` 不是这组宿主的推荐安装入口。源码安装见[维护指南](./docs/maintenance-workflow.md),验证范围见[本版验收记录](./docs/releases/v0.1.17-rc.1/README.md)。
79
80
 
80
81
  > Desktop 用户需核对应用内置的 Harness 核心;全局 CLI 升级不会升级桌面内核。旧 `0.1.0-*` / `0.1.1-*` 或其他未列出的宿主,请先保留已工作的组合,参考[旧版本与诊断指引](./docs/maintenance-workflow.md)。
81
82
 
@@ -135,6 +136,7 @@ dsh plugin --profile web add --save-exact @nanmicoder/dsh-agent-teams@0.1.16-rc.
135
136
  - 一个队长同一时间只能带一个活动团队。
136
137
  - 没有开放任务的空闲成员会自动续领就绪任务;仍持有开放 attempt 的空闲成员会停驻,队长可发消息让其沿用原 attempt 继续,或显式转派;冷重启遗留的开放任务才会生成新 attempt。暂时无法实时投递的消息会持久保存在邮箱中并在后续状态边界重投。
137
138
  - 状态使用文件持久化,并在单个 DSH 进程内串行操作;多个进程同时修改同一团队不保证一致。
139
+ - 历史面板依赖保存的团队状态或归档;早期版本删除团队时未保留归档的会话,暂不支持从日志重建完整面板。
138
140
  - 活动面板如实展示持久化状态;模型偶尔可能完成工作却没有按协议更新任务状态。
139
141
 
140
142
  完整工具列表、状态模型、Web UI 行为、配置与已知限制见 [docs/usage.md](./docs/usage.md)。
@@ -1,10 +1,23 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "recommendedHost": "0.1.2-rc.1",
3
+ "recommendedHost": "0.1.5-rc.1",
4
4
  "previewTag": "next",
5
5
  "supportedHosts": [
6
- { "version": "0.1.2-rc.1", "track": "recommended" },
7
- { "version": "0.1.2-alpha.5", "track": "preview" },
8
- { "version": "0.1.2-alpha.2", "track": "legacy" }
6
+ {
7
+ "version": "0.1.5-rc.1",
8
+ "track": "recommended"
9
+ },
10
+ {
11
+ "version": "0.1.2-rc.1",
12
+ "track": "legacy"
13
+ },
14
+ {
15
+ "version": "0.1.2-alpha.5",
16
+ "track": "preview"
17
+ },
18
+ {
19
+ "version": "0.1.2-alpha.2",
20
+ "track": "legacy"
21
+ }
9
22
  ]
10
23
  }
@@ -410,7 +410,7 @@ function historicCardTeam(data, owner) {
410
410
  captainInbox: [],
411
411
  };
412
412
  }
413
- export function ActivityPanel({ sessionsList, modelDirectories, openMember, t }) {
413
+ export function ActivityPanel({ sessionsList, modelDirectories, openMember, t, conversationVisible = true }) {
414
414
  // Navigating to a member's subagent transcript is an explicit departure:
415
415
  // hide the floater immediately instead of waiting out the autocollapse
416
416
  // grace, so the panel never lingers over the member session.
@@ -439,7 +439,7 @@ export function ActivityPanel({ sessionsList, modelDirectories, openMember, t })
439
439
  setOpen(false);
440
440
  setOpenOwner(undefined);
441
441
  window.requestAnimationFrame(() => {
442
- document.querySelector('[data-composer-card] textarea')?.focus();
442
+ document.querySelector('[data-composer-card] [contenteditable="true"][role="textbox"], [data-composer-card] textarea')?.focus();
443
443
  });
444
444
  };
445
445
  const { teams, archivedTeams } = useSyncExternalStore(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
@@ -447,7 +447,7 @@ export function ActivityPanel({ sessionsList, modelDirectories, openMember, t })
447
447
  const currentRef = useRef(current);
448
448
  useEffect(() => { currentRef.current = current; }, [current]);
449
449
  const mountedAtRef = useRef(performance.now());
450
- const expanded = activityPanelExpandedForSession(open, openOwner, current);
450
+ const expanded = conversationVisible && activityPanelExpandedForSession(open, openOwner, current);
451
451
  const geometry = useMemo(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);
452
452
  const compact = compactPanelForBounds(bounds);
453
453
  const commitLayout = useCallback((next) => {
@@ -754,7 +754,7 @@ export function ActivityPanel({ sessionsList, modelDirectories, openMember, t })
754
754
  maxHeight: panelMaximumHeight(geometry, bounds),
755
755
  transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`,
756
756
  };
757
- if (!hasTeams && !expanded)
757
+ if (!conversationVisible || (!hasTeams && !expanded))
758
758
  return null;
759
759
  return (_jsxs(_Fragment, { children: [!expanded && (_jsx(CollapsedBadge, { count: visibleCount, busy: busy, t: t, onClick: () => {
760
760
  if (current === undefined)
@@ -5,7 +5,8 @@ import { agentTeamsCardDefinition } from "./agent-teams-card-definition.js";
5
5
  import { AGENT_TEAMS_LOCALE_NAMESPACE, en, zh, } from "./locales.js";
6
6
  import { openAgentTeamMember } from "./session-navigation.js";
7
7
  /** Required services: conversation nodes, slots, sessions navigation, and locale. */
8
- export const inject = ['uiConversation', 'slots', 'sessions', 'locale', 'modelDirectories'];
8
+ export const inject = ['uiConversation', 'slots', 'sessions', 'locale', 'modelDirectories', 'layout'];
9
+ const useLegacyPanelInfo = select => select({ activePanelId: null });
9
10
  /** The replayed user message is the canonical transcript entry. */
10
11
  function HiddenAgentTeamsCommand() {
11
12
  return null;
@@ -18,11 +19,16 @@ function HiddenAgentTeamsCommand() {
18
19
  export function apply(ctx) {
19
20
  ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, { zh, en }), 'agent-teams: dictionaries');
20
21
  const openMember = (parentId, childId) => {
21
- void openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {
22
+ void openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout).catch((error) => {
22
23
  console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
23
24
  });
24
25
  };
25
- const Panel = ({ t }) => (_jsx(ActivityPanel, { sessionsList: ctx.sessions.list, modelDirectories: ctx.modelDirectories, openMember: openMember, t: t }));
26
+ const Panel = ({ t, usePanelInfo }) => {
27
+ // A host's standard hook set is fixed for this mounted plugin instance.
28
+ const usePanel = usePanelInfo ?? useLegacyPanelInfo;
29
+ const conversationVisible = usePanel(panel => panel.activePanelId === null);
30
+ return (_jsx(ActivityPanel, { conversationVisible: conversationVisible, sessionsList: ctx.sessions.list, modelDirectories: ctx.modelDirectories, openMember: openMember, t: t }));
31
+ };
26
32
  ctx.slots.inject('shell.overlay', () => ctx.slots.register({
27
33
  name: 'shell.overlay',
28
34
  id: 'agent-teams-activity',
@@ -5,17 +5,23 @@
5
5
  * Harness rc.8 intentionally removed cold subagents from the ordinary session
6
6
  * list. They must first be rediscovered in their parent's catalog, then opened
7
7
  * with the exact parent/child/mode address. Older runtimes have only `open()`;
8
- * the fallback preserves the plugin's rc.6 peer range.
8
+ * the fallback preserves ordinary-session navigation. New layouts also select
9
+ * the Conversation panel and cancel catalog refreshes superseded by navigation.
9
10
  */
10
- export async function openAgentTeamMember(sessions, parentSessionId, childSessionId) {
11
+ export async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout) {
12
+ const navigation = layout?.beginNavigation?.();
11
13
  if (sessions.openSubagent === undefined || sessions.refreshSubagents === undefined) {
12
14
  sessions.open(childSessionId);
15
+ layout?.selectPanel?.(null);
13
16
  return 'session';
14
17
  }
15
18
  await sessions.refreshSubagents(parentSessionId);
19
+ if (navigation?.aborted)
20
+ return 'cancelled';
16
21
  const retained = sessions.subagentAddress?.(childSessionId);
17
22
  sessions.openSubagent(retained?.parentSessionId === parentSessionId
18
23
  ? retained
19
24
  : { parentSessionId, childSessionId, mode: 'continuable' });
25
+ layout?.selectPanel?.(null);
20
26
  return 'subagent';
21
27
  }
package/lib/client.js CHANGED
@@ -2692,7 +2692,7 @@ window.__ModuleLoader__.load({
2692
2692
  captainInbox: []
2693
2693
  };
2694
2694
  }
2695
- function ActivityPanel({ sessionsList, modelDirectories, openMember, t }) {
2695
+ function ActivityPanel({ sessionsList, modelDirectories, openMember, t, conversationVisible = true }) {
2696
2696
  const navigateToSession = (parentId, childId) => {
2697
2697
  setOpen(false);
2698
2698
  setWasActive(false);
@@ -2722,7 +2722,7 @@ window.__ModuleLoader__.load({
2722
2722
  setOpen(false);
2723
2723
  setOpenOwner(void 0);
2724
2724
  window.requestAnimationFrame(() => {
2725
- document.querySelector("[data-composer-card] textarea")?.focus();
2725
+ document.querySelector("[data-composer-card] [contenteditable=\"true\"][role=\"textbox\"], [data-composer-card] textarea")?.focus();
2726
2726
  });
2727
2727
  };
2728
2728
  const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
@@ -2732,7 +2732,7 @@ window.__ModuleLoader__.load({
2732
2732
  currentRef.current = current;
2733
2733
  }, [current]);
2734
2734
  const mountedAtRef = (0, react.useRef)(performance.now());
2735
- const expanded = activityPanelExpandedForSession(open, openOwner, current);
2735
+ const expanded = conversationVisible && activityPanelExpandedForSession(open, openOwner, current);
2736
2736
  const geometry = (0, react.useMemo)(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);
2737
2737
  const compact = compactPanelForBounds(bounds);
2738
2738
  const commitLayout = (0, react.useCallback)((next) => {
@@ -3006,7 +3006,7 @@ window.__ModuleLoader__.load({
3006
3006
  maxHeight: panelMaximumHeight(geometry, bounds),
3007
3007
  transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`
3008
3008
  };
3009
- if (!hasTeams && !expanded) return null;
3009
+ if (!conversationVisible || !hasTeams && !expanded) return null;
3010
3010
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {
3011
3011
  count: visibleCount,
3012
3012
  busy,
@@ -3620,20 +3620,25 @@ window.__ModuleLoader__.load({
3620
3620
  * Harness rc.8 intentionally removed cold subagents from the ordinary session
3621
3621
  * list. They must first be rediscovered in their parent's catalog, then opened
3622
3622
  * with the exact parent/child/mode address. Older runtimes have only `open()`;
3623
- * the fallback preserves the plugin's rc.6 peer range.
3623
+ * the fallback preserves ordinary-session navigation. New layouts also select
3624
+ * the Conversation panel and cancel catalog refreshes superseded by navigation.
3624
3625
  */
3625
- async function openAgentTeamMember(sessions, parentSessionId, childSessionId) {
3626
+ async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout) {
3627
+ const navigation = layout?.beginNavigation?.();
3626
3628
  if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
3627
3629
  sessions.open(childSessionId);
3630
+ layout?.selectPanel?.(null);
3628
3631
  return "session";
3629
3632
  }
3630
3633
  await sessions.refreshSubagents(parentSessionId);
3634
+ if (navigation?.aborted) return "cancelled";
3631
3635
  const retained = sessions.subagentAddress?.(childSessionId);
3632
3636
  sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
3633
3637
  parentSessionId,
3634
3638
  childSessionId,
3635
3639
  mode: "continuable"
3636
3640
  });
3641
+ layout?.selectPanel?.(null);
3637
3642
  return "subagent";
3638
3643
  }
3639
3644
  //#endregion
@@ -3644,8 +3649,10 @@ window.__ModuleLoader__.load({
3644
3649
  "slots",
3645
3650
  "sessions",
3646
3651
  "locale",
3647
- "modelDirectories"
3652
+ "modelDirectories",
3653
+ "layout"
3648
3654
  ];
3655
+ const useLegacyPanelInfo = (select) => select({ activePanelId: null });
3649
3656
  /** The replayed user message is the canonical transcript entry. */
3650
3657
  function HiddenAgentTeamsCommand() {
3651
3658
  return null;
@@ -3661,16 +3668,19 @@ window.__ModuleLoader__.load({
3661
3668
  en
3662
3669
  }), "agent-teams: dictionaries");
3663
3670
  const openMember = (parentId, childId) => {
3664
- openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {
3671
+ openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout).catch((error) => {
3665
3672
  console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
3666
3673
  });
3667
3674
  };
3668
- const Panel = ({ t }) => (0, react_jsx_runtime.jsx)(ActivityPanel, {
3669
- sessionsList: ctx.sessions.list,
3670
- modelDirectories: ctx.modelDirectories,
3671
- openMember,
3672
- t
3673
- });
3675
+ const Panel = ({ t, usePanelInfo }) => {
3676
+ return (0, react_jsx_runtime.jsx)(ActivityPanel, {
3677
+ conversationVisible: (usePanelInfo ?? useLegacyPanelInfo)((panel) => panel.activePanelId === null),
3678
+ sessionsList: ctx.sessions.list,
3679
+ modelDirectories: ctx.modelDirectories,
3680
+ openMember,
3681
+ t
3682
+ });
3683
+ };
3674
3684
  ctx.slots.inject("shell.overlay", () => ctx.slots.register({
3675
3685
  name: "shell.overlay",
3676
3686
  id: "agent-teams-activity",