@nanmicoder/dsh-agent-teams 0.1.12 → 0.1.13

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
@@ -78,7 +78,7 @@ Then ask for a team directly:
78
78
  1. The current session creates a team and becomes its captain.
79
79
  2. The captain adds role-specific members backed by continuable sub-agents.
80
80
  3. The goal becomes tasks with owners and explicit dependencies.
81
- 4. The shared scheduler uses real `running / idle / ready` state to atomically claim one ready task per idle member and wake it. If an idle/ready member still owns an open task after an interrupted turn or process restart, the scheduler retries it with a fresh attempt.
81
+ 4. The shared scheduler uses real `running / idle / ready` state to atomically claim one ready task per idle member and wake it. An interrupted resident attempt stays parked and can resume through a direct message without losing its capability; after a cold process restart, the scheduler retries stranded open work with a fresh attempt.
82
82
  5. Members update with the current `attempt_id`; reassignment or captain takeover revokes the old attempt and waits for the old worker to quiesce before a new attempt starts.
83
83
  6. The captain presents the combined result, then archives the complete team record.
84
84
 
@@ -129,7 +129,7 @@ Defaults work without extra setup. A trusted profile can override member behavio
129
129
  ## Boundaries
130
130
 
131
131
  - One captain leads one active team at a time.
132
- - Idle members are automatically reused for ready work; messages that cannot be delivered live remain durable and are retried at a later status boundary.
132
+ - Idle members with no open task are automatically reused for ready work. An idle member that still owns an open attempt is parked until messaged or explicitly reassigned; messages that cannot be delivered live remain durable and are retried at a later status boundary.
133
133
  - State is file-backed and serialized within one DSH process; concurrent processes editing the same team are not coordinated.
134
134
  - The activity panel reports persisted state as-is. Models may occasionally finish work without performing the expected task-state update.
135
135
 
package/README_ZH.md CHANGED
@@ -78,7 +78,7 @@ dsh web
78
78
  1. 当前会话创建团队并成为队长。
79
79
  2. 队长按角色添加由可续聊子 Agent 驱动的成员。
80
80
  3. 目标被拆成有负责人和显式依赖的任务。
81
- 4. 共享调度器依据真实 `running / idle / ready` 状态,为每个空闲成员原子领取一项就绪任务并唤醒它;成员在中断或进程重启后仍持有开放任务时,会以新 attempt 自动恢复执行。
81
+ 4. 共享调度器依据真实 `running / idle / ready` 状态,为每个空闲成员原子领取一项就绪任务并唤醒它;驻留成员被中断时会停驻当前 attempt,可通过直接消息继续而不丢 capability;只有冷进程重启后的遗留任务才会生成新 attempt 恢复。
82
82
  5. 成员携带当前 `attempt_id` 更新任务;转派或队长接管会先撤销旧 attempt、等待原成员安静,再启动新 attempt。
83
83
  6. 队长汇总结果,随后归档完整团队记录。
84
84
 
@@ -119,7 +119,7 @@ dsh web
119
119
  ## 使用边界
120
120
 
121
121
  - 一个队长同一时间只能带一个活动团队。
122
- - 成员空闲后由共享调度器自动续领就绪任务;中断/冷重启遗留的开放任务会生成新 attempt 并重新唤醒原成员;暂时无法实时投递的消息会持久保存在邮箱中并在后续状态边界重投。
122
+ - 没有开放任务的空闲成员会自动续领就绪任务;仍持有开放 attempt 的空闲成员会停驻,队长可发消息让其沿用原 attempt 继续,或显式转派;冷重启遗留的开放任务才会生成新 attempt。暂时无法实时投递的消息会持久保存在邮箱中并在后续状态边界重投。
123
123
  - 状态使用文件持久化,并在单个 DSH 进程内串行操作;多个进程同时修改同一团队不保证一致。
124
124
  - 活动面板如实展示持久化状态;模型偶尔可能完成工作却没有按协议更新任务状态。
125
125
 
@@ -99,18 +99,30 @@ export function updateActivitySnapshots(update) {
99
99
  }
100
100
  /** Poll cadence for the live host snapshot route. */
101
101
  export const ACTIVITY_POLL_MS = 1000;
102
+ /**
103
+ * Low-frequency probe cadence while a cardless discovery session still owns
104
+ * no team. The probe keeps the panel able to pick up a team created later in
105
+ * that session (e.g. a run_code-wrapped agent_teams_create) without turning
106
+ * every ordinary session into a one-second filesystem scan.
107
+ */
108
+ export const ACTIVITY_PROBE_MS = 5000;
102
109
  /** Host route serving live and archived team snapshots. */
103
110
  export const ACTIVITY_STATE_URL = '/plugins/dsh-agent-teams/state';
104
111
  /**
105
112
  * Start the single polling loop for the current session's requested targets.
106
113
  *
107
114
  * With neither targets nor a discovery session this is deliberately inert.
108
- * A discovery session performs one live+archive pass after selection/restart;
109
- * it keeps polling only while that captain still owns a live team. This
110
- * restores legacy/cardless history without turning every ordinary session
111
- * into a permanent one-second filesystem scan. Explicit card targets retain
112
- * the normal cadence, and archive state is refreshed when a target or a
113
- * previously discovered live team disappears.
115
+ * Explicit card targets poll at the live cadence from the start. A discovery
116
+ * session performs an immediate live+archive restore pass, then while it
117
+ * still owns no team probes on a low-frequency cadence, so a team created
118
+ * later in that session (e.g. a run_code-wrapped agent_teams_create) is
119
+ * discovered without a manual reload, without turning every ordinary session
120
+ * into a one-second filesystem scan. The moment a team for the discovery
121
+ * session appears, the controller upgrades to the live one-second cadence for
122
+ * the rest of its lifetime. The caller — the session view, which stops the
123
+ * controller when the session is no longer current — bounds the lifetime, and
124
+ * archive state is refreshed when a target or a previously discovered live
125
+ * team disappears.
114
126
  */
115
127
  export function startActivityPolling(monitorTargets, runtime = {}) {
116
128
  const discoverySessionId = runtime.discoverySessionId?.trim();
@@ -124,16 +136,21 @@ export function startActivityPolling(monitorTargets, runtime = {}) {
124
136
  const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;
125
137
  let cancelled = false;
126
138
  let inFlight = false;
139
+ // Explicit card targets are demanded work: start at the live cadence. A
140
+ // discovery session starts probing low-frequency and upgrades on detection.
141
+ let hot = monitorTargets.length > 0;
127
142
  let discoveryComplete = false;
128
143
  let discoveredLiveKeys = new Set();
129
144
  let controller;
145
+ let timer;
146
+ const intervalMs = () => (hot ? ACTIVITY_POLL_MS : ACTIVITY_PROBE_MS);
147
+ const reschedule = () => {
148
+ cancel(timer);
149
+ timer = schedule(() => { void tick(); }, intervalMs());
150
+ };
130
151
  const tick = async () => {
131
152
  if (inFlight || cancelled)
132
153
  return;
133
- // A cardless ordinary or archive-only session needs one recovery pass,
134
- // then stays dormant until the component is recreated for another session.
135
- if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0)
136
- return;
137
154
  inFlight = true;
138
155
  controller = new AbortController();
139
156
  try {
@@ -154,6 +171,12 @@ export function startActivityPolling(monitorTargets, runtime = {}) {
154
171
  : liveTeams
155
172
  .filter((team) => team.captainSessionId === discoverySessionId)
156
173
  .map((team) => team.teamId));
174
+ // A discovery session found its first team: upgrade from the low-frequency
175
+ // probe to the live cadence for the rest of the controller lifetime.
176
+ if (!hot && discoveredLiveKeys.size > 0) {
177
+ hot = true;
178
+ reschedule();
179
+ }
157
180
  const discoveredTeamArchived = [...previousDiscoveredKeys]
158
181
  .some((teamId) => !discoveredLiveKeys.has(teamId));
159
182
  const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));
@@ -164,8 +187,9 @@ export function startActivityPolling(monitorTargets, runtime = {}) {
164
187
  return;
165
188
  // Archives are immutable per team generation. A successful fallback
166
189
  // retires every missing explicit target, including legacy cards whose
167
- // host archive no longer exists; discovery remains available from the
168
- // shared snapshot after this controller becomes dormant.
190
+ // host archive no longer exists; a discovery session that already
191
+ // upgraded keeps polling, and a still-probing one keeps probing, so a
192
+ // team created later in the same session stays discoverable.
169
193
  const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {
170
194
  cache: 'no-store',
171
195
  signal: controller.signal,
@@ -189,7 +213,8 @@ export function startActivityPolling(monitorTargets, runtime = {}) {
189
213
  }
190
214
  };
191
215
  const firstTick = tick();
192
- const timer = schedule(() => { void tick(); }, ACTIVITY_POLL_MS);
216
+ if (timer === undefined)
217
+ timer = schedule(() => { void tick(); }, intervalMs());
193
218
  return {
194
219
  firstTick,
195
220
  stop: () => {
package/lib/client.js CHANGED
@@ -241,18 +241,30 @@ window.__ModuleLoader__.load({
241
241
  }
242
242
  /** Poll cadence for the live host snapshot route. */
243
243
  const ACTIVITY_POLL_MS = 1e3;
244
+ /**
245
+ * Low-frequency probe cadence while a cardless discovery session still owns
246
+ * no team. The probe keeps the panel able to pick up a team created later in
247
+ * that session (e.g. a run_code-wrapped agent_teams_create) without turning
248
+ * every ordinary session into a one-second filesystem scan.
249
+ */
250
+ const ACTIVITY_PROBE_MS = 5e3;
244
251
  /** Host route serving live and archived team snapshots. */
245
252
  const ACTIVITY_STATE_URL = "/plugins/dsh-agent-teams/state";
246
253
  /**
247
254
  * Start the single polling loop for the current session's requested targets.
248
255
  *
249
256
  * With neither targets nor a discovery session this is deliberately inert.
250
- * A discovery session performs one live+archive pass after selection/restart;
251
- * it keeps polling only while that captain still owns a live team. This
252
- * restores legacy/cardless history without turning every ordinary session
253
- * into a permanent one-second filesystem scan. Explicit card targets retain
254
- * the normal cadence, and archive state is refreshed when a target or a
255
- * previously discovered live team disappears.
257
+ * Explicit card targets poll at the live cadence from the start. A discovery
258
+ * session performs an immediate live+archive restore pass, then while it
259
+ * still owns no team probes on a low-frequency cadence, so a team created
260
+ * later in that session (e.g. a run_code-wrapped agent_teams_create) is
261
+ * discovered without a manual reload, without turning every ordinary session
262
+ * into a one-second filesystem scan. The moment a team for the discovery
263
+ * session appears, the controller upgrades to the live one-second cadence for
264
+ * the rest of its lifetime. The caller — the session view, which stops the
265
+ * controller when the session is no longer current — bounds the lifetime, and
266
+ * archive state is refreshed when a target or a previously discovered live
267
+ * team disappears.
256
268
  */
257
269
  function startActivityPolling(monitorTargets, runtime = {}) {
258
270
  const discoverySessionId = runtime.discoverySessionId?.trim();
@@ -269,12 +281,20 @@ window.__ModuleLoader__.load({
269
281
  const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;
270
282
  let cancelled = false;
271
283
  let inFlight = false;
284
+ let hot = monitorTargets.length > 0;
272
285
  let discoveryComplete = false;
273
286
  let discoveredLiveKeys = /* @__PURE__ */ new Set();
274
287
  let controller;
288
+ let timer;
289
+ const intervalMs = () => hot ? ACTIVITY_POLL_MS : ACTIVITY_PROBE_MS;
290
+ const reschedule = () => {
291
+ cancel(timer);
292
+ timer = schedule(() => {
293
+ tick();
294
+ }, intervalMs());
295
+ };
275
296
  const tick = async () => {
276
297
  if (inFlight || cancelled) return;
277
- if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0) return;
278
298
  inFlight = true;
279
299
  controller = new AbortController();
280
300
  try {
@@ -289,6 +309,10 @@ window.__ModuleLoader__.load({
289
309
  publishSnapshots({ teams: liveTeams });
290
310
  const previousDiscoveredKeys = discoveredLiveKeys;
291
311
  discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));
312
+ if (!hot && discoveredLiveKeys.size > 0) {
313
+ hot = true;
314
+ reschedule();
315
+ }
292
316
  const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));
293
317
  const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));
294
318
  const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;
@@ -310,9 +334,9 @@ window.__ModuleLoader__.load({
310
334
  }
311
335
  };
312
336
  const firstTick = tick();
313
- const timer = schedule(() => {
337
+ if (timer === void 0) timer = schedule(() => {
314
338
  tick();
315
- }, ACTIVITY_POLL_MS);
339
+ }, intervalMs());
316
340
  return {
317
341
  firstTick,
318
342
  stop: () => {
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["css","css","IconBranchOutline16","_Fragment","IconPanelLeftOutline16","IconChevronDownOutline14"],"sources":["client/activity-model.js","client/activity-monitor.js","client/artwork.js","client/AgentTeamsCard.js","client/panel-geometry.js","client/ActivityPanel.js","client/agent-teams-card-definition.js","client/locales.js","client/session-navigation.js","client/index.js"],"sourcesContent":["/** Pure relationship projections used by the AgentTeams activity panel. */\n/** Reference-panel geometry: narrow nodes with enough room for curved edges. */\nexport const COMPACT_DAG_NODE_WIDTH = 92;\nexport const COMPACT_DAG_NODE_HEIGHT = 30;\nexport const COMPACT_DAG_COLUMN_GAP = 26;\nexport const COMPACT_DAG_ROW_GAP = 8;\n/** Use a fill-width grid when the task graph has no real dependency edges. */\nexport function usesParallelTaskGrid(tasks) {\n if (tasks.length === 0)\n return false;\n const taskIds = new Set(tasks.map((task) => task.id));\n return tasks.every((task) => task.dependencies.every((dependency) => !taskIds.has(dependency)));\n}\n/**\n * Whether an expanded activity panel still belongs to the current session.\n *\n * The panel is mounted in the root-scoped shell overlay, so React does not\n * remount it when the conversation route changes. Ownership keeps an expanded\n * panel from leaking onto the new-session screen (or another conversation)\n * while its local open state is being reset.\n */\nexport function activityPanelExpandedForSession(open, owner, current) {\n return open && owner !== undefined && owner === current;\n}\n/**\n * Resolve the task whose dependency chain should be highlighted.\n *\n * A pinned task is an explicit user choice. Keyboard focus takes precedence\n * over delayed pointer intent so an older hover timer cannot steal the active\n * chain from someone navigating the task map with the keyboard.\n */\nexport function dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId) {\n return pinnedTaskId ?? keyboardTaskId ?? hoverTaskId;\n}\n/** Group tasks by their precomputed dependency depth. */\nexport function taskStages(tasks) {\n const byDepth = new Map();\n for (const task of tasks) {\n const depth = Number.isFinite(task.depth) ? Math.max(0, Math.floor(task.depth)) : 0;\n const stage = byDepth.get(depth) ?? [];\n stage.push(task);\n byDepth.set(depth, stage);\n }\n return [...byDepth.entries()]\n .sort(([left], [right]) => left - right)\n .map(([depth, stageTasks]) => ({\n depth,\n tasks: stageTasks.slice().sort((left, right) => left.id.localeCompare(right.id, 'en', { numeric: true })),\n }));\n}\n/**\n * Lay tasks out as the reference panel's compact left-to-right DAG.\n *\n * Columns are dependency-depth stages. Rows are stable task-id order within\n * each stage. Edges use cubic curves so fan-in remains readable without\n * turning every task into a large card.\n */\nexport function compactDagLayout(tasks) {\n const stages = taskStages(tasks);\n const positions = new Map();\n const nodes = [];\n for (const [column, stage] of stages.entries()) {\n for (const [row, task] of stage.tasks.entries()) {\n const x = column * (COMPACT_DAG_NODE_WIDTH + COMPACT_DAG_COLUMN_GAP);\n const y = row * (COMPACT_DAG_NODE_HEIGHT + COMPACT_DAG_ROW_GAP);\n positions.set(task.id, { x, y });\n nodes.push({ task, x, y });\n }\n }\n const edges = [];\n for (const task of tasks) {\n const target = positions.get(task.id);\n if (target === undefined)\n continue;\n for (const dependency of task.dependencies) {\n const source = positions.get(dependency);\n if (source === undefined)\n continue;\n const x1 = source.x + COMPACT_DAG_NODE_WIDTH;\n const y1 = source.y + COMPACT_DAG_NODE_HEIGHT / 2;\n const x2 = target.x;\n const y2 = target.y + COMPACT_DAG_NODE_HEIGHT / 2;\n edges.push({\n from: dependency,\n to: task.id,\n path: `M${x1} ${y1}C${x1 + 14} ${y1},${x2 - 14} ${y2},${x2} ${y2}`,\n });\n }\n }\n const rows = Math.max(1, ...stages.map((stage) => stage.tasks.length));\n return {\n width: stages.length === 0\n ? 0\n : stages.length * COMPACT_DAG_NODE_WIDTH + (stages.length - 1) * COMPACT_DAG_COLUMN_GAP,\n height: stages.length === 0\n ? 0\n : rows * COMPACT_DAG_NODE_HEIGHT + (rows - 1) * COMPACT_DAG_ROW_GAP,\n nodes,\n edges,\n };\n}\n/**\n * Return the complete upstream/downstream chain around one task.\n *\n * Traversal uses both dependency directions and remains cycle-safe, so the UI\n * can highlight every handoff related to the focused task even if malformed\n * durable data contains a cycle.\n */\nexport function relatedTaskIds(taskId, tasks) {\n const byId = new Map(tasks.map((task) => [task.id, task]));\n if (!byId.has(taskId))\n return new Set();\n const dependents = new Map();\n for (const task of tasks) {\n for (const dependency of task.dependencies) {\n const targets = dependents.get(dependency) ?? [];\n targets.push(task.id);\n dependents.set(dependency, targets);\n }\n }\n const related = new Set();\n const upstreamSeen = new Set();\n const downstreamSeen = new Set();\n const visitUpstream = (id) => {\n if (upstreamSeen.has(id))\n return;\n upstreamSeen.add(id);\n related.add(id);\n for (const dependency of byId.get(id)?.dependencies ?? [])\n visitUpstream(dependency);\n };\n const visitDownstream = (id) => {\n if (downstreamSeen.has(id))\n return;\n downstreamSeen.add(id);\n related.add(id);\n for (const dependent of dependents.get(id) ?? [])\n visitDownstream(dependent);\n };\n visitUpstream(taskId);\n visitDownstream(taskId);\n return related;\n}\n","/** Shared, demand-driven state for the AgentTeams browser monitor. */\nconst targets = new Map();\nconst targetListeners = new Set();\nconst snapshotListeners = new Set();\nlet targetSnapshot = [];\nlet activitySnapshots = { teams: [], archivedTeams: [] };\nfunction targetKey(sessionId, teamId) {\n return `${sessionId}\\u0000${teamId}`;\n}\nfunction publishTargets() {\n targetSnapshot = [...targets.values()]\n .filter((target) => target.active)\n .map(({ key, sessionId, teamId }) => ({ key, sessionId, teamId }));\n for (const listener of targetListeners)\n listener();\n}\n/** Subscribe to the active monitor-target list (React external-store shape). */\nexport function subscribeActivityMonitorTargets(listener) {\n targetListeners.add(listener);\n return () => { targetListeners.delete(listener); };\n}\n/** Read the stable active-target snapshot. */\nexport function getActivityMonitorTargetsSnapshot() {\n return targetSnapshot;\n}\n/**\n * Register one successful AgentTeams card as a monitoring demand.\n *\n * The returned cleanup is reference-counted so multiple cards and React\n * StrictMode remounts cannot stop another card's monitor.\n */\nexport function monitorAgentTeam(sessionId, teamId) {\n const owner = sessionId.trim();\n const id = teamId.trim();\n if (owner === '' || id === '')\n return () => { };\n const key = targetKey(owner, id);\n const existing = targets.get(key);\n if (existing === undefined) {\n targets.set(key, { key, sessionId: owner, teamId: id, refs: 1, active: true });\n publishTargets();\n }\n else {\n existing.refs += 1;\n if (!existing.active) {\n existing.active = true;\n publishTargets();\n }\n }\n let released = false;\n return () => {\n if (released)\n return;\n released = true;\n const current = targets.get(key);\n if (current === undefined)\n return;\n current.refs -= 1;\n if (current.refs <= 0) {\n targets.delete(key);\n if (current.active)\n publishTargets();\n }\n };\n}\n/** Stop polling targets whose final archived snapshot has been captured. */\nexport function settleActivityMonitorTargets(keys) {\n let changed = false;\n for (const key of keys) {\n const target = targets.get(key);\n if (target?.active !== true)\n continue;\n target.active = false;\n changed = true;\n }\n if (changed)\n publishTargets();\n}\n/** Subscribe to the shared live/archive snapshot. */\nexport function subscribeActivitySnapshots(listener) {\n snapshotListeners.add(listener);\n return () => { snapshotListeners.delete(listener); };\n}\n/** Read the stable shared live/archive snapshot. */\nexport function getActivitySnapshotsSnapshot() {\n return activitySnapshots;\n}\n/** Publish one or both successful state-route responses. */\nexport function updateActivitySnapshots(update) {\n const next = {\n teams: update.teams ?? activitySnapshots.teams,\n archivedTeams: update.archivedTeams ?? activitySnapshots.archivedTeams,\n };\n if (next.teams === activitySnapshots.teams && next.archivedTeams === activitySnapshots.archivedTeams)\n return;\n activitySnapshots = next;\n for (const listener of snapshotListeners)\n listener();\n}\n/** Poll cadence for the live host snapshot route. */\nexport const ACTIVITY_POLL_MS = 1000;\n/** Host route serving live and archived team snapshots. */\nexport const ACTIVITY_STATE_URL = '/plugins/dsh-agent-teams/state';\n/**\n * Start the single polling loop for the current session's requested targets.\n *\n * With neither targets nor a discovery session this is deliberately inert.\n * A discovery session performs one live+archive pass after selection/restart;\n * it keeps polling only while that captain still owns a live team. This\n * restores legacy/cardless history without turning every ordinary session\n * into a permanent one-second filesystem scan. Explicit card targets retain\n * the normal cadence, and archive state is refreshed when a target or a\n * previously discovered live team disappears.\n */\nexport function startActivityPolling(monitorTargets, runtime = {}) {\n const discoverySessionId = runtime.discoverySessionId?.trim();\n if (monitorTargets.length === 0 && (discoverySessionId === undefined || discoverySessionId === '')) {\n return { firstTick: Promise.resolve(), stop: () => { } };\n }\n const fetchState = runtime.fetchState ?? ((url, init) => fetch(url, init));\n const schedule = runtime.schedule ?? ((callback, intervalMs) => setInterval(callback, intervalMs));\n const cancel = runtime.cancel ?? ((timer) => { clearInterval(timer); });\n const publishSnapshots = runtime.publishSnapshots ?? updateActivitySnapshots;\n const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;\n let cancelled = false;\n let inFlight = false;\n let discoveryComplete = false;\n let discoveredLiveKeys = new Set();\n let controller;\n const tick = async () => {\n if (inFlight || cancelled)\n return;\n // A cardless ordinary or archive-only session needs one recovery pass,\n // then stays dormant until the component is recreated for another session.\n if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0)\n return;\n inFlight = true;\n controller = new AbortController();\n try {\n const liveResponse = await fetchState(ACTIVITY_STATE_URL, {\n cache: 'no-store',\n signal: controller.signal,\n });\n if (!liveResponse.ok)\n return;\n const body = (await liveResponse.json());\n if (cancelled || !Array.isArray(body.teams))\n return;\n const liveTeams = body.teams;\n publishSnapshots({ teams: liveTeams });\n const previousDiscoveredKeys = discoveredLiveKeys;\n discoveredLiveKeys = new Set(discoverySessionId === undefined || discoverySessionId === ''\n ? []\n : liveTeams\n .filter((team) => team.captainSessionId === discoverySessionId)\n .map((team) => team.teamId));\n const discoveredTeamArchived = [...previousDiscoveredKeys]\n .some((teamId) => !discoveredLiveKeys.has(teamId));\n const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));\n const needsDiscoveryArchive = discoverySessionId !== undefined\n && discoverySessionId !== ''\n && !discoveryComplete;\n if (missing.length === 0 && !needsDiscoveryArchive && !discoveredTeamArchived)\n return;\n // Archives are immutable per team generation. A successful fallback\n // retires every missing explicit target, including legacy cards whose\n // host archive no longer exists; discovery remains available from the\n // shared snapshot after this controller becomes dormant.\n const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {\n cache: 'no-store',\n signal: controller.signal,\n });\n if (!archivedResponse.ok)\n return;\n const archivedBody = (await archivedResponse.json());\n if (cancelled || !Array.isArray(archivedBody.teams))\n return;\n publishSnapshots({ archivedTeams: archivedBody.teams });\n discoveryComplete = true;\n settleTargets(new Set(missing.map((target) => target.key)));\n }\n catch (error) {\n if (error?.name === 'AbortError')\n return;\n // Host restarting; keep the last snapshot and retry on the next tick.\n }\n finally {\n inFlight = false;\n }\n };\n const firstTick = tick();\n const timer = schedule(() => { void tick(); }, ACTIVITY_POLL_MS);\n return {\n firstTick,\n stop: () => {\n if (cancelled)\n return;\n cancelled = true;\n controller?.abort();\n cancel(timer);\n },\n };\n}\n","/**\n * Shared whale artwork lookup for the activity panel and the conversation\n * card: role keywords map to the packaged role images; the captain always\n * uses the lead whale.\n * @module dsh-agent-teams/client/artwork\n */\n/** Artwork route prefix served by the plugin host half. */\nexport const ART_BASE = '/plugins/dsh-agent-teams/assets/';\n/** V2 whale role artwork per role keyword. */\nconst ROLE_ART = [\n [/data|analys|metric|performance|数据|分析|指标|性能/, 'member-data-v2.png'],\n [/resear|investig|explor|study|研究|调查|探索|调研/, 'member-researcher-v2.png'],\n // Match compound QA titles (for example \"QA Engineer\") before the broad\n // engineer bucket, otherwise an eight-role roster repeats the engineer art.\n [/\\bqa\\b|test|verif|quality|测试|质量|验证/, 'member-qa-v2.png'],\n [/engineer|dev\\b|server|backend|\\bapi\\b|runtime|watcher|contract|工程|后端|服务|接口|开发|代码|编程/, 'member-engineer-v2.png'],\n [/design|\\bui\\b|\\bux\\b|front|theme|accessib|设计|前端|主题|无障碍/, 'member-designer-v2.png'],\n [/secur|audit|risk|threat|review|安全|审计|审查|风险/, 'member-security-v2.png'],\n [/docs|writer|product|spec|撰写|文案|写作|文档|规范/, 'member-docs-v2.png'],\n [/release|\\bbuild\\b|deploy|\\bops\\b|\\bci\\b|ship|coordin|发布|构建|部署|运维|协调/, 'member-operator-v2.png'],\n];\n/** Captain artwork (always the lead whale). */\nexport const LEAD_ART = `${ART_BASE}team-lead-v2.png`;\n/** Status action artwork per member activity. */\nexport const ACTION_ART = {\n working: `${ART_BASE}action-working-v2.png`,\n idle: `${ART_BASE}action-sleeping-v2.png`,\n unknown: `${ART_BASE}action-thinking-v2.png`,\n};\n/**\n * Member artwork URL, or null when no role matches (initial-letter fallback).\n * @param name - the member's display name.\n * @param role - the member's role text.\n * @returns the artwork URL, or null when unmatched.\n */\nexport function memberArtUrl(name, role) {\n const identity = `${name} ${role}`.toLowerCase();\n for (const [pattern, art] of ROLE_ART) {\n if (pattern.test(identity))\n return `${ART_BASE}${art}`;\n }\n return null;\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * AgentTeams conversation card: the lightweight in-conversation summary for\n * one team — the captain's whale avatar and name, the member roster as\n * clickable whale avatars (opening the member's subagent transcript), and\n * an \"activity panel\" button that re-activates the top-right floater.\n *\n * The floater and this card share the `agent-teams:open-panel` window event\n * so the card can summon the panel even after it was closed (or when an old\n * session is re-opened for review).\n * @module dsh-agent-teams/client/card\n */\nimport { useEffect, useMemo, useSyncExternalStore } from 'react';\nimport { getActivitySnapshotsSnapshot, monitorAgentTeam, subscribeActivitySnapshots, } from \"./activity-monitor.js\";\nimport { LEAD_ART, memberArtUrl } from \"./artwork.js\";\nimport css from './AgentTeamsCard.module.css';\n/** Window event name the floater listens for to open itself. */\nexport const OPEN_PANEL_EVENT = 'agent-teams:open-panel';\n/** Re-activate the top-right activity panel, carrying this team's summary\n * so the panel can show it even when the team no longer exists on disk\n * (historical session review). */\nfunction openActivityPanel(data) {\n window.dispatchEvent(new CustomEvent(OPEN_PANEL_EVENT, {\n detail: {\n teamId: data.teamId,\n captainSessionId: data.captainSessionId,\n teamName: data.teamName,\n members: data.members,\n },\n }));\n}\n/** Render one durable team as a compact conversation card. */\nexport function AgentTeamsCard({ node, openMember, sessionId, t }) {\n const data = node.data;\n // `conversation.chat.node` is session-scoped, so its framework-owned id is\n // a stable owner even while another conversation becomes current.\n const owner = data.captainSessionId || sessionId;\n const { teams, archivedTeams } = useSyncExternalStore(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n useEffect(() => {\n return monitorAgentTeam(owner, data.teamId);\n }, [data.teamId, owner]);\n const snapshot = teams.find((team) => team.teamId === data.teamId && (owner === '' || team.captainSessionId === owner))\n ?? archivedTeams.find((team) => team.teamId === data.teamId && (owner === '' || team.captainSessionId === owner));\n const resolved = useMemo(() => ({\n ...data,\n captainSessionId: snapshot?.captainSessionId ?? owner,\n teamName: snapshot?.name ?? data.teamName,\n members: snapshot?.members.map((member) => ({ id: member.id, name: member.name, role: member.role })) ?? data.members,\n }), [data, owner, snapshot]);\n return (_jsxs(\"section\", { className: css.root, \"data-agent-teams-card\": true, \"data-team-id\": resolved.teamId, children: [_jsxs(\"header\", { className: css.head, children: [_jsx(\"img\", { className: css.leadAvatar, src: LEAD_ART, alt: \"\", \"aria-hidden\": true }), _jsx(\"span\", { className: css.teamName, title: resolved.teamName, children: resolved.teamName }), _jsx(\"span\", { className: css.memberCount, children: t('card.memberCount', { count: resolved.members.length }) }), _jsx(\"button\", { type: \"button\", className: css.panelButton, onClick: () => { openActivityPanel(resolved); }, \"aria-label\": t('action.openActivityPanel'), title: t('action.openActivityPanel'), children: t('activity.panelButton') })] }), resolved.members.length > 0 && (_jsx(\"div\", { className: css.members, children: resolved.members.map((member) => (_jsxs(\"button\", { type: \"button\", className: css.member, onClick: () => {\n if (member.id !== '')\n openMember(owner, member.id);\n }, title: member.role === '' ? member.name : `${member.name} · ${member.role}`, children: [memberArtUrl(member.name, member.role) !== null ? (_jsx(\"img\", { className: css.memberArt, src: memberArtUrl(member.name, member.role) ?? '', alt: \"\", \"aria-hidden\": true })) : (_jsx(\"span\", { className: css.memberInitial, children: member.name.trim().slice(0, 1).toUpperCase() || '?' })), _jsx(\"span\", { className: css.memberName, children: member.name })] }, member.id))) }))] }));\n}\n","/** Pure persisted geometry rules for the AgentTeams shell-overlay panel. */\nexport const PANEL_LAYOUT_STORAGE_KEY = 'dsh-agent-teams:activity-panel:v1';\nexport const PANEL_COMPACT_BREAKPOINT = 960;\nexport const PANEL_DEFAULT_WIDTH = 388;\nexport const PANEL_DEFAULT_HEIGHT = 640;\nexport const PANEL_MIN_WIDTH = 320;\nexport const PANEL_MAX_WIDTH = 640;\nexport const PANEL_MIN_HEIGHT = 360;\nexport const PANEL_DOCK_TOP = 64;\nexport const PANEL_DOCK_RIGHT = 18;\nexport const PANEL_DOCK_BOTTOM = 48;\nexport const PANEL_FLOAT_MARGIN = 12;\nexport const DEFAULT_PANEL_LAYOUT = Object.freeze({\n mode: 'docked',\n x: 0,\n y: PANEL_DOCK_TOP,\n width: PANEL_DEFAULT_WIDTH,\n height: PANEL_DEFAULT_HEIGHT,\n heightMode: 'auto',\n});\nfunction clamp(value, minimum, maximum) {\n return Math.min(Math.max(value, minimum), maximum);\n}\nfunction finite(value) {\n return typeof value === 'number' && Number.isFinite(value);\n}\n/** Decode one versioned localStorage value, rejecting partial/corrupt state. */\nexport function parsePanelLayout(value) {\n if (value === null)\n return DEFAULT_PANEL_LAYOUT;\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== 'object' || parsed === null)\n return DEFAULT_PANEL_LAYOUT;\n const record = parsed;\n if ((record.mode !== 'docked' && record.mode !== 'floating')\n || !finite(record.x) || !finite(record.y)\n || !finite(record.width) || !finite(record.height)) {\n return DEFAULT_PANEL_LAYOUT;\n }\n return {\n mode: record.mode,\n x: record.x,\n y: record.y,\n width: record.width,\n height: record.height,\n // v1 values written before content-fit height existed have no mode.\n // Treat them as automatic so the upgrade removes legacy blank space.\n heightMode: record.mode === 'floating' && record.heightMode === 'manual' ? 'manual' : 'auto',\n };\n }\n catch {\n return DEFAULT_PANEL_LAYOUT;\n }\n}\n/** Whether the panel should become a simple inset overlay with no gestures. */\nexport function compactPanelForBounds(bounds) {\n return bounds.width <= PANEL_COMPACT_BREAKPOINT;\n}\n/** Docked and compact panels always fit content; floating panels may be user-sized. */\nexport function panelUsesAutoHeight(layout, bounds) {\n return compactPanelForBounds(bounds) || layout.mode === 'docked' || layout.heightMode === 'auto';\n}\n/** CSS max-height ceiling that keeps an auto-height panel inside its shell. */\nexport function panelMaximumHeight(layout, bounds) {\n const bottomInset = compactPanelForBounds(bounds) || layout.mode === 'floating'\n ? PANEL_FLOAT_MARGIN\n : PANEL_DOCK_BOTTOM;\n return Math.max(1, bounds.height - layout.y - bottomInset);\n}\n/** Resolve persisted state into a visible rectangle inside the current shell. */\nexport function resolvePanelGeometry(layout, bounds) {\n const boundsWidth = Math.max(1, bounds.width);\n const boundsHeight = Math.max(1, bounds.height);\n if (compactPanelForBounds(bounds)) {\n return {\n ...layout,\n x: PANEL_FLOAT_MARGIN,\n y: PANEL_FLOAT_MARGIN,\n width: Math.max(1, boundsWidth - PANEL_FLOAT_MARGIN * 2),\n height: Math.max(1, boundsHeight - PANEL_FLOAT_MARGIN * 2),\n };\n }\n const maximumWidth = Math.max(1, Math.min(PANEL_MAX_WIDTH, boundsWidth - PANEL_FLOAT_MARGIN * 2));\n const minimumWidth = Math.min(PANEL_MIN_WIDTH, maximumWidth);\n const width = clamp(layout.width, minimumWidth, maximumWidth);\n const maximumHeight = Math.max(1, boundsHeight - PANEL_FLOAT_MARGIN * 2);\n const minimumHeight = Math.min(PANEL_MIN_HEIGHT, maximumHeight);\n if (layout.mode === 'docked') {\n const y = clamp(PANEL_DOCK_TOP, PANEL_FLOAT_MARGIN, Math.max(PANEL_FLOAT_MARGIN, boundsHeight - minimumHeight - PANEL_FLOAT_MARGIN));\n const availableHeight = Math.max(1, boundsHeight - y - PANEL_DOCK_BOTTOM);\n const height = clamp(availableHeight, Math.min(minimumHeight, availableHeight), maximumHeight);\n const anchorRight = clamp(bounds.anchorRight, 0, boundsWidth);\n const maximumX = Math.max(PANEL_FLOAT_MARGIN, boundsWidth - width - PANEL_FLOAT_MARGIN);\n const x = clamp(anchorRight - PANEL_DOCK_RIGHT - width, PANEL_FLOAT_MARGIN, maximumX);\n return { mode: 'docked', x, y, width, height, heightMode: layout.heightMode };\n }\n const height = clamp(layout.height, minimumHeight, maximumHeight);\n return {\n mode: 'floating',\n x: clamp(layout.x, PANEL_FLOAT_MARGIN, Math.max(PANEL_FLOAT_MARGIN, boundsWidth - width - PANEL_FLOAT_MARGIN)),\n y: clamp(layout.y, PANEL_FLOAT_MARGIN, Math.max(PANEL_FLOAT_MARGIN, boundsHeight - height - PANEL_FLOAT_MARGIN)),\n width,\n height,\n heightMode: layout.heightMode,\n };\n}\n/** Undock without a visual jump by adopting the panel's resolved rectangle. */\nexport function floatPanelLayout(geometry, bounds) {\n return resolvePanelGeometry({ ...geometry, mode: 'floating' }, bounds);\n}\n/** Return to the right dock, preserving width and restoring content-fit height. */\nexport function dockPanelLayout(layout, bounds) {\n return resolvePanelGeometry({ ...layout, mode: 'docked', heightMode: 'auto' }, bounds);\n}\n/** Translate a floating panel and clamp it back into the visible shell. */\nexport function movePanelLayout(start, dx, dy, bounds) {\n return resolvePanelGeometry({ ...start, mode: 'floating', x: start.x + dx, y: start.y + dy }, bounds);\n}\n/** Resize while keeping the edge opposite the active handle stationary. */\nexport function resizePanelLayout(start, edge, dx, dy, bounds) {\n if (start.mode === 'docked') {\n if (edge !== 'left')\n return resolvePanelGeometry(start, bounds);\n return resolvePanelGeometry({ ...start, width: start.width - dx }, bounds);\n }\n const resolved = resolvePanelGeometry(start, bounds);\n const minimumWidth = Math.min(PANEL_MIN_WIDTH, resolved.x + resolved.width - PANEL_FLOAT_MARGIN);\n const minimumHeight = Math.min(PANEL_MIN_HEIGHT, bounds.height - resolved.y - PANEL_FLOAT_MARGIN);\n if (edge === 'left') {\n const right = resolved.x + resolved.width;\n const maximumWidth = Math.max(1, Math.min(PANEL_MAX_WIDTH, right - PANEL_FLOAT_MARGIN));\n const width = clamp(resolved.width - dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return { ...resolved, x: right - width, width };\n }\n const maximumHeight = Math.max(1, bounds.height - resolved.y - PANEL_FLOAT_MARGIN);\n const height = clamp(resolved.height + dy, Math.min(minimumHeight, maximumHeight), maximumHeight);\n if (edge === 'bottom')\n return { ...resolved, height, heightMode: 'manual' };\n const maximumWidth = Math.max(1, Math.min(PANEL_MAX_WIDTH, bounds.width - resolved.x - PANEL_FLOAT_MARGIN));\n const width = clamp(resolved.width + dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return { ...resolved, width, height, heightMode: 'manual' };\n}\n","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\n/**\n * AgentTeams activity panel: the top-right floater monitoring every team.\n *\n * Modeled on the Claude Code desktop SessionActivityPanel: a shell-overlay\n * panel that docks at the conversation's top-right edge by default, can be\n * dragged into a floating window, resized, and folded into an activity badge.\n * On wide viewports the docked panel makes the conversation column yield\n * space; narrow viewports keep a simple inset overlay. It\n * polls the host `/plugins/dsh-agent-teams/state` route for\n * server-side snapshots (durable files + live subagent activity), with a\n * collapsed badge that auto-expands once when activity appears. Archived\n * teams stay available for the owning conversation after live work ends.\n *\n * The floater mounts in ui-layout's additive `shell.overlay`; it is not a\n * conversation node — the in-conversation panel was removed in favor of this\n * always-available monitor.\n * @module dsh-agent-teams/client/activity\n */\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';\nimport { IconBranchOutline16, IconChevronDownOutline14, IconPanelLeftOutline16, } from '@deepseek-ai/dsh-client-ui-primitives';\nimport { activityPanelExpandedForSession, compactDagLayout, COMPACT_DAG_NODE_HEIGHT, COMPACT_DAG_NODE_WIDTH, dependencyFocusTaskId, relatedTaskIds, usesParallelTaskGrid, } from \"./activity-model.js\";\nimport { getActivityMonitorTargetsSnapshot, getActivitySnapshotsSnapshot, startActivityPolling, subscribeActivityMonitorTargets, subscribeActivitySnapshots, } from \"./activity-monitor.js\";\nimport { ACTION_ART, LEAD_ART, memberArtUrl } from \"./artwork.js\";\nimport { OPEN_PANEL_EVENT } from \"./AgentTeamsCard.js\";\nimport { DEFAULT_PANEL_LAYOUT, PANEL_LAYOUT_STORAGE_KEY, compactPanelForBounds, dockPanelLayout, floatPanelLayout, movePanelLayout, panelMaximumHeight, panelUsesAutoHeight, parsePanelLayout, resizePanelLayout, resolvePanelGeometry, } from \"./panel-geometry.js\";\nimport css from './ActivityPanel.module.css';\n/** Grace before the panel collapses once no team remains. */\nconst AUTOCLOSE_GRACE_MS = 2000;\n/**\n * Page-settle window after mount: activity restored on page load only shows\n * the collapsed badge, so the panel never yanks the conversation column\n * right after load. New activity after this window auto-expands as usual.\n */\nconst AUTO_OPEN_SETTLE_MS = 4000;\n/** Root marker shared with the panel CSS while the shell overlay is expanded. */\nconst PANEL_OPEN_ATTRIBUTE = 'data-agent-teams-panel-open';\n/** Shared width concession consumed by the conversation root CSS. */\nconst PANEL_SHIFT_PROPERTY = '--agent-teams-panel-shift';\nconst PANEL_CONVERSATION_GAP = 14;\nconst MOVE_THRESHOLD = 4;\nfunction initialPanelLayout() {\n if (typeof window === 'undefined')\n return DEFAULT_PANEL_LAYOUT;\n return parsePanelLayout(window.localStorage.getItem(PANEL_LAYOUT_STORAGE_KEY));\n}\nfunction initialPanelBounds() {\n if (typeof window === 'undefined')\n return { width: 1440, height: 900, anchorRight: 1440 };\n return { width: window.innerWidth, height: window.innerHeight, anchorRight: window.innerWidth };\n}\n/** Initial-letter fallback for unmatched roles. */\nfunction memberInitial(name) {\n return name.trim().slice(0, 1).toUpperCase() || '?';\n}\nfunction stableHash(value) {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) {\n hash = ((hash << 5) - hash + value.charCodeAt(index)) | 0;\n }\n return Math.abs(hash);\n}\nconst ACCENTS = [\n 'var(--dsw-alias-state-business-primary)',\n 'var(--dsw-alias-state-success)',\n 'var(--dsw-alias-state-danger)',\n 'var(--dsw-alias-state-warning)',\n 'var(--dsw-alias-label-tertiary)',\n];\nfunction accentOf(id) {\n return ACCENTS[stableHash(id) % ACCENTS.length] ?? ACCENTS[0];\n}\n/** Badge text follows the raw task status (finer than the 4 visual states):\n * claimed/pending/failed/cancelled keep their own labels and colors. */\nconst TASK_STATUS_LABEL = {\n pending: 'task.status.pending',\n claimed: 'task.status.claimed',\n in_progress: 'task.status.inProgress',\n completed: 'task.status.completed',\n failed: 'task.status.failed',\n cancelled: 'task.status.cancelled',\n};\nfunction taskStatusLabel(status, t) {\n const key = TASK_STATUS_LABEL[status];\n return key === undefined ? status : t(key);\n}\nfunction formatTaskIds(ids, t) {\n return ids.join(t('format.listSeparator'));\n}\n/** Badge/bar coloring key: visual state, widened for terminal statuses. */\nfunction taskTone(state, status) {\n if (status === 'failed')\n return 'failed';\n if (status === 'cancelled')\n return 'cancelled';\n return state;\n}\nfunction Chevron({ open }) {\n return (_jsx(\"svg\", { className: css.chevron, \"data-open\": open, width: \"9\", height: \"9\", viewBox: \"0 0 10 10\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"1.5\", strokeLinecap: \"round\", \"aria-hidden\": true, children: _jsx(\"path\", { d: \"M3.5 2l3 3-3 3\" }) }));\n}\nfunction WorkGlyph({ active }) {\n return (_jsx(\"svg\", { className: css.workGlyph, \"data-active\": active, width: \"11\", height: \"11\", viewBox: \"0 0 11 11\", fill: \"currentColor\", \"aria-hidden\": true, children: [[0, 0], [4.2, 0], [8.4, 0], [0, 4.2], [4.2, 4.2], [8.4, 4.2]].map(([x, y], index) => (_jsx(\"rect\", { x: x, y: y, width: \"2.6\", height: \"2.6\", rx: \".6\", style: { animationDelay: `${index * 0.15}s` } }, `${x}:${y}`))) }));\n}\n/** Collapsed badge: an always-visible corner pill while any team exists. */\nfunction CollapsedBadge({ count, busy, onClick, t }) {\n return (_jsxs(\"button\", { type: \"button\", className: css.badge, \"data-agent-teams-collapsed\": true, \"data-busy\": busy, onClick: onClick, \"aria-label\": t('activity.badgeAria', { count }), children: [_jsx(\"span\", { className: css.badgeDot, \"data-busy\": busy, \"aria-hidden\": true }), _jsx(\"span\", { className: css.badgeCount, children: count })] }));\n}\nfunction memberStateLabel(member, tasks, historic, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n if (member.activity === 'working')\n return t('member.state.working');\n if (owned.some((task) => task.status === 'failed'))\n return t('member.state.failed');\n if (owned.some((task) => task.state === 'blocked'))\n return t('member.state.waiting');\n if (owned.length > 0 && owned.every((task) => task.status === 'completed'))\n return t('member.state.delivered');\n if (member.status === 'removed')\n return t(historic ? 'member.state.left' : 'member.state.removed');\n if (owned.length > 0)\n return t('member.state.pending');\n return t('member.state.unassigned');\n}\nfunction memberStatusText(member, tasks, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n const current = owned.find((task) => task.id === member.currentTask);\n const blocked = owned.find((task) => task.state === 'blocked');\n if (member.activity === 'working' && current !== undefined)\n return t('member.status.executing', { taskId: current.id });\n if (member.activity === 'working')\n return t('member.status.working');\n if (blocked !== undefined) {\n const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== 'completed');\n if (dependency !== undefined) {\n return t('member.status.waitingOn', {\n taskId: dependency.id,\n assignee: dependency.assignee || t('task.assignee.unclaimed'),\n });\n }\n return t('member.status.waitingPrerequisite');\n }\n if (member.total === 0)\n return t('member.status.waitingAssignment');\n if (member.done === member.total)\n return t('member.status.delivered');\n return t(member.activity === 'idle' ? 'member.status.idle' : 'member.status.unknown');\n}\nfunction compactTaskLabel(subject) {\n const withoutVerb = subject.replace(/^开发\\s*/u, '').replace(/^\\d+[-_.、\\s]*/u, '');\n const head = withoutVerb.split(/[((·::]/u)[0]?.trim() ?? withoutVerb;\n return head.length > 18 ? `${head.slice(0, 17)}…` : head;\n}\nfunction taskSummary(team, t) {\n const completed = team.tasks.filter((task) => task.status === 'completed');\n const running = team.tasks.filter((task) => task.state === 'running');\n const blocked = team.tasks.filter((task) => task.state === 'blocked');\n const ready = team.tasks.filter((task) => task.state === 'open' && task.status !== 'completed');\n if (team.tasks.length === 0)\n return t('task.summary.waitingBreakdown');\n if (completed.length === team.tasks.length)\n return t('task.summary.allDelivered', { count: completed.length });\n if (blocked.length > 0 && running.length > 0) {\n return t('task.summary.blockedAndRunning', {\n tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),\n more: blocked.length > 3 ? t('task.summary.more', { count: blocked.length - 3 }) : '',\n });\n }\n if (running.length > 0)\n return t('task.summary.running', { tasks: formatTaskIds(running.map((task) => task.id), t) });\n if (ready.length > 0)\n return t('task.summary.ready', { tasks: formatTaskIds(ready.map((task) => task.id), t) });\n if (blocked.length > 0)\n return t('task.summary.blocked', { tasks: formatTaskIds(blocked.map((task) => task.id), t) });\n return t('task.summary.waitingSchedule');\n}\nfunction ProgressOverview({ team, t }) {\n const running = team.tasks.filter((task) => task.state === 'running').length;\n const blocked = team.tasks.filter((task) => task.state === 'blocked').length;\n const completed = team.tasks.filter((task) => task.status === 'completed').length;\n const summaryTone = blocked > 0 ? 'warning' : completed === team.tasks.length && team.tasks.length > 0 ? 'completed' : 'running';\n return (_jsxs(\"section\", { className: css.progressOverview, \"aria-label\": t('progress.aria'), \"data-progress-summary\": true, children: [_jsx(\"span\", { className: css.progressTitle, children: t('progress.title') }), team.tasks.length > 0 ? (_jsx(\"span\", { className: css.progressSegments, \"aria-hidden\": true, children: team.tasks.map((task) => _jsx(\"span\", { \"data-state\": taskTone(task.state, task.status) }, task.id)) })) : _jsx(\"span\", { className: css.progressEmpty }), _jsxs(\"span\", { className: css.progressLegend, children: [_jsx(\"span\", { \"data-state\": \"running\", children: t('progress.running', { count: running }) }), _jsx(\"span\", { \"data-state\": \"blocked\", children: t('progress.blocked', { count: blocked }) }), _jsx(\"span\", { \"data-state\": \"completed\", children: t('progress.delivered', { count: completed }) })] }), _jsxs(\"span\", { className: css.progressSummary, \"data-state\": summaryTone, children: [_jsx(\"span\", { className: css.progressSummaryDot }), _jsx(\"span\", { children: taskSummary(team, t) })] })] }));\n}\nfunction DependencyMap({ tasks, t }) {\n const [open, setOpen] = useState(true);\n const [hoverTaskId, setHoverTaskId] = useState(null);\n const [keyboardTaskId, setKeyboardTaskId] = useState(null);\n const [pinnedTaskId, setPinnedTaskId] = useState(null);\n const hoverTimer = useRef(null);\n const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);\n const layout = useMemo(() => compactDagLayout(tasks), [tasks]);\n const parallel = useMemo(() => usesParallelTaskGrid(tasks), [tasks]);\n const related = useMemo(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);\n const scheduleHover = (id) => {\n if (hoverTimer.current !== null) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (id === null) {\n setHoverTaskId(null);\n return;\n }\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n setHoverTaskId(id);\n }, 180);\n };\n useEffect(() => () => {\n if (hoverTimer.current !== null)\n clearTimeout(hoverTimer.current);\n }, []);\n useEffect(() => {\n const onKeyDown = (event) => {\n if (event.key === 'Escape')\n setPinnedTaskId(null);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, []);\n if (tasks.length === 0)\n return null;\n const fallbackTask = tasks.find((task) => task.state === 'blocked')\n ?? tasks.find((task) => task.state === 'running')\n ?? tasks[0];\n const detailTask = tasks.find((task) => task.id === focusedTaskId) ?? fallbackTask;\n const waitingOn = detailTask.dependencies.filter((dependency) => (tasks.find((task) => task.id === dependency)?.status !== 'completed'));\n const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));\n return (_jsxs(\"section\", { className: css.dependencySection, \"aria-label\": t('dependency.aria'), \"data-dependency-map\": true, children: [_jsxs(\"header\", { className: css.sectionHead, children: [_jsxs(\"button\", { type: \"button\", className: css.sectionToggleTitle, onClick: () => { setOpen((current) => !current); }, \"aria-expanded\": open, children: [_jsx(Chevron, { open: open }), _jsx(IconBranchOutline16, {}), \" \", t(parallel ? 'dependency.parallel' : 'dependency.title')] }), _jsx(\"span\", { className: css.sectionHint, children: pinnedTaskId === null\n ? t(parallel ? 'dependency.hint.parallel' : 'dependency.hint.chain')\n : t('dependency.hint.pinned', { taskId: pinnedTaskId }) })] }), open && (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: css.dagViewport, children: _jsxs(\"div\", { className: css.dagCanvas, \"data-layout\": parallel ? 'parallel' : 'dependency', style: parallel ? undefined : { width: layout.width, height: layout.height }, children: [!parallel && _jsx(\"svg\", { className: css.dagEdges, width: layout.width, height: layout.height, \"aria-hidden\": true, children: layout.edges.map((edge) => {\n const active = related !== null && related.has(edge.from) && related.has(edge.to);\n return _jsx(\"path\", { d: edge.path, \"data-active\": active, \"data-dimmed\": related !== null && !active }, `${edge.from}:${edge.to}`);\n }) }), layout.nodes.map(({ task, x, y }) => (_jsxs(\"button\", { type: \"button\", className: css.dagNode, style: parallel\n ? { height: COMPACT_DAG_NODE_HEIGHT }\n : { left: x, top: y, width: COMPACT_DAG_NODE_WIDTH, height: COMPACT_DAG_NODE_HEIGHT }, \"data-task-id\": task.id, \"data-state\": taskTone(task.state, task.status), \"data-focused\": related?.has(task.id) ?? false, \"data-dimmed\": related !== null && !related.has(task.id), \"aria-pressed\": pinnedTaskId === task.id, title: `${task.id} · ${task.subject}`, onClick: () => { setPinnedTaskId((current) => current === task.id ? null : task.id); }, onMouseEnter: () => { scheduleHover(task.id); }, onMouseLeave: () => { scheduleHover(null); }, onFocus: () => { setKeyboardTaskId(task.id); }, onBlur: () => { setKeyboardTaskId(null); }, children: [_jsxs(\"span\", { className: css.dagNodeHead, children: [_jsx(\"span\", { className: css.dagNodeDot }), task.id] }), _jsx(\"span\", { className: css.dagNodeLabel, children: compactTaskLabel(task.subject) }), task.state === 'running' && (_jsx(\"span\", { className: css.dagRunningState, \"aria-label\": t('task.runningAria'), children: _jsx(WorkGlyph, { active: true }) }))] }, task.id)))] }) }), _jsxs(\"section\", { className: css.taskDetail, \"data-task-detail\": detailTask.id, children: [_jsxs(\"span\", { className: css.taskDetailHead, children: [_jsx(\"span\", { className: css.taskDetailId, children: detailTask.id }), _jsx(\"span\", { className: css.taskDetailSubject, title: detailTask.subject, children: detailTask.subject.replace(/^开发\\s*/u, '') }), _jsx(\"span\", { className: css.taskDetailBadge, \"data-state\": taskTone(detailTask.state, detailTask.status), children: taskStatusLabel(detailTask.status, t) })] }), _jsxs(\"span\", { className: css.taskDetailLine, children: [detailTask.assignee || t('task.assignee.unclaimed'), \" \\u00B7 \", detailTask.status === 'completed'\n ? t('task.detail.completed')\n : detailTask.dependencies.length === 0\n ? t('task.detail.noPrerequisite')\n : waitingOn.length === 0\n ? t('task.detail.ready')\n : t('task.detail.waitingOn', { tasks: formatTaskIds(waitingOn, t) })] }), _jsx(\"span\", { className: css.taskDetailMeta, children: dependents.length === 0\n ? t('task.detail.noDownstream')\n : t('task.detail.unlocks', { tasks: formatTaskIds(dependents.map((task) => task.id), t) }) })] })] }))] }));\n}\nfunction TeamSection({ team, onNavigate, t, historic = false }) {\n const [membersOpen, setMembersOpen] = useState(true);\n const busyCount = team.members.filter((member) => member.activity === 'working').length;\n const assignedCount = team.tasks.filter((task) => task.assignee !== '').length;\n const completedCount = team.tasks.filter((task) => task.status === 'completed').length;\n const allCompleted = team.tasks.length > 0 && completedCount === team.tasks.length;\n return (_jsxs(\"section\", { className: css.team, \"data-team-id\": team.teamId, children: [_jsxs(\"header\", { className: css.teamHead, children: [_jsx(\"span\", { className: css.teamName, title: team.name, children: team.name }), historic && _jsx(\"span\", { className: css.historicPill, children: t('team.ended') }), _jsxs(\"span\", { className: css.teamStats, children: [_jsx(\"span\", { \"data-stat\": \"members\", children: t('team.stats.members', { count: team.members.length }) }), _jsx(\"span\", { \"data-stat\": \"tasks\", children: t('team.stats.completed', { completed: completedCount, total: team.tasks.length }) }), _jsx(\"span\", { \"data-stat\": \"messages\", children: t('team.stats.messages', { count: team.messageCount }) })] })] }), _jsxs(\"section\", { className: css.delegationSection, \"aria-label\": t('delegation.aria'), \"data-delegation-map\": true, children: [_jsxs(\"div\", { className: css.captainNode, children: [_jsx(\"span\", { className: css.captainAvatar, children: _jsx(\"img\", { className: css.leadAvatar, src: LEAD_ART, alt: \"\", \"aria-hidden\": true }) }), _jsxs(\"span\", { className: css.captainInfo, children: [_jsxs(\"span\", { className: css.captainLine, children: [_jsx(\"span\", { className: css.captainName, children: t('captain.name') }), _jsx(\"span\", { className: css.captainRole, children: t('captain.role') })] }), _jsx(\"span\", { className: css.captainSummary, children: t('captain.summary', {\n tasks: assignedCount,\n members: team.members.length,\n }) })] }), _jsxs(\"span\", { className: css.captainState, \"data-busy\": busyCount > 0, children: [_jsx(WorkGlyph, { active: busyCount > 0 }), busyCount > 0\n ? t('captain.state.working', { count: busyCount })\n : t(allCompleted ? 'captain.state.collected' : 'captain.state.waiting')] })] }), _jsx(ProgressOverview, { team: team, t: t }), _jsxs(\"button\", { type: \"button\", className: css.membersToggle, onClick: () => { setMembersOpen((current) => !current); }, \"aria-expanded\": membersOpen, \"data-members-toggle\": true, children: [_jsxs(\"span\", { children: [_jsx(Chevron, { open: membersOpen }), t('members.toggle', { count: team.members.length })] }), _jsx(\"span\", { children: t(membersOpen ? 'members.collapse' : 'members.expand') })] }), membersOpen && _jsxs(\"div\", { className: css.delegationTree, children: [team.members.length === 0 && _jsx(\"span\", { className: css.emptyHint, children: t('members.empty') }), team.members.map((member) => {\n const owned = team.tasks.filter((task) => task.assignee === member.name);\n return (_jsxs(\"div\", { className: css.memberBlock, \"data-activity\": member.activity, children: [_jsx(\"span\", { className: css.memberBranch, \"aria-hidden\": true, children: _jsx(\"span\", {}) }), _jsxs(\"button\", { type: \"button\", className: css.memberRow, \"data-activity\": member.activity, onClick: () => {\n if (member.id !== '') {\n onNavigate(team.captainSessionId, member.id);\n }\n }, children: [_jsxs(\"span\", { className: css.memberAvatar, \"data-unread\": member.unread > 0, children: [memberArtUrl(member.name, member.role) !== null ? (_jsx(\"img\", { className: css.memberArt, src: memberArtUrl(member.name, member.role) ?? '', alt: \"\", \"aria-hidden\": true })) : (_jsx(\"span\", { className: css.memberInitial, style: { background: accentOf(member.id) }, children: memberInitial(member.name) })), _jsx(\"img\", { className: css.stateArt, \"data-activity\": member.activity, src: ACTION_ART[member.activity], alt: \"\", \"aria-hidden\": true })] }), _jsxs(\"span\", { className: css.memberInfo, children: [_jsxs(\"span\", { className: css.memberLine, children: [_jsx(\"span\", { className: css.memberName, children: member.name }), member.role !== '' && _jsx(\"span\", { className: css.memberRole, children: member.role }), _jsxs(\"span\", { className: css.memberState, \"data-activity\": member.activity, children: [_jsx(WorkGlyph, { active: member.activity === 'working' }), memberStateLabel(member, team.tasks, historic, t)] })] }), _jsx(\"span\", { className: css.memberStatusLine, children: memberStatusText(member, team.tasks, t) })] }), _jsxs(\"span\", { className: css.memberCount, children: [member.done, \"/\", member.total] })] }), _jsxs(\"div\", { className: css.assignmentLine, children: [_jsx(\"span\", { className: css.assignmentLabel, children: t('assignment.label') }), _jsx(\"span\", { className: css.assignmentTasks, children: owned.length === 0\n ? _jsx(\"span\", { className: css.taskEmpty, children: t('assignment.empty') })\n : owned.map((task) => (_jsx(\"span\", { className: css.assignmentChip, \"data-state\": taskTone(task.state, task.status), title: task.subject, children: task.id }, task.id))) })] })] }, member.id));\n })] })] }), _jsx(DependencyMap, { tasks: team.tasks, t: t })] }));\n}\n/** Legacy conversation cards may outlive their host archive. Project their\n * durable roster through the same rebuilt panel instead of a second UI. */\nfunction historicCardTeam(data, owner) {\n return {\n workspace: '',\n teamId: data.teamId,\n name: data.teamName,\n captainSessionId: data.captainSessionId || owner,\n members: data.members.map((member) => ({\n ...member,\n status: 'removed',\n activity: 'idle',\n progress: 0,\n done: 0,\n total: 0,\n currentTask: '',\n unread: 0,\n })),\n tasks: [],\n messageCount: 0,\n captainInbox: [],\n };\n}\nexport function ActivityPanel({ sessionsList, openMember, t }) {\n // Navigating to a member's subagent transcript is an explicit departure:\n // hide the floater immediately instead of waiting out the autocollapse\n // grace, so the panel never lingers over the member session.\n const navigateToSession = (parentId, childId) => {\n setOpen(false);\n setWasActive(false);\n openMember(parentId, childId);\n };\n const [open, setOpen] = useState(false);\n const [openOwner, setOpenOwner] = useState();\n const [autoOpened, setAutoOpened] = useState(false);\n const [wasActive, setWasActive] = useState(false);\n const [historic, setHistoric] = useState(new Map());\n const [layout, setLayout] = useState(initialPanelLayout);\n const [bounds, setBounds] = useState(initialPanelBounds);\n const [interaction, setInteraction] = useState(null);\n const panelRef = useRef(null);\n const boundsRef = useRef(bounds);\n const gestureRef = useRef(null);\n const frameRef = useRef(null);\n const pendingLayoutRef = useRef(null);\n const current = useSyncExternalStore(sessionsList.subscribe, sessionsList.getSnapshot).current;\n const monitorTargets = useSyncExternalStore(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);\n const { teams, archivedTeams } = useSyncExternalStore(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n const currentTargets = useMemo(() => current === undefined ? [] : monitorTargets.filter((target) => target.sessionId === current), [current, monitorTargets]);\n const currentRef = useRef(current);\n useEffect(() => { currentRef.current = current; }, [current]);\n const mountedAtRef = useRef(performance.now());\n const expanded = activityPanelExpandedForSession(open, openOwner, current);\n const geometry = useMemo(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);\n const compact = compactPanelForBounds(bounds);\n const commitLayout = useCallback((next) => {\n setLayout(next);\n }, []);\n useEffect(() => {\n window.localStorage.setItem(PANEL_LAYOUT_STORAGE_KEY, JSON.stringify(layout));\n }, [layout]);\n // The slot sits inside AppFrame, so all geometry is measured against the\n // shell overlay rather than the browser viewport. The conversation's real\n // right edge is the dock anchor and naturally follows sidebar/details\n // concessions without importing their hashed implementation classes.\n useLayoutEffect(() => {\n const overlay = document.querySelector('[data-shell-overlay]');\n if (overlay === null)\n return;\n const conversation = document.querySelector(\"[data-phase='active']\");\n let frame = null;\n const measure = () => {\n frame = null;\n const overlayRect = overlay.getBoundingClientRect();\n const conversationRect = conversation?.getBoundingClientRect();\n const next = {\n width: overlayRect.width,\n height: overlayRect.height,\n anchorRight: conversationRect === undefined\n ? overlayRect.width\n : Math.min(Math.max(conversationRect.right - overlayRect.left, 0), overlayRect.width),\n };\n const previous = boundsRef.current;\n if (previous.width === next.width\n && previous.height === next.height\n && previous.anchorRight === next.anchorRight)\n return;\n boundsRef.current = next;\n setBounds(next);\n };\n const scheduleMeasure = () => {\n frame ??= requestAnimationFrame(measure);\n };\n measure();\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(scheduleMeasure);\n observer?.observe(overlay);\n if (conversation !== null)\n observer?.observe(conversation);\n window.addEventListener('resize', scheduleMeasure);\n return () => {\n if (frame !== null)\n cancelAnimationFrame(frame);\n observer?.disconnect();\n window.removeEventListener('resize', scheduleMeasure);\n };\n }, [current]);\n // This shell overlay survives conversation route changes. Gate expansion by its\n // owning session during render, then clear stale state before paint. This\n // removes the old panel immediately instead of waiting for the no-team\n // autoclose grace period on the destination page.\n useLayoutEffect(() => {\n if (openOwner === undefined || openOwner === current)\n return;\n setOpen(false);\n setOpenOwner(undefined);\n setWasActive(false);\n setAutoOpened(false);\n }, [current, openOwner]);\n // Only the wide docked mode asks the conversation column to yield. Floating\n // and compact modes are intentionally true overlays. The width is written as\n // one shared variable so the panel and the concession cannot drift apart.\n useLayoutEffect(() => {\n const root = document.documentElement;\n const shouldYield = expanded && geometry.mode === 'docked' && !compact;\n if (shouldYield) {\n root.setAttribute(PANEL_OPEN_ATTRIBUTE, '');\n root.style.setProperty(PANEL_SHIFT_PROPERTY, `${geometry.width + PANEL_CONVERSATION_GAP + 18}px`);\n }\n else {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n }\n return () => {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n };\n }, [compact, expanded, geometry.mode, geometry.width]);\n useEffect(() => {\n if (current === undefined)\n return;\n // Cards keep live teams on the normal cadence. The current-session scope\n // also performs one cold-start discovery pass so archived/cardless teams\n // survive a browser or `dsh web` restart.\n const controller = startActivityPolling(currentTargets, { discoverySessionId: current });\n return () => { controller.stop(); };\n }, [current, currentTargets]);\n useEffect(() => {\n const onOpenPanel = (event) => {\n const activeSession = currentRef.current;\n if (activeSession === undefined)\n return;\n setOpenOwner(activeSession);\n setOpen(true);\n const detail = event.detail;\n if (detail?.teamId !== undefined) {\n // A card from a log that predates captainSessionId belongs to the\n // session that activated it (the current one at injection time).\n const owner = detail.captainSessionId !== '' ? detail.captainSessionId : currentRef.current ?? '';\n const teamKey = `${owner}:${detail.teamId}`;\n setHistoric((previous) => {\n const next = new Map(previous);\n next.set(teamKey, { data: detail, owner });\n return next;\n });\n }\n };\n window.addEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n return () => {\n window.removeEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n };\n }, []);\n // Teams follow the current session: live snapshots and historic card\n // summaries are visible only while their captain session is current.\n const visibleTeams = useMemo(\n // No current session (initial load): show nothing until one is picked,\n // so cross-session teams never leak into the floater.\n () => (current === undefined ? [] : teams.filter((team) => team.captainSessionId === current)), [teams, current]);\n const visibleHistoric = useMemo(() => (current === undefined ? [] : [...historic.values()].filter(({ data, owner }) => owner === current && !teams.some((live) => live.captainSessionId === current && live.teamId === data.teamId) && !archivedTeams.some((archived) => archived.captainSessionId === current && archived.teamId === data.teamId))), [historic, current, teams, archivedTeams]);\n const visibleArchived = useMemo(() => (current === undefined ? [] : archivedTeams.filter((team) => team.captainSessionId === current && !teams.some((live) => live.captainSessionId === current && live.teamId === team.teamId))), [archivedTeams, current, teams]);\n const visibleCount = visibleTeams.length + visibleArchived.length + visibleHistoric.length;\n useEffect(() => {\n if (visibleCount > 0) {\n setWasActive(true);\n // Auto-expand only after the page-settle window: opening (and its\n // main-column yield) right after load reads as a whole-page flicker.\n const settled = performance.now() - mountedAtRef.current >= AUTO_OPEN_SETTLE_MS;\n if (!autoOpened && settled) {\n setOpenOwner(current);\n setOpen(true);\n setAutoOpened(true);\n }\n return;\n }\n if (!wasActive)\n return;\n const timer = setTimeout(() => {\n setOpen(false);\n setOpenOwner(undefined);\n setWasActive(false);\n // Re-arm auto-expand: a later activity (new team, new session) may\n // open the panel on its own again.\n setAutoOpened(false);\n }, AUTOCLOSE_GRACE_MS);\n return () => { clearTimeout(timer); };\n }, [visibleCount, autoOpened, wasActive]);\n const busy = useMemo(() => visibleTeams.some((team) => team.members.some((member) => member.activity === 'working')), [visibleTeams]);\n const hasTeams = visibleCount > 0;\n // Auto-height panels do not store their live content height. Capture the\n // rendered box when a pointer gesture starts so movement and a first manual\n // resize clamp against what the user actually sees.\n const panelGeometryForGesture = useCallback(() => {\n const measuredHeight = panelRef.current?.getBoundingClientRect().height;\n if (measuredHeight === undefined || measuredHeight <= 0)\n return geometry;\n return { ...geometry, height: measuredHeight };\n }, [geometry]);\n const flushScheduledLayout = useCallback(() => {\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null)\n commitLayout(pending);\n }, [commitLayout]);\n const scheduleLayout = useCallback((next) => {\n pendingLayoutRef.current = next;\n frameRef.current ??= requestAnimationFrame(() => {\n frameRef.current = null;\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null)\n commitLayout(pending);\n });\n }, [commitLayout]);\n useEffect(() => () => {\n if (frameRef.current !== null)\n cancelAnimationFrame(frameRef.current);\n }, []);\n const beginMove = useCallback((event) => {\n if (compact || event.button !== 0 || event.target.closest('button') !== null)\n return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: 'move',\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: false,\n };\n }, [compact, panelGeometryForGesture]);\n const beginResize = useCallback((edge, event) => {\n if (compact || event.button !== 0 || (geometry.mode === 'docked' && edge !== 'left'))\n return;\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: 'resize',\n edge,\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: true,\n };\n setInteraction('resizing');\n }, [compact, geometry.mode, panelGeometryForGesture]);\n const updateGesture = useCallback((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId\n || !event.currentTarget.hasPointerCapture(event.pointerId))\n return;\n const dx = event.clientX - gesture.originX;\n const dy = event.clientY - gesture.originY;\n const activeBounds = boundsRef.current;\n if (gesture.kind === 'move') {\n if (!gesture.activated && Math.hypot(dx, dy) < MOVE_THRESHOLD)\n return;\n if (!gesture.activated) {\n gesture.activated = true;\n setInteraction('dragging');\n }\n scheduleLayout(movePanelLayout(floatPanelLayout(gesture.start, activeBounds), dx, dy, activeBounds));\n return;\n }\n scheduleLayout(resizePanelLayout(gesture.start, gesture.edge ?? 'left', dx, dy, activeBounds));\n }, [scheduleLayout]);\n const endGesture = useCallback((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId)\n return;\n updateGesture(event);\n flushScheduledLayout();\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout, updateGesture]);\n const cancelGesture = useCallback((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId)\n return;\n flushScheduledLayout();\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout]);\n const toggleDock = useCallback(() => {\n const liveGeometry = panelGeometryForGesture();\n commitLayout(liveGeometry.mode === 'docked'\n ? floatPanelLayout(liveGeometry, boundsRef.current)\n : dockPanelLayout(liveGeometry, boundsRef.current));\n }, [commitLayout, panelGeometryForGesture]);\n const autoHeight = panelUsesAutoHeight(geometry, bounds);\n const panelStyle = {\n width: geometry.width,\n height: autoHeight ? 'auto' : geometry.height,\n maxHeight: panelMaximumHeight(geometry, bounds),\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`,\n };\n if (!hasTeams && !expanded)\n return null;\n return (_jsxs(_Fragment, { children: [!expanded && (_jsx(CollapsedBadge, { count: visibleCount, busy: busy, t: t, onClick: () => {\n if (current === undefined)\n return;\n setOpenOwner(current);\n setOpen(true);\n } })), expanded && (_jsxs(\"aside\", { ref: panelRef, className: css.panel, style: panelStyle, \"data-agent-teams-activity\": true, \"data-panel-mode\": geometry.mode, \"data-height-mode\": autoHeight ? 'auto' : 'manual', \"data-compact\": compact || undefined, \"data-dragging\": interaction === 'dragging' || undefined, \"data-resizing\": interaction === 'resizing' || undefined, \"aria-label\": t('activity.panelAria'), children: [_jsxs(\"header\", { className: css.panelHead, onPointerDown: beginMove, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"data-drag-handle\": !compact || undefined, children: [_jsxs(\"span\", { className: css.panelTitle, children: [t('activity.title'), _jsx(\"span\", { className: css.panelDot, \"data-busy\": busy, \"aria-hidden\": true })] }), _jsxs(\"span\", { className: css.panelControls, children: [!compact && (_jsx(\"button\", { type: \"button\", className: css.iconButton, \"data-control\": \"dock\", \"data-mode\": geometry.mode, onClick: toggleDock, \"aria-label\": t(geometry.mode === 'docked' ? 'activity.float' : 'activity.dockRight'), title: t(geometry.mode === 'docked' ? 'activity.float' : 'activity.dockRight'), children: _jsx(IconPanelLeftOutline16, {}) })), _jsx(\"button\", { type: \"button\", className: css.iconButton, \"data-control\": \"collapse\", onClick: () => {\n setOpen(false);\n setOpenOwner(undefined);\n }, \"aria-label\": t('activity.collapse'), title: t('activity.collapse'), children: _jsx(IconChevronDownOutline14, {}) })] })] }), _jsx(\"div\", { className: css.teams, children: visibleCount === 0\n ? _jsx(\"span\", { className: css.emptyHint, children: t('activity.empty') })\n : (_jsxs(_Fragment, { children: [visibleTeams.map((team) => (_jsx(TeamSection, { team: team, onNavigate: navigateToSession, t: t }, team.teamId))), visibleArchived.map((team) => (_jsxs(\"div\", { \"data-team-id\": team.teamId, \"data-historic\": true, className: css.archivedWrap, children: [_jsx(\"span\", { className: css.archiveLabel, children: t('archive.label') }), _jsx(TeamSection, { team: team, onNavigate: navigateToSession, t: t, historic: true })] }, `${team.captainSessionId}:${team.teamId}`))), visibleHistoric.map(({ data: team, owner }) => {\n const teamKey = `${owner}:${team.teamId}`;\n return (_jsx(TeamSection, { team: historicCardTeam(team, owner), onNavigate: navigateToSession, t: t, historic: true }, teamKey));\n })] })) }), !compact && (_jsx(\"div\", { className: css.resizeHandle, \"data-resize-edge\": \"left\", onPointerDown: (event) => { beginResize('left', event); }, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"aria-hidden\": true })), !compact && geometry.mode === 'floating' && (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: css.resizeHandle, \"data-resize-edge\": \"bottom\", onPointerDown: (event) => { beginResize('bottom', event); }, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"aria-hidden\": true }), _jsx(\"div\", { className: css.resizeHandle, \"data-resize-edge\": \"corner\", onPointerDown: (event) => { beginResize('corner', event); }, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"aria-hidden\": true })] }))] }))] }));\n}\n","/**\n * AgentTeams conversation card: a lightweight in-conversation summary shown\n * when a team is created — the captain's name, the member roster with whale\n * avatars, and an entry point that re-activates the top-right activity\n * panel (useful after the floater was closed, or when re-opening an old\n * session for review).\n *\n * The fold anchors to the Harness's durable `tool/call` + `tool/result`\n * records for `agent_teams_create`. Those are first-party session events, so\n * the card survives restarts without writing an out-of-repo event type.\n * @module dsh-agent-teams/client/card\n */\n/** Parse the only create-call fields the historic card owns. */\nexport function parseAgentTeamsCreateArgs(value) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== 'object' || parsed === null || !('name' in parsed) || typeof parsed.name !== 'string') {\n return undefined;\n }\n const name = parsed.name.trim();\n if (name === '')\n return undefined;\n const cleaned = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n return { teamId: cleaned === '' ? 'team' : cleaned, name };\n }\n catch {\n return undefined;\n }\n}\n/** Durable first-party tool events folded into one keyed Chat node. */\nexport const agentTeamsCardDefinition = {\n kind: 'agent-teams',\n target: 'chat',\n match: (event) => {\n if (event.type === 'tool/call' && event.data.name === 'agent_teams_create') {\n return parseAgentTeamsCreateArgs(event.data.arguments) === undefined\n ? null\n : { id: String(event.data.callId), role: 'start' };\n }\n if (event.type === 'tool/result' && event.data.message.source.kind === 'tool') {\n return { id: String(event.data.message.source.callId), role: 'update' };\n }\n return null;\n },\n start: (_context, match) => {\n if (match.event.type !== 'tool/call') {\n throw new Error('agent-teams card start requires agent_teams_create tool/call');\n }\n const parsed = parseAgentTeamsCreateArgs(match.event.data.arguments);\n if (parsed === undefined)\n throw new Error('agent-teams card start requires valid create arguments');\n return { ...parsed, accepted: false };\n },\n update: (context, match) => {\n if (match.event.type !== 'tool/result')\n return context.state;\n const failed = match.event.data.error !== undefined\n || match.event.data.message.content.some((block) => block.type === 'tool-result' && block.isError === true);\n if (failed)\n return context.state;\n return { ...context.state, accepted: true };\n },\n buildViewNode: (context) => {\n if (context.start === undefined)\n return null;\n const state = context.state;\n if (!state.accepted)\n return null;\n return {\n key: context.key,\n kind: 'agent-teams',\n id: context.id,\n target: 'chat',\n anchorSeq: context.start.event.seq,\n location: context.start.location,\n visibility: 'visible',\n data: {\n teamId: state.teamId,\n captainSessionId: '',\n teamName: state.name,\n members: [],\n },\n };\n },\n};\n","/** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */\n/** Dictionary namespace owned by the AgentTeams client plugin. */\nexport const AGENT_TEAMS_LOCALE_NAMESPACE = 'agentTeams';\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'card.memberCount': '{count} 名成员',\n 'action.openActivityPanel': '打开活动面板',\n 'activity.panelButton': '活动面板',\n 'activity.badgeAria': 'AgentTeams 活动,{count} 个团队',\n 'activity.panelAria': 'AgentTeams 活动面板',\n 'activity.title': 'AgentTeams 活动',\n 'activity.float': '切换为浮动面板',\n 'activity.dockRight': '停靠到右侧',\n 'activity.collapse': '收起活动面板',\n 'activity.empty': '暂无团队活动',\n 'format.listSeparator': '、',\n 'task.status.pending': '待领取',\n 'task.status.claimed': '已认领',\n 'task.status.inProgress': '进行中',\n 'task.status.completed': '已完成',\n 'task.status.failed': '失败',\n 'task.status.cancelled': '已取消',\n 'member.state.working': '工作中',\n 'member.state.failed': '有失败',\n 'member.state.waiting': '等待',\n 'member.state.delivered': '已交付',\n 'member.state.left': '已离队',\n 'member.state.removed': '已移除',\n 'member.state.pending': '待执行',\n 'member.state.unassigned': '待派工',\n 'member.status.executing': '正在执行 {taskId}',\n 'member.status.working': '正在处理已派任务',\n 'member.status.waitingOn': '等待 {taskId} · {assignee}',\n 'member.status.waitingPrerequisite': '等待前置任务',\n 'member.status.waitingAssignment': '等待队长派工',\n 'member.status.delivered': '任务已交付',\n 'member.status.idle': '待继续执行',\n 'member.status.unknown': '状态未知',\n 'task.assignee.unclaimed': '待认领',\n 'task.summary.waitingBreakdown': '等待队长拆解任务',\n 'task.summary.allDelivered': '全部 {count} 项任务已交付',\n 'task.summary.blockedAndRunning': '{tasks}{more} 等待前置,其余已开工',\n 'task.summary.more': ' 等 {count} 项',\n 'task.summary.running': '{tasks} 正在执行',\n 'task.summary.ready': '{tasks} 已就绪待开工',\n 'task.summary.blocked': '{tasks} 等待前置',\n 'task.summary.waitingSchedule': '等待下一轮调度',\n 'progress.aria': '团队总进度',\n 'progress.title': '总进度',\n 'progress.running': '■ 进行中 {count}',\n 'progress.blocked': '■ 等待依赖 {count}',\n 'progress.delivered': '■ 已交付 {count}',\n 'dependency.aria': '任务依赖链',\n 'dependency.parallel': '并行任务',\n 'dependency.title': '任务依赖',\n 'dependency.hint.parallel': '无前后依赖 · 点击查看详情',\n 'dependency.hint.chain': '悬停高亮依赖链 · 点击固定',\n 'dependency.hint.pinned': '{taskId} 已固定 · Esc 取消',\n 'task.runningAria': '运行中',\n 'task.detail.completed': '已完成并交付',\n 'task.detail.noPrerequisite': '无前置,可立即开工',\n 'task.detail.ready': '前置已就绪,可开工',\n 'task.detail.waitingOn': '等待 {tasks}',\n 'task.detail.noDownstream': '无下游任务',\n 'task.detail.unlocks': '完成后解锁 {tasks}',\n 'team.ended': '已结束',\n 'team.stats.members': '{count} 名成员',\n 'team.stats.completed': '{completed}/{total} 完成',\n 'team.stats.messages': '{count} 条消息',\n 'delegation.aria': '队长派工关系',\n 'captain.name': '队长',\n 'captain.role': '拆解 · 派发 · 汇总',\n 'captain.summary': '已派发 {tasks} 项任务给 {members} 名成员',\n 'captain.state.working': '{count} 人执行中',\n 'captain.state.collected': '已收齐',\n 'captain.state.waiting': '等待回报',\n 'members.toggle': '{count} 名成员',\n 'members.collapse': '收起',\n 'members.expand': '展开',\n 'members.empty': '暂无成员,等待队长组建团队',\n 'assignment.label': '队长派发',\n 'assignment.empty': '暂无任务',\n 'archive.label': '已结束 · 历史归档',\n};\n/** English dictionary, checked complete against the Chinese source key set. */\nexport const en = {\n 'card.memberCount': '{count} members',\n 'action.openActivityPanel': 'Open activity panel',\n 'activity.panelButton': 'Activity panel',\n 'activity.badgeAria': 'AgentTeams activity, {count} teams',\n 'activity.panelAria': 'AgentTeams activity panel',\n 'activity.title': 'AgentTeams activity',\n 'activity.float': 'Switch to floating panel',\n 'activity.dockRight': 'Dock to the right',\n 'activity.collapse': 'Collapse activity panel',\n 'activity.empty': 'No team activity',\n 'format.listSeparator': ', ',\n 'task.status.pending': 'Unclaimed',\n 'task.status.claimed': 'Claimed',\n 'task.status.inProgress': 'In progress',\n 'task.status.completed': 'Completed',\n 'task.status.failed': 'Failed',\n 'task.status.cancelled': 'Cancelled',\n 'member.state.working': 'Working',\n 'member.state.failed': 'Has failures',\n 'member.state.waiting': 'Waiting',\n 'member.state.delivered': 'Delivered',\n 'member.state.left': 'Left team',\n 'member.state.removed': 'Removed',\n 'member.state.pending': 'Pending',\n 'member.state.unassigned': 'Awaiting assignment',\n 'member.status.executing': 'Working on {taskId}',\n 'member.status.working': 'Working on assigned tasks',\n 'member.status.waitingOn': 'Waiting for {taskId} · {assignee}',\n 'member.status.waitingPrerequisite': 'Waiting for prerequisites',\n 'member.status.waitingAssignment': 'Waiting for the captain to assign work',\n 'member.status.delivered': 'Tasks delivered',\n 'member.status.idle': 'Ready to continue',\n 'member.status.unknown': 'Status unknown',\n 'task.assignee.unclaimed': 'Unclaimed',\n 'task.summary.waitingBreakdown': 'Waiting for the captain to break down the work',\n 'task.summary.allDelivered': 'All {count} tasks delivered',\n 'task.summary.blockedAndRunning': '{tasks}{more} waiting on prerequisites; other work has started',\n 'task.summary.more': ' and {count} more',\n 'task.summary.running': '{tasks} in progress',\n 'task.summary.ready': '{tasks} ready to start',\n 'task.summary.blocked': '{tasks} waiting on prerequisites',\n 'task.summary.waitingSchedule': 'Waiting for the next scheduling round',\n 'progress.aria': 'Overall team progress',\n 'progress.title': 'Overall progress',\n 'progress.running': '■ In progress {count}',\n 'progress.blocked': '■ Waiting {count}',\n 'progress.delivered': '■ Delivered {count}',\n 'dependency.aria': 'Task dependency chain',\n 'dependency.parallel': 'Parallel tasks',\n 'dependency.title': 'Task dependencies',\n 'dependency.hint.parallel': 'No dependencies · Click for details',\n 'dependency.hint.chain': 'Hover to highlight dependencies · Click to pin',\n 'dependency.hint.pinned': '{taskId} pinned · Esc to clear',\n 'task.runningAria': 'Running',\n 'task.detail.completed': 'Completed and delivered',\n 'task.detail.noPrerequisite': 'No prerequisites; ready to start',\n 'task.detail.ready': 'Prerequisites ready; can start',\n 'task.detail.waitingOn': 'Waiting for {tasks}',\n 'task.detail.noDownstream': 'No downstream tasks',\n 'task.detail.unlocks': 'Unlocks {tasks} when complete',\n 'team.ended': 'Ended',\n 'team.stats.members': '{count} members',\n 'team.stats.completed': '{completed}/{total} completed',\n 'team.stats.messages': '{count} messages',\n 'delegation.aria': 'Captain delegation map',\n 'captain.name': 'Captain',\n 'captain.role': 'Break down · Delegate · Synthesize',\n 'captain.summary': 'Assigned {tasks} tasks to {members} members',\n 'captain.state.working': '{count} active',\n 'captain.state.collected': 'All reports received',\n 'captain.state.waiting': 'Waiting for reports',\n 'members.toggle': 'Members {count}',\n 'members.collapse': 'Collapse',\n 'members.expand': 'Expand',\n 'members.empty': 'No members yet; waiting for the captain to assemble the team',\n 'assignment.label': 'Captain assigned',\n 'assignment.empty': 'No tasks',\n 'archive.label': 'Ended · Archived history',\n};\n","/** Version-tolerant navigation into durable AgentTeams member transcripts. */\n/**\n * Open one member's persisted transcript.\n *\n * Harness rc.8 intentionally removed cold subagents from the ordinary session\n * list. They must first be rediscovered in their parent's catalog, then opened\n * with the exact parent/child/mode address. Older runtimes have only `open()`;\n * the fallback preserves the plugin's rc.6 peer range.\n */\nexport async function openAgentTeamMember(sessions, parentSessionId, childSessionId) {\n if (sessions.openSubagent === undefined || sessions.refreshSubagents === undefined) {\n sessions.open(childSessionId);\n return 'session';\n }\n await sessions.refreshSubagents(parentSessionId);\n const retained = sessions.subagentAddress?.(childSessionId);\n sessions.openSubagent(retained?.parentSessionId === parentSessionId\n ? retained\n : { parentSessionId, childSessionId, mode: 'continuable' });\n return 'subagent';\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ActivityPanel } from \"./ActivityPanel.js\";\nimport { AgentTeamsCard } from \"./AgentTeamsCard.js\";\nimport { agentTeamsCardDefinition } from \"./agent-teams-card-definition.js\";\nimport { AGENT_TEAMS_LOCALE_NAMESPACE, en, zh, } from \"./locales.js\";\nimport { openAgentTeamMember } from \"./session-navigation.js\";\n/** Required services: conversation nodes, slots, sessions navigation, and locale. */\nexport const inject = ['conversationEvents', 'slots', 'sessions', 'locale'];\n/** The replayed user message is the canonical transcript entry. */\nfunction HiddenAgentTeamsCommand() {\n return null;\n}\n/**\n * Register the activity monitor in the shell's additive overlay and the\n * in-conversation team card. The card's activity button re-opens a folded\n * monitor via a window event — the recovery path for an old session.\n */\nexport function apply(ctx) {\n ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, { zh, en }), 'agent-teams: dictionaries');\n const openMember = (parentId, childId) => {\n void openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {\n console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);\n });\n };\n const Panel = ({ t }) => (_jsx(ActivityPanel, { sessionsList: ctx.sessions.list, openMember: openMember, t: t }));\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay',\n id: 'agent-teams-activity',\n order: 80,\n label: 'AgentTeams activity',\n locale: AGENT_TEAMS_LOCALE_NAMESPACE,\n }, Panel));\n // The host command is only the slash-menu/admission surface. Its input is\n // replayed as the visible user message, so the generic result row would be\n // a duplicate placed before that message by command lifecycle ordering.\n ctx.slots.inject('conversation.chat.commandview', () => ctx.slots.register({\n name: 'conversation.chat.commandview',\n key: 'agent-teams',\n }, HiddenAgentTeamsCommand));\n ctx.conversationEvents.register(agentTeamsCardDefinition);\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({\n name: 'conversation.chat.node',\n key: 'agent-teams',\n locale: AGENT_TEAMS_LOCALE_NAMESPACE,\n inject: () => ({\n openMember,\n }),\n }, AgentTeamsCard));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["css","css","IconBranchOutline16","_Fragment","IconPanelLeftOutline16","IconChevronDownOutline14"],"sources":["client/activity-model.js","client/activity-monitor.js","client/artwork.js","client/AgentTeamsCard.js","client/panel-geometry.js","client/ActivityPanel.js","client/agent-teams-card-definition.js","client/locales.js","client/session-navigation.js","client/index.js"],"sourcesContent":["/** Pure relationship projections used by the AgentTeams activity panel. */\n/** Reference-panel geometry: narrow nodes with enough room for curved edges. */\nexport const COMPACT_DAG_NODE_WIDTH = 92;\nexport const COMPACT_DAG_NODE_HEIGHT = 30;\nexport const COMPACT_DAG_COLUMN_GAP = 26;\nexport const COMPACT_DAG_ROW_GAP = 8;\n/** Use a fill-width grid when the task graph has no real dependency edges. */\nexport function usesParallelTaskGrid(tasks) {\n if (tasks.length === 0)\n return false;\n const taskIds = new Set(tasks.map((task) => task.id));\n return tasks.every((task) => task.dependencies.every((dependency) => !taskIds.has(dependency)));\n}\n/**\n * Whether an expanded activity panel still belongs to the current session.\n *\n * The panel is mounted in the root-scoped shell overlay, so React does not\n * remount it when the conversation route changes. Ownership keeps an expanded\n * panel from leaking onto the new-session screen (or another conversation)\n * while its local open state is being reset.\n */\nexport function activityPanelExpandedForSession(open, owner, current) {\n return open && owner !== undefined && owner === current;\n}\n/**\n * Resolve the task whose dependency chain should be highlighted.\n *\n * A pinned task is an explicit user choice. Keyboard focus takes precedence\n * over delayed pointer intent so an older hover timer cannot steal the active\n * chain from someone navigating the task map with the keyboard.\n */\nexport function dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId) {\n return pinnedTaskId ?? keyboardTaskId ?? hoverTaskId;\n}\n/** Group tasks by their precomputed dependency depth. */\nexport function taskStages(tasks) {\n const byDepth = new Map();\n for (const task of tasks) {\n const depth = Number.isFinite(task.depth) ? Math.max(0, Math.floor(task.depth)) : 0;\n const stage = byDepth.get(depth) ?? [];\n stage.push(task);\n byDepth.set(depth, stage);\n }\n return [...byDepth.entries()]\n .sort(([left], [right]) => left - right)\n .map(([depth, stageTasks]) => ({\n depth,\n tasks: stageTasks.slice().sort((left, right) => left.id.localeCompare(right.id, 'en', { numeric: true })),\n }));\n}\n/**\n * Lay tasks out as the reference panel's compact left-to-right DAG.\n *\n * Columns are dependency-depth stages. Rows are stable task-id order within\n * each stage. Edges use cubic curves so fan-in remains readable without\n * turning every task into a large card.\n */\nexport function compactDagLayout(tasks) {\n const stages = taskStages(tasks);\n const positions = new Map();\n const nodes = [];\n for (const [column, stage] of stages.entries()) {\n for (const [row, task] of stage.tasks.entries()) {\n const x = column * (COMPACT_DAG_NODE_WIDTH + COMPACT_DAG_COLUMN_GAP);\n const y = row * (COMPACT_DAG_NODE_HEIGHT + COMPACT_DAG_ROW_GAP);\n positions.set(task.id, { x, y });\n nodes.push({ task, x, y });\n }\n }\n const edges = [];\n for (const task of tasks) {\n const target = positions.get(task.id);\n if (target === undefined)\n continue;\n for (const dependency of task.dependencies) {\n const source = positions.get(dependency);\n if (source === undefined)\n continue;\n const x1 = source.x + COMPACT_DAG_NODE_WIDTH;\n const y1 = source.y + COMPACT_DAG_NODE_HEIGHT / 2;\n const x2 = target.x;\n const y2 = target.y + COMPACT_DAG_NODE_HEIGHT / 2;\n edges.push({\n from: dependency,\n to: task.id,\n path: `M${x1} ${y1}C${x1 + 14} ${y1},${x2 - 14} ${y2},${x2} ${y2}`,\n });\n }\n }\n const rows = Math.max(1, ...stages.map((stage) => stage.tasks.length));\n return {\n width: stages.length === 0\n ? 0\n : stages.length * COMPACT_DAG_NODE_WIDTH + (stages.length - 1) * COMPACT_DAG_COLUMN_GAP,\n height: stages.length === 0\n ? 0\n : rows * COMPACT_DAG_NODE_HEIGHT + (rows - 1) * COMPACT_DAG_ROW_GAP,\n nodes,\n edges,\n };\n}\n/**\n * Return the complete upstream/downstream chain around one task.\n *\n * Traversal uses both dependency directions and remains cycle-safe, so the UI\n * can highlight every handoff related to the focused task even if malformed\n * durable data contains a cycle.\n */\nexport function relatedTaskIds(taskId, tasks) {\n const byId = new Map(tasks.map((task) => [task.id, task]));\n if (!byId.has(taskId))\n return new Set();\n const dependents = new Map();\n for (const task of tasks) {\n for (const dependency of task.dependencies) {\n const targets = dependents.get(dependency) ?? [];\n targets.push(task.id);\n dependents.set(dependency, targets);\n }\n }\n const related = new Set();\n const upstreamSeen = new Set();\n const downstreamSeen = new Set();\n const visitUpstream = (id) => {\n if (upstreamSeen.has(id))\n return;\n upstreamSeen.add(id);\n related.add(id);\n for (const dependency of byId.get(id)?.dependencies ?? [])\n visitUpstream(dependency);\n };\n const visitDownstream = (id) => {\n if (downstreamSeen.has(id))\n return;\n downstreamSeen.add(id);\n related.add(id);\n for (const dependent of dependents.get(id) ?? [])\n visitDownstream(dependent);\n };\n visitUpstream(taskId);\n visitDownstream(taskId);\n return related;\n}\n","/** Shared, demand-driven state for the AgentTeams browser monitor. */\nconst targets = new Map();\nconst targetListeners = new Set();\nconst snapshotListeners = new Set();\nlet targetSnapshot = [];\nlet activitySnapshots = { teams: [], archivedTeams: [] };\nfunction targetKey(sessionId, teamId) {\n return `${sessionId}\\u0000${teamId}`;\n}\nfunction publishTargets() {\n targetSnapshot = [...targets.values()]\n .filter((target) => target.active)\n .map(({ key, sessionId, teamId }) => ({ key, sessionId, teamId }));\n for (const listener of targetListeners)\n listener();\n}\n/** Subscribe to the active monitor-target list (React external-store shape). */\nexport function subscribeActivityMonitorTargets(listener) {\n targetListeners.add(listener);\n return () => { targetListeners.delete(listener); };\n}\n/** Read the stable active-target snapshot. */\nexport function getActivityMonitorTargetsSnapshot() {\n return targetSnapshot;\n}\n/**\n * Register one successful AgentTeams card as a monitoring demand.\n *\n * The returned cleanup is reference-counted so multiple cards and React\n * StrictMode remounts cannot stop another card's monitor.\n */\nexport function monitorAgentTeam(sessionId, teamId) {\n const owner = sessionId.trim();\n const id = teamId.trim();\n if (owner === '' || id === '')\n return () => { };\n const key = targetKey(owner, id);\n const existing = targets.get(key);\n if (existing === undefined) {\n targets.set(key, { key, sessionId: owner, teamId: id, refs: 1, active: true });\n publishTargets();\n }\n else {\n existing.refs += 1;\n if (!existing.active) {\n existing.active = true;\n publishTargets();\n }\n }\n let released = false;\n return () => {\n if (released)\n return;\n released = true;\n const current = targets.get(key);\n if (current === undefined)\n return;\n current.refs -= 1;\n if (current.refs <= 0) {\n targets.delete(key);\n if (current.active)\n publishTargets();\n }\n };\n}\n/** Stop polling targets whose final archived snapshot has been captured. */\nexport function settleActivityMonitorTargets(keys) {\n let changed = false;\n for (const key of keys) {\n const target = targets.get(key);\n if (target?.active !== true)\n continue;\n target.active = false;\n changed = true;\n }\n if (changed)\n publishTargets();\n}\n/** Subscribe to the shared live/archive snapshot. */\nexport function subscribeActivitySnapshots(listener) {\n snapshotListeners.add(listener);\n return () => { snapshotListeners.delete(listener); };\n}\n/** Read the stable shared live/archive snapshot. */\nexport function getActivitySnapshotsSnapshot() {\n return activitySnapshots;\n}\n/** Publish one or both successful state-route responses. */\nexport function updateActivitySnapshots(update) {\n const next = {\n teams: update.teams ?? activitySnapshots.teams,\n archivedTeams: update.archivedTeams ?? activitySnapshots.archivedTeams,\n };\n if (next.teams === activitySnapshots.teams && next.archivedTeams === activitySnapshots.archivedTeams)\n return;\n activitySnapshots = next;\n for (const listener of snapshotListeners)\n listener();\n}\n/** Poll cadence for the live host snapshot route. */\nexport const ACTIVITY_POLL_MS = 1000;\n/**\n * Low-frequency probe cadence while a cardless discovery session still owns\n * no team. The probe keeps the panel able to pick up a team created later in\n * that session (e.g. a run_code-wrapped agent_teams_create) without turning\n * every ordinary session into a one-second filesystem scan.\n */\nexport const ACTIVITY_PROBE_MS = 5000;\n/** Host route serving live and archived team snapshots. */\nexport const ACTIVITY_STATE_URL = '/plugins/dsh-agent-teams/state';\n/**\n * Start the single polling loop for the current session's requested targets.\n *\n * With neither targets nor a discovery session this is deliberately inert.\n * Explicit card targets poll at the live cadence from the start. A discovery\n * session performs an immediate live+archive restore pass, then — while it\n * still owns no team — probes on a low-frequency cadence, so a team created\n * later in that session (e.g. a run_code-wrapped agent_teams_create) is\n * discovered without a manual reload, without turning every ordinary session\n * into a one-second filesystem scan. The moment a team for the discovery\n * session appears, the controller upgrades to the live one-second cadence for\n * the rest of its lifetime. The caller — the session view, which stops the\n * controller when the session is no longer current — bounds the lifetime, and\n * archive state is refreshed when a target or a previously discovered live\n * team disappears.\n */\nexport function startActivityPolling(monitorTargets, runtime = {}) {\n const discoverySessionId = runtime.discoverySessionId?.trim();\n if (monitorTargets.length === 0 && (discoverySessionId === undefined || discoverySessionId === '')) {\n return { firstTick: Promise.resolve(), stop: () => { } };\n }\n const fetchState = runtime.fetchState ?? ((url, init) => fetch(url, init));\n const schedule = runtime.schedule ?? ((callback, intervalMs) => setInterval(callback, intervalMs));\n const cancel = runtime.cancel ?? ((timer) => { clearInterval(timer); });\n const publishSnapshots = runtime.publishSnapshots ?? updateActivitySnapshots;\n const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;\n let cancelled = false;\n let inFlight = false;\n // Explicit card targets are demanded work: start at the live cadence. A\n // discovery session starts probing low-frequency and upgrades on detection.\n let hot = monitorTargets.length > 0;\n let discoveryComplete = false;\n let discoveredLiveKeys = new Set();\n let controller;\n let timer;\n const intervalMs = () => (hot ? ACTIVITY_POLL_MS : ACTIVITY_PROBE_MS);\n const reschedule = () => {\n cancel(timer);\n timer = schedule(() => { void tick(); }, intervalMs());\n };\n const tick = async () => {\n if (inFlight || cancelled)\n return;\n inFlight = true;\n controller = new AbortController();\n try {\n const liveResponse = await fetchState(ACTIVITY_STATE_URL, {\n cache: 'no-store',\n signal: controller.signal,\n });\n if (!liveResponse.ok)\n return;\n const body = (await liveResponse.json());\n if (cancelled || !Array.isArray(body.teams))\n return;\n const liveTeams = body.teams;\n publishSnapshots({ teams: liveTeams });\n const previousDiscoveredKeys = discoveredLiveKeys;\n discoveredLiveKeys = new Set(discoverySessionId === undefined || discoverySessionId === ''\n ? []\n : liveTeams\n .filter((team) => team.captainSessionId === discoverySessionId)\n .map((team) => team.teamId));\n // A discovery session found its first team: upgrade from the low-frequency\n // probe to the live cadence for the rest of the controller lifetime.\n if (!hot && discoveredLiveKeys.size > 0) {\n hot = true;\n reschedule();\n }\n const discoveredTeamArchived = [...previousDiscoveredKeys]\n .some((teamId) => !discoveredLiveKeys.has(teamId));\n const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));\n const needsDiscoveryArchive = discoverySessionId !== undefined\n && discoverySessionId !== ''\n && !discoveryComplete;\n if (missing.length === 0 && !needsDiscoveryArchive && !discoveredTeamArchived)\n return;\n // Archives are immutable per team generation. A successful fallback\n // retires every missing explicit target, including legacy cards whose\n // host archive no longer exists; a discovery session that already\n // upgraded keeps polling, and a still-probing one keeps probing, so a\n // team created later in the same session stays discoverable.\n const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {\n cache: 'no-store',\n signal: controller.signal,\n });\n if (!archivedResponse.ok)\n return;\n const archivedBody = (await archivedResponse.json());\n if (cancelled || !Array.isArray(archivedBody.teams))\n return;\n publishSnapshots({ archivedTeams: archivedBody.teams });\n discoveryComplete = true;\n settleTargets(new Set(missing.map((target) => target.key)));\n }\n catch (error) {\n if (error?.name === 'AbortError')\n return;\n // Host restarting; keep the last snapshot and retry on the next tick.\n }\n finally {\n inFlight = false;\n }\n };\n const firstTick = tick();\n if (timer === undefined)\n timer = schedule(() => { void tick(); }, intervalMs());\n return {\n firstTick,\n stop: () => {\n if (cancelled)\n return;\n cancelled = true;\n controller?.abort();\n cancel(timer);\n },\n };\n}\n","/**\n * Shared whale artwork lookup for the activity panel and the conversation\n * card: role keywords map to the packaged role images; the captain always\n * uses the lead whale.\n * @module dsh-agent-teams/client/artwork\n */\n/** Artwork route prefix served by the plugin host half. */\nexport const ART_BASE = '/plugins/dsh-agent-teams/assets/';\n/** V2 whale role artwork per role keyword. */\nconst ROLE_ART = [\n [/data|analys|metric|performance|数据|分析|指标|性能/, 'member-data-v2.png'],\n [/resear|investig|explor|study|研究|调查|探索|调研/, 'member-researcher-v2.png'],\n // Match compound QA titles (for example \"QA Engineer\") before the broad\n // engineer bucket, otherwise an eight-role roster repeats the engineer art.\n [/\\bqa\\b|test|verif|quality|测试|质量|验证/, 'member-qa-v2.png'],\n [/engineer|dev\\b|server|backend|\\bapi\\b|runtime|watcher|contract|工程|后端|服务|接口|开发|代码|编程/, 'member-engineer-v2.png'],\n [/design|\\bui\\b|\\bux\\b|front|theme|accessib|设计|前端|主题|无障碍/, 'member-designer-v2.png'],\n [/secur|audit|risk|threat|review|安全|审计|审查|风险/, 'member-security-v2.png'],\n [/docs|writer|product|spec|撰写|文案|写作|文档|规范/, 'member-docs-v2.png'],\n [/release|\\bbuild\\b|deploy|\\bops\\b|\\bci\\b|ship|coordin|发布|构建|部署|运维|协调/, 'member-operator-v2.png'],\n];\n/** Captain artwork (always the lead whale). */\nexport const LEAD_ART = `${ART_BASE}team-lead-v2.png`;\n/** Status action artwork per member activity. */\nexport const ACTION_ART = {\n working: `${ART_BASE}action-working-v2.png`,\n idle: `${ART_BASE}action-sleeping-v2.png`,\n unknown: `${ART_BASE}action-thinking-v2.png`,\n};\n/**\n * Member artwork URL, or null when no role matches (initial-letter fallback).\n * @param name - the member's display name.\n * @param role - the member's role text.\n * @returns the artwork URL, or null when unmatched.\n */\nexport function memberArtUrl(name, role) {\n const identity = `${name} ${role}`.toLowerCase();\n for (const [pattern, art] of ROLE_ART) {\n if (pattern.test(identity))\n return `${ART_BASE}${art}`;\n }\n return null;\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * AgentTeams conversation card: the lightweight in-conversation summary for\n * one team — the captain's whale avatar and name, the member roster as\n * clickable whale avatars (opening the member's subagent transcript), and\n * an \"activity panel\" button that re-activates the top-right floater.\n *\n * The floater and this card share the `agent-teams:open-panel` window event\n * so the card can summon the panel even after it was closed (or when an old\n * session is re-opened for review).\n * @module dsh-agent-teams/client/card\n */\nimport { useEffect, useMemo, useSyncExternalStore } from 'react';\nimport { getActivitySnapshotsSnapshot, monitorAgentTeam, subscribeActivitySnapshots, } from \"./activity-monitor.js\";\nimport { LEAD_ART, memberArtUrl } from \"./artwork.js\";\nimport css from './AgentTeamsCard.module.css';\n/** Window event name the floater listens for to open itself. */\nexport const OPEN_PANEL_EVENT = 'agent-teams:open-panel';\n/** Re-activate the top-right activity panel, carrying this team's summary\n * so the panel can show it even when the team no longer exists on disk\n * (historical session review). */\nfunction openActivityPanel(data) {\n window.dispatchEvent(new CustomEvent(OPEN_PANEL_EVENT, {\n detail: {\n teamId: data.teamId,\n captainSessionId: data.captainSessionId,\n teamName: data.teamName,\n members: data.members,\n },\n }));\n}\n/** Render one durable team as a compact conversation card. */\nexport function AgentTeamsCard({ node, openMember, sessionId, t }) {\n const data = node.data;\n // `conversation.chat.node` is session-scoped, so its framework-owned id is\n // a stable owner even while another conversation becomes current.\n const owner = data.captainSessionId || sessionId;\n const { teams, archivedTeams } = useSyncExternalStore(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n useEffect(() => {\n return monitorAgentTeam(owner, data.teamId);\n }, [data.teamId, owner]);\n const snapshot = teams.find((team) => team.teamId === data.teamId && (owner === '' || team.captainSessionId === owner))\n ?? archivedTeams.find((team) => team.teamId === data.teamId && (owner === '' || team.captainSessionId === owner));\n const resolved = useMemo(() => ({\n ...data,\n captainSessionId: snapshot?.captainSessionId ?? owner,\n teamName: snapshot?.name ?? data.teamName,\n members: snapshot?.members.map((member) => ({ id: member.id, name: member.name, role: member.role })) ?? data.members,\n }), [data, owner, snapshot]);\n return (_jsxs(\"section\", { className: css.root, \"data-agent-teams-card\": true, \"data-team-id\": resolved.teamId, children: [_jsxs(\"header\", { className: css.head, children: [_jsx(\"img\", { className: css.leadAvatar, src: LEAD_ART, alt: \"\", \"aria-hidden\": true }), _jsx(\"span\", { className: css.teamName, title: resolved.teamName, children: resolved.teamName }), _jsx(\"span\", { className: css.memberCount, children: t('card.memberCount', { count: resolved.members.length }) }), _jsx(\"button\", { type: \"button\", className: css.panelButton, onClick: () => { openActivityPanel(resolved); }, \"aria-label\": t('action.openActivityPanel'), title: t('action.openActivityPanel'), children: t('activity.panelButton') })] }), resolved.members.length > 0 && (_jsx(\"div\", { className: css.members, children: resolved.members.map((member) => (_jsxs(\"button\", { type: \"button\", className: css.member, onClick: () => {\n if (member.id !== '')\n openMember(owner, member.id);\n }, title: member.role === '' ? member.name : `${member.name} · ${member.role}`, children: [memberArtUrl(member.name, member.role) !== null ? (_jsx(\"img\", { className: css.memberArt, src: memberArtUrl(member.name, member.role) ?? '', alt: \"\", \"aria-hidden\": true })) : (_jsx(\"span\", { className: css.memberInitial, children: member.name.trim().slice(0, 1).toUpperCase() || '?' })), _jsx(\"span\", { className: css.memberName, children: member.name })] }, member.id))) }))] }));\n}\n","/** Pure persisted geometry rules for the AgentTeams shell-overlay panel. */\nexport const PANEL_LAYOUT_STORAGE_KEY = 'dsh-agent-teams:activity-panel:v1';\nexport const PANEL_COMPACT_BREAKPOINT = 960;\nexport const PANEL_DEFAULT_WIDTH = 388;\nexport const PANEL_DEFAULT_HEIGHT = 640;\nexport const PANEL_MIN_WIDTH = 320;\nexport const PANEL_MAX_WIDTH = 640;\nexport const PANEL_MIN_HEIGHT = 360;\nexport const PANEL_DOCK_TOP = 64;\nexport const PANEL_DOCK_RIGHT = 18;\nexport const PANEL_DOCK_BOTTOM = 48;\nexport const PANEL_FLOAT_MARGIN = 12;\nexport const DEFAULT_PANEL_LAYOUT = Object.freeze({\n mode: 'docked',\n x: 0,\n y: PANEL_DOCK_TOP,\n width: PANEL_DEFAULT_WIDTH,\n height: PANEL_DEFAULT_HEIGHT,\n heightMode: 'auto',\n});\nfunction clamp(value, minimum, maximum) {\n return Math.min(Math.max(value, minimum), maximum);\n}\nfunction finite(value) {\n return typeof value === 'number' && Number.isFinite(value);\n}\n/** Decode one versioned localStorage value, rejecting partial/corrupt state. */\nexport function parsePanelLayout(value) {\n if (value === null)\n return DEFAULT_PANEL_LAYOUT;\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== 'object' || parsed === null)\n return DEFAULT_PANEL_LAYOUT;\n const record = parsed;\n if ((record.mode !== 'docked' && record.mode !== 'floating')\n || !finite(record.x) || !finite(record.y)\n || !finite(record.width) || !finite(record.height)) {\n return DEFAULT_PANEL_LAYOUT;\n }\n return {\n mode: record.mode,\n x: record.x,\n y: record.y,\n width: record.width,\n height: record.height,\n // v1 values written before content-fit height existed have no mode.\n // Treat them as automatic so the upgrade removes legacy blank space.\n heightMode: record.mode === 'floating' && record.heightMode === 'manual' ? 'manual' : 'auto',\n };\n }\n catch {\n return DEFAULT_PANEL_LAYOUT;\n }\n}\n/** Whether the panel should become a simple inset overlay with no gestures. */\nexport function compactPanelForBounds(bounds) {\n return bounds.width <= PANEL_COMPACT_BREAKPOINT;\n}\n/** Docked and compact panels always fit content; floating panels may be user-sized. */\nexport function panelUsesAutoHeight(layout, bounds) {\n return compactPanelForBounds(bounds) || layout.mode === 'docked' || layout.heightMode === 'auto';\n}\n/** CSS max-height ceiling that keeps an auto-height panel inside its shell. */\nexport function panelMaximumHeight(layout, bounds) {\n const bottomInset = compactPanelForBounds(bounds) || layout.mode === 'floating'\n ? PANEL_FLOAT_MARGIN\n : PANEL_DOCK_BOTTOM;\n return Math.max(1, bounds.height - layout.y - bottomInset);\n}\n/** Resolve persisted state into a visible rectangle inside the current shell. */\nexport function resolvePanelGeometry(layout, bounds) {\n const boundsWidth = Math.max(1, bounds.width);\n const boundsHeight = Math.max(1, bounds.height);\n if (compactPanelForBounds(bounds)) {\n return {\n ...layout,\n x: PANEL_FLOAT_MARGIN,\n y: PANEL_FLOAT_MARGIN,\n width: Math.max(1, boundsWidth - PANEL_FLOAT_MARGIN * 2),\n height: Math.max(1, boundsHeight - PANEL_FLOAT_MARGIN * 2),\n };\n }\n const maximumWidth = Math.max(1, Math.min(PANEL_MAX_WIDTH, boundsWidth - PANEL_FLOAT_MARGIN * 2));\n const minimumWidth = Math.min(PANEL_MIN_WIDTH, maximumWidth);\n const width = clamp(layout.width, minimumWidth, maximumWidth);\n const maximumHeight = Math.max(1, boundsHeight - PANEL_FLOAT_MARGIN * 2);\n const minimumHeight = Math.min(PANEL_MIN_HEIGHT, maximumHeight);\n if (layout.mode === 'docked') {\n const y = clamp(PANEL_DOCK_TOP, PANEL_FLOAT_MARGIN, Math.max(PANEL_FLOAT_MARGIN, boundsHeight - minimumHeight - PANEL_FLOAT_MARGIN));\n const availableHeight = Math.max(1, boundsHeight - y - PANEL_DOCK_BOTTOM);\n const height = clamp(availableHeight, Math.min(minimumHeight, availableHeight), maximumHeight);\n const anchorRight = clamp(bounds.anchorRight, 0, boundsWidth);\n const maximumX = Math.max(PANEL_FLOAT_MARGIN, boundsWidth - width - PANEL_FLOAT_MARGIN);\n const x = clamp(anchorRight - PANEL_DOCK_RIGHT - width, PANEL_FLOAT_MARGIN, maximumX);\n return { mode: 'docked', x, y, width, height, heightMode: layout.heightMode };\n }\n const height = clamp(layout.height, minimumHeight, maximumHeight);\n return {\n mode: 'floating',\n x: clamp(layout.x, PANEL_FLOAT_MARGIN, Math.max(PANEL_FLOAT_MARGIN, boundsWidth - width - PANEL_FLOAT_MARGIN)),\n y: clamp(layout.y, PANEL_FLOAT_MARGIN, Math.max(PANEL_FLOAT_MARGIN, boundsHeight - height - PANEL_FLOAT_MARGIN)),\n width,\n height,\n heightMode: layout.heightMode,\n };\n}\n/** Undock without a visual jump by adopting the panel's resolved rectangle. */\nexport function floatPanelLayout(geometry, bounds) {\n return resolvePanelGeometry({ ...geometry, mode: 'floating' }, bounds);\n}\n/** Return to the right dock, preserving width and restoring content-fit height. */\nexport function dockPanelLayout(layout, bounds) {\n return resolvePanelGeometry({ ...layout, mode: 'docked', heightMode: 'auto' }, bounds);\n}\n/** Translate a floating panel and clamp it back into the visible shell. */\nexport function movePanelLayout(start, dx, dy, bounds) {\n return resolvePanelGeometry({ ...start, mode: 'floating', x: start.x + dx, y: start.y + dy }, bounds);\n}\n/** Resize while keeping the edge opposite the active handle stationary. */\nexport function resizePanelLayout(start, edge, dx, dy, bounds) {\n if (start.mode === 'docked') {\n if (edge !== 'left')\n return resolvePanelGeometry(start, bounds);\n return resolvePanelGeometry({ ...start, width: start.width - dx }, bounds);\n }\n const resolved = resolvePanelGeometry(start, bounds);\n const minimumWidth = Math.min(PANEL_MIN_WIDTH, resolved.x + resolved.width - PANEL_FLOAT_MARGIN);\n const minimumHeight = Math.min(PANEL_MIN_HEIGHT, bounds.height - resolved.y - PANEL_FLOAT_MARGIN);\n if (edge === 'left') {\n const right = resolved.x + resolved.width;\n const maximumWidth = Math.max(1, Math.min(PANEL_MAX_WIDTH, right - PANEL_FLOAT_MARGIN));\n const width = clamp(resolved.width - dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return { ...resolved, x: right - width, width };\n }\n const maximumHeight = Math.max(1, bounds.height - resolved.y - PANEL_FLOAT_MARGIN);\n const height = clamp(resolved.height + dy, Math.min(minimumHeight, maximumHeight), maximumHeight);\n if (edge === 'bottom')\n return { ...resolved, height, heightMode: 'manual' };\n const maximumWidth = Math.max(1, Math.min(PANEL_MAX_WIDTH, bounds.width - resolved.x - PANEL_FLOAT_MARGIN));\n const width = clamp(resolved.width + dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return { ...resolved, width, height, heightMode: 'manual' };\n}\n","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\n/**\n * AgentTeams activity panel: the top-right floater monitoring every team.\n *\n * Modeled on the Claude Code desktop SessionActivityPanel: a shell-overlay\n * panel that docks at the conversation's top-right edge by default, can be\n * dragged into a floating window, resized, and folded into an activity badge.\n * On wide viewports the docked panel makes the conversation column yield\n * space; narrow viewports keep a simple inset overlay. It\n * polls the host `/plugins/dsh-agent-teams/state` route for\n * server-side snapshots (durable files + live subagent activity), with a\n * collapsed badge that auto-expands once when activity appears. Archived\n * teams stay available for the owning conversation after live work ends.\n *\n * The floater mounts in ui-layout's additive `shell.overlay`; it is not a\n * conversation node — the in-conversation panel was removed in favor of this\n * always-available monitor.\n * @module dsh-agent-teams/client/activity\n */\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';\nimport { IconBranchOutline16, IconChevronDownOutline14, IconPanelLeftOutline16, } from '@deepseek-ai/dsh-client-ui-primitives';\nimport { activityPanelExpandedForSession, compactDagLayout, COMPACT_DAG_NODE_HEIGHT, COMPACT_DAG_NODE_WIDTH, dependencyFocusTaskId, relatedTaskIds, usesParallelTaskGrid, } from \"./activity-model.js\";\nimport { getActivityMonitorTargetsSnapshot, getActivitySnapshotsSnapshot, startActivityPolling, subscribeActivityMonitorTargets, subscribeActivitySnapshots, } from \"./activity-monitor.js\";\nimport { ACTION_ART, LEAD_ART, memberArtUrl } from \"./artwork.js\";\nimport { OPEN_PANEL_EVENT } from \"./AgentTeamsCard.js\";\nimport { DEFAULT_PANEL_LAYOUT, PANEL_LAYOUT_STORAGE_KEY, compactPanelForBounds, dockPanelLayout, floatPanelLayout, movePanelLayout, panelMaximumHeight, panelUsesAutoHeight, parsePanelLayout, resizePanelLayout, resolvePanelGeometry, } from \"./panel-geometry.js\";\nimport css from './ActivityPanel.module.css';\n/** Grace before the panel collapses once no team remains. */\nconst AUTOCLOSE_GRACE_MS = 2000;\n/**\n * Page-settle window after mount: activity restored on page load only shows\n * the collapsed badge, so the panel never yanks the conversation column\n * right after load. New activity after this window auto-expands as usual.\n */\nconst AUTO_OPEN_SETTLE_MS = 4000;\n/** Root marker shared with the panel CSS while the shell overlay is expanded. */\nconst PANEL_OPEN_ATTRIBUTE = 'data-agent-teams-panel-open';\n/** Shared width concession consumed by the conversation root CSS. */\nconst PANEL_SHIFT_PROPERTY = '--agent-teams-panel-shift';\nconst PANEL_CONVERSATION_GAP = 14;\nconst MOVE_THRESHOLD = 4;\nfunction initialPanelLayout() {\n if (typeof window === 'undefined')\n return DEFAULT_PANEL_LAYOUT;\n return parsePanelLayout(window.localStorage.getItem(PANEL_LAYOUT_STORAGE_KEY));\n}\nfunction initialPanelBounds() {\n if (typeof window === 'undefined')\n return { width: 1440, height: 900, anchorRight: 1440 };\n return { width: window.innerWidth, height: window.innerHeight, anchorRight: window.innerWidth };\n}\n/** Initial-letter fallback for unmatched roles. */\nfunction memberInitial(name) {\n return name.trim().slice(0, 1).toUpperCase() || '?';\n}\nfunction stableHash(value) {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) {\n hash = ((hash << 5) - hash + value.charCodeAt(index)) | 0;\n }\n return Math.abs(hash);\n}\nconst ACCENTS = [\n 'var(--dsw-alias-state-business-primary)',\n 'var(--dsw-alias-state-success)',\n 'var(--dsw-alias-state-danger)',\n 'var(--dsw-alias-state-warning)',\n 'var(--dsw-alias-label-tertiary)',\n];\nfunction accentOf(id) {\n return ACCENTS[stableHash(id) % ACCENTS.length] ?? ACCENTS[0];\n}\n/** Badge text follows the raw task status (finer than the 4 visual states):\n * claimed/pending/failed/cancelled keep their own labels and colors. */\nconst TASK_STATUS_LABEL = {\n pending: 'task.status.pending',\n claimed: 'task.status.claimed',\n in_progress: 'task.status.inProgress',\n completed: 'task.status.completed',\n failed: 'task.status.failed',\n cancelled: 'task.status.cancelled',\n};\nfunction taskStatusLabel(status, t) {\n const key = TASK_STATUS_LABEL[status];\n return key === undefined ? status : t(key);\n}\nfunction formatTaskIds(ids, t) {\n return ids.join(t('format.listSeparator'));\n}\n/** Badge/bar coloring key: visual state, widened for terminal statuses. */\nfunction taskTone(state, status) {\n if (status === 'failed')\n return 'failed';\n if (status === 'cancelled')\n return 'cancelled';\n return state;\n}\nfunction Chevron({ open }) {\n return (_jsx(\"svg\", { className: css.chevron, \"data-open\": open, width: \"9\", height: \"9\", viewBox: \"0 0 10 10\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"1.5\", strokeLinecap: \"round\", \"aria-hidden\": true, children: _jsx(\"path\", { d: \"M3.5 2l3 3-3 3\" }) }));\n}\nfunction WorkGlyph({ active }) {\n return (_jsx(\"svg\", { className: css.workGlyph, \"data-active\": active, width: \"11\", height: \"11\", viewBox: \"0 0 11 11\", fill: \"currentColor\", \"aria-hidden\": true, children: [[0, 0], [4.2, 0], [8.4, 0], [0, 4.2], [4.2, 4.2], [8.4, 4.2]].map(([x, y], index) => (_jsx(\"rect\", { x: x, y: y, width: \"2.6\", height: \"2.6\", rx: \".6\", style: { animationDelay: `${index * 0.15}s` } }, `${x}:${y}`))) }));\n}\n/** Collapsed badge: an always-visible corner pill while any team exists. */\nfunction CollapsedBadge({ count, busy, onClick, t }) {\n return (_jsxs(\"button\", { type: \"button\", className: css.badge, \"data-agent-teams-collapsed\": true, \"data-busy\": busy, onClick: onClick, \"aria-label\": t('activity.badgeAria', { count }), children: [_jsx(\"span\", { className: css.badgeDot, \"data-busy\": busy, \"aria-hidden\": true }), _jsx(\"span\", { className: css.badgeCount, children: count })] }));\n}\nfunction memberStateLabel(member, tasks, historic, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n if (member.activity === 'working')\n return t('member.state.working');\n if (owned.some((task) => task.status === 'failed'))\n return t('member.state.failed');\n if (owned.some((task) => task.state === 'blocked'))\n return t('member.state.waiting');\n if (owned.length > 0 && owned.every((task) => task.status === 'completed'))\n return t('member.state.delivered');\n if (member.status === 'removed')\n return t(historic ? 'member.state.left' : 'member.state.removed');\n if (owned.length > 0)\n return t('member.state.pending');\n return t('member.state.unassigned');\n}\nfunction memberStatusText(member, tasks, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n const current = owned.find((task) => task.id === member.currentTask);\n const blocked = owned.find((task) => task.state === 'blocked');\n if (member.activity === 'working' && current !== undefined)\n return t('member.status.executing', { taskId: current.id });\n if (member.activity === 'working')\n return t('member.status.working');\n if (blocked !== undefined) {\n const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== 'completed');\n if (dependency !== undefined) {\n return t('member.status.waitingOn', {\n taskId: dependency.id,\n assignee: dependency.assignee || t('task.assignee.unclaimed'),\n });\n }\n return t('member.status.waitingPrerequisite');\n }\n if (member.total === 0)\n return t('member.status.waitingAssignment');\n if (member.done === member.total)\n return t('member.status.delivered');\n return t(member.activity === 'idle' ? 'member.status.idle' : 'member.status.unknown');\n}\nfunction compactTaskLabel(subject) {\n const withoutVerb = subject.replace(/^开发\\s*/u, '').replace(/^\\d+[-_.、\\s]*/u, '');\n const head = withoutVerb.split(/[((·::]/u)[0]?.trim() ?? withoutVerb;\n return head.length > 18 ? `${head.slice(0, 17)}…` : head;\n}\nfunction taskSummary(team, t) {\n const completed = team.tasks.filter((task) => task.status === 'completed');\n const running = team.tasks.filter((task) => task.state === 'running');\n const blocked = team.tasks.filter((task) => task.state === 'blocked');\n const ready = team.tasks.filter((task) => task.state === 'open' && task.status !== 'completed');\n if (team.tasks.length === 0)\n return t('task.summary.waitingBreakdown');\n if (completed.length === team.tasks.length)\n return t('task.summary.allDelivered', { count: completed.length });\n if (blocked.length > 0 && running.length > 0) {\n return t('task.summary.blockedAndRunning', {\n tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),\n more: blocked.length > 3 ? t('task.summary.more', { count: blocked.length - 3 }) : '',\n });\n }\n if (running.length > 0)\n return t('task.summary.running', { tasks: formatTaskIds(running.map((task) => task.id), t) });\n if (ready.length > 0)\n return t('task.summary.ready', { tasks: formatTaskIds(ready.map((task) => task.id), t) });\n if (blocked.length > 0)\n return t('task.summary.blocked', { tasks: formatTaskIds(blocked.map((task) => task.id), t) });\n return t('task.summary.waitingSchedule');\n}\nfunction ProgressOverview({ team, t }) {\n const running = team.tasks.filter((task) => task.state === 'running').length;\n const blocked = team.tasks.filter((task) => task.state === 'blocked').length;\n const completed = team.tasks.filter((task) => task.status === 'completed').length;\n const summaryTone = blocked > 0 ? 'warning' : completed === team.tasks.length && team.tasks.length > 0 ? 'completed' : 'running';\n return (_jsxs(\"section\", { className: css.progressOverview, \"aria-label\": t('progress.aria'), \"data-progress-summary\": true, children: [_jsx(\"span\", { className: css.progressTitle, children: t('progress.title') }), team.tasks.length > 0 ? (_jsx(\"span\", { className: css.progressSegments, \"aria-hidden\": true, children: team.tasks.map((task) => _jsx(\"span\", { \"data-state\": taskTone(task.state, task.status) }, task.id)) })) : _jsx(\"span\", { className: css.progressEmpty }), _jsxs(\"span\", { className: css.progressLegend, children: [_jsx(\"span\", { \"data-state\": \"running\", children: t('progress.running', { count: running }) }), _jsx(\"span\", { \"data-state\": \"blocked\", children: t('progress.blocked', { count: blocked }) }), _jsx(\"span\", { \"data-state\": \"completed\", children: t('progress.delivered', { count: completed }) })] }), _jsxs(\"span\", { className: css.progressSummary, \"data-state\": summaryTone, children: [_jsx(\"span\", { className: css.progressSummaryDot }), _jsx(\"span\", { children: taskSummary(team, t) })] })] }));\n}\nfunction DependencyMap({ tasks, t }) {\n const [open, setOpen] = useState(true);\n const [hoverTaskId, setHoverTaskId] = useState(null);\n const [keyboardTaskId, setKeyboardTaskId] = useState(null);\n const [pinnedTaskId, setPinnedTaskId] = useState(null);\n const hoverTimer = useRef(null);\n const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);\n const layout = useMemo(() => compactDagLayout(tasks), [tasks]);\n const parallel = useMemo(() => usesParallelTaskGrid(tasks), [tasks]);\n const related = useMemo(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);\n const scheduleHover = (id) => {\n if (hoverTimer.current !== null) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (id === null) {\n setHoverTaskId(null);\n return;\n }\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n setHoverTaskId(id);\n }, 180);\n };\n useEffect(() => () => {\n if (hoverTimer.current !== null)\n clearTimeout(hoverTimer.current);\n }, []);\n useEffect(() => {\n const onKeyDown = (event) => {\n if (event.key === 'Escape')\n setPinnedTaskId(null);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => { window.removeEventListener('keydown', onKeyDown); };\n }, []);\n if (tasks.length === 0)\n return null;\n const fallbackTask = tasks.find((task) => task.state === 'blocked')\n ?? tasks.find((task) => task.state === 'running')\n ?? tasks[0];\n const detailTask = tasks.find((task) => task.id === focusedTaskId) ?? fallbackTask;\n const waitingOn = detailTask.dependencies.filter((dependency) => (tasks.find((task) => task.id === dependency)?.status !== 'completed'));\n const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));\n return (_jsxs(\"section\", { className: css.dependencySection, \"aria-label\": t('dependency.aria'), \"data-dependency-map\": true, children: [_jsxs(\"header\", { className: css.sectionHead, children: [_jsxs(\"button\", { type: \"button\", className: css.sectionToggleTitle, onClick: () => { setOpen((current) => !current); }, \"aria-expanded\": open, children: [_jsx(Chevron, { open: open }), _jsx(IconBranchOutline16, {}), \" \", t(parallel ? 'dependency.parallel' : 'dependency.title')] }), _jsx(\"span\", { className: css.sectionHint, children: pinnedTaskId === null\n ? t(parallel ? 'dependency.hint.parallel' : 'dependency.hint.chain')\n : t('dependency.hint.pinned', { taskId: pinnedTaskId }) })] }), open && (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: css.dagViewport, children: _jsxs(\"div\", { className: css.dagCanvas, \"data-layout\": parallel ? 'parallel' : 'dependency', style: parallel ? undefined : { width: layout.width, height: layout.height }, children: [!parallel && _jsx(\"svg\", { className: css.dagEdges, width: layout.width, height: layout.height, \"aria-hidden\": true, children: layout.edges.map((edge) => {\n const active = related !== null && related.has(edge.from) && related.has(edge.to);\n return _jsx(\"path\", { d: edge.path, \"data-active\": active, \"data-dimmed\": related !== null && !active }, `${edge.from}:${edge.to}`);\n }) }), layout.nodes.map(({ task, x, y }) => (_jsxs(\"button\", { type: \"button\", className: css.dagNode, style: parallel\n ? { height: COMPACT_DAG_NODE_HEIGHT }\n : { left: x, top: y, width: COMPACT_DAG_NODE_WIDTH, height: COMPACT_DAG_NODE_HEIGHT }, \"data-task-id\": task.id, \"data-state\": taskTone(task.state, task.status), \"data-focused\": related?.has(task.id) ?? false, \"data-dimmed\": related !== null && !related.has(task.id), \"aria-pressed\": pinnedTaskId === task.id, title: `${task.id} · ${task.subject}`, onClick: () => { setPinnedTaskId((current) => current === task.id ? null : task.id); }, onMouseEnter: () => { scheduleHover(task.id); }, onMouseLeave: () => { scheduleHover(null); }, onFocus: () => { setKeyboardTaskId(task.id); }, onBlur: () => { setKeyboardTaskId(null); }, children: [_jsxs(\"span\", { className: css.dagNodeHead, children: [_jsx(\"span\", { className: css.dagNodeDot }), task.id] }), _jsx(\"span\", { className: css.dagNodeLabel, children: compactTaskLabel(task.subject) }), task.state === 'running' && (_jsx(\"span\", { className: css.dagRunningState, \"aria-label\": t('task.runningAria'), children: _jsx(WorkGlyph, { active: true }) }))] }, task.id)))] }) }), _jsxs(\"section\", { className: css.taskDetail, \"data-task-detail\": detailTask.id, children: [_jsxs(\"span\", { className: css.taskDetailHead, children: [_jsx(\"span\", { className: css.taskDetailId, children: detailTask.id }), _jsx(\"span\", { className: css.taskDetailSubject, title: detailTask.subject, children: detailTask.subject.replace(/^开发\\s*/u, '') }), _jsx(\"span\", { className: css.taskDetailBadge, \"data-state\": taskTone(detailTask.state, detailTask.status), children: taskStatusLabel(detailTask.status, t) })] }), _jsxs(\"span\", { className: css.taskDetailLine, children: [detailTask.assignee || t('task.assignee.unclaimed'), \" \\u00B7 \", detailTask.status === 'completed'\n ? t('task.detail.completed')\n : detailTask.dependencies.length === 0\n ? t('task.detail.noPrerequisite')\n : waitingOn.length === 0\n ? t('task.detail.ready')\n : t('task.detail.waitingOn', { tasks: formatTaskIds(waitingOn, t) })] }), _jsx(\"span\", { className: css.taskDetailMeta, children: dependents.length === 0\n ? t('task.detail.noDownstream')\n : t('task.detail.unlocks', { tasks: formatTaskIds(dependents.map((task) => task.id), t) }) })] })] }))] }));\n}\nfunction TeamSection({ team, onNavigate, t, historic = false }) {\n const [membersOpen, setMembersOpen] = useState(true);\n const busyCount = team.members.filter((member) => member.activity === 'working').length;\n const assignedCount = team.tasks.filter((task) => task.assignee !== '').length;\n const completedCount = team.tasks.filter((task) => task.status === 'completed').length;\n const allCompleted = team.tasks.length > 0 && completedCount === team.tasks.length;\n return (_jsxs(\"section\", { className: css.team, \"data-team-id\": team.teamId, children: [_jsxs(\"header\", { className: css.teamHead, children: [_jsx(\"span\", { className: css.teamName, title: team.name, children: team.name }), historic && _jsx(\"span\", { className: css.historicPill, children: t('team.ended') }), _jsxs(\"span\", { className: css.teamStats, children: [_jsx(\"span\", { \"data-stat\": \"members\", children: t('team.stats.members', { count: team.members.length }) }), _jsx(\"span\", { \"data-stat\": \"tasks\", children: t('team.stats.completed', { completed: completedCount, total: team.tasks.length }) }), _jsx(\"span\", { \"data-stat\": \"messages\", children: t('team.stats.messages', { count: team.messageCount }) })] })] }), _jsxs(\"section\", { className: css.delegationSection, \"aria-label\": t('delegation.aria'), \"data-delegation-map\": true, children: [_jsxs(\"div\", { className: css.captainNode, children: [_jsx(\"span\", { className: css.captainAvatar, children: _jsx(\"img\", { className: css.leadAvatar, src: LEAD_ART, alt: \"\", \"aria-hidden\": true }) }), _jsxs(\"span\", { className: css.captainInfo, children: [_jsxs(\"span\", { className: css.captainLine, children: [_jsx(\"span\", { className: css.captainName, children: t('captain.name') }), _jsx(\"span\", { className: css.captainRole, children: t('captain.role') })] }), _jsx(\"span\", { className: css.captainSummary, children: t('captain.summary', {\n tasks: assignedCount,\n members: team.members.length,\n }) })] }), _jsxs(\"span\", { className: css.captainState, \"data-busy\": busyCount > 0, children: [_jsx(WorkGlyph, { active: busyCount > 0 }), busyCount > 0\n ? t('captain.state.working', { count: busyCount })\n : t(allCompleted ? 'captain.state.collected' : 'captain.state.waiting')] })] }), _jsx(ProgressOverview, { team: team, t: t }), _jsxs(\"button\", { type: \"button\", className: css.membersToggle, onClick: () => { setMembersOpen((current) => !current); }, \"aria-expanded\": membersOpen, \"data-members-toggle\": true, children: [_jsxs(\"span\", { children: [_jsx(Chevron, { open: membersOpen }), t('members.toggle', { count: team.members.length })] }), _jsx(\"span\", { children: t(membersOpen ? 'members.collapse' : 'members.expand') })] }), membersOpen && _jsxs(\"div\", { className: css.delegationTree, children: [team.members.length === 0 && _jsx(\"span\", { className: css.emptyHint, children: t('members.empty') }), team.members.map((member) => {\n const owned = team.tasks.filter((task) => task.assignee === member.name);\n return (_jsxs(\"div\", { className: css.memberBlock, \"data-activity\": member.activity, children: [_jsx(\"span\", { className: css.memberBranch, \"aria-hidden\": true, children: _jsx(\"span\", {}) }), _jsxs(\"button\", { type: \"button\", className: css.memberRow, \"data-activity\": member.activity, onClick: () => {\n if (member.id !== '') {\n onNavigate(team.captainSessionId, member.id);\n }\n }, children: [_jsxs(\"span\", { className: css.memberAvatar, \"data-unread\": member.unread > 0, children: [memberArtUrl(member.name, member.role) !== null ? (_jsx(\"img\", { className: css.memberArt, src: memberArtUrl(member.name, member.role) ?? '', alt: \"\", \"aria-hidden\": true })) : (_jsx(\"span\", { className: css.memberInitial, style: { background: accentOf(member.id) }, children: memberInitial(member.name) })), _jsx(\"img\", { className: css.stateArt, \"data-activity\": member.activity, src: ACTION_ART[member.activity], alt: \"\", \"aria-hidden\": true })] }), _jsxs(\"span\", { className: css.memberInfo, children: [_jsxs(\"span\", { className: css.memberLine, children: [_jsx(\"span\", { className: css.memberName, children: member.name }), member.role !== '' && _jsx(\"span\", { className: css.memberRole, children: member.role }), _jsxs(\"span\", { className: css.memberState, \"data-activity\": member.activity, children: [_jsx(WorkGlyph, { active: member.activity === 'working' }), memberStateLabel(member, team.tasks, historic, t)] })] }), _jsx(\"span\", { className: css.memberStatusLine, children: memberStatusText(member, team.tasks, t) })] }), _jsxs(\"span\", { className: css.memberCount, children: [member.done, \"/\", member.total] })] }), _jsxs(\"div\", { className: css.assignmentLine, children: [_jsx(\"span\", { className: css.assignmentLabel, children: t('assignment.label') }), _jsx(\"span\", { className: css.assignmentTasks, children: owned.length === 0\n ? _jsx(\"span\", { className: css.taskEmpty, children: t('assignment.empty') })\n : owned.map((task) => (_jsx(\"span\", { className: css.assignmentChip, \"data-state\": taskTone(task.state, task.status), title: task.subject, children: task.id }, task.id))) })] })] }, member.id));\n })] })] }), _jsx(DependencyMap, { tasks: team.tasks, t: t })] }));\n}\n/** Legacy conversation cards may outlive their host archive. Project their\n * durable roster through the same rebuilt panel instead of a second UI. */\nfunction historicCardTeam(data, owner) {\n return {\n workspace: '',\n teamId: data.teamId,\n name: data.teamName,\n captainSessionId: data.captainSessionId || owner,\n members: data.members.map((member) => ({\n ...member,\n status: 'removed',\n activity: 'idle',\n progress: 0,\n done: 0,\n total: 0,\n currentTask: '',\n unread: 0,\n })),\n tasks: [],\n messageCount: 0,\n captainInbox: [],\n };\n}\nexport function ActivityPanel({ sessionsList, openMember, t }) {\n // Navigating to a member's subagent transcript is an explicit departure:\n // hide the floater immediately instead of waiting out the autocollapse\n // grace, so the panel never lingers over the member session.\n const navigateToSession = (parentId, childId) => {\n setOpen(false);\n setWasActive(false);\n openMember(parentId, childId);\n };\n const [open, setOpen] = useState(false);\n const [openOwner, setOpenOwner] = useState();\n const [autoOpened, setAutoOpened] = useState(false);\n const [wasActive, setWasActive] = useState(false);\n const [historic, setHistoric] = useState(new Map());\n const [layout, setLayout] = useState(initialPanelLayout);\n const [bounds, setBounds] = useState(initialPanelBounds);\n const [interaction, setInteraction] = useState(null);\n const panelRef = useRef(null);\n const boundsRef = useRef(bounds);\n const gestureRef = useRef(null);\n const frameRef = useRef(null);\n const pendingLayoutRef = useRef(null);\n const current = useSyncExternalStore(sessionsList.subscribe, sessionsList.getSnapshot).current;\n const monitorTargets = useSyncExternalStore(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);\n const { teams, archivedTeams } = useSyncExternalStore(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n const currentTargets = useMemo(() => current === undefined ? [] : monitorTargets.filter((target) => target.sessionId === current), [current, monitorTargets]);\n const currentRef = useRef(current);\n useEffect(() => { currentRef.current = current; }, [current]);\n const mountedAtRef = useRef(performance.now());\n const expanded = activityPanelExpandedForSession(open, openOwner, current);\n const geometry = useMemo(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);\n const compact = compactPanelForBounds(bounds);\n const commitLayout = useCallback((next) => {\n setLayout(next);\n }, []);\n useEffect(() => {\n window.localStorage.setItem(PANEL_LAYOUT_STORAGE_KEY, JSON.stringify(layout));\n }, [layout]);\n // The slot sits inside AppFrame, so all geometry is measured against the\n // shell overlay rather than the browser viewport. The conversation's real\n // right edge is the dock anchor and naturally follows sidebar/details\n // concessions without importing their hashed implementation classes.\n useLayoutEffect(() => {\n const overlay = document.querySelector('[data-shell-overlay]');\n if (overlay === null)\n return;\n const conversation = document.querySelector(\"[data-phase='active']\");\n let frame = null;\n const measure = () => {\n frame = null;\n const overlayRect = overlay.getBoundingClientRect();\n const conversationRect = conversation?.getBoundingClientRect();\n const next = {\n width: overlayRect.width,\n height: overlayRect.height,\n anchorRight: conversationRect === undefined\n ? overlayRect.width\n : Math.min(Math.max(conversationRect.right - overlayRect.left, 0), overlayRect.width),\n };\n const previous = boundsRef.current;\n if (previous.width === next.width\n && previous.height === next.height\n && previous.anchorRight === next.anchorRight)\n return;\n boundsRef.current = next;\n setBounds(next);\n };\n const scheduleMeasure = () => {\n frame ??= requestAnimationFrame(measure);\n };\n measure();\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(scheduleMeasure);\n observer?.observe(overlay);\n if (conversation !== null)\n observer?.observe(conversation);\n window.addEventListener('resize', scheduleMeasure);\n return () => {\n if (frame !== null)\n cancelAnimationFrame(frame);\n observer?.disconnect();\n window.removeEventListener('resize', scheduleMeasure);\n };\n }, [current]);\n // This shell overlay survives conversation route changes. Gate expansion by its\n // owning session during render, then clear stale state before paint. This\n // removes the old panel immediately instead of waiting for the no-team\n // autoclose grace period on the destination page.\n useLayoutEffect(() => {\n if (openOwner === undefined || openOwner === current)\n return;\n setOpen(false);\n setOpenOwner(undefined);\n setWasActive(false);\n setAutoOpened(false);\n }, [current, openOwner]);\n // Only the wide docked mode asks the conversation column to yield. Floating\n // and compact modes are intentionally true overlays. The width is written as\n // one shared variable so the panel and the concession cannot drift apart.\n useLayoutEffect(() => {\n const root = document.documentElement;\n const shouldYield = expanded && geometry.mode === 'docked' && !compact;\n if (shouldYield) {\n root.setAttribute(PANEL_OPEN_ATTRIBUTE, '');\n root.style.setProperty(PANEL_SHIFT_PROPERTY, `${geometry.width + PANEL_CONVERSATION_GAP + 18}px`);\n }\n else {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n }\n return () => {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n };\n }, [compact, expanded, geometry.mode, geometry.width]);\n useEffect(() => {\n if (current === undefined)\n return;\n // Cards keep live teams on the normal cadence. The current-session scope\n // also performs one cold-start discovery pass so archived/cardless teams\n // survive a browser or `dsh web` restart.\n const controller = startActivityPolling(currentTargets, { discoverySessionId: current });\n return () => { controller.stop(); };\n }, [current, currentTargets]);\n useEffect(() => {\n const onOpenPanel = (event) => {\n const activeSession = currentRef.current;\n if (activeSession === undefined)\n return;\n setOpenOwner(activeSession);\n setOpen(true);\n const detail = event.detail;\n if (detail?.teamId !== undefined) {\n // A card from a log that predates captainSessionId belongs to the\n // session that activated it (the current one at injection time).\n const owner = detail.captainSessionId !== '' ? detail.captainSessionId : currentRef.current ?? '';\n const teamKey = `${owner}:${detail.teamId}`;\n setHistoric((previous) => {\n const next = new Map(previous);\n next.set(teamKey, { data: detail, owner });\n return next;\n });\n }\n };\n window.addEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n return () => {\n window.removeEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n };\n }, []);\n // Teams follow the current session: live snapshots and historic card\n // summaries are visible only while their captain session is current.\n const visibleTeams = useMemo(\n // No current session (initial load): show nothing until one is picked,\n // so cross-session teams never leak into the floater.\n () => (current === undefined ? [] : teams.filter((team) => team.captainSessionId === current)), [teams, current]);\n const visibleHistoric = useMemo(() => (current === undefined ? [] : [...historic.values()].filter(({ data, owner }) => owner === current && !teams.some((live) => live.captainSessionId === current && live.teamId === data.teamId) && !archivedTeams.some((archived) => archived.captainSessionId === current && archived.teamId === data.teamId))), [historic, current, teams, archivedTeams]);\n const visibleArchived = useMemo(() => (current === undefined ? [] : archivedTeams.filter((team) => team.captainSessionId === current && !teams.some((live) => live.captainSessionId === current && live.teamId === team.teamId))), [archivedTeams, current, teams]);\n const visibleCount = visibleTeams.length + visibleArchived.length + visibleHistoric.length;\n useEffect(() => {\n if (visibleCount > 0) {\n setWasActive(true);\n // Auto-expand only after the page-settle window: opening (and its\n // main-column yield) right after load reads as a whole-page flicker.\n const settled = performance.now() - mountedAtRef.current >= AUTO_OPEN_SETTLE_MS;\n if (!autoOpened && settled) {\n setOpenOwner(current);\n setOpen(true);\n setAutoOpened(true);\n }\n return;\n }\n if (!wasActive)\n return;\n const timer = setTimeout(() => {\n setOpen(false);\n setOpenOwner(undefined);\n setWasActive(false);\n // Re-arm auto-expand: a later activity (new team, new session) may\n // open the panel on its own again.\n setAutoOpened(false);\n }, AUTOCLOSE_GRACE_MS);\n return () => { clearTimeout(timer); };\n }, [visibleCount, autoOpened, wasActive]);\n const busy = useMemo(() => visibleTeams.some((team) => team.members.some((member) => member.activity === 'working')), [visibleTeams]);\n const hasTeams = visibleCount > 0;\n // Auto-height panels do not store their live content height. Capture the\n // rendered box when a pointer gesture starts so movement and a first manual\n // resize clamp against what the user actually sees.\n const panelGeometryForGesture = useCallback(() => {\n const measuredHeight = panelRef.current?.getBoundingClientRect().height;\n if (measuredHeight === undefined || measuredHeight <= 0)\n return geometry;\n return { ...geometry, height: measuredHeight };\n }, [geometry]);\n const flushScheduledLayout = useCallback(() => {\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null)\n commitLayout(pending);\n }, [commitLayout]);\n const scheduleLayout = useCallback((next) => {\n pendingLayoutRef.current = next;\n frameRef.current ??= requestAnimationFrame(() => {\n frameRef.current = null;\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null)\n commitLayout(pending);\n });\n }, [commitLayout]);\n useEffect(() => () => {\n if (frameRef.current !== null)\n cancelAnimationFrame(frameRef.current);\n }, []);\n const beginMove = useCallback((event) => {\n if (compact || event.button !== 0 || event.target.closest('button') !== null)\n return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: 'move',\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: false,\n };\n }, [compact, panelGeometryForGesture]);\n const beginResize = useCallback((edge, event) => {\n if (compact || event.button !== 0 || (geometry.mode === 'docked' && edge !== 'left'))\n return;\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: 'resize',\n edge,\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: true,\n };\n setInteraction('resizing');\n }, [compact, geometry.mode, panelGeometryForGesture]);\n const updateGesture = useCallback((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId\n || !event.currentTarget.hasPointerCapture(event.pointerId))\n return;\n const dx = event.clientX - gesture.originX;\n const dy = event.clientY - gesture.originY;\n const activeBounds = boundsRef.current;\n if (gesture.kind === 'move') {\n if (!gesture.activated && Math.hypot(dx, dy) < MOVE_THRESHOLD)\n return;\n if (!gesture.activated) {\n gesture.activated = true;\n setInteraction('dragging');\n }\n scheduleLayout(movePanelLayout(floatPanelLayout(gesture.start, activeBounds), dx, dy, activeBounds));\n return;\n }\n scheduleLayout(resizePanelLayout(gesture.start, gesture.edge ?? 'left', dx, dy, activeBounds));\n }, [scheduleLayout]);\n const endGesture = useCallback((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId)\n return;\n updateGesture(event);\n flushScheduledLayout();\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout, updateGesture]);\n const cancelGesture = useCallback((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId)\n return;\n flushScheduledLayout();\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout]);\n const toggleDock = useCallback(() => {\n const liveGeometry = panelGeometryForGesture();\n commitLayout(liveGeometry.mode === 'docked'\n ? floatPanelLayout(liveGeometry, boundsRef.current)\n : dockPanelLayout(liveGeometry, boundsRef.current));\n }, [commitLayout, panelGeometryForGesture]);\n const autoHeight = panelUsesAutoHeight(geometry, bounds);\n const panelStyle = {\n width: geometry.width,\n height: autoHeight ? 'auto' : geometry.height,\n maxHeight: panelMaximumHeight(geometry, bounds),\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`,\n };\n if (!hasTeams && !expanded)\n return null;\n return (_jsxs(_Fragment, { children: [!expanded && (_jsx(CollapsedBadge, { count: visibleCount, busy: busy, t: t, onClick: () => {\n if (current === undefined)\n return;\n setOpenOwner(current);\n setOpen(true);\n } })), expanded && (_jsxs(\"aside\", { ref: panelRef, className: css.panel, style: panelStyle, \"data-agent-teams-activity\": true, \"data-panel-mode\": geometry.mode, \"data-height-mode\": autoHeight ? 'auto' : 'manual', \"data-compact\": compact || undefined, \"data-dragging\": interaction === 'dragging' || undefined, \"data-resizing\": interaction === 'resizing' || undefined, \"aria-label\": t('activity.panelAria'), children: [_jsxs(\"header\", { className: css.panelHead, onPointerDown: beginMove, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"data-drag-handle\": !compact || undefined, children: [_jsxs(\"span\", { className: css.panelTitle, children: [t('activity.title'), _jsx(\"span\", { className: css.panelDot, \"data-busy\": busy, \"aria-hidden\": true })] }), _jsxs(\"span\", { className: css.panelControls, children: [!compact && (_jsx(\"button\", { type: \"button\", className: css.iconButton, \"data-control\": \"dock\", \"data-mode\": geometry.mode, onClick: toggleDock, \"aria-label\": t(geometry.mode === 'docked' ? 'activity.float' : 'activity.dockRight'), title: t(geometry.mode === 'docked' ? 'activity.float' : 'activity.dockRight'), children: _jsx(IconPanelLeftOutline16, {}) })), _jsx(\"button\", { type: \"button\", className: css.iconButton, \"data-control\": \"collapse\", onClick: () => {\n setOpen(false);\n setOpenOwner(undefined);\n }, \"aria-label\": t('activity.collapse'), title: t('activity.collapse'), children: _jsx(IconChevronDownOutline14, {}) })] })] }), _jsx(\"div\", { className: css.teams, children: visibleCount === 0\n ? _jsx(\"span\", { className: css.emptyHint, children: t('activity.empty') })\n : (_jsxs(_Fragment, { children: [visibleTeams.map((team) => (_jsx(TeamSection, { team: team, onNavigate: navigateToSession, t: t }, team.teamId))), visibleArchived.map((team) => (_jsxs(\"div\", { \"data-team-id\": team.teamId, \"data-historic\": true, className: css.archivedWrap, children: [_jsx(\"span\", { className: css.archiveLabel, children: t('archive.label') }), _jsx(TeamSection, { team: team, onNavigate: navigateToSession, t: t, historic: true })] }, `${team.captainSessionId}:${team.teamId}`))), visibleHistoric.map(({ data: team, owner }) => {\n const teamKey = `${owner}:${team.teamId}`;\n return (_jsx(TeamSection, { team: historicCardTeam(team, owner), onNavigate: navigateToSession, t: t, historic: true }, teamKey));\n })] })) }), !compact && (_jsx(\"div\", { className: css.resizeHandle, \"data-resize-edge\": \"left\", onPointerDown: (event) => { beginResize('left', event); }, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"aria-hidden\": true })), !compact && geometry.mode === 'floating' && (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: css.resizeHandle, \"data-resize-edge\": \"bottom\", onPointerDown: (event) => { beginResize('bottom', event); }, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"aria-hidden\": true }), _jsx(\"div\", { className: css.resizeHandle, \"data-resize-edge\": \"corner\", onPointerDown: (event) => { beginResize('corner', event); }, onPointerMove: updateGesture, onPointerUp: endGesture, onPointerCancel: cancelGesture, \"aria-hidden\": true })] }))] }))] }));\n}\n","/**\n * AgentTeams conversation card: a lightweight in-conversation summary shown\n * when a team is created — the captain's name, the member roster with whale\n * avatars, and an entry point that re-activates the top-right activity\n * panel (useful after the floater was closed, or when re-opening an old\n * session for review).\n *\n * The fold anchors to the Harness's durable `tool/call` + `tool/result`\n * records for `agent_teams_create`. Those are first-party session events, so\n * the card survives restarts without writing an out-of-repo event type.\n * @module dsh-agent-teams/client/card\n */\n/** Parse the only create-call fields the historic card owns. */\nexport function parseAgentTeamsCreateArgs(value) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== 'object' || parsed === null || !('name' in parsed) || typeof parsed.name !== 'string') {\n return undefined;\n }\n const name = parsed.name.trim();\n if (name === '')\n return undefined;\n const cleaned = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n return { teamId: cleaned === '' ? 'team' : cleaned, name };\n }\n catch {\n return undefined;\n }\n}\n/** Durable first-party tool events folded into one keyed Chat node. */\nexport const agentTeamsCardDefinition = {\n kind: 'agent-teams',\n target: 'chat',\n match: (event) => {\n if (event.type === 'tool/call' && event.data.name === 'agent_teams_create') {\n return parseAgentTeamsCreateArgs(event.data.arguments) === undefined\n ? null\n : { id: String(event.data.callId), role: 'start' };\n }\n if (event.type === 'tool/result' && event.data.message.source.kind === 'tool') {\n return { id: String(event.data.message.source.callId), role: 'update' };\n }\n return null;\n },\n start: (_context, match) => {\n if (match.event.type !== 'tool/call') {\n throw new Error('agent-teams card start requires agent_teams_create tool/call');\n }\n const parsed = parseAgentTeamsCreateArgs(match.event.data.arguments);\n if (parsed === undefined)\n throw new Error('agent-teams card start requires valid create arguments');\n return { ...parsed, accepted: false };\n },\n update: (context, match) => {\n if (match.event.type !== 'tool/result')\n return context.state;\n const failed = match.event.data.error !== undefined\n || match.event.data.message.content.some((block) => block.type === 'tool-result' && block.isError === true);\n if (failed)\n return context.state;\n return { ...context.state, accepted: true };\n },\n buildViewNode: (context) => {\n if (context.start === undefined)\n return null;\n const state = context.state;\n if (!state.accepted)\n return null;\n return {\n key: context.key,\n kind: 'agent-teams',\n id: context.id,\n target: 'chat',\n anchorSeq: context.start.event.seq,\n location: context.start.location,\n visibility: 'visible',\n data: {\n teamId: state.teamId,\n captainSessionId: '',\n teamName: state.name,\n members: [],\n },\n };\n },\n};\n","/** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */\n/** Dictionary namespace owned by the AgentTeams client plugin. */\nexport const AGENT_TEAMS_LOCALE_NAMESPACE = 'agentTeams';\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'card.memberCount': '{count} 名成员',\n 'action.openActivityPanel': '打开活动面板',\n 'activity.panelButton': '活动面板',\n 'activity.badgeAria': 'AgentTeams 活动,{count} 个团队',\n 'activity.panelAria': 'AgentTeams 活动面板',\n 'activity.title': 'AgentTeams 活动',\n 'activity.float': '切换为浮动面板',\n 'activity.dockRight': '停靠到右侧',\n 'activity.collapse': '收起活动面板',\n 'activity.empty': '暂无团队活动',\n 'format.listSeparator': '、',\n 'task.status.pending': '待领取',\n 'task.status.claimed': '已认领',\n 'task.status.inProgress': '进行中',\n 'task.status.completed': '已完成',\n 'task.status.failed': '失败',\n 'task.status.cancelled': '已取消',\n 'member.state.working': '工作中',\n 'member.state.failed': '有失败',\n 'member.state.waiting': '等待',\n 'member.state.delivered': '已交付',\n 'member.state.left': '已离队',\n 'member.state.removed': '已移除',\n 'member.state.pending': '待执行',\n 'member.state.unassigned': '待派工',\n 'member.status.executing': '正在执行 {taskId}',\n 'member.status.working': '正在处理已派任务',\n 'member.status.waitingOn': '等待 {taskId} · {assignee}',\n 'member.status.waitingPrerequisite': '等待前置任务',\n 'member.status.waitingAssignment': '等待队长派工',\n 'member.status.delivered': '任务已交付',\n 'member.status.idle': '待继续执行',\n 'member.status.unknown': '状态未知',\n 'task.assignee.unclaimed': '待认领',\n 'task.summary.waitingBreakdown': '等待队长拆解任务',\n 'task.summary.allDelivered': '全部 {count} 项任务已交付',\n 'task.summary.blockedAndRunning': '{tasks}{more} 等待前置,其余已开工',\n 'task.summary.more': ' 等 {count} 项',\n 'task.summary.running': '{tasks} 正在执行',\n 'task.summary.ready': '{tasks} 已就绪待开工',\n 'task.summary.blocked': '{tasks} 等待前置',\n 'task.summary.waitingSchedule': '等待下一轮调度',\n 'progress.aria': '团队总进度',\n 'progress.title': '总进度',\n 'progress.running': '■ 进行中 {count}',\n 'progress.blocked': '■ 等待依赖 {count}',\n 'progress.delivered': '■ 已交付 {count}',\n 'dependency.aria': '任务依赖链',\n 'dependency.parallel': '并行任务',\n 'dependency.title': '任务依赖',\n 'dependency.hint.parallel': '无前后依赖 · 点击查看详情',\n 'dependency.hint.chain': '悬停高亮依赖链 · 点击固定',\n 'dependency.hint.pinned': '{taskId} 已固定 · Esc 取消',\n 'task.runningAria': '运行中',\n 'task.detail.completed': '已完成并交付',\n 'task.detail.noPrerequisite': '无前置,可立即开工',\n 'task.detail.ready': '前置已就绪,可开工',\n 'task.detail.waitingOn': '等待 {tasks}',\n 'task.detail.noDownstream': '无下游任务',\n 'task.detail.unlocks': '完成后解锁 {tasks}',\n 'team.ended': '已结束',\n 'team.stats.members': '{count} 名成员',\n 'team.stats.completed': '{completed}/{total} 完成',\n 'team.stats.messages': '{count} 条消息',\n 'delegation.aria': '队长派工关系',\n 'captain.name': '队长',\n 'captain.role': '拆解 · 派发 · 汇总',\n 'captain.summary': '已派发 {tasks} 项任务给 {members} 名成员',\n 'captain.state.working': '{count} 人执行中',\n 'captain.state.collected': '已收齐',\n 'captain.state.waiting': '等待回报',\n 'members.toggle': '{count} 名成员',\n 'members.collapse': '收起',\n 'members.expand': '展开',\n 'members.empty': '暂无成员,等待队长组建团队',\n 'assignment.label': '队长派发',\n 'assignment.empty': '暂无任务',\n 'archive.label': '已结束 · 历史归档',\n};\n/** English dictionary, checked complete against the Chinese source key set. */\nexport const en = {\n 'card.memberCount': '{count} members',\n 'action.openActivityPanel': 'Open activity panel',\n 'activity.panelButton': 'Activity panel',\n 'activity.badgeAria': 'AgentTeams activity, {count} teams',\n 'activity.panelAria': 'AgentTeams activity panel',\n 'activity.title': 'AgentTeams activity',\n 'activity.float': 'Switch to floating panel',\n 'activity.dockRight': 'Dock to the right',\n 'activity.collapse': 'Collapse activity panel',\n 'activity.empty': 'No team activity',\n 'format.listSeparator': ', ',\n 'task.status.pending': 'Unclaimed',\n 'task.status.claimed': 'Claimed',\n 'task.status.inProgress': 'In progress',\n 'task.status.completed': 'Completed',\n 'task.status.failed': 'Failed',\n 'task.status.cancelled': 'Cancelled',\n 'member.state.working': 'Working',\n 'member.state.failed': 'Has failures',\n 'member.state.waiting': 'Waiting',\n 'member.state.delivered': 'Delivered',\n 'member.state.left': 'Left team',\n 'member.state.removed': 'Removed',\n 'member.state.pending': 'Pending',\n 'member.state.unassigned': 'Awaiting assignment',\n 'member.status.executing': 'Working on {taskId}',\n 'member.status.working': 'Working on assigned tasks',\n 'member.status.waitingOn': 'Waiting for {taskId} · {assignee}',\n 'member.status.waitingPrerequisite': 'Waiting for prerequisites',\n 'member.status.waitingAssignment': 'Waiting for the captain to assign work',\n 'member.status.delivered': 'Tasks delivered',\n 'member.status.idle': 'Ready to continue',\n 'member.status.unknown': 'Status unknown',\n 'task.assignee.unclaimed': 'Unclaimed',\n 'task.summary.waitingBreakdown': 'Waiting for the captain to break down the work',\n 'task.summary.allDelivered': 'All {count} tasks delivered',\n 'task.summary.blockedAndRunning': '{tasks}{more} waiting on prerequisites; other work has started',\n 'task.summary.more': ' and {count} more',\n 'task.summary.running': '{tasks} in progress',\n 'task.summary.ready': '{tasks} ready to start',\n 'task.summary.blocked': '{tasks} waiting on prerequisites',\n 'task.summary.waitingSchedule': 'Waiting for the next scheduling round',\n 'progress.aria': 'Overall team progress',\n 'progress.title': 'Overall progress',\n 'progress.running': '■ In progress {count}',\n 'progress.blocked': '■ Waiting {count}',\n 'progress.delivered': '■ Delivered {count}',\n 'dependency.aria': 'Task dependency chain',\n 'dependency.parallel': 'Parallel tasks',\n 'dependency.title': 'Task dependencies',\n 'dependency.hint.parallel': 'No dependencies · Click for details',\n 'dependency.hint.chain': 'Hover to highlight dependencies · Click to pin',\n 'dependency.hint.pinned': '{taskId} pinned · Esc to clear',\n 'task.runningAria': 'Running',\n 'task.detail.completed': 'Completed and delivered',\n 'task.detail.noPrerequisite': 'No prerequisites; ready to start',\n 'task.detail.ready': 'Prerequisites ready; can start',\n 'task.detail.waitingOn': 'Waiting for {tasks}',\n 'task.detail.noDownstream': 'No downstream tasks',\n 'task.detail.unlocks': 'Unlocks {tasks} when complete',\n 'team.ended': 'Ended',\n 'team.stats.members': '{count} members',\n 'team.stats.completed': '{completed}/{total} completed',\n 'team.stats.messages': '{count} messages',\n 'delegation.aria': 'Captain delegation map',\n 'captain.name': 'Captain',\n 'captain.role': 'Break down · Delegate · Synthesize',\n 'captain.summary': 'Assigned {tasks} tasks to {members} members',\n 'captain.state.working': '{count} active',\n 'captain.state.collected': 'All reports received',\n 'captain.state.waiting': 'Waiting for reports',\n 'members.toggle': 'Members {count}',\n 'members.collapse': 'Collapse',\n 'members.expand': 'Expand',\n 'members.empty': 'No members yet; waiting for the captain to assemble the team',\n 'assignment.label': 'Captain assigned',\n 'assignment.empty': 'No tasks',\n 'archive.label': 'Ended · Archived history',\n};\n","/** Version-tolerant navigation into durable AgentTeams member transcripts. */\n/**\n * Open one member's persisted transcript.\n *\n * Harness rc.8 intentionally removed cold subagents from the ordinary session\n * list. They must first be rediscovered in their parent's catalog, then opened\n * with the exact parent/child/mode address. Older runtimes have only `open()`;\n * the fallback preserves the plugin's rc.6 peer range.\n */\nexport async function openAgentTeamMember(sessions, parentSessionId, childSessionId) {\n if (sessions.openSubagent === undefined || sessions.refreshSubagents === undefined) {\n sessions.open(childSessionId);\n return 'session';\n }\n await sessions.refreshSubagents(parentSessionId);\n const retained = sessions.subagentAddress?.(childSessionId);\n sessions.openSubagent(retained?.parentSessionId === parentSessionId\n ? retained\n : { parentSessionId, childSessionId, mode: 'continuable' });\n return 'subagent';\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ActivityPanel } from \"./ActivityPanel.js\";\nimport { AgentTeamsCard } from \"./AgentTeamsCard.js\";\nimport { agentTeamsCardDefinition } from \"./agent-teams-card-definition.js\";\nimport { AGENT_TEAMS_LOCALE_NAMESPACE, en, zh, } from \"./locales.js\";\nimport { openAgentTeamMember } from \"./session-navigation.js\";\n/** Required services: conversation nodes, slots, sessions navigation, and locale. */\nexport const inject = ['conversationEvents', 'slots', 'sessions', 'locale'];\n/** The replayed user message is the canonical transcript entry. */\nfunction HiddenAgentTeamsCommand() {\n return null;\n}\n/**\n * Register the activity monitor in the shell's additive overlay and the\n * in-conversation team card. The card's activity button re-opens a folded\n * monitor via a window event — the recovery path for an old session.\n */\nexport function apply(ctx) {\n ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, { zh, en }), 'agent-teams: dictionaries');\n const openMember = (parentId, childId) => {\n void openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {\n console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);\n });\n };\n const Panel = ({ t }) => (_jsx(ActivityPanel, { sessionsList: ctx.sessions.list, openMember: openMember, t: t }));\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay',\n id: 'agent-teams-activity',\n order: 80,\n label: 'AgentTeams activity',\n locale: AGENT_TEAMS_LOCALE_NAMESPACE,\n }, Panel));\n // The host command is only the slash-menu/admission surface. Its input is\n // replayed as the visible user message, so the generic result row would be\n // a duplicate placed before that message by command lifecycle ordering.\n ctx.slots.inject('conversation.chat.commandview', () => ctx.slots.register({\n name: 'conversation.chat.commandview',\n key: 'agent-teams',\n }, HiddenAgentTeamsCommand));\n ctx.conversationEvents.register(agentTeamsCardDefinition);\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({\n name: 'conversation.chat.node',\n key: 'agent-teams',\n locale: AGENT_TEAMS_LOCALE_NAMESPACE,\n inject: () => ({\n openMember,\n }),\n }, AgentTeamsCard));\n}\n"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -44,9 +44,9 @@ function usageSectionText(toolNames) {
44
44
  1. Call agent_teams_create with a team name and the goal as description. You become the captain and may lead one team at a time.
45
45
  2. Call agent_teams_add_member once per role the goal needs (researcher, engineer, reviewer, ...). Members are durable subagents: they wait for your messages, then work a full turn. By default a member on your current provider/model snapshots your current reasoning effort; a member routed to a different provider or model automatically uses that target model's default effort. Never ask the user to choose these per member; only pass provider/model when the user explicitly requests a different route for that role, and reasoning_effort only when the user explicitly requests a particular effort ("default" explicitly selects the target model's default).
46
46
  3. Break the goal into tasks with agent_teams_create_task and wire dependencies. Assign role-specific work when useful; unassigned ready work belongs to the shared pool. The scheduler automatically claims one ready task for each truly idle member and wakes it, including across later rounds.
47
- 4. Lead by delegation: monitor with agent_teams_status, send guidance with agent_teams_send_message, and let idle teammates execute ready work. Do not duplicate a teammate's work merely because its turn is slow.
48
- 5. If work is blocked, stale, or needs takeover, always call agent_teams_reassign_task first. Reassign to another idle member, or use assignee=captain before doing it yourself. Reassignment revokes the old attempt and waits for that member to quiesce, preventing late results from overwriting the new attempt.
49
- 6. Tasks carry attempt_id capabilities. Members must use the current attempt_id for updates; stale-attempt errors mean ownership changed. Poll status until every required task is terminal and every member is idle/ready.
47
+ 4. Lead by delegation: monitor with agent_teams_status, send guidance with agent_teams_send_message, and let idle teammates execute ready work. Do not duplicate a teammate's work merely because its turn is slow. If the user requires every member to contribute or report, create one task per required contribution (or message each member directly); never wait for an unassigned member to produce work it was never given.
48
+ 5. If the user explicitly asks to pause a running member, its open attempt remains parked after interruption; after answering the user, send that same member guidance with agent_teams_send_message so it continues the same attempt. Do not interrupt members for an ordinary user question that did not request a pause. If work must change owner, restart from scratch, or be taken over, call agent_teams_reassign_task first. Reassign to another idle member, retry with the same member, or use assignee=captain before doing it yourself. Reassignment revokes the old attempt and waits for that member to quiesce, preventing late results from overwriting the new attempt.
49
+ 6. Tasks carry attempt_id capabilities. Members must use the current attempt_id for updates; stale-attempt errors mean ownership changed. Check status after progress notifications until every required task is terminal and every member is idle/ready; do not busy-poll or require reports from members with no assigned work.
50
50
  7. Present the team's results to the user, then agent_teams_delete the team unless the user wants to keep working with it.
51
51
 
52
52
  Tools: ${toolNames}`;
package/lib/scheduler.js CHANGED
@@ -5,7 +5,10 @@
5
5
  * continuable agents instead expose explicit idle/running edges, so this
6
6
  * scheduler closes the same loop without keeping a polling turn alive: every
7
7
  * idle edge and every task-graph mutation attempts one atomic claim and wakes
8
- * the selected durable member.
8
+ * the selected durable member. A resident member that becomes idle while it
9
+ * still owns an open attempt is parked: only an explicit captain reassignment
10
+ * may rotate that capability. Automatic retry is reserved for cold recovery,
11
+ * when the durable owner is no longer resident in the live Agent registry.
9
12
  * @module dsh-agent-teams/scheduler
10
13
  */
11
14
  import { join } from 'node:path';
@@ -22,8 +25,11 @@ function liveCaptain(ctx, captainSessionId, supplied) {
22
25
  return supplied;
23
26
  return ctx.agents.get(captainSessionId);
24
27
  }
28
+ function liveMember(ctx, member) {
29
+ return ctx.agents.get(member.id);
30
+ }
25
31
  function isMemberAvailable(ctx, member) {
26
- const live = ctx.agents.get(member.id);
32
+ const live = liveMember(ctx, member);
27
33
  return live === undefined || live.status === 'idle';
28
34
  }
29
35
  function ownedOpenTask(tasks, memberName) {
@@ -59,6 +65,13 @@ function fallbackMailboxPrompt(messages) {
59
65
  /** Install one scheduler and its member activity observer. */
60
66
  export function installTeamScheduler(ctx, config) {
61
67
  const memberQueues = new Map();
68
+ // An idle edge in this process proves that the resident member ended its
69
+ // turn while the current attempt was still open. Remember that capability
70
+ // even after Harness disposes the continuable AgentHandle: later status or
71
+ // graph kicks must keep it parked. A cold process starts with an empty map,
72
+ // so durable open attempts are still recovered after restart.
73
+ const parkedAttempts = new Map();
74
+ const memberQueueKey = (stateRoot, teamId, memberName) => (`${stateRoot}\u0000${teamId}\u0000${memberName}`);
62
75
  const serializeMember = async (key, operation) => {
63
76
  const previous = memberQueues.get(key) ?? Promise.resolve();
64
77
  let release;
@@ -92,7 +105,7 @@ export function installTeamScheduler(ctx, config) {
92
105
  },
93
106
  async kickMember(workspace, teamId, memberName, suppliedCaptain) {
94
107
  const stateRoot = stateRootOf(workspace, config);
95
- const queueKey = `${stateRoot}\u0000${teamId}\u0000${memberName}`;
108
+ const queueKey = memberQueueKey(stateRoot, teamId, memberName);
96
109
  await serializeMember(queueKey, async () => {
97
110
  let team = await readTeam(stateRoot, teamId);
98
111
  if (team === undefined)
@@ -124,12 +137,20 @@ export function installTeamScheduler(ctx, config) {
124
137
  const currentMember = fresh.members.find(candidate => candidate.name === memberName && candidate.status !== 'removed');
125
138
  if (currentMember === undefined || currentMember.id === '' || !isMemberAvailable(ctx, currentMember))
126
139
  return undefined;
127
- // An idle/ready member that still owns an open task lost the turn
128
- // that was executing it (model stopped early, interrupt settlement,
129
- // or process restart). Retry that task with a fresh capability
130
- // instead of permanently treating the durable claim as "busy".
131
- const task = ownedOpenTask(fresh.tasks, currentMember.name)
132
- ?? nextReadyTask(fresh.tasks, currentMember.name);
140
+ const owned = ownedOpenTask(fresh.tasks, currentMember.name);
141
+ // A resident idle member can intentionally leave an attempt open
142
+ // while waiting for guidance, or because the user paused its turn.
143
+ // Re-dispatching here would revoke still-valid work on every idle
144
+ // edge and every status kick. The idle observer remembers that exact
145
+ // capability across normal continuable disposal; only an unobserved
146
+ // durable capability (cold process recovery) or a legacy open task
147
+ // with no capability is retried.
148
+ const parkedAttemptId = parkedAttempts.get(currentMember.id);
149
+ const recoverOwned = owned !== undefined
150
+ && (owned.attemptId === undefined || owned.attemptId !== parkedAttemptId);
151
+ const task = recoverOwned ? owned : owned === undefined
152
+ ? nextReadyTask(fresh.tasks, currentMember.name)
153
+ : undefined;
133
154
  if (task === undefined) {
134
155
  if (currentMember.status !== 'idle') {
135
156
  currentMember.status = 'idle';
@@ -139,6 +160,7 @@ export function installTeamScheduler(ctx, config) {
139
160
  }
140
161
  const previousAssignee = task.assignee;
141
162
  const attemptId = beginTaskAttempt(task, currentMember.name);
163
+ parkedAttempts.delete(currentMember.id);
142
164
  currentMember.status = 'working';
143
165
  await writeTeam(stateRoot, fresh);
144
166
  return {
@@ -184,17 +206,33 @@ export function installTeamScheduler(ctx, config) {
184
206
  const workspace = agent.session.header.cwd ?? process.cwd();
185
207
  const stateRoot = stateRootOf(workspace, config);
186
208
  const located = await findTeamByParticipant(stateRoot, agent.id);
187
- if (located === undefined || located.captainSessionId === agent.id)
209
+ if (located === undefined) {
210
+ parkedAttempts.delete(agent.id);
211
+ return;
212
+ }
213
+ if (located.captainSessionId === agent.id)
188
214
  return;
189
215
  const member = located.members.find(candidate => candidate.id === agent.id && candidate.status !== 'removed');
190
- if (member === undefined)
216
+ if (member === undefined) {
217
+ parkedAttempts.delete(agent.id);
191
218
  return;
219
+ }
192
220
  await withTeamLock(teamLockKey(stateRoot, located.id), async () => {
193
221
  const fresh = await readTeam(stateRoot, located.id);
194
222
  const current = fresh?.members.find(candidate => candidate.id === agent.id && candidate.status !== 'removed');
195
223
  if (fresh === undefined || current === undefined)
196
224
  return;
197
225
  const next = status === 'running' ? 'working' : 'idle';
226
+ if (next === 'idle') {
227
+ const owned = ownedOpenTask(fresh.tasks, current.name);
228
+ if (owned?.attemptId === undefined)
229
+ parkedAttempts.delete(agent.id);
230
+ else
231
+ parkedAttempts.set(agent.id, owned.attemptId);
232
+ }
233
+ else {
234
+ parkedAttempts.delete(agent.id);
235
+ }
198
236
  if (current.status === next)
199
237
  return;
200
238
  current.status = next;
@@ -71,6 +71,13 @@ export declare function getActivitySnapshotsSnapshot(): ActivitySnapshots;
71
71
  export declare function updateActivitySnapshots(update: Partial<ActivitySnapshots>): void;
72
72
  /** Poll cadence for the live host snapshot route. */
73
73
  export declare const ACTIVITY_POLL_MS = 1000;
74
+ /**
75
+ * Low-frequency probe cadence while a cardless discovery session still owns
76
+ * no team. The probe keeps the panel able to pick up a team created later in
77
+ * that session (e.g. a run_code-wrapped agent_teams_create) without turning
78
+ * every ordinary session into a one-second filesystem scan.
79
+ */
80
+ export declare const ACTIVITY_PROBE_MS = 5000;
74
81
  /** Host route serving live and archived team snapshots. */
75
82
  export declare const ACTIVITY_STATE_URL = "/plugins/dsh-agent-teams/state";
76
83
  interface ActivityFetchResponse {
@@ -105,12 +112,17 @@ export interface ActivityPollingController {
105
112
  * Start the single polling loop for the current session's requested targets.
106
113
  *
107
114
  * With neither targets nor a discovery session this is deliberately inert.
108
- * A discovery session performs one live+archive pass after selection/restart;
109
- * it keeps polling only while that captain still owns a live team. This
110
- * restores legacy/cardless history without turning every ordinary session
111
- * into a permanent one-second filesystem scan. Explicit card targets retain
112
- * the normal cadence, and archive state is refreshed when a target or a
113
- * previously discovered live team disappears.
115
+ * Explicit card targets poll at the live cadence from the start. A discovery
116
+ * session performs an immediate live+archive restore pass, then while it
117
+ * still owns no team probes on a low-frequency cadence, so a team created
118
+ * later in that session (e.g. a run_code-wrapped agent_teams_create) is
119
+ * discovered without a manual reload, without turning every ordinary session
120
+ * into a one-second filesystem scan. The moment a team for the discovery
121
+ * session appears, the controller upgrades to the live one-second cadence for
122
+ * the rest of its lifetime. The caller — the session view, which stops the
123
+ * controller when the session is no longer current — bounds the lifetime, and
124
+ * archive state is refreshed when a target or a previously discovered live
125
+ * team disappears.
114
126
  */
115
127
  export declare function startActivityPolling(monitorTargets: readonly ActivityMonitorTarget[], runtime?: ActivityPollingRuntime): ActivityPollingController;
116
128
  export {};
@@ -5,7 +5,10 @@
5
5
  * continuable agents instead expose explicit idle/running edges, so this
6
6
  * scheduler closes the same loop without keeping a polling turn alive: every
7
7
  * idle edge and every task-graph mutation attempts one atomic claim and wakes
8
- * the selected durable member.
8
+ * the selected durable member. A resident member that becomes idle while it
9
+ * still owns an open attempt is parked: only an explicit captain reassignment
10
+ * may rotate that capability. Automatic retry is reserved for cold recovery,
11
+ * when the durable owner is no longer resident in the live Agent registry.
9
12
  * @module dsh-agent-teams/scheduler
10
13
  */
11
14
  import type { Context } from '@deepseek-ai/cordis';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanmicoder/dsh-agent-teams",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "AgentTeams for DeepSeek Harness: multi-agent team collaboration (captain, members, tasks with dependencies, messaging) driven by natural language, with a tree monitor in the web GUI",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -0,0 +1,60 @@
1
+ # AgentTeams v0.1.13
2
+
3
+ This release makes long-running AgentTeams sessions calmer, more predictable, and easier to observe.
4
+
5
+ ## Fixed & Improved
6
+
7
+ - **No retry storms while checking progress**: an idle member with an open task attempt now stays parked instead of restarting the same work whenever the captain checks status.
8
+ - **Explicit pause and resume**: a captain message resumes a parked member with the same task capability, while reassignment still revokes the previous attempt safely.
9
+ - **Activity panel discovery**: teams created after the first page discovery pass appear without a manual reload.
10
+ - **Lower idle overhead**: ordinary cardless sessions probe every five seconds and upgrade to the one-second live cadence only after a team is discovered.
11
+ - **Clearer delegation guidance**: the captain is instructed to create work for every required contributor and to avoid busy polling or waiting on unassigned members.
12
+
13
+ ## Verification
14
+
15
+ - Passed production build, offline verification, lifecycle verification, the eight-member complex stress suite, and the Skill mirror check.
16
+ - Ran three independent four-member workflows with real DeepSeek models in a `/tmp` workspace; all assigned tasks completed in all three runs.
17
+ - Verified parked-member resume, task dependency gates, member-to-member reassignment, captain takeover, archive readback, live language switching, panel persistence, and idle polling cadence in the real Harness Web UI.
18
+
19
+ ## Known Limitation
20
+
21
+ - After a hard DSH restart, the team, members, tasks, and dependency graph are restored, but unfinished members may remain in **Ready to continue** instead of resuming automatically. The captain can explicitly resume or reassign them; automatic cold-restart continuation will be addressed separately.
22
+
23
+ ## Installation
24
+
25
+ ```sh
26
+ dsh plugin --profile web add @nanmicoder/dsh-agent-teams
27
+ ```
28
+
29
+ <details>
30
+ <summary><b>中文版本 / Chinese Version</b></summary>
31
+
32
+ # AgentTeams v0.1.13
33
+
34
+ 本次更新让长时间运行的 AgentTeams 协作更安静、更可预测,也更容易观察。
35
+
36
+ ## 修复与改进
37
+
38
+ - **查询进度不再触发重复工作**:成员空闲但仍持有未完成任务时会保持暂停,不会因为队长查询状态而重新执行同一件事。
39
+ - **明确的暂停与继续语义**:队长发消息可让暂停成员沿用原任务能力继续执行;任务转派仍会安全撤销旧 attempt。
40
+ - **活动面板自动发现团队**:首次页面探测之后才创建的团队,也能自动出现在面板中,无需手动刷新。
41
+ - **降低普通会话开销**:没有团队卡片的普通会话每 5 秒低频探测一次,发现团队后才升级为每秒实时轮询。
42
+ - **更清晰的派工指导**:要求每位必须参与的成员都有明确任务,并避免高频查询或等待未分配工作的成员。
43
+
44
+ ## 验证
45
+
46
+ - 通过生产构建、离线验证、生命周期验证、八成员复杂压力测试及 Skill 镜像检查。
47
+ - 在 `/tmp` workspace 中使用真实 DeepSeek 模型连续运行 3 轮独立四人团队流程,三轮所有已分配任务均完成。
48
+ - 在真实 Harness Web UI 中验证成员暂停继续、任务依赖、成员间转派、队长接管、归档读取、语言实时切换、面板状态保持及普通会话轮询频率。
49
+
50
+ ## 已知限制
51
+
52
+ - DSH 硬重启后,团队、成员、任务和依赖图能够恢复,但未完成成员可能停在“待继续执行”,不会自动恢复工作。队长可以显式继续或转派;冷重启自动续跑将在后续版本单独处理。
53
+
54
+ ## 安装
55
+
56
+ ```sh
57
+ dsh plugin --profile web add @nanmicoder/dsh-agent-teams
58
+ ```
59
+
60
+ </details>