@nanmicoder/dsh-agent-teams 0.1.8 → 0.1.9

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.
Files changed (35) hide show
  1. package/assets/agent-teams/action-celebrating-v2.png +0 -0
  2. package/assets/agent-teams/action-reporting-v2.png +0 -0
  3. package/assets/agent-teams/action-sending-v2.png +0 -0
  4. package/assets/agent-teams/action-sleeping-v2.png +0 -0
  5. package/assets/agent-teams/action-thinking-v2.png +0 -0
  6. package/assets/agent-teams/action-working-v2.png +0 -0
  7. package/assets/agent-teams/member-data-v2.png +0 -0
  8. package/assets/agent-teams/member-designer-v2.png +0 -0
  9. package/assets/agent-teams/member-docs-v2.png +0 -0
  10. package/assets/agent-teams/member-engineer-v2.png +0 -0
  11. package/assets/agent-teams/member-operator-v2.png +0 -0
  12. package/assets/agent-teams/member-qa-v2.png +0 -0
  13. package/assets/agent-teams/member-researcher-v2.png +0 -0
  14. package/assets/agent-teams/member-security-v2.png +0 -0
  15. package/assets/agent-teams/team-lead-v2.png +0 -0
  16. package/lib/client/artwork.js +15 -12
  17. package/lib/client.js +13 -12
  18. package/lib/client.js.map +1 -1
  19. package/lib/index.js +9 -6
  20. package/lib/types/client/artwork.d.ts +1 -1
  21. package/package.json +1 -1
  22. package/assets/agent-teams/action-celebrating.png +0 -0
  23. package/assets/agent-teams/action-reporting.png +0 -0
  24. package/assets/agent-teams/action-sending.png +0 -0
  25. package/assets/agent-teams/action-sleeping.png +0 -0
  26. package/assets/agent-teams/action-thinking.png +0 -0
  27. package/assets/agent-teams/action-working.png +0 -0
  28. package/assets/agent-teams/data-analyst.png +0 -0
  29. package/assets/agent-teams/designer.png +0 -0
  30. package/assets/agent-teams/docs-coordinator.png +0 -0
  31. package/assets/agent-teams/engineer.png +0 -0
  32. package/assets/agent-teams/qa-engineer.png +0 -0
  33. package/assets/agent-teams/researcher.png +0 -0
  34. package/assets/agent-teams/security-reviewer.png +0 -0
  35. package/assets/agent-teams/team-lead.png +0 -0
@@ -6,23 +6,26 @@
6
6
  */
7
7
  /** Artwork route prefix served by the plugin host half. */
8
8
  export const ART_BASE = '/plugins/dsh-agent-teams/assets/';
9
- /** Whale role artwork per role keyword. */
9
+ /** V2 whale role artwork per role keyword. */
10
10
  const ROLE_ART = [
11
- [/resear|analys|investig|explor|data|study|研究|分析|数据|调查|探索|调研/, 'researcher.png'],
12
- [/engineer|dev\b|server|backend|\bapi\b|runtime|watcher|contract|工程|后端|服务|接口|开发|代码|编程/, 'engineer.png'],
13
- [/\bqa\b|test|verif|quality|测试|质量/, 'qa-engineer.png'],
14
- [/design|\bui\b|\bux\b|front|theme|accessib|设计|前端|主题/, 'designer.png'],
15
- [/secur|audit|risk|threat|review|安全|审计|审查|风险/, 'security-reviewer.png'],
16
- [/docs|writer|product|spec|coordin|撰写|文案|写作|文档|协调/, 'docs-coordinator.png'],
17
- [/release|\bbuild\b|deploy|\bops\b|\bci\b|ship|发布|构建|部署/, 'engineer.png'],
11
+ [/data|analys|metric|performance|数据|分析|指标|性能/, 'member-data-v2.png'],
12
+ [/resear|investig|explor|study|研究|调查|探索|调研/, 'member-researcher-v2.png'],
13
+ // Match compound QA titles (for example "QA Engineer") before the broad
14
+ // engineer bucket, otherwise an eight-role roster repeats the engineer art.
15
+ [/\bqa\b|test|verif|quality|测试|质量|验证/, 'member-qa-v2.png'],
16
+ [/engineer|dev\b|server|backend|\bapi\b|runtime|watcher|contract|工程|后端|服务|接口|开发|代码|编程/, 'member-engineer-v2.png'],
17
+ [/design|\bui\b|\bux\b|front|theme|accessib|设计|前端|主题|无障碍/, 'member-designer-v2.png'],
18
+ [/secur|audit|risk|threat|review|安全|审计|审查|风险/, 'member-security-v2.png'],
19
+ [/docs|writer|product|spec|撰写|文案|写作|文档|规范/, 'member-docs-v2.png'],
20
+ [/release|\bbuild\b|deploy|\bops\b|\bci\b|ship|coordin|发布|构建|部署|运维|协调/, 'member-operator-v2.png'],
18
21
  ];
19
22
  /** Captain artwork (always the lead whale). */
20
- export const LEAD_ART = `${ART_BASE}team-lead.png`;
23
+ export const LEAD_ART = `${ART_BASE}team-lead-v2.png`;
21
24
  /** Status action artwork per member activity. */
22
25
  export const ACTION_ART = {
23
- working: `${ART_BASE}action-working.png`,
24
- idle: `${ART_BASE}action-sleeping.png`,
25
- unknown: `${ART_BASE}action-thinking.png`,
26
+ working: `${ART_BASE}action-working-v2.png`,
27
+ idle: `${ART_BASE}action-sleeping-v2.png`,
28
+ unknown: `${ART_BASE}action-thinking-v2.png`,
26
29
  };
27
30
  /**
28
31
  * Member artwork URL, or null when no role matches (initial-letter fallback).
package/lib/client.js CHANGED
@@ -321,23 +321,24 @@ window.__ModuleLoader__.load({
321
321
  */
322
322
  /** Artwork route prefix served by the plugin host half. */
323
323
  const ART_BASE = "/plugins/dsh-agent-teams/assets/";
324
- /** Whale role artwork per role keyword. */
324
+ /** V2 whale role artwork per role keyword. */
325
325
  const ROLE_ART = [
326
- [/resear|analys|investig|explor|data|study|研究|分析|数据|调查|探索|调研/, "researcher.png"],
327
- [/engineer|dev\b|server|backend|\bapi\b|runtime|watcher|contract|工程|后端|服务|接口|开发|代码|编程/, "engineer.png"],
328
- [/\bqa\b|test|verif|quality|测试|质量/, "qa-engineer.png"],
329
- [/design|\bui\b|\bux\b|front|theme|accessib|设计|前端|主题/, "designer.png"],
330
- [/secur|audit|risk|threat|review|安全|审计|审查|风险/, "security-reviewer.png"],
331
- [/docs|writer|product|spec|coordin|撰写|文案|写作|文档|协调/, "docs-coordinator.png"],
332
- [/release|\bbuild\b|deploy|\bops\b|\bci\b|ship|发布|构建|部署/, "engineer.png"]
326
+ [/data|analys|metric|performance|数据|分析|指标|性能/, "member-data-v2.png"],
327
+ [/resear|investig|explor|study|研究|调查|探索|调研/, "member-researcher-v2.png"],
328
+ [/\bqa\b|test|verif|quality|测试|质量|验证/, "member-qa-v2.png"],
329
+ [/engineer|dev\b|server|backend|\bapi\b|runtime|watcher|contract|工程|后端|服务|接口|开发|代码|编程/, "member-engineer-v2.png"],
330
+ [/design|\bui\b|\bux\b|front|theme|accessib|设计|前端|主题|无障碍/, "member-designer-v2.png"],
331
+ [/secur|audit|risk|threat|review|安全|审计|审查|风险/, "member-security-v2.png"],
332
+ [/docs|writer|product|spec|撰写|文案|写作|文档|规范/, "member-docs-v2.png"],
333
+ [/release|\bbuild\b|deploy|\bops\b|\bci\b|ship|coordin|发布|构建|部署|运维|协调/, "member-operator-v2.png"]
333
334
  ];
334
335
  /** Captain artwork (always the lead whale). */
335
- const LEAD_ART = `${ART_BASE}team-lead.png`;
336
+ const LEAD_ART = `${ART_BASE}team-lead-v2.png`;
336
337
  /** Status action artwork per member activity. */
337
338
  const ACTION_ART = {
338
- working: `${ART_BASE}action-working.png`,
339
- idle: `${ART_BASE}action-sleeping.png`,
340
- unknown: `${ART_BASE}action-thinking.png`
339
+ working: `${ART_BASE}action-working-v2.png`,
340
+ idle: `${ART_BASE}action-sleeping-v2.png`,
341
+ unknown: `${ART_BASE}action-thinking-v2.png`
341
342
  };
342
343
  /**
343
344
  * Member artwork URL, or null when no role matches (initial-letter fallback).
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["css","css","IconBranchOutline16","_Fragment","IconCloseOutline16"],"sources":["client/activity-model.js","client/activity-monitor.js","client/artwork.js","client/AgentTeamsCard.js","client/ActivityPanel.js","client/agent-teams-card-definition.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 through a body portal, so React does not remount it\n * when the conversation route changes. Ownership keeps an expanded panel\n * from leaking onto the new-session screen (or another conversation) while\n * 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 no targets this is deliberately inert: installing the plugin must not\n * touch the state route. Live state is polled at the normal cadence; archive\n * state is fetched only as a one-time fallback for targets no longer live.\n */\nexport function startActivityPolling(monitorTargets, runtime = {}) {\n if (monitorTargets.length === 0) {\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 controller;\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 missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));\n if (missing.length === 0)\n return;\n // Archives are immutable. A successful fallback retires every missing\n // target, including legacy cards whose host archive no longer exists.\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 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/** Whale role artwork per role keyword. */\nconst ROLE_ART = [\n [/resear|analys|investig|explor|data|study|研究|分析|数据|调查|探索|调研/, 'researcher.png'],\n [/engineer|dev\\b|server|backend|\\bapi\\b|runtime|watcher|contract|工程|后端|服务|接口|开发|代码|编程/, 'engineer.png'],\n [/\\bqa\\b|test|verif|quality|测试|质量/, 'qa-engineer.png'],\n [/design|\\bui\\b|\\bux\\b|front|theme|accessib|设计|前端|主题/, 'designer.png'],\n [/secur|audit|risk|threat|review|安全|审计|审查|风险/, 'security-reviewer.png'],\n [/docs|writer|product|spec|coordin|撰写|文案|写作|文档|协调/, 'docs-coordinator.png'],\n [/release|\\bbuild\\b|deploy|\\bops\\b|\\bci\\b|ship|发布|构建|部署/, 'engineer.png'],\n];\n/** Captain artwork (always the lead whale). */\nexport const LEAD_ART = `${ART_BASE}team-lead.png`;\n/** Status action artwork per member activity. */\nexport const ACTION_ART = {\n working: `${ART_BASE}action-working.png`,\n idle: `${ART_BASE}action-sleeping.png`,\n unknown: `${ART_BASE}action-thinking.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, openSession, sessionId }) {\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 }), _jsxs(\"span\", { className: css.memberCount, children: [resolved.members.length, \" \\u540D\\u6210\\u5458\"] }), _jsx(\"button\", { type: \"button\", className: css.panelButton, onClick: () => { openActivityPanel(resolved); }, \"aria-label\": \"\\u6253\\u5F00\\u6D3B\\u52A8\\u9762\\u677F\", title: \"\\u6253\\u5F00\\u6D3B\\u52A8\\u9762\\u677F\", children: \"\\u6D3B\\u52A8\\u9762\\u677F\" })] }), resolved.members.length > 0 && (_jsx(\"div\", { className: css.members, children: resolved.members.map((member) => (_jsxs(\"button\", { type: \"button\", className: css.member, onClick: () => { if (member.id !== '')\n openSession(member.id); }, 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","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 fixed glass\n * panel at the top-right corner. On wide viewports it cooperatively makes the\n * conversation column yield space; narrow viewports keep overlay mode. 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 through a body portal (no top-right slot exists in the\n * web shell); it is not a conversation node — the in-conversation panel was\n * removed in favor of this always-available monitor.\n * @module dsh-agent-teams/client/activity\n */\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { IconBranchOutline16, IconCloseOutline16, } 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 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 portal is expanded. */\nconst PANEL_OPEN_ATTRIBUTE = 'data-agent-teams-panel-open';\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: '待领取',\n claimed: '已认领',\n in_progress: '进行中',\n completed: '已完成',\n failed: '失败',\n cancelled: '已取消',\n};\nfunction taskStatusLabel(status) {\n return TASK_STATUS_LABEL[status] ?? status;\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 }) {\n return (_jsxs(\"button\", { type: \"button\", className: css.badge, \"data-busy\": busy, onClick: onClick, \"aria-label\": `AgentTeams 活动,${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) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n if (member.activity === 'working')\n return '工作中';\n if (owned.some((task) => task.status === 'failed'))\n return '有失败';\n if (owned.some((task) => task.state === 'blocked'))\n return '等待';\n if (owned.length > 0 && owned.every((task) => task.status === 'completed'))\n return '已交付';\n if (member.status === 'removed')\n return historic ? '已离队' : '已移除';\n if (owned.length > 0)\n return '待执行';\n return '待派工';\n}\nfunction memberStatusText(member, tasks) {\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 `正在执行 ${current.id}`;\n if (member.activity === 'working')\n return '正在处理已派任务';\n if (blocked !== undefined) {\n const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== 'completed');\n if (dependency !== undefined)\n return `等待 ${dependency.id} · ${dependency.assignee || '待认领'}`;\n return '等待前置任务';\n }\n if (member.total === 0)\n return '等待队长派工';\n if (member.done === member.total)\n return '任务已交付';\n return member.activity === 'idle' ? '待继续执行' : '状态未知';\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) {\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 '等待队长拆解任务';\n if (completed.length === team.tasks.length)\n return `全部 ${completed.length} 项任务已交付`;\n if (blocked.length > 0 && running.length > 0) {\n return `${blocked.slice(0, 3).map((task) => task.id).join('、')}${blocked.length > 3 ? ` 等 ${blocked.length} 项` : ''} 等待前置,其余已开工`;\n }\n if (running.length > 0)\n return `${running.map((task) => task.id).join('、')} 正在执行`;\n if (ready.length > 0)\n return `${ready.map((task) => task.id).join('、')} 已就绪待开工`;\n if (blocked.length > 0)\n return `${blocked.map((task) => task.id).join('、')} 等待前置`;\n return '等待下一轮调度';\n}\nfunction ProgressOverview({ team }) {\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\": \"\\u56E2\\u961F\\u603B\\u8FDB\\u5EA6\", \"data-progress-summary\": true, children: [_jsx(\"span\", { className: css.progressTitle, children: \"\\u603B\\u8FDB\\u5EA6\" }), 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: [_jsxs(\"span\", { \"data-state\": \"running\", children: [\"\\u25A0 \\u8FDB\\u884C\\u4E2D \", running] }), _jsxs(\"span\", { \"data-state\": \"blocked\", children: [\"\\u25A0 \\u7B49\\u5F85\\u4F9D\\u8D56 \", blocked] }), _jsxs(\"span\", { \"data-state\": \"completed\", children: [\"\\u25A0 \\u5DF2\\u4EA4\\u4ED8 \", completed] })] }), _jsxs(\"span\", { className: css.progressSummary, \"data-state\": summaryTone, children: [_jsx(\"span\", { className: css.progressSummaryDot }), _jsx(\"span\", { children: taskSummary(team) })] })] }));\n}\nfunction DependencyMap({ tasks }) {\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\": \"\\u4EFB\\u52A1\\u4F9D\\u8D56\\u94FE\", \"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, {}), \" \", parallel ? '并行任务' : '任务依赖'] }), _jsx(\"span\", { className: css.sectionHint, children: pinnedTaskId === null\n ? parallel ? '无前后依赖 · 点击查看详情' : '悬停高亮依赖链 · 点击固定'\n : `${pinnedTaskId} 已固定 · Esc 取消` })] }), 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\": \"\\u8FD0\\u884C\\u4E2D\", 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) })] }), _jsxs(\"span\", { className: css.taskDetailLine, children: [detailTask.assignee || '待认领', \" \\u00B7 \", detailTask.status === 'completed'\n ? '已完成并交付'\n : detailTask.dependencies.length === 0\n ? '无前置,可立即开工'\n : waitingOn.length === 0\n ? '前置已就绪,可开工'\n : `等待 ${waitingOn.join('、')}`] }), _jsx(\"span\", { className: css.taskDetailMeta, children: dependents.length === 0 ? '无下游任务' : `完成后解锁 ${dependents.map((task) => task.id).join('、')}` })] })] }))] }));\n}\nfunction TeamSection({ team, onNavigate, 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: \"\\u5DF2\\u7ED3\\u675F\" }), _jsxs(\"span\", { className: css.teamStats, children: [_jsxs(\"span\", { \"data-stat\": \"members\", children: [team.members.length, \" \\u6210\\u5458\"] }), _jsxs(\"span\", { \"data-stat\": \"tasks\", children: [completedCount, \"/\", team.tasks.length, \" \\u5B8C\\u6210\"] }), _jsxs(\"span\", { \"data-stat\": \"messages\", children: [team.messageCount, \" \\u6D88\\u606F\"] })] })] }), _jsxs(\"section\", { className: css.delegationSection, \"aria-label\": \"\\u961F\\u957F\\u6D3E\\u5DE5\\u5173\\u7CFB\", \"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: \"\\u961F\\u957F\" }), _jsx(\"span\", { className: css.captainRole, children: \"\\u62C6\\u89E3 \\u00B7 \\u6D3E\\u53D1 \\u00B7 \\u6C47\\u603B\" })] }), _jsxs(\"span\", { className: css.captainSummary, children: [\"\\u5DF2\\u6D3E\\u53D1 \", assignedCount, \" \\u9879\\u4EFB\\u52A1\\u7ED9 \", team.members.length, \" \\u540D\\u6210\\u5458\"] })] }), _jsxs(\"span\", { className: css.captainState, \"data-busy\": busyCount > 0, children: [_jsx(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ? `${busyCount} 人执行中` : allCompleted ? '已收齐' : '等待回报'] })] }), _jsx(ProgressOverview, { team: team }), _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 }), \"\\u6210\\u5458 \", team.members.length] }), _jsx(\"span\", { children: membersOpen ? '收起' : '展开' })] }), membersOpen && _jsxs(\"div\", { className: css.delegationTree, children: [team.members.length === 0 && _jsx(\"span\", { className: css.emptyHint, children: \"\\u6682\\u65E0\\u6210\\u5458\\uFF0C\\u7B49\\u5F85\\u961F\\u957F\\u7EC4\\u5EFA\\u56E2\\u961F\" }), 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: () => { if (member.id !== '')\n onNavigate(member.id); }, 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)] })] }), _jsx(\"span\", { className: css.memberStatusLine, children: memberStatusText(member, team.tasks) })] }), _jsxs(\"span\", { className: css.memberCount, children: [member.done, \"/\", member.total] })] }), _jsxs(\"div\", { className: css.assignmentLine, children: [_jsx(\"span\", { className: css.assignmentLabel, children: \"\\u961F\\u957F\\u6D3E\\u53D1\" }), _jsx(\"span\", { className: css.assignmentTasks, children: owned.length === 0\n ? _jsx(\"span\", { className: css.taskEmpty, children: \"\\u6682\\u65E0\\u4EFB\\u52A1\" })\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 })] }));\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}\n/** The top-right activity floater. Teams follow the current session: live\n * snapshots and historic card summaries are only shown while their captain\n * session is the one currently open. */\nexport function ActivityPanel({ sessionsList, openSession }) {\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 = (id) => {\n setOpen(false);\n setWasActive(false);\n openSession(id);\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 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 // This portal 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 // The activity panel is a body portal, so announce its open state on body.\n // CSS can then make the conversation column yield space without knowing the\n // host shell's hashed module class names. Narrow viewports keep overlay mode.\n useLayoutEffect(() => {\n const root = document.documentElement;\n if (expanded)\n root.setAttribute(PANEL_OPEN_ATTRIBUTE, '');\n else\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n return () => { root.removeAttribute(PANEL_OPEN_ATTRIBUTE); };\n }, [expanded]);\n useEffect(() => {\n // Installing the plugin alone must not touch the state route. A successful\n // AgentTeams conversation card registers the demand that reaches here.\n if (currentTargets.length === 0)\n return;\n const controller = startActivityPolling(currentTargets);\n return () => { controller.stop(); };\n }, [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 if (!hasTeams && !expanded)\n return null;\n return (_jsxs(_Fragment, { children: [!expanded && (_jsx(CollapsedBadge, { count: visibleCount, busy: busy, onClick: () => {\n if (current === undefined)\n return;\n setOpenOwner(current);\n setOpen(true);\n } })), expanded && (_jsxs(\"aside\", { className: css.panel, \"data-agent-teams-activity\": true, children: [_jsxs(\"header\", { className: css.panelHead, children: [_jsxs(\"span\", { className: css.panelTitle, children: [\"AgentTeams \\u6D3B\\u52A8\", _jsx(\"span\", { className: css.panelDot, \"data-busy\": busy, \"aria-hidden\": true })] }), _jsx(\"button\", { type: \"button\", className: css.closeButton, onClick: () => {\n setOpen(false);\n setOpenOwner(undefined);\n }, \"aria-label\": \"\\u5173\\u95ED\", children: _jsx(IconCloseOutline16, {}) })] }), _jsx(\"div\", { className: css.teams, children: visibleCount === 0\n ? _jsx(\"span\", { className: css.emptyHint, children: \"\\u6682\\u65E0\\u56E2\\u961F\\u6D3B\\u52A8\" })\n : (_jsxs(_Fragment, { children: [visibleTeams.map((team) => (_jsx(TeamSection, { team: team, onNavigate: navigateToSession }, team.teamId))), visibleArchived.map((team) => (_jsx(\"div\", { \"data-team-id\": team.teamId, \"data-historic\": true, className: css.archivedWrap, children: _jsx(TeamSection, { team: team, onNavigate: navigateToSession, 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, historic: true }, teamKey));\n })] })) })] }))] }));\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","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createRoot } from 'react-dom/client';\nimport { ActivityPanel } from \"./ActivityPanel.js\";\nimport { AgentTeamsCard } from \"./AgentTeamsCard.js\";\nimport { agentTeamsCardDefinition } from \"./agent-teams-card-definition.js\";\n/** Required services: conversation nodes, slots, and sessions navigation. */\nexport const inject = ['conversationEvents', 'slots', 'sessions'];\n/**\n * Mount the floater through a body portal (the web shell has no top-right\n * slot) and register the in-conversation team card, whose \"activity panel\"\n * button re-activates the floater via a window event — the recovery path\n * for a closed floater or a re-opened session.\n */\nexport function apply(ctx) {\n const host = document.createElement('div');\n host.dataset.agentTeamsHost = '';\n document.body.appendChild(host);\n const root = createRoot(host);\n root.render(_jsx(ActivityPanel, { sessionsList: ctx.sessions.list, openSession: (id) => { ctx.sessions.open(id); } }));\n ctx.effect(() => () => {\n root.unmount();\n host.remove();\n }, 'agent-teams: activity panel');\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 inject: () => ({\n openSession: (id) => { ctx.sessions.open(id); },\n }),\n }, AgentTeamsCard));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["css","css","IconBranchOutline16","_Fragment","IconCloseOutline16"],"sources":["client/activity-model.js","client/activity-monitor.js","client/artwork.js","client/AgentTeamsCard.js","client/ActivityPanel.js","client/agent-teams-card-definition.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 through a body portal, so React does not remount it\n * when the conversation route changes. Ownership keeps an expanded panel\n * from leaking onto the new-session screen (or another conversation) while\n * 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 no targets this is deliberately inert: installing the plugin must not\n * touch the state route. Live state is polled at the normal cadence; archive\n * state is fetched only as a one-time fallback for targets no longer live.\n */\nexport function startActivityPolling(monitorTargets, runtime = {}) {\n if (monitorTargets.length === 0) {\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 controller;\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 missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));\n if (missing.length === 0)\n return;\n // Archives are immutable. A successful fallback retires every missing\n // target, including legacy cards whose host archive no longer exists.\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 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, openSession, sessionId }) {\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 }), _jsxs(\"span\", { className: css.memberCount, children: [resolved.members.length, \" \\u540D\\u6210\\u5458\"] }), _jsx(\"button\", { type: \"button\", className: css.panelButton, onClick: () => { openActivityPanel(resolved); }, \"aria-label\": \"\\u6253\\u5F00\\u6D3B\\u52A8\\u9762\\u677F\", title: \"\\u6253\\u5F00\\u6D3B\\u52A8\\u9762\\u677F\", children: \"\\u6D3B\\u52A8\\u9762\\u677F\" })] }), resolved.members.length > 0 && (_jsx(\"div\", { className: css.members, children: resolved.members.map((member) => (_jsxs(\"button\", { type: \"button\", className: css.member, onClick: () => { if (member.id !== '')\n openSession(member.id); }, 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","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 fixed glass\n * panel at the top-right corner. On wide viewports it cooperatively makes the\n * conversation column yield space; narrow viewports keep overlay mode. 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 through a body portal (no top-right slot exists in the\n * web shell); it is not a conversation node — the in-conversation panel was\n * removed in favor of this always-available monitor.\n * @module dsh-agent-teams/client/activity\n */\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { IconBranchOutline16, IconCloseOutline16, } 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 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 portal is expanded. */\nconst PANEL_OPEN_ATTRIBUTE = 'data-agent-teams-panel-open';\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: '待领取',\n claimed: '已认领',\n in_progress: '进行中',\n completed: '已完成',\n failed: '失败',\n cancelled: '已取消',\n};\nfunction taskStatusLabel(status) {\n return TASK_STATUS_LABEL[status] ?? status;\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 }) {\n return (_jsxs(\"button\", { type: \"button\", className: css.badge, \"data-busy\": busy, onClick: onClick, \"aria-label\": `AgentTeams 活动,${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) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n if (member.activity === 'working')\n return '工作中';\n if (owned.some((task) => task.status === 'failed'))\n return '有失败';\n if (owned.some((task) => task.state === 'blocked'))\n return '等待';\n if (owned.length > 0 && owned.every((task) => task.status === 'completed'))\n return '已交付';\n if (member.status === 'removed')\n return historic ? '已离队' : '已移除';\n if (owned.length > 0)\n return '待执行';\n return '待派工';\n}\nfunction memberStatusText(member, tasks) {\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 `正在执行 ${current.id}`;\n if (member.activity === 'working')\n return '正在处理已派任务';\n if (blocked !== undefined) {\n const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== 'completed');\n if (dependency !== undefined)\n return `等待 ${dependency.id} · ${dependency.assignee || '待认领'}`;\n return '等待前置任务';\n }\n if (member.total === 0)\n return '等待队长派工';\n if (member.done === member.total)\n return '任务已交付';\n return member.activity === 'idle' ? '待继续执行' : '状态未知';\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) {\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 '等待队长拆解任务';\n if (completed.length === team.tasks.length)\n return `全部 ${completed.length} 项任务已交付`;\n if (blocked.length > 0 && running.length > 0) {\n return `${blocked.slice(0, 3).map((task) => task.id).join('、')}${blocked.length > 3 ? ` 等 ${blocked.length} 项` : ''} 等待前置,其余已开工`;\n }\n if (running.length > 0)\n return `${running.map((task) => task.id).join('、')} 正在执行`;\n if (ready.length > 0)\n return `${ready.map((task) => task.id).join('、')} 已就绪待开工`;\n if (blocked.length > 0)\n return `${blocked.map((task) => task.id).join('、')} 等待前置`;\n return '等待下一轮调度';\n}\nfunction ProgressOverview({ team }) {\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\": \"\\u56E2\\u961F\\u603B\\u8FDB\\u5EA6\", \"data-progress-summary\": true, children: [_jsx(\"span\", { className: css.progressTitle, children: \"\\u603B\\u8FDB\\u5EA6\" }), 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: [_jsxs(\"span\", { \"data-state\": \"running\", children: [\"\\u25A0 \\u8FDB\\u884C\\u4E2D \", running] }), _jsxs(\"span\", { \"data-state\": \"blocked\", children: [\"\\u25A0 \\u7B49\\u5F85\\u4F9D\\u8D56 \", blocked] }), _jsxs(\"span\", { \"data-state\": \"completed\", children: [\"\\u25A0 \\u5DF2\\u4EA4\\u4ED8 \", completed] })] }), _jsxs(\"span\", { className: css.progressSummary, \"data-state\": summaryTone, children: [_jsx(\"span\", { className: css.progressSummaryDot }), _jsx(\"span\", { children: taskSummary(team) })] })] }));\n}\nfunction DependencyMap({ tasks }) {\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\": \"\\u4EFB\\u52A1\\u4F9D\\u8D56\\u94FE\", \"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, {}), \" \", parallel ? '并行任务' : '任务依赖'] }), _jsx(\"span\", { className: css.sectionHint, children: pinnedTaskId === null\n ? parallel ? '无前后依赖 · 点击查看详情' : '悬停高亮依赖链 · 点击固定'\n : `${pinnedTaskId} 已固定 · Esc 取消` })] }), 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\": \"\\u8FD0\\u884C\\u4E2D\", 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) })] }), _jsxs(\"span\", { className: css.taskDetailLine, children: [detailTask.assignee || '待认领', \" \\u00B7 \", detailTask.status === 'completed'\n ? '已完成并交付'\n : detailTask.dependencies.length === 0\n ? '无前置,可立即开工'\n : waitingOn.length === 0\n ? '前置已就绪,可开工'\n : `等待 ${waitingOn.join('、')}`] }), _jsx(\"span\", { className: css.taskDetailMeta, children: dependents.length === 0 ? '无下游任务' : `完成后解锁 ${dependents.map((task) => task.id).join('、')}` })] })] }))] }));\n}\nfunction TeamSection({ team, onNavigate, 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: \"\\u5DF2\\u7ED3\\u675F\" }), _jsxs(\"span\", { className: css.teamStats, children: [_jsxs(\"span\", { \"data-stat\": \"members\", children: [team.members.length, \" \\u6210\\u5458\"] }), _jsxs(\"span\", { \"data-stat\": \"tasks\", children: [completedCount, \"/\", team.tasks.length, \" \\u5B8C\\u6210\"] }), _jsxs(\"span\", { \"data-stat\": \"messages\", children: [team.messageCount, \" \\u6D88\\u606F\"] })] })] }), _jsxs(\"section\", { className: css.delegationSection, \"aria-label\": \"\\u961F\\u957F\\u6D3E\\u5DE5\\u5173\\u7CFB\", \"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: \"\\u961F\\u957F\" }), _jsx(\"span\", { className: css.captainRole, children: \"\\u62C6\\u89E3 \\u00B7 \\u6D3E\\u53D1 \\u00B7 \\u6C47\\u603B\" })] }), _jsxs(\"span\", { className: css.captainSummary, children: [\"\\u5DF2\\u6D3E\\u53D1 \", assignedCount, \" \\u9879\\u4EFB\\u52A1\\u7ED9 \", team.members.length, \" \\u540D\\u6210\\u5458\"] })] }), _jsxs(\"span\", { className: css.captainState, \"data-busy\": busyCount > 0, children: [_jsx(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ? `${busyCount} 人执行中` : allCompleted ? '已收齐' : '等待回报'] })] }), _jsx(ProgressOverview, { team: team }), _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 }), \"\\u6210\\u5458 \", team.members.length] }), _jsx(\"span\", { children: membersOpen ? '收起' : '展开' })] }), membersOpen && _jsxs(\"div\", { className: css.delegationTree, children: [team.members.length === 0 && _jsx(\"span\", { className: css.emptyHint, children: \"\\u6682\\u65E0\\u6210\\u5458\\uFF0C\\u7B49\\u5F85\\u961F\\u957F\\u7EC4\\u5EFA\\u56E2\\u961F\" }), 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: () => { if (member.id !== '')\n onNavigate(member.id); }, 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)] })] }), _jsx(\"span\", { className: css.memberStatusLine, children: memberStatusText(member, team.tasks) })] }), _jsxs(\"span\", { className: css.memberCount, children: [member.done, \"/\", member.total] })] }), _jsxs(\"div\", { className: css.assignmentLine, children: [_jsx(\"span\", { className: css.assignmentLabel, children: \"\\u961F\\u957F\\u6D3E\\u53D1\" }), _jsx(\"span\", { className: css.assignmentTasks, children: owned.length === 0\n ? _jsx(\"span\", { className: css.taskEmpty, children: \"\\u6682\\u65E0\\u4EFB\\u52A1\" })\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 })] }));\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}\n/** The top-right activity floater. Teams follow the current session: live\n * snapshots and historic card summaries are only shown while their captain\n * session is the one currently open. */\nexport function ActivityPanel({ sessionsList, openSession }) {\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 = (id) => {\n setOpen(false);\n setWasActive(false);\n openSession(id);\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 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 // This portal 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 // The activity panel is a body portal, so announce its open state on body.\n // CSS can then make the conversation column yield space without knowing the\n // host shell's hashed module class names. Narrow viewports keep overlay mode.\n useLayoutEffect(() => {\n const root = document.documentElement;\n if (expanded)\n root.setAttribute(PANEL_OPEN_ATTRIBUTE, '');\n else\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n return () => { root.removeAttribute(PANEL_OPEN_ATTRIBUTE); };\n }, [expanded]);\n useEffect(() => {\n // Installing the plugin alone must not touch the state route. A successful\n // AgentTeams conversation card registers the demand that reaches here.\n if (currentTargets.length === 0)\n return;\n const controller = startActivityPolling(currentTargets);\n return () => { controller.stop(); };\n }, [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 if (!hasTeams && !expanded)\n return null;\n return (_jsxs(_Fragment, { children: [!expanded && (_jsx(CollapsedBadge, { count: visibleCount, busy: busy, onClick: () => {\n if (current === undefined)\n return;\n setOpenOwner(current);\n setOpen(true);\n } })), expanded && (_jsxs(\"aside\", { className: css.panel, \"data-agent-teams-activity\": true, children: [_jsxs(\"header\", { className: css.panelHead, children: [_jsxs(\"span\", { className: css.panelTitle, children: [\"AgentTeams \\u6D3B\\u52A8\", _jsx(\"span\", { className: css.panelDot, \"data-busy\": busy, \"aria-hidden\": true })] }), _jsx(\"button\", { type: \"button\", className: css.closeButton, onClick: () => {\n setOpen(false);\n setOpenOwner(undefined);\n }, \"aria-label\": \"\\u5173\\u95ED\", children: _jsx(IconCloseOutline16, {}) })] }), _jsx(\"div\", { className: css.teams, children: visibleCount === 0\n ? _jsx(\"span\", { className: css.emptyHint, children: \"\\u6682\\u65E0\\u56E2\\u961F\\u6D3B\\u52A8\" })\n : (_jsxs(_Fragment, { children: [visibleTeams.map((team) => (_jsx(TeamSection, { team: team, onNavigate: navigateToSession }, team.teamId))), visibleArchived.map((team) => (_jsx(\"div\", { \"data-team-id\": team.teamId, \"data-historic\": true, className: css.archivedWrap, children: _jsx(TeamSection, { team: team, onNavigate: navigateToSession, 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, historic: true }, teamKey));\n })] })) })] }))] }));\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","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createRoot } from 'react-dom/client';\nimport { ActivityPanel } from \"./ActivityPanel.js\";\nimport { AgentTeamsCard } from \"./AgentTeamsCard.js\";\nimport { agentTeamsCardDefinition } from \"./agent-teams-card-definition.js\";\n/** Required services: conversation nodes, slots, and sessions navigation. */\nexport const inject = ['conversationEvents', 'slots', 'sessions'];\n/**\n * Mount the floater through a body portal (the web shell has no top-right\n * slot) and register the in-conversation team card, whose \"activity panel\"\n * button re-activates the floater via a window event — the recovery path\n * for a closed floater or a re-opened session.\n */\nexport function apply(ctx) {\n const host = document.createElement('div');\n host.dataset.agentTeamsHost = '';\n document.body.appendChild(host);\n const root = createRoot(host);\n root.render(_jsx(ActivityPanel, { sessionsList: ctx.sessions.list, openSession: (id) => { ctx.sessions.open(id); } }));\n ctx.effect(() => () => {\n root.unmount();\n host.remove();\n }, 'agent-teams: activity panel');\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 inject: () => ({\n openSession: (id) => { ctx.sessions.open(id); },\n }),\n }, AgentTeamsCard));\n}\n"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -136,16 +136,19 @@ export function apply(ctx, config) {
136
136
  res.end(body);
137
137
  },
138
138
  }), 'agent-teams: activity route');
139
- // Whale mascot artwork: serve the packaged role/action images to the
139
+ // Whale mascot artwork: serve the packaged V2 role/action images to the
140
140
  // activity panel. An explicit allowlist guards the route (no path
141
141
  // traversal); the images ship with the bundle (files: assets/).
142
142
  const artDir = fileURLToPath(new URL('../assets/agent-teams/', import.meta.url));
143
143
  const ART_ALLOWLIST = new Set([
144
- 'team-lead.png', 'researcher.png', 'engineer.png', 'designer.png',
145
- 'qa-engineer.png', 'security-reviewer.png', 'data-analyst.png',
146
- 'docs-coordinator.png', 'action-working.png', 'action-thinking.png',
147
- 'action-reporting.png', 'action-celebrating.png', 'action-sleeping.png',
148
- 'action-sending.png',
144
+ 'team-lead-v2.png',
145
+ 'member-researcher-v2.png', 'member-engineer-v2.png',
146
+ 'member-qa-v2.png', 'member-designer-v2.png',
147
+ 'member-security-v2.png', 'member-docs-v2.png',
148
+ 'member-data-v2.png', 'member-operator-v2.png',
149
+ 'action-working-v2.png', 'action-thinking-v2.png',
150
+ 'action-reporting-v2.png', 'action-celebrating-v2.png',
151
+ 'action-sleeping-v2.png', 'action-sending-v2.png',
149
152
  ]);
150
153
  ctx.effect(() => webServer.register({
151
154
  kind: 'prefix',
@@ -7,7 +7,7 @@
7
7
  /** Artwork route prefix served by the plugin host half. */
8
8
  export declare const ART_BASE = "/plugins/dsh-agent-teams/assets/";
9
9
  /** Captain artwork (always the lead whale). */
10
- export declare const LEAD_ART = "/plugins/dsh-agent-teams/assets/team-lead.png";
10
+ export declare const LEAD_ART = "/plugins/dsh-agent-teams/assets/team-lead-v2.png";
11
11
  /** Status action artwork per member activity. */
12
12
  export declare const ACTION_ART: Record<'working' | 'idle' | 'unknown', string>;
13
13
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanmicoder/dsh-agent-teams",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
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",
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file