@nanmicoder/dsh-agent-teams 0.1.20 → 0.1.22-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -15
- package/README_ZH.md +36 -15
- package/assets/readme/workspace.png +0 -0
- package/compatibility.json +22 -2
- package/lib/capabilities.js +3 -1
- package/lib/client/ActivityPanel.js +80 -51
- package/lib/client/AgentTeamsCard.js +14 -5
- package/lib/client/TeamChatEntry.js +22 -0
- package/lib/client/WorkspaceActivity.js +100 -0
- package/lib/client/activity-model.js +73 -8
- package/lib/client/activity-monitor.js +11 -4
- package/lib/client/agent-teams-card-definition.js +11 -1
- package/lib/client/icons.js +18 -0
- package/lib/client/index.js +35 -4
- package/lib/client/locales.js +44 -0
- package/lib/client/session-navigation.js +13 -1
- package/lib/client/workspace-state.js +43 -0
- package/lib/client.js +832 -210
- package/lib/client.js.map +1 -1
- package/lib/git-artifact-stamp.json +5 -0
- package/lib/harness-compat.js +20 -3
- package/lib/index.js +1 -1
- package/lib/mailbox.js +23 -3
- package/lib/members.js +3 -3
- package/lib/quality-gates.js +54 -0
- package/lib/scheduler.js +8 -2
- package/lib/snapshot.js +1 -0
- package/lib/state.js +15 -3
- package/lib/tools.js +71 -22
- package/lib/types/capabilities.d.ts +0 -1
- package/lib/types/client/ActivityPanel.d.ts +18 -1
- package/lib/types/client/AgentTeamsCard.d.ts +14 -2
- package/lib/types/client/TeamChatEntry.d.ts +4 -0
- package/lib/types/client/WorkspaceActivity.d.ts +22 -0
- package/lib/types/client/activity-model.d.ts +37 -1
- package/lib/types/client/activity-monitor.d.ts +4 -0
- package/lib/types/client/agent-teams-card-definition.d.ts +8 -0
- package/lib/types/client/icons.d.ts +5 -0
- package/lib/types/client/locales.d.ts +44 -0
- package/lib/types/client/session-navigation.d.ts +13 -2
- package/lib/types/client/workspace-state.d.ts +19 -0
- package/lib/types/harness-compat.d.ts +14 -1
- package/lib/types/mailbox.d.ts +4 -0
- package/lib/types/quality-gates.d.ts +7 -1
- package/lib/types/scheduler.d.ts +1 -0
- package/lib/types/snapshot.d.ts +2 -0
- package/lib/types/types.d.ts +16 -0
- package/package.json +61 -54
- package/pnpm-workspace.yaml +288 -0
- package/release-notes/v0.1.21-rc.1.md +14 -0
- package/release-notes/v0.1.21.md +23 -0
- package/release-notes/v0.1.22-rc.1.md +24 -0
- package/scripts/compatibility.mjs +26 -4
- package/scripts/doctor.mjs +7 -2
package/lib/client.js
CHANGED
|
@@ -7,6 +7,138 @@ window.__ModuleLoader__.load({
|
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
let react = require("react");
|
|
9
9
|
let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
10
|
+
//#region lib/client/icons.js
|
|
11
|
+
/** Plugin-owned icons avoid depending on the host's generated design-export names. */
|
|
12
|
+
const stroke = {
|
|
13
|
+
fill: "none",
|
|
14
|
+
stroke: "currentColor",
|
|
15
|
+
strokeWidth: 1.5,
|
|
16
|
+
strokeLinecap: "round",
|
|
17
|
+
strokeLinejoin: "round"
|
|
18
|
+
};
|
|
19
|
+
function IconBranchOutline16() {
|
|
20
|
+
return (0, react_jsx_runtime.jsxs)("svg", {
|
|
21
|
+
width: "16",
|
|
22
|
+
height: "16",
|
|
23
|
+
viewBox: "0 0 16 16",
|
|
24
|
+
"aria-hidden": "true",
|
|
25
|
+
...stroke,
|
|
26
|
+
children: [
|
|
27
|
+
(0, react_jsx_runtime.jsx)("circle", {
|
|
28
|
+
cx: "4",
|
|
29
|
+
cy: "3",
|
|
30
|
+
r: "1.5"
|
|
31
|
+
}),
|
|
32
|
+
(0, react_jsx_runtime.jsx)("circle", {
|
|
33
|
+
cx: "12",
|
|
34
|
+
cy: "4",
|
|
35
|
+
r: "1.5"
|
|
36
|
+
}),
|
|
37
|
+
(0, react_jsx_runtime.jsx)("circle", {
|
|
38
|
+
cx: "4",
|
|
39
|
+
cy: "13",
|
|
40
|
+
r: "1.5"
|
|
41
|
+
}),
|
|
42
|
+
(0, react_jsx_runtime.jsx)("path", { d: "M4 4.5v7M4 9h3a5 5 0 0 0 5-3.5" })
|
|
43
|
+
]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function IconChevronDownOutline14() {
|
|
47
|
+
return (0, react_jsx_runtime.jsx)("svg", {
|
|
48
|
+
width: "14",
|
|
49
|
+
height: "14",
|
|
50
|
+
viewBox: "0 0 14 14",
|
|
51
|
+
"aria-hidden": "true",
|
|
52
|
+
...stroke,
|
|
53
|
+
children: (0, react_jsx_runtime.jsx)("path", { d: "m3 5 4 4 4-4" })
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function IconPanelLeftOutline16() {
|
|
57
|
+
return (0, react_jsx_runtime.jsxs)("svg", {
|
|
58
|
+
width: "16",
|
|
59
|
+
height: "16",
|
|
60
|
+
viewBox: "0 0 16 16",
|
|
61
|
+
"aria-hidden": "true",
|
|
62
|
+
...stroke,
|
|
63
|
+
children: [(0, react_jsx_runtime.jsx)("rect", {
|
|
64
|
+
x: "2",
|
|
65
|
+
y: "2.5",
|
|
66
|
+
width: "12",
|
|
67
|
+
height: "11",
|
|
68
|
+
rx: "2"
|
|
69
|
+
}), (0, react_jsx_runtime.jsx)("path", { d: "M6 2.5v11" })]
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function IconStopFill16() {
|
|
73
|
+
return (0, react_jsx_runtime.jsx)("svg", {
|
|
74
|
+
width: "16",
|
|
75
|
+
height: "16",
|
|
76
|
+
viewBox: "0 0 16 16",
|
|
77
|
+
"aria-hidden": "true",
|
|
78
|
+
children: (0, react_jsx_runtime.jsx)("rect", {
|
|
79
|
+
x: "4",
|
|
80
|
+
y: "4",
|
|
81
|
+
width: "8",
|
|
82
|
+
height: "8",
|
|
83
|
+
rx: "1",
|
|
84
|
+
fill: "currentColor"
|
|
85
|
+
})
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function IconWarningOutline16() {
|
|
89
|
+
return (0, react_jsx_runtime.jsxs)("svg", {
|
|
90
|
+
width: "16",
|
|
91
|
+
height: "16",
|
|
92
|
+
viewBox: "0 0 16 16",
|
|
93
|
+
"aria-hidden": "true",
|
|
94
|
+
...stroke,
|
|
95
|
+
children: [(0, react_jsx_runtime.jsx)("path", { d: "m7 2-5.5 10a1 1 0 0 0 1 1.5h11a1 1 0 0 0 1-1.5L9 2a1.1 1.1 0 0 0-2 0Z" }), (0, react_jsx_runtime.jsx)("path", { d: "M8 6v3m0 2v.1" })]
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region lib/client/session-navigation.js
|
|
100
|
+
/** Version-tolerant navigation into durable AgentTeams member transcripts. */
|
|
101
|
+
/** Newer sessions retain view ownership instead of publishing list.current. */
|
|
102
|
+
function currentSessionId(state) {
|
|
103
|
+
if ("current" in state) return state.current;
|
|
104
|
+
return Object.values(state.byId).find((row) => (row.retainedBy?.mainView ?? 0) > 0)?.id;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Open one member's persisted transcript.
|
|
108
|
+
*
|
|
109
|
+
* Harness rc.8 intentionally removed cold subagents from the ordinary session
|
|
110
|
+
* list. They must first be rediscovered in their parent's catalog, then opened
|
|
111
|
+
* with the exact parent/child/mode address. Older runtimes have only `open()`;
|
|
112
|
+
* the fallback preserves ordinary-session navigation. New layouts also select
|
|
113
|
+
* the Conversation panel and cancel catalog refreshes superseded by navigation.
|
|
114
|
+
*/
|
|
115
|
+
async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout, workspace) {
|
|
116
|
+
if (sessions.open === void 0 && workspace !== void 0) {
|
|
117
|
+
workspace.openSession({
|
|
118
|
+
parentSessionId,
|
|
119
|
+
childSessionId,
|
|
120
|
+
mode: "continuable"
|
|
121
|
+
});
|
|
122
|
+
return "subagent";
|
|
123
|
+
}
|
|
124
|
+
const navigation = layout?.beginNavigation?.();
|
|
125
|
+
if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
|
|
126
|
+
if (sessions.open === void 0) throw new Error("Harness does not expose session navigation");
|
|
127
|
+
sessions.open(childSessionId);
|
|
128
|
+
layout?.selectPanel?.(null);
|
|
129
|
+
return "session";
|
|
130
|
+
}
|
|
131
|
+
await sessions.refreshSubagents(parentSessionId);
|
|
132
|
+
if (navigation?.aborted) return "cancelled";
|
|
133
|
+
const retained = sessions.subagentAddress?.(childSessionId);
|
|
134
|
+
sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
|
|
135
|
+
parentSessionId,
|
|
136
|
+
childSessionId,
|
|
137
|
+
mode: "continuable"
|
|
138
|
+
});
|
|
139
|
+
layout?.selectPanel?.(null);
|
|
140
|
+
return "subagent";
|
|
141
|
+
}
|
|
10
142
|
/** Compact `provider/model` route, or just the model when the provider is absent. */
|
|
11
143
|
function memberRouteLabel(member) {
|
|
12
144
|
if (member === void 0) return "";
|
|
@@ -31,6 +163,69 @@ window.__ModuleLoader__.load({
|
|
|
31
163
|
const slash = trimmed.lastIndexOf("/");
|
|
32
164
|
return slash === -1 ? trimmed : trimmed.slice(slash + 1);
|
|
33
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Latest terminal-task `updatedAt` owned by one member.
|
|
168
|
+
* @param memberName - member whose owned tasks are scanned.
|
|
169
|
+
* @param tasks - team tasks carrying durable `updatedAt` stamps.
|
|
170
|
+
* @returns the newest terminal stamp, or undefined when the member owns none.
|
|
171
|
+
*/
|
|
172
|
+
function memberFinishedAt(memberName, tasks) {
|
|
173
|
+
let latest;
|
|
174
|
+
for (const task of tasks) {
|
|
175
|
+
if (task.assignee !== memberName) continue;
|
|
176
|
+
if (task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled") continue;
|
|
177
|
+
const stamp = task.updatedAt;
|
|
178
|
+
if (typeof stamp !== "number" || !Number.isFinite(stamp)) continue;
|
|
179
|
+
if (latest === void 0 || stamp > latest) latest = stamp;
|
|
180
|
+
}
|
|
181
|
+
return latest;
|
|
182
|
+
}
|
|
183
|
+
/** Whether a member still has live work (running activity or an open task). */
|
|
184
|
+
function memberIsRunning(member, tasks) {
|
|
185
|
+
if (member.activity === "working" || member.status === "working") return true;
|
|
186
|
+
return tasks.some((task) => task.assignee === member.name && (task.status === "pending" || task.status === "claimed" || task.status === "in_progress"));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Order the delegation member list for issue #192.
|
|
190
|
+
*
|
|
191
|
+
* Running members keep their incoming relative order and come first; finished
|
|
192
|
+
* members follow sorted by finish time, newest first. Members without a
|
|
193
|
+
* derivable finish time keep their incoming relative order after the stamped
|
|
194
|
+
* ones, so an older host that omits stamps never reorders them randomly.
|
|
195
|
+
* @param members - delegation roster in snapshot order.
|
|
196
|
+
* @param tasks - team tasks carrying durable `updatedAt` stamps.
|
|
197
|
+
* @returns the members in display order.
|
|
198
|
+
*/
|
|
199
|
+
function orderDelegationMembers(members, tasks) {
|
|
200
|
+
const running = [];
|
|
201
|
+
const finishedStamped = [];
|
|
202
|
+
const finishedUnstamped = [];
|
|
203
|
+
members.forEach((member, index) => {
|
|
204
|
+
if (memberIsRunning(member, tasks)) {
|
|
205
|
+
running.push({
|
|
206
|
+
member,
|
|
207
|
+
index
|
|
208
|
+
});
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const finishedAt = memberFinishedAt(member.name, tasks);
|
|
212
|
+
if (finishedAt === void 0) finishedUnstamped.push({
|
|
213
|
+
member,
|
|
214
|
+
index
|
|
215
|
+
});
|
|
216
|
+
else finishedStamped.push({
|
|
217
|
+
member,
|
|
218
|
+
index,
|
|
219
|
+
finishedAt
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
finishedStamped.sort((left, right) => right.finishedAt - left.finishedAt || left.index - right.index);
|
|
223
|
+
return [
|
|
224
|
+
...running,
|
|
225
|
+
...finishedStamped,
|
|
226
|
+
...finishedUnstamped
|
|
227
|
+
].map((entry) => entry.member);
|
|
228
|
+
}
|
|
34
229
|
/** Whether the captain chat should keep showing the in-progress banner. */
|
|
35
230
|
function teamIsActive(team) {
|
|
36
231
|
if (team.halted === true || team.phase === "staged") return false;
|
|
@@ -94,13 +289,17 @@ window.__ModuleLoader__.load({
|
|
|
94
289
|
* each stage. Edges use cubic curves so fan-in remains readable without
|
|
95
290
|
* turning every task into a large card.
|
|
96
291
|
*/
|
|
97
|
-
function compactDagLayout(tasks) {
|
|
292
|
+
function compactDagLayout(tasks, dimensions) {
|
|
293
|
+
const nodeWidth = dimensions?.nodeWidth ?? 92;
|
|
294
|
+
const nodeHeight = dimensions?.nodeHeight ?? 30;
|
|
295
|
+
const columnGap = dimensions?.columnGap ?? 26;
|
|
296
|
+
const rowGap = dimensions?.rowGap ?? 8;
|
|
98
297
|
const stages = taskStages(tasks);
|
|
99
298
|
const positions = /* @__PURE__ */ new Map();
|
|
100
299
|
const nodes = [];
|
|
101
300
|
for (const [column, stage] of stages.entries()) for (const [row, task] of stage.tasks.entries()) {
|
|
102
|
-
const x = column *
|
|
103
|
-
const y = row *
|
|
301
|
+
const x = column * (nodeWidth + columnGap);
|
|
302
|
+
const y = row * (nodeHeight + rowGap);
|
|
104
303
|
positions.set(task.id, {
|
|
105
304
|
x,
|
|
106
305
|
y
|
|
@@ -118,10 +317,10 @@ window.__ModuleLoader__.load({
|
|
|
118
317
|
for (const dependency of task.dependencies) {
|
|
119
318
|
const source = positions.get(dependency);
|
|
120
319
|
if (source === void 0) continue;
|
|
121
|
-
const x1 = source.x +
|
|
122
|
-
const y1 = source.y +
|
|
320
|
+
const x1 = source.x + nodeWidth;
|
|
321
|
+
const y1 = source.y + nodeHeight / 2;
|
|
123
322
|
const x2 = target.x;
|
|
124
|
-
const y2 = target.y +
|
|
323
|
+
const y2 = target.y + nodeHeight / 2;
|
|
125
324
|
edges.push({
|
|
126
325
|
from: dependency,
|
|
127
326
|
to: task.id,
|
|
@@ -131,8 +330,8 @@ window.__ModuleLoader__.load({
|
|
|
131
330
|
}
|
|
132
331
|
const rows = Math.max(1, ...stages.map((stage) => stage.tasks.length));
|
|
133
332
|
return {
|
|
134
|
-
width: stages.length === 0 ? 0 : stages.length *
|
|
135
|
-
height: stages.length === 0 ? 0 : rows *
|
|
333
|
+
width: stages.length === 0 ? 0 : stages.length * nodeWidth + (stages.length - 1) * columnGap,
|
|
334
|
+
height: stages.length === 0 ? 0 : rows * nodeHeight + (rows - 1) * rowGap,
|
|
136
335
|
nodes,
|
|
137
336
|
edges
|
|
138
337
|
};
|
|
@@ -342,9 +541,11 @@ window.__ModuleLoader__.load({
|
|
|
342
541
|
cache: "no-store",
|
|
343
542
|
signal: controller.signal
|
|
344
543
|
});
|
|
345
|
-
if (!liveResponse.ok)
|
|
544
|
+
if (!liveResponse.ok) throw new Error("Activity unavailable");
|
|
346
545
|
const body = await liveResponse.json();
|
|
347
|
-
if (cancelled
|
|
546
|
+
if (cancelled) return;
|
|
547
|
+
if (!Array.isArray(body.teams)) throw new Error("Invalid activity response");
|
|
548
|
+
runtime.onStatus?.("ready");
|
|
348
549
|
const liveTeams = body.teams;
|
|
349
550
|
publishSnapshots({ teams: liveTeams });
|
|
350
551
|
const previousDiscoveredKeys = discoveredLiveKeys;
|
|
@@ -361,14 +562,16 @@ window.__ModuleLoader__.load({
|
|
|
361
562
|
cache: "no-store",
|
|
362
563
|
signal: controller.signal
|
|
363
564
|
});
|
|
364
|
-
if (!archivedResponse.ok)
|
|
565
|
+
if (!archivedResponse.ok) throw new Error("Archive unavailable");
|
|
365
566
|
const archivedBody = await archivedResponse.json();
|
|
366
|
-
if (cancelled
|
|
567
|
+
if (cancelled) return;
|
|
568
|
+
if (!Array.isArray(archivedBody.teams)) throw new Error("Invalid archive response");
|
|
367
569
|
publishSnapshots({ archivedTeams: archivedBody.teams });
|
|
368
570
|
discoveryComplete = true;
|
|
369
571
|
settleTargets(new Set(missing.map((target) => target.key)));
|
|
370
572
|
} catch (error) {
|
|
371
573
|
if (error?.name === "AbortError") return;
|
|
574
|
+
if (!cancelled) runtime.onStatus?.("error");
|
|
372
575
|
} finally {
|
|
373
576
|
inFlight = false;
|
|
374
577
|
}
|
|
@@ -429,16 +632,17 @@ window.__ModuleLoader__.load({
|
|
|
429
632
|
}
|
|
430
633
|
//#endregion
|
|
431
634
|
//#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/AgentTeamsCard.module.css.mjs
|
|
432
|
-
const css$
|
|
433
|
-
const tagId$
|
|
434
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$
|
|
635
|
+
const css$2 = ".kPAopq_root{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:10px;flex-direction:column;gap:8px;width:100%;min-width:0;padding:10px 12px;display:flex}.kPAopq_head{align-items:center;gap:8px;min-width:0;display:flex}.kPAopq_leadAvatar{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0;flex:none;width:30px;height:30px}.kPAopq_teamName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.kPAopq_memberCount{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;margin-left:auto;font-size:11px;line-height:16px}.kPAopq_panelButton{border:1px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;flex:none;padding:2px 8px;font-size:10.5px;font-weight:600;line-height:16px;transition:border-color .12s,color .12s}.kPAopq_panelButton:hover{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.kPAopq_panelButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_members{flex-wrap:wrap;gap:6px;min-width:0;display:flex}.kPAopq_member{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);max-width:160px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:5px;padding:3px 8px 3px 3px;font-size:11px;font-weight:500;line-height:16px;transition:border-color .12s,background-color .12s;display:inline-flex}.kPAopq_member:hover{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-button-ghost-active-fill)}.kPAopq_member:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d482e);background:0 0;border:0;border-radius:0;width:24px;height:24px}.kPAopq_memberInitial{background:var(--dsw-alias-state-business-primary);width:20px;height:20px;color:var(--dsw-alias-label-primary-inverted);border-radius:50%;justify-content:center;align-items:center;font-size:10px;font-weight:600;line-height:20px;display:inline-flex}.kPAopq_memberName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.kPAopq_chatEntry{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border-radius:7px;align-items:center;gap:5px;padding:3px 8px;font-size:12px;display:inline-flex}.kPAopq_chatEntry img{object-fit:contain;width:22px;height:22px}.kPAopq_chatEntry:hover{background:var(--dsw-alias-bg-module-platform)}.kPAopq_chatEntry:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.kPAopq_turnCards{gap:8px;margin-block:10px;display:grid}@media (width<=600px){.kPAopq_head{flex-wrap:wrap}}";
|
|
636
|
+
const tagId$2 = "@nanmicoder/dsh-agent-teams/AgentTeamsCard.module.css";
|
|
637
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
|
|
435
638
|
const tag = document.createElement("style");
|
|
436
639
|
tag.dataset.plugin = "@nanmicoder/dsh-agent-teams";
|
|
437
|
-
tag.dataset.pluginCss = tagId$
|
|
438
|
-
tag.textContent = css$
|
|
640
|
+
tag.dataset.pluginCss = tagId$2;
|
|
641
|
+
tag.textContent = css$2;
|
|
439
642
|
document.head.appendChild(tag);
|
|
440
643
|
}
|
|
441
644
|
var AgentTeamsCard_module_css_default = {
|
|
645
|
+
"chatEntry": "kPAopq_chatEntry",
|
|
442
646
|
"head": "kPAopq_head",
|
|
443
647
|
"leadAvatar": "kPAopq_leadAvatar",
|
|
444
648
|
"member": "kPAopq_member",
|
|
@@ -449,7 +653,8 @@ window.__ModuleLoader__.load({
|
|
|
449
653
|
"members": "kPAopq_members",
|
|
450
654
|
"panelButton": "kPAopq_panelButton",
|
|
451
655
|
"root": "kPAopq_root",
|
|
452
|
-
"teamName": "kPAopq_teamName"
|
|
656
|
+
"teamName": "kPAopq_teamName",
|
|
657
|
+
"turnCards": "kPAopq_turnCards"
|
|
453
658
|
};
|
|
454
659
|
//#endregion
|
|
455
660
|
//#region lib/client/AgentTeamsCard.js
|
|
@@ -466,7 +671,7 @@ window.__ModuleLoader__.load({
|
|
|
466
671
|
*/
|
|
467
672
|
/** Window event name the floater listens for to open itself. */
|
|
468
673
|
const OPEN_PANEL_EVENT = "agent-teams:open-panel";
|
|
469
|
-
/**
|
|
674
|
+
/** Open the matching team view, carrying this team's summary
|
|
470
675
|
* so the panel can show it even when the team no longer exists on disk
|
|
471
676
|
* (historical session review). */
|
|
472
677
|
function openActivityPanel(data) {
|
|
@@ -478,8 +683,20 @@ window.__ModuleLoader__.load({
|
|
|
478
683
|
} }));
|
|
479
684
|
}
|
|
480
685
|
/** Render one durable team as a compact conversation card. */
|
|
481
|
-
|
|
482
|
-
|
|
686
|
+
const noWorkspace = () => void 0;
|
|
687
|
+
const noSubscription = () => () => {};
|
|
688
|
+
function AgentTeamsCard({ node, openMember, sessionId, t, workspaceBridge }) {
|
|
689
|
+
const native = (0, react.useSyncExternalStore)(workspaceBridge?.subscribe ?? noSubscription, workspaceBridge?.getSnapshot ?? noWorkspace);
|
|
690
|
+
const location = node.location;
|
|
691
|
+
if (native && (location.kind === "turn" || location.kind === "step") && location.turn.status === "closed") return null;
|
|
692
|
+
return (0, react_jsx_runtime.jsx)(AgentTeamsSummary, {
|
|
693
|
+
data: node.data,
|
|
694
|
+
openMember,
|
|
695
|
+
sessionId,
|
|
696
|
+
t
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
function AgentTeamsSummary({ data, openMember, sessionId, t }) {
|
|
483
700
|
const owner = data.captainSessionId || sessionId;
|
|
484
701
|
const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
|
|
485
702
|
(0, react.useEffect)(() => {
|
|
@@ -528,9 +745,9 @@ window.__ModuleLoader__.load({
|
|
|
528
745
|
onClick: () => {
|
|
529
746
|
openActivityPanel(resolved);
|
|
530
747
|
},
|
|
531
|
-
"aria-label": t("
|
|
532
|
-
title: t("
|
|
533
|
-
children: t("
|
|
748
|
+
"aria-label": t("workspace.focus"),
|
|
749
|
+
title: t("workspace.focus"),
|
|
750
|
+
children: t("workspace.focus")
|
|
534
751
|
})
|
|
535
752
|
]
|
|
536
753
|
}), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -560,13 +777,13 @@ window.__ModuleLoader__.load({
|
|
|
560
777
|
}
|
|
561
778
|
//#endregion
|
|
562
779
|
//#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
|
|
563
|
-
const css = "html{--agent-teams-panel-shift:420px}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 29%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-border-l3);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l3) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 25%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 33%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 29%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 38%, transparent)}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-border-l2);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:5;touch-action:none;pointer-events:auto;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:14px;top:44px;bottom:14px;left:0}.aYQbCq_resizeHandle[data-resize-edge=left]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:3px;height:48px;transition:background-color .12s,opacity .12s;position:absolute;top:50%;left:4px;transform:translateY(-50%)}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:14px;bottom:0;left:20px;right:20px}.aYQbCq_resizeHandle[data-resize-edge=bottom]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:48px;height:3px;transition:background-color .12s,opacity .12s;position:absolute;bottom:4px;left:50%;transform:translate(-50%)}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:28px;height:28px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:2px solid var(--dsw-alias-label-tertiary);border-bottom:2px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.58;width:10px;height:10px;transition:border-color .12s,opacity .12s;position:absolute;bottom:6px;right:6px}.aYQbCq_resizeHandle:hover:after,.aYQbCq_panel[data-resizing] .aYQbCq_resizeHandle:after{background-color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);opacity:.95}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex;container:aYQbCq_agent-team/inline-size}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_teamStopButton{border:1px solid var(--dsw-alias-border-l2);width:26px;height:26px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border-radius:7px;flex:none;place-items:center;padding:0;transition:border-color .15s,background .15s,color .15s;display:grid}.aYQbCq_teamStopButton:hover{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 42%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);color:var(--dsw-alias-state-error-primary)}.aYQbCq_teamStopButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_stopModalActions{justify-content:flex-end;gap:8px;display:flex}.aYQbCq_stopModalActions button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:6px 13px;font-size:12px;font-weight:600;display:inline-flex}.aYQbCq_stopModalActions button[data-danger]{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_stopModalActions button:disabled{cursor:wait;opacity:.58}.aYQbCq_stopModalError{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);color:var(--dsw-alias-state-error-primary);border-radius:8px;align-items:flex-start;gap:7px;margin:0;padding:9px 10px;font-size:12px;line-height:18px;display:flex}.aYQbCq_stopModalError svg{flex:none;margin-top:1px}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_taskDetailModel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;line-height:14px;overflow:hidden}.aYQbCq_memberModel{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-width:0;max-width:132px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:0 auto;align-items:center;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:15px;display:inline-flex;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_agentTeamsDot}@keyframes aYQbCq_agentTeamsDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-border-l3);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warn-primary)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-error-primary)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warn-primary)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=discarded]{background:var(--dsw-alias-button-ghost-active-fill)}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warn-primary)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary[data-state=discarded] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-label-tertiary)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-button-ghost-active-fill)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-border-l2));content:\"\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-border-l2));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-layer-1))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_agentTeamsUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_agentTeamsUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-state-business-primary);width:34px;height:34px;color:var(--dsw-alias-label-primary-inverted);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-layer-1)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-button-ghost-active-fill);max-width:100%;min-height:16px;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex;overflow:hidden}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-border-l3);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-layer-1))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 48%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 52%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 56%, var(--dsw-alias-border-l2))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-border-l3);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warn-primary)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-error-primary)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_planEditor{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, var(--dsw-alias-state-business-primary));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent);border-radius:10px;flex-direction:column;gap:12px;margin:0 10px 12px;padding:12px;display:flex}.aYQbCq_planHeader>span{justify-content:space-between;align-items:center;gap:8px;display:flex}.aYQbCq_planHeader>span>span{flex-direction:column;gap:2px;min-width:0;display:flex}.aYQbCq_planHeader strong{color:var(--dsw-alias-label-primary);font-size:12px}.aYQbCq_planHeader small{color:var(--dsw-alias-label-secondary);font-size:9px;font-weight:500;line-height:13px}.aYQbCq_planHeader em{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted);border-radius:999px;flex:none;padding:1px 7px;font-size:9px;font-style:normal;line-height:16px}.aYQbCq_planHeader p{color:var(--dsw-alias-label-secondary);margin:5px 0 0;font-size:10px;line-height:15px}.aYQbCq_planFlow{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;padding:0;list-style:none;display:grid}.aYQbCq_planFlow li{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:5px;font-size:9px;font-weight:600;line-height:14px;display:flex;position:relative}.aYQbCq_planFlow li:not(:last-child):after{background:var(--dsw-alias-border-l2);content:\"\";flex:1;min-width:8px;height:1px;margin-right:5px}.aYQbCq_planFlow li>span{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;place-items:center;width:18px;height:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;display:grid}.aYQbCq_planFlow li[data-active]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_planFlow li[data-active]>span{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent)}.aYQbCq_planSection{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:8px;overflow:hidden}.aYQbCq_planSectionToggle,.aYQbCq_planCardHeader{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0}.aYQbCq_planSectionToggle{justify-content:space-between;align-items:center;gap:8px;min-height:42px;padding:7px 9px;display:flex}.aYQbCq_planSectionToggle:hover,.aYQbCq_planCardHeader:hover{background:color-mix(in srgb, var(--dsw-alias-button-ghost-active-fill) 46%, transparent)}.aYQbCq_planSectionToggle>span{align-items:baseline;gap:7px;min-width:0;display:flex}.aYQbCq_planSectionToggle strong{font-size:10.5px}.aYQbCq_planSectionToggle small{color:var(--dsw-alias-label-tertiary);font-size:9px}.aYQbCq_planList{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:0;display:flex}.aYQbCq_planEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;padding:12px;font-size:10px}.aYQbCq_planCard{background:0 0;border:0;border-radius:0;min-width:0;margin:0;padding:0;display:block;position:relative}.aYQbCq_planCard+.aYQbCq_planCard{border-top:1px solid var(--dsw-alias-border-l2)}.aYQbCq_planCard[data-open=true]{background:color-mix(in srgb, var(--dsw-alias-bg-base) 62%, transparent)}.aYQbCq_planCardHeader{grid-template-columns:minmax(80px,.9fr) minmax(72px,1.15fr) auto 12px;align-items:center;gap:7px;min-height:40px;padding:6px 9px;display:grid}.aYQbCq_planCardIdentity{flex-direction:column;gap:1px;min-width:0;display:flex}.aYQbCq_planCardIdentity strong,.aYQbCq_planTaskSummary{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:650;line-height:14px;overflow:hidden}.aYQbCq_planCardIdentity>span,.aYQbCq_planCardMeta{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planTaskId{background:var(--dsw-alias-button-ghost-active-fill);width:max-content;color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8.5px;font-weight:700;line-height:14px}.aYQbCq_planDirty{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 13%, transparent);color:var(--dsw-alias-state-warn-primary);border-radius:999px;justify-self:end;padding:1px 5px;font-size:8px;font-style:normal;font-weight:650;line-height:14px}.aYQbCq_planChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.2,.7,.2,1)}.aYQbCq_planChevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_planCardBody{flex-direction:column;gap:8px;padding:0 9px 9px;display:flex}.aYQbCq_planCardBody fieldset{border:0;flex-direction:column;gap:7px;min-width:0;margin:0;padding:0;display:flex}.aYQbCq_planCardBody label,.aYQbCq_planNewTask label{min-width:0;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;gap:4px;font-size:9px;display:flex}.aYQbCq_planCardBody label small{color:var(--dsw-alias-label-tertiary);font-size:8px;line-height:11px}.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:6px;outline:none;font-size:10.5px;line-height:16px;transition:border-color .16s,box-shadow .16s}.aYQbCq_planCard input,.aYQbCq_planCard select,.aYQbCq_planNewTask input{min-height:32px;padding:6px 8px}.aYQbCq_planCard textarea{resize:vertical;min-height:58px;padding:7px 8px}.aYQbCq_planCard input:focus-visible,.aYQbCq_planCard textarea:focus-visible,.aYQbCq_planCard select:focus-visible,.aYQbCq_planNewTask input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent)}.aYQbCq_planGrid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px;display:grid}.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr);gap:5px;display:grid}.aYQbCq_planModelMenu{width:100%;display:flex}.aYQbCq_planModelTrigger{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:7px;justify-content:space-between;align-items:center;gap:8px;padding:7px 9px;transition:border-color .16s,background-color .16s,transform .12s;display:flex}.aYQbCq_planModelTrigger:hover:not(:disabled){border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.aYQbCq_planModelTrigger:active:not(:disabled){transform:translateY(1px)}.aYQbCq_planModelTrigger:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:2px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);outline-offset:1px}.aYQbCq_planModelTrigger:disabled{cursor:wait;opacity:.64}.aYQbCq_planModelTriggerCopy{align-items:baseline;gap:6px;min-width:0;display:flex}.aYQbCq_planModelTriggerCopy strong,.aYQbCq_planModelTriggerCopy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_planModelTriggerCopy strong{color:var(--dsw-alias-label-primary);font-size:10px;font-weight:650;line-height:15px}.aYQbCq_planModelTriggerCopy span{color:var(--dsw-alias-label-tertiary);font-size:9px;line-height:14px}.aYQbCq_planModelMenuRow{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;min-width:0;display:grid}.aYQbCq_planModelMenuRow>span:first-child{color:var(--dsw-alias-label-primary)}.aYQbCq_planModelMenuRow strong{color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-weight:450;overflow:hidden}.aYQbCq_planModelMenuBack{align-items:center;gap:7px;display:inline-flex}.aYQbCq_planModelMenuBack svg{transform:rotate(180deg)}.aYQbCq_planModelEffortRow{flex-direction:column;align-items:flex-start;min-width:0;display:flex}.aYQbCq_planModelEffortRow small{width:100%;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_planModelHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planModelNotice{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 9%, transparent);color:var(--dsw-alias-label-secondary);border-radius:6px;grid-column:1/-1;justify-content:space-between;align-items:center;gap:8px;padding:6px 7px;font-size:8.5px;line-height:12px;display:flex}.aYQbCq_planModelNotice button{color:var(--dsw-alias-state-business-primary);cursor:pointer;font:inherit;background:0 0;border:0;flex:none;padding:2px 6px;font-weight:650}.aYQbCq_planActions,.aYQbCq_planApproveRow,.aYQbCq_planNewTask,.aYQbCq_planConfirm,.aYQbCq_planApproveActions,.aYQbCq_planSecondaryActions{align-items:center;gap:7px;display:flex}.aYQbCq_planReviewActions{grid-template-columns:minmax(0,1fr);gap:6px;width:100%;display:grid}.aYQbCq_planSecondaryActions{grid-template-columns:minmax(0,1fr) auto;display:grid}.aYQbCq_planActions{justify-content:flex-end}.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;flex:none;padding:5px 10px;font-size:9.5px;font-weight:600;transition:background .16s,border-color .16s,transform .16s}.aYQbCq_planActions button:hover:not(:disabled),.aYQbCq_planNewTask button:hover:not(:disabled),.aYQbCq_planApproveRow button:hover:not(:disabled),.aYQbCq_planConfirm button:hover:not(:disabled){border-color:var(--dsw-alias-label-tertiary)}.aYQbCq_planActions button:active:not(:disabled),.aYQbCq_planNewTask button:active:not(:disabled),.aYQbCq_planApproveRow button:active:not(:disabled),.aYQbCq_planConfirm button:active:not(:disabled){transform:scale(.98)}.aYQbCq_planActions button[data-danger],.aYQbCq_planConfirm button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;align-items:center;gap:5px;font-size:9px;line-height:13px;animation:.18s ease-out aYQbCq_plan-feedback-in;display:inline-flex}.aYQbCq_planFeedback[data-tone=success]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_planFeedback[data-tone=error]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback>span{border:1px solid;border-radius:50%;flex:none;place-items:center;width:15px;height:15px;display:grid}.aYQbCq_planFeedback svg{width:11px;height:11px}@keyframes aYQbCq_plan-feedback-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.aYQbCq_planConfirm{border:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);border-radius:7px;flex-wrap:wrap;justify-content:flex-end;padding:7px}.aYQbCq_planConfirm>span{min-width:140px;color:var(--dsw-alias-label-secondary);flex:1;font-size:9px;line-height:13px}.aYQbCq_planNewTask{align-items:flex-end}.aYQbCq_planNewTask label{gap:4px}.aYQbCq_planNewTask label>span{line-height:13px}.aYQbCq_planApproveRow{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, transparent);min-height:50px;box-shadow:0 -5px 16px color-mix(in srgb, var(--dsw-alias-bg-base) 35%, transparent);backdrop-filter:blur(8px);border-radius:8px;flex-direction:column;justify-content:flex-end;align-items:stretch;margin:0 -4px -4px;padding:8px;position:sticky;bottom:0}.aYQbCq_planApproveRow[data-armed=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveRow[data-discard=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveCopy{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.aYQbCq_planApproveCopy strong{color:var(--dsw-alias-label-primary);font-size:9.5px;line-height:13px}.aYQbCq_planApproveCopy small{color:var(--dsw-alias-label-tertiary);font-size:8.5px;line-height:12px}.aYQbCq_planApproveRow button{background:var(--dsw-alias-state-business-primary);min-height:32px;color:var(--dsw-alias-label-primary-inverted);padding-inline:13px}.aYQbCq_planReviewActions>button[data-plan-approve]{width:100%}.aYQbCq_planApproveActions>button:first-child{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button,.aYQbCq_planApproveActions>button[data-danger]{border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button[data-danger],.aYQbCq_planApproveActions>button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planSectionToggle:focus-visible,.aYQbCq_planCardHeader:focus-visible,.aYQbCq_planActions button:focus-visible,.aYQbCq_planNewTask button:focus-visible,.aYQbCq_planApproveRow button:focus-visible,.aYQbCq_planConfirm button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.aYQbCq_planActions button:disabled,.aYQbCq_planNewTask button:disabled,.aYQbCq_planApproveRow button:disabled{cursor:default;opacity:.55}.aYQbCq_historicPill{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archiveLabel{color:var(--dsw-alias-label-tertiary);padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after,.aYQbCq_planChevron,.aYQbCq_planFeedback,.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button,.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{transition:none;animation:none}}@media (width<=960px){html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}.aYQbCq_planFlow li{gap:4px;font-size:8px}.aYQbCq_planFlow li:not(:last-child):after{margin-right:3px}.aYQbCq_planCardHeader{grid-template-columns:auto minmax(0,1fr) auto}.aYQbCq_planCardHeader .aYQbCq_planCardMeta{display:none}.aYQbCq_planGrid,.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr)}.aYQbCq_planNewTask,.aYQbCq_planApproveRow{flex-direction:column;align-items:stretch}.aYQbCq_planNewTask button,.aYQbCq_planApproveRow>button,.aYQbCq_planApproveActions,.aYQbCq_planReviewActions{width:100%}.aYQbCq_planApproveActions button,.aYQbCq_planReviewActions button,.aYQbCq_planSecondaryActions button{flex:1}}@container aYQbCq_agent-team (width<=360px){.aYQbCq_planEditor{margin-inline:0;padding-inline:10px}.aYQbCq_planHeader>span{align-items:flex-start}.aYQbCq_planFlow li{gap:3px;font-size:7.5px}.aYQbCq_planFlow li:not(:last-child):after{min-width:4px;margin-right:2px}.aYQbCq_planSecondaryActions,.aYQbCq_planApproveActions{grid-template-columns:minmax(0,1fr);width:100%;display:grid}.aYQbCq_planSecondaryActions button,.aYQbCq_planApproveActions button{width:100%}}";
|
|
564
|
-
const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
|
|
565
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
780
|
+
const css$1 = "html{--agent-teams-panel-shift:420px}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 29%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-border-l3);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l3) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 25%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 33%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 29%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 38%, transparent)}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-border-l2);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:5;touch-action:none;pointer-events:auto;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:14px;top:44px;bottom:14px;left:0}.aYQbCq_resizeHandle[data-resize-edge=left]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:3px;height:48px;transition:background-color .12s,opacity .12s;position:absolute;top:50%;left:4px;transform:translateY(-50%)}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:14px;bottom:0;left:20px;right:20px}.aYQbCq_resizeHandle[data-resize-edge=bottom]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:48px;height:3px;transition:background-color .12s,opacity .12s;position:absolute;bottom:4px;left:50%;transform:translate(-50%)}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:28px;height:28px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:2px solid var(--dsw-alias-label-tertiary);border-bottom:2px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.58;width:10px;height:10px;transition:border-color .12s,opacity .12s;position:absolute;bottom:6px;right:6px}.aYQbCq_resizeHandle:hover:after,.aYQbCq_panel[data-resizing] .aYQbCq_resizeHandle:after{background-color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);opacity:.95}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex;container:aYQbCq_agent-team/inline-size}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_teamStopButton{border:1px solid var(--dsw-alias-border-l2);width:26px;height:26px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border-radius:7px;flex:none;place-items:center;padding:0;transition:border-color .15s,background .15s,color .15s;display:grid}.aYQbCq_teamStopButton:hover{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 42%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);color:var(--dsw-alias-state-error-primary)}.aYQbCq_teamStopButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_stopModalActions{justify-content:flex-end;gap:8px;display:flex}.aYQbCq_stopModalActions button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:6px 13px;font-size:12px;font-weight:600;display:inline-flex}.aYQbCq_stopModalActions button[data-danger]{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_stopModalActions button:disabled{cursor:wait;opacity:.58}.aYQbCq_stopModalError{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);color:var(--dsw-alias-state-error-primary);border-radius:8px;align-items:flex-start;gap:7px;margin:0;padding:9px 10px;font-size:12px;line-height:18px;display:flex}.aYQbCq_stopModalError svg{flex:none;margin-top:1px}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_taskDetailModel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;line-height:14px;overflow:hidden}.aYQbCq_memberModel{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-width:0;max-width:132px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:0 auto;align-items:center;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:15px;display:inline-flex;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_agentTeamsDot}@keyframes aYQbCq_agentTeamsDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-border-l3);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warn-primary)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-error-primary)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warn-primary)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=discarded]{background:var(--dsw-alias-button-ghost-active-fill)}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warn-primary)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary[data-state=discarded] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-label-tertiary)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-button-ghost-active-fill)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-border-l2));content:\"\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-border-l2));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-layer-1))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_agentTeamsUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_agentTeamsUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-state-business-primary);width:34px;height:34px;color:var(--dsw-alias-label-primary-inverted);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-layer-1)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-button-ghost-active-fill);max-width:100%;min-height:16px;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex;overflow:hidden}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-border-l3);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-layer-1))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 48%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 52%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 56%, var(--dsw-alias-border-l2))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-border-l3);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warn-primary)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-error-primary)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_planEditor{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, var(--dsw-alias-state-business-primary));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent);border-radius:10px;flex-direction:column;gap:12px;margin:0 10px 12px;padding:12px;display:flex}.aYQbCq_planHeader>span{justify-content:space-between;align-items:center;gap:8px;display:flex}.aYQbCq_planHeader>span>span{flex-direction:column;gap:2px;min-width:0;display:flex}.aYQbCq_planHeader strong{color:var(--dsw-alias-label-primary);font-size:12px}.aYQbCq_planHeader small{color:var(--dsw-alias-label-secondary);font-size:9px;font-weight:500;line-height:13px}.aYQbCq_planHeader em{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted);border-radius:999px;flex:none;padding:1px 7px;font-size:9px;font-style:normal;line-height:16px}.aYQbCq_planHeader p{color:var(--dsw-alias-label-secondary);margin:5px 0 0;font-size:10px;line-height:15px}.aYQbCq_planFlow{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;padding:0;list-style:none;display:grid}.aYQbCq_planFlow li{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:5px;font-size:9px;font-weight:600;line-height:14px;display:flex;position:relative}.aYQbCq_planFlow li:not(:last-child):after{background:var(--dsw-alias-border-l2);content:\"\";flex:1;min-width:8px;height:1px;margin-right:5px}.aYQbCq_planFlow li>span{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;place-items:center;width:18px;height:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;display:grid}.aYQbCq_planFlow li[data-active]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_planFlow li[data-active]>span{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent)}.aYQbCq_planSection{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:8px;overflow:hidden}.aYQbCq_planSectionToggle,.aYQbCq_planCardHeader{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0}.aYQbCq_planSectionToggle{justify-content:space-between;align-items:center;gap:8px;min-height:42px;padding:7px 9px;display:flex}.aYQbCq_planSectionToggle:hover,.aYQbCq_planCardHeader:hover{background:color-mix(in srgb, var(--dsw-alias-button-ghost-active-fill) 46%, transparent)}.aYQbCq_planSectionToggle>span{align-items:baseline;gap:7px;min-width:0;display:flex}.aYQbCq_planSectionToggle strong{font-size:10.5px}.aYQbCq_planSectionToggle small{color:var(--dsw-alias-label-tertiary);font-size:9px}.aYQbCq_planList{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:0;display:flex}.aYQbCq_planEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;padding:12px;font-size:10px}.aYQbCq_planCard{background:0 0;border:0;border-radius:0;min-width:0;margin:0;padding:0;display:block;position:relative}.aYQbCq_planCard+.aYQbCq_planCard{border-top:1px solid var(--dsw-alias-border-l2)}.aYQbCq_planCard[data-open=true]{background:color-mix(in srgb, var(--dsw-alias-bg-base) 62%, transparent)}.aYQbCq_planCardHeader{grid-template-columns:minmax(80px,.9fr) minmax(72px,1.15fr) auto 12px;align-items:center;gap:7px;min-height:40px;padding:6px 9px;display:grid}.aYQbCq_planCardIdentity{flex-direction:column;gap:1px;min-width:0;display:flex}.aYQbCq_planCardIdentity strong,.aYQbCq_planTaskSummary{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:650;line-height:14px;overflow:hidden}.aYQbCq_planCardIdentity>span,.aYQbCq_planCardMeta{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planTaskId{background:var(--dsw-alias-button-ghost-active-fill);width:max-content;color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8.5px;font-weight:700;line-height:14px}.aYQbCq_planDirty{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 13%, transparent);color:var(--dsw-alias-state-warn-primary);border-radius:999px;justify-self:end;padding:1px 5px;font-size:8px;font-style:normal;font-weight:650;line-height:14px}.aYQbCq_planChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.2,.7,.2,1)}.aYQbCq_planChevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_planCardBody{flex-direction:column;gap:8px;padding:0 9px 9px;display:flex}.aYQbCq_planCardBody fieldset{border:0;flex-direction:column;gap:7px;min-width:0;margin:0;padding:0;display:flex}.aYQbCq_planCardBody label,.aYQbCq_planNewTask label{min-width:0;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;gap:4px;font-size:9px;display:flex}.aYQbCq_planCardBody label small{color:var(--dsw-alias-label-tertiary);font-size:8px;line-height:11px}.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:6px;outline:none;font-size:10.5px;line-height:16px;transition:border-color .16s,box-shadow .16s}.aYQbCq_planCard input,.aYQbCq_planCard select,.aYQbCq_planNewTask input{min-height:32px;padding:6px 8px}.aYQbCq_planCard textarea{resize:vertical;min-height:58px;padding:7px 8px}.aYQbCq_planCard input:focus-visible,.aYQbCq_planCard textarea:focus-visible,.aYQbCq_planCard select:focus-visible,.aYQbCq_planNewTask input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent)}.aYQbCq_planGrid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px;display:grid}.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr);gap:5px;display:grid}.aYQbCq_planModelMenu{width:100%;display:flex}.aYQbCq_planModelTrigger{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:7px;justify-content:space-between;align-items:center;gap:8px;padding:7px 9px;transition:border-color .16s,background-color .16s,transform .12s;display:flex}.aYQbCq_planModelTrigger:hover:not(:disabled){border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.aYQbCq_planModelTrigger:active:not(:disabled){transform:translateY(1px)}.aYQbCq_planModelTrigger:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:2px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);outline-offset:1px}.aYQbCq_planModelTrigger:disabled{cursor:wait;opacity:.64}.aYQbCq_planModelTriggerCopy{align-items:baseline;gap:6px;min-width:0;display:flex}.aYQbCq_planModelTriggerCopy strong,.aYQbCq_planModelTriggerCopy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_planModelTriggerCopy strong{color:var(--dsw-alias-label-primary);font-size:10px;font-weight:650;line-height:15px}.aYQbCq_planModelTriggerCopy span{color:var(--dsw-alias-label-tertiary);font-size:9px;line-height:14px}.aYQbCq_planModelMenuRow{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;min-width:0;display:grid}.aYQbCq_planModelMenuRow>span:first-child{color:var(--dsw-alias-label-primary)}.aYQbCq_planModelMenuRow strong{color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-weight:450;overflow:hidden}.aYQbCq_planModelMenuBack{align-items:center;gap:7px;display:inline-flex}.aYQbCq_planModelMenuBack svg{transform:rotate(180deg)}.aYQbCq_planModelEffortRow{flex-direction:column;align-items:flex-start;min-width:0;display:flex}.aYQbCq_planModelEffortRow small{width:100%;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_planModelHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planModelNotice{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 9%, transparent);color:var(--dsw-alias-label-secondary);border-radius:6px;grid-column:1/-1;justify-content:space-between;align-items:center;gap:8px;padding:6px 7px;font-size:8.5px;line-height:12px;display:flex}.aYQbCq_planModelNotice button{color:var(--dsw-alias-state-business-primary);cursor:pointer;font:inherit;background:0 0;border:0;flex:none;padding:2px 6px;font-weight:650}.aYQbCq_planActions,.aYQbCq_planApproveRow,.aYQbCq_planNewTask,.aYQbCq_planConfirm,.aYQbCq_planApproveActions,.aYQbCq_planSecondaryActions{align-items:center;gap:7px;display:flex}.aYQbCq_planReviewActions{grid-template-columns:minmax(0,1fr);gap:6px;width:100%;display:grid}.aYQbCq_planSecondaryActions{grid-template-columns:minmax(0,1fr) auto;display:grid}.aYQbCq_planActions{justify-content:flex-end}.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;flex:none;padding:5px 10px;font-size:9.5px;font-weight:600;transition:background .16s,border-color .16s,transform .16s}.aYQbCq_planActions button:hover:not(:disabled),.aYQbCq_planNewTask button:hover:not(:disabled),.aYQbCq_planApproveRow button:hover:not(:disabled),.aYQbCq_planConfirm button:hover:not(:disabled){border-color:var(--dsw-alias-label-tertiary)}.aYQbCq_planActions button:active:not(:disabled),.aYQbCq_planNewTask button:active:not(:disabled),.aYQbCq_planApproveRow button:active:not(:disabled),.aYQbCq_planConfirm button:active:not(:disabled){transform:scale(.98)}.aYQbCq_planActions button[data-danger],.aYQbCq_planConfirm button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;align-items:center;gap:5px;font-size:9px;line-height:13px;animation:.18s ease-out aYQbCq_plan-feedback-in;display:inline-flex}.aYQbCq_planFeedback[data-tone=success]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_planFeedback[data-tone=error]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback>span{border:1px solid;border-radius:50%;flex:none;place-items:center;width:15px;height:15px;display:grid}.aYQbCq_planFeedback svg{width:11px;height:11px}@keyframes aYQbCq_plan-feedback-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.aYQbCq_planConfirm{border:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);border-radius:7px;flex-wrap:wrap;justify-content:flex-end;padding:7px}.aYQbCq_planConfirm>span{min-width:140px;color:var(--dsw-alias-label-secondary);flex:1;font-size:9px;line-height:13px}.aYQbCq_planNewTask{align-items:flex-end}.aYQbCq_planNewTask label{gap:4px}.aYQbCq_planNewTask label>span{line-height:13px}.aYQbCq_planApproveRow{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, transparent);min-height:50px;box-shadow:0 -5px 16px color-mix(in srgb, var(--dsw-alias-bg-base) 35%, transparent);backdrop-filter:blur(8px);border-radius:8px;flex-direction:column;justify-content:flex-end;align-items:stretch;margin:0 -4px -4px;padding:8px;position:sticky;bottom:0}.aYQbCq_planApproveRow[data-armed=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveRow[data-discard=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveCopy{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.aYQbCq_planApproveCopy strong{color:var(--dsw-alias-label-primary);font-size:9.5px;line-height:13px}.aYQbCq_planApproveCopy small{color:var(--dsw-alias-label-tertiary);font-size:8.5px;line-height:12px}.aYQbCq_planApproveRow button{background:var(--dsw-alias-state-business-primary);min-height:32px;color:var(--dsw-alias-label-primary-inverted);padding-inline:13px}.aYQbCq_planReviewActions>button[data-plan-approve]{width:100%}.aYQbCq_planApproveActions>button:first-child{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button,.aYQbCq_planApproveActions>button[data-danger]{border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button[data-danger],.aYQbCq_planApproveActions>button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planSectionToggle:focus-visible,.aYQbCq_planCardHeader:focus-visible,.aYQbCq_planActions button:focus-visible,.aYQbCq_planNewTask button:focus-visible,.aYQbCq_planApproveRow button:focus-visible,.aYQbCq_planConfirm button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.aYQbCq_planActions button:disabled,.aYQbCq_planNewTask button:disabled,.aYQbCq_planApproveRow button:disabled{cursor:default;opacity:.55}.aYQbCq_historicPill{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archiveLabel{color:var(--dsw-alias-label-tertiary);padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after,.aYQbCq_planChevron,.aYQbCq_planFeedback,.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button,.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{transition:none;animation:none}}@media (width<=960px){html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}.aYQbCq_planFlow li{gap:4px;font-size:8px}.aYQbCq_planFlow li:not(:last-child):after{margin-right:3px}.aYQbCq_planCardHeader{grid-template-columns:auto minmax(0,1fr) auto}.aYQbCq_planCardHeader .aYQbCq_planCardMeta{display:none}.aYQbCq_planGrid,.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr)}.aYQbCq_planNewTask,.aYQbCq_planApproveRow{flex-direction:column;align-items:stretch}.aYQbCq_planNewTask button,.aYQbCq_planApproveRow>button,.aYQbCq_planApproveActions,.aYQbCq_planReviewActions{width:100%}.aYQbCq_planApproveActions button,.aYQbCq_planReviewActions button,.aYQbCq_planSecondaryActions button{flex:1}}@container aYQbCq_agent-team (width<=360px){.aYQbCq_planEditor{margin-inline:0;padding-inline:10px}.aYQbCq_planHeader>span{align-items:flex-start}.aYQbCq_planFlow li{gap:3px;font-size:7.5px}.aYQbCq_planFlow li:not(:last-child):after{min-width:4px;margin-right:2px}.aYQbCq_planSecondaryActions,.aYQbCq_planApproveActions{grid-template-columns:minmax(0,1fr);width:100%;display:grid}.aYQbCq_planSecondaryActions button,.aYQbCq_planApproveActions button{width:100%}}.aYQbCq_dagOwner{text-overflow:ellipsis;max-width:64px;margin-left:auto;font-size:9px;font-weight:400;overflow:hidden}.aYQbCq_team[data-workspace-team]{background:0 0;border:0;padding:0;container:none}.aYQbCq_team[data-workspace-team] .aYQbCq_teamHead{flex-wrap:wrap;gap:8px;padding-bottom:18px}.aYQbCq_team[data-workspace-team] .aYQbCq_teamName{font-size:15px}.aYQbCq_team[data-workspace-team] .aYQbCq_teamStats{flex-wrap:wrap}.aYQbCq_team[data-workspace-team] .aYQbCq_delegationSection,.aYQbCq_team[data-workspace-team] .aYQbCq_dependencySection{min-width:0}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNodeLabel{white-space:normal;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.4;display:-webkit-box;overflow:hidden}.aYQbCq_team[data-workspace-team] .aYQbCq_sectionHead{flex-wrap:wrap;gap:6px}.aYQbCq_team[data-workspace-team] .aYQbCq_sectionHint{white-space:normal}.aYQbCq_team[data-workspace-team] .aYQbCq_memberLine{flex-wrap:wrap}.aYQbCq_team[data-workspace-team] .aYQbCq_memberStatusLine,.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailSubject{white-space:normal}.aYQbCq_team[data-workspace-team] .aYQbCq_dagViewport{padding-bottom:12px}@container (width>=1000px){.aYQbCq_team[data-workspace-team]{grid-template-columns:minmax(260px,.85fr) minmax(0,1.35fr);align-items:start;column-gap:32px;display:grid}.aYQbCq_team[data-workspace-team]>.aYQbCq_teamHead,.aYQbCq_team[data-workspace-team]>:not(.aYQbCq_teamHead):not(.aYQbCq_delegationSection):not(.aYQbCq_dependencySection){grid-column:1/-1}.aYQbCq_team[data-workspace-team] .aYQbCq_dependencySection{border-top:0;border-left:1px solid var(--dsw-alias-border-l2);margin:0;padding:0 0 0 28px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainNode{padding-top:0}.aYQbCq_team[data-workspace-team] .aYQbCq_dagCanvas[data-layout=parallel]{grid-template-columns:repeat(2,minmax(0,1fr))}}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNode{border-radius:9px;padding:10px 11px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNodeHead{margin-bottom:7px;font-size:10px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNodeLabel{letter-spacing:0;font-size:12px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagOwner{font-size:10px}.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetail{margin-top:14px;padding:14px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainName{font-size:14px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainRole{font-size:11px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainSummary{font-size:12px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_captainState{font-size:11px}.aYQbCq_team[data-workspace-team] .aYQbCq_memberName{font-size:13px}.aYQbCq_team[data-workspace-team] .aYQbCq_memberRole,.aYQbCq_team[data-workspace-team] .aYQbCq_memberState,.aYQbCq_team[data-workspace-team] .aYQbCq_memberCount{font-size:11px}.aYQbCq_team[data-workspace-team] .aYQbCq_memberStatusLine{font-size:12px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailSubject{font-size:13px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailLine,.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailMeta{font-size:12px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_captainNode{background:var(--dsw-alias-bg-module-platform);border-color:var(--dsw-alias-border-l2)}.aYQbCq_team[data-workspace-team] .aYQbCq_planEditor{border-color:var(--dsw-alias-border-l2);background:0 0;margin:0 0 24px;padding:16px}@container (width>=1000px){.aYQbCq_team[data-workspace-team]:has(>[data-staging-editor]){grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.aYQbCq_team[data-workspace-team]>[data-staging-editor]{grid-row:2/4;grid-column:1!important}.aYQbCq_team[data-workspace-team]:has(>[data-staging-editor])>.aYQbCq_delegationSection{grid-area:2/2}.aYQbCq_team[data-workspace-team]:has(>[data-staging-editor])>.aYQbCq_dependencySection{border-left:0;grid-area:3/2;padding:24px 0 0}}.aYQbCq_team[data-workspace-team] .aYQbCq_memberBlock[data-selected-member] .aYQbCq_memberRow{outline:1px solid var(--dsw-alias-state-business-primary);outline-offset:3px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagOwner{white-space:nowrap;max-width:105px}.aYQbCq_team[data-workspace-team] .aYQbCq_planApproveRow{position:static}";
|
|
781
|
+
const tagId$1 = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
|
|
782
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
566
783
|
const tag = document.createElement("style");
|
|
567
784
|
tag.dataset.plugin = "@nanmicoder/dsh-agent-teams";
|
|
568
|
-
tag.dataset.pluginCss = tagId;
|
|
569
|
-
tag.textContent = css;
|
|
785
|
+
tag.dataset.pluginCss = tagId$1;
|
|
786
|
+
tag.textContent = css$1;
|
|
570
787
|
document.head.appendChild(tag);
|
|
571
788
|
}
|
|
572
789
|
var ActivityPanel_module_css_default = {
|
|
@@ -601,6 +818,7 @@ window.__ModuleLoader__.load({
|
|
|
601
818
|
"dagNodeDot": "aYQbCq_dagNodeDot",
|
|
602
819
|
"dagNodeHead": "aYQbCq_dagNodeHead",
|
|
603
820
|
"dagNodeLabel": "aYQbCq_dagNodeLabel",
|
|
821
|
+
"dagOwner": "aYQbCq_dagOwner",
|
|
604
822
|
"dagRunningState": "aYQbCq_dagRunningState",
|
|
605
823
|
"dagViewport": "aYQbCq_dagViewport",
|
|
606
824
|
"delegationSection": "aYQbCq_delegationSection",
|
|
@@ -2074,6 +2292,8 @@ window.__ModuleLoader__.load({
|
|
|
2074
2292
|
}
|
|
2075
2293
|
if (member.total === 0) return t("member.status.waitingAssignment");
|
|
2076
2294
|
if (member.done === member.total) return t("member.status.delivered");
|
|
2295
|
+
if (owned.some((task) => task.status === "failed")) return t("task.detail.failed");
|
|
2296
|
+
if (owned.length > 0 && owned.every((task) => task.status === "completed" || task.status === "cancelled")) return t("member.status.settled");
|
|
2077
2297
|
return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");
|
|
2078
2298
|
}
|
|
2079
2299
|
function compactTaskLabel(subject) {
|
|
@@ -2112,7 +2332,7 @@ window.__ModuleLoader__.load({
|
|
|
2112
2332
|
const blocked = discarded ? 0 : team.tasks.filter((task) => task.state === "blocked").length;
|
|
2113
2333
|
const completed = discarded ? 0 : team.tasks.filter((task) => task.status === "completed").length;
|
|
2114
2334
|
const settled = !discarded && team.tasks.length > 0 && team.tasks.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled");
|
|
2115
|
-
const summaryTone = discarded ? "discarded" : blocked > 0 ? "warning" : settled ? "completed" : "running";
|
|
2335
|
+
const summaryTone = discarded ? "discarded" : blocked > 0 || team.tasks.some((task) => task.status === "failed" || task.status === "cancelled") ? "warning" : settled ? "completed" : "running";
|
|
2116
2336
|
return (0, react_jsx_runtime.jsxs)("section", {
|
|
2117
2337
|
className: ActivityPanel_module_css_default.progressOverview,
|
|
2118
2338
|
"aria-label": t("progress.aria"),
|
|
@@ -2152,14 +2372,21 @@ window.__ModuleLoader__.load({
|
|
|
2152
2372
|
]
|
|
2153
2373
|
});
|
|
2154
2374
|
}
|
|
2155
|
-
function DependencyMap({ tasks, members, t, discarded = false }) {
|
|
2375
|
+
function DependencyMap({ tasks, members, t, discarded = false, workspace = false, onSelectTask }) {
|
|
2156
2376
|
const [open, setOpen] = (0, react.useState)(true);
|
|
2157
2377
|
const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
|
|
2158
2378
|
const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
|
|
2159
2379
|
const [pinnedTaskId, setPinnedTaskId] = (0, react.useState)(null);
|
|
2160
2380
|
const hoverTimer = (0, react.useRef)(null);
|
|
2161
2381
|
const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);
|
|
2162
|
-
const
|
|
2382
|
+
const nodeWidth = workspace ? 164 : 92;
|
|
2383
|
+
const nodeHeight = workspace ? 76 : 30;
|
|
2384
|
+
const layout = (0, react.useMemo)(() => compactDagLayout(tasks, workspace ? {
|
|
2385
|
+
nodeWidth: 164,
|
|
2386
|
+
nodeHeight: 76,
|
|
2387
|
+
columnGap: 36,
|
|
2388
|
+
rowGap: 16
|
|
2389
|
+
} : void 0), [tasks, workspace]);
|
|
2163
2390
|
const parallel = (0, react.useMemo)(() => usesParallelTaskGrid(tasks), [tasks]);
|
|
2164
2391
|
const related = (0, react.useMemo)(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);
|
|
2165
2392
|
const scheduleHover = (id) => {
|
|
@@ -2181,13 +2408,16 @@ window.__ModuleLoader__.load({
|
|
|
2181
2408
|
}, []);
|
|
2182
2409
|
(0, react.useEffect)(() => {
|
|
2183
2410
|
const onKeyDown = (event) => {
|
|
2184
|
-
if (event.key === "Escape")
|
|
2411
|
+
if (event.key === "Escape") {
|
|
2412
|
+
setPinnedTaskId(null);
|
|
2413
|
+
onSelectTask?.(null);
|
|
2414
|
+
}
|
|
2185
2415
|
};
|
|
2186
2416
|
window.addEventListener("keydown", onKeyDown);
|
|
2187
2417
|
return () => {
|
|
2188
2418
|
window.removeEventListener("keydown", onKeyDown);
|
|
2189
2419
|
};
|
|
2190
|
-
}, []);
|
|
2420
|
+
}, [onSelectTask]);
|
|
2191
2421
|
if (tasks.length === 0) return null;
|
|
2192
2422
|
const fallbackTask = tasks.find((task) => task.state === "blocked") ?? tasks.find((task) => task.state === "running") ?? tasks[0];
|
|
2193
2423
|
const detailTask = tasks.find((task) => task.id === focusedTaskId) ?? fallbackTask;
|
|
@@ -2209,13 +2439,13 @@ window.__ModuleLoader__.load({
|
|
|
2209
2439
|
"aria-expanded": open,
|
|
2210
2440
|
children: [
|
|
2211
2441
|
(0, react_jsx_runtime.jsx)(Chevron, { open }),
|
|
2212
|
-
(0, react_jsx_runtime.jsx)(
|
|
2442
|
+
(0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
2213
2443
|
" ",
|
|
2214
2444
|
t(parallel ? "dependency.parallel" : "dependency.title")
|
|
2215
2445
|
]
|
|
2216
2446
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
2217
2447
|
className: ActivityPanel_module_css_default.sectionHint,
|
|
2218
|
-
children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
|
|
2448
|
+
children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : workspace ? "workspace.dependencies" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
|
|
2219
2449
|
})]
|
|
2220
2450
|
}), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
|
|
2221
2451
|
className: ActivityPanel_module_css_default.dagViewport,
|
|
@@ -2241,15 +2471,14 @@ window.__ModuleLoader__.load({
|
|
|
2241
2471
|
})
|
|
2242
2472
|
}), layout.nodes.map(({ task, x, y }) => {
|
|
2243
2473
|
const model = taskModelLabel(task, members);
|
|
2244
|
-
const shortModel = compactModelLabel(model);
|
|
2245
2474
|
return (0, react_jsx_runtime.jsxs)("button", {
|
|
2246
2475
|
type: "button",
|
|
2247
2476
|
className: ActivityPanel_module_css_default.dagNode,
|
|
2248
|
-
style: parallel ? { height:
|
|
2477
|
+
style: parallel ? { height: nodeHeight } : {
|
|
2249
2478
|
left: x,
|
|
2250
2479
|
top: y,
|
|
2251
|
-
width:
|
|
2252
|
-
height:
|
|
2480
|
+
width: nodeWidth,
|
|
2481
|
+
height: nodeHeight
|
|
2253
2482
|
},
|
|
2254
2483
|
"data-task-id": task.id,
|
|
2255
2484
|
"data-state": discarded ? "cancelled" : taskTone(task.state, task.status),
|
|
@@ -2259,7 +2488,9 @@ window.__ModuleLoader__.load({
|
|
|
2259
2488
|
"aria-pressed": pinnedTaskId === task.id,
|
|
2260
2489
|
title: taskTitle(task, model),
|
|
2261
2490
|
onClick: () => {
|
|
2262
|
-
|
|
2491
|
+
const next = pinnedTaskId === task.id ? null : task.id;
|
|
2492
|
+
setPinnedTaskId(next);
|
|
2493
|
+
onSelectTask?.(next);
|
|
2263
2494
|
},
|
|
2264
2495
|
onMouseEnter: () => {
|
|
2265
2496
|
scheduleHover(task.id);
|
|
@@ -2276,11 +2507,18 @@ window.__ModuleLoader__.load({
|
|
|
2276
2507
|
children: [
|
|
2277
2508
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
2278
2509
|
className: ActivityPanel_module_css_default.dagNodeHead,
|
|
2279
|
-
children: [
|
|
2510
|
+
children: [
|
|
2511
|
+
(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.dagNodeDot }),
|
|
2512
|
+
task.id,
|
|
2513
|
+
workspace && (0, react_jsx_runtime.jsx)("span", {
|
|
2514
|
+
className: ActivityPanel_module_css_default.dagOwner,
|
|
2515
|
+
children: task.assignee || t("task.assignee.unclaimed")
|
|
2516
|
+
})
|
|
2517
|
+
]
|
|
2280
2518
|
}),
|
|
2281
2519
|
(0, react_jsx_runtime.jsx)("span", {
|
|
2282
2520
|
className: ActivityPanel_module_css_default.dagNodeLabel,
|
|
2283
|
-
children:
|
|
2521
|
+
children: workspace ? task.subject : compactTaskLabel(task.subject)
|
|
2284
2522
|
}),
|
|
2285
2523
|
task.state === "running" && (0, react_jsx_runtime.jsx)("span", {
|
|
2286
2524
|
className: ActivityPanel_module_css_default.dagRunningState,
|
|
@@ -2319,7 +2557,7 @@ window.__ModuleLoader__.load({
|
|
|
2319
2557
|
children: [
|
|
2320
2558
|
detailTask.assignee || t("task.assignee.unclaimed"),
|
|
2321
2559
|
" · ",
|
|
2322
|
-
discarded ? t("task.detail.notRun") : detailTask.status === "completed" ? t("task.detail.completed") : detailTask.dependencies.length === 0 ? t("task.detail.noPrerequisite") : waitingOn.length === 0 ? t("task.detail.ready") : t("task.detail.waitingOn", { tasks: formatTaskIds(waitingOn, t) })
|
|
2560
|
+
discarded ? t("task.detail.notRun") : detailTask.status === "completed" ? t("task.detail.completed") : detailTask.status === "cancelled" ? t("task.detail.cancelled") : detailTask.status === "failed" ? t("task.detail.failed") : detailTask.dependencies.length === 0 ? t("task.detail.noPrerequisite") : waitingOn.length === 0 ? t("task.detail.ready") : t("task.detail.waitingOn", { tasks: formatTaskIds(waitingOn, t) })
|
|
2323
2561
|
]
|
|
2324
2562
|
}),
|
|
2325
2563
|
detailModel !== "" && (0, react_jsx_runtime.jsx)("span", {
|
|
@@ -2335,8 +2573,10 @@ window.__ModuleLoader__.load({
|
|
|
2335
2573
|
})] })]
|
|
2336
2574
|
});
|
|
2337
2575
|
}
|
|
2338
|
-
function TeamSection({ team, modelDirectory, onContinuePlanning, onDiscarded, onNavigate, t, historic = false }) {
|
|
2339
|
-
const [
|
|
2576
|
+
function TeamSection({ team, modelDirectory, onContinuePlanning, onDiscarded, onNavigate, t, historic = false, workspace = false }) {
|
|
2577
|
+
const [selectedTaskId, setSelectedTaskId] = (0, react.useState)(null);
|
|
2578
|
+
const selectedAssignee = team.tasks.find((task) => task.id === selectedTaskId)?.assignee;
|
|
2579
|
+
const [membersOpen, setMembersOpen] = (0, react.useState)(workspace);
|
|
2340
2580
|
const [stopOpen, setStopOpen] = (0, react.useState)(false);
|
|
2341
2581
|
const [stopping, setStopping] = (0, react.useState)(false);
|
|
2342
2582
|
const [stopError, setStopError] = (0, react.useState)("");
|
|
@@ -2384,6 +2624,7 @@ window.__ModuleLoader__.load({
|
|
|
2384
2624
|
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("section", {
|
|
2385
2625
|
className: ActivityPanel_module_css_default.team,
|
|
2386
2626
|
"data-team-id": team.teamId,
|
|
2627
|
+
"data-workspace-team": workspace || void 0,
|
|
2387
2628
|
children: [
|
|
2388
2629
|
(0, react_jsx_runtime.jsxs)("header", {
|
|
2389
2630
|
className: ActivityPanel_module_css_default.teamHead,
|
|
@@ -2430,7 +2671,7 @@ window.__ModuleLoader__.load({
|
|
|
2430
2671
|
setStopError("");
|
|
2431
2672
|
setStopOpen(true);
|
|
2432
2673
|
},
|
|
2433
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
2674
|
+
children: (0, react_jsx_runtime.jsx)(IconStopFill16, {})
|
|
2434
2675
|
})
|
|
2435
2676
|
]
|
|
2436
2677
|
}),
|
|
@@ -2498,137 +2739,146 @@ window.__ModuleLoader__.load({
|
|
|
2498
2739
|
t,
|
|
2499
2740
|
discarded
|
|
2500
2741
|
}),
|
|
2501
|
-
(
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
}
|
|
2507
|
-
"
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
children: t("members.
|
|
2516
|
-
}),
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2742
|
+
(() => {
|
|
2743
|
+
const orderedMembers = orderDelegationMembers(team.members, team.tasks);
|
|
2744
|
+
const runningMembers = orderedMembers.filter((member) => member.activity === "working" || member.status === "working" || team.tasks.some((task) => task.assignee === member.name && (task.status === "pending" || task.status === "claimed" || task.status === "in_progress")));
|
|
2745
|
+
const visibleMembers = membersOpen ? orderedMembers : runningMembers;
|
|
2746
|
+
const hiddenFinishedCount = orderedMembers.length - visibleMembers.length;
|
|
2747
|
+
const expandLabel = membersOpen ? t("members.collapse") : hiddenFinishedCount > 0 ? t("members.expandFinished", { count: hiddenFinishedCount }) : t("members.expand");
|
|
2748
|
+
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("button", {
|
|
2749
|
+
type: "button",
|
|
2750
|
+
className: ActivityPanel_module_css_default.membersToggle,
|
|
2751
|
+
onClick: () => {
|
|
2752
|
+
setMembersOpen((current) => !current);
|
|
2753
|
+
},
|
|
2754
|
+
"aria-expanded": membersOpen,
|
|
2755
|
+
"data-members-toggle": true,
|
|
2756
|
+
children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }), t("members.toggle", { count: team.members.length })] }), (0, react_jsx_runtime.jsx)("span", { children: expandLabel })]
|
|
2757
|
+
}), (membersOpen || visibleMembers.length > 0) && (0, react_jsx_runtime.jsxs)("div", {
|
|
2758
|
+
className: ActivityPanel_module_css_default.delegationTree,
|
|
2759
|
+
children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
|
|
2760
|
+
className: ActivityPanel_module_css_default.emptyHint,
|
|
2761
|
+
children: t("members.empty")
|
|
2762
|
+
}), visibleMembers.map((member) => {
|
|
2763
|
+
const owned = team.tasks.filter((task) => task.assignee === member.name);
|
|
2764
|
+
const memberModel = memberRouteLabel(member);
|
|
2765
|
+
return (0, react_jsx_runtime.jsxs)("div", {
|
|
2766
|
+
className: ActivityPanel_module_css_default.memberBlock,
|
|
2767
|
+
"data-activity": member.activity,
|
|
2768
|
+
"data-selected-member": workspace && selectedAssignee === member.name || void 0,
|
|
2769
|
+
children: [
|
|
2770
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
2771
|
+
className: ActivityPanel_module_css_default.memberBranch,
|
|
2772
|
+
"aria-hidden": true,
|
|
2773
|
+
children: (0, react_jsx_runtime.jsx)("span", {})
|
|
2774
|
+
}),
|
|
2775
|
+
(0, react_jsx_runtime.jsxs)("button", {
|
|
2776
|
+
type: "button",
|
|
2777
|
+
className: ActivityPanel_module_css_default.memberRow,
|
|
2778
|
+
"data-activity": member.activity,
|
|
2779
|
+
onClick: () => {
|
|
2780
|
+
if (member.id !== "") onNavigate(team.captainSessionId, member.id);
|
|
2781
|
+
},
|
|
2782
|
+
children: [
|
|
2783
|
+
(0, react_jsx_runtime.jsxs)("span", {
|
|
2784
|
+
className: ActivityPanel_module_css_default.memberAvatar,
|
|
2785
|
+
"data-unread": member.unread > 0,
|
|
2786
|
+
children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
|
|
2787
|
+
className: ActivityPanel_module_css_default.memberArt,
|
|
2788
|
+
src: memberArtUrl(member.name, member.role) ?? "",
|
|
2789
|
+
alt: "",
|
|
2790
|
+
"aria-hidden": true
|
|
2791
|
+
}) : (0, react_jsx_runtime.jsx)("span", {
|
|
2792
|
+
className: ActivityPanel_module_css_default.memberInitial,
|
|
2793
|
+
style: { background: accentOf(member.id) },
|
|
2794
|
+
children: memberInitial(member.name)
|
|
2795
|
+
}), (0, react_jsx_runtime.jsx)("img", {
|
|
2796
|
+
className: ActivityPanel_module_css_default.stateArt,
|
|
2797
|
+
"data-activity": member.activity,
|
|
2798
|
+
src: ACTION_ART[member.activity],
|
|
2799
|
+
alt: "",
|
|
2800
|
+
"aria-hidden": true
|
|
2801
|
+
})]
|
|
2802
|
+
}),
|
|
2803
|
+
(0, react_jsx_runtime.jsxs)("span", {
|
|
2804
|
+
className: ActivityPanel_module_css_default.memberInfo,
|
|
2805
|
+
children: [(0, react_jsx_runtime.jsxs)("span", {
|
|
2806
|
+
className: ActivityPanel_module_css_default.memberLine,
|
|
2807
|
+
children: [
|
|
2808
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
2809
|
+
className: ActivityPanel_module_css_default.memberName,
|
|
2810
|
+
children: member.name
|
|
2811
|
+
}),
|
|
2812
|
+
member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
|
|
2813
|
+
className: ActivityPanel_module_css_default.memberRole,
|
|
2814
|
+
children: member.role
|
|
2815
|
+
}),
|
|
2816
|
+
memberModel !== "" && (0, react_jsx_runtime.jsx)("span", {
|
|
2817
|
+
className: ActivityPanel_module_css_default.memberModel,
|
|
2818
|
+
role: "img",
|
|
2819
|
+
"data-member-model": memberModel,
|
|
2820
|
+
title: memberModel,
|
|
2821
|
+
"aria-label": memberModel,
|
|
2822
|
+
children: compactModelLabel(memberModel)
|
|
2823
|
+
}),
|
|
2824
|
+
(0, react_jsx_runtime.jsxs)("span", {
|
|
2825
|
+
className: ActivityPanel_module_css_default.memberState,
|
|
2826
|
+
"data-activity": member.activity,
|
|
2827
|
+
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), discarded ? t("member.state.notCreated") : stopped ? t("member.state.stopped") : team.phase === "staged" ? t("member.state.staged") : memberStateLabel(member, team.tasks, historic, t)]
|
|
2828
|
+
})
|
|
2829
|
+
]
|
|
2830
|
+
}), (0, react_jsx_runtime.jsx)("span", {
|
|
2831
|
+
className: ActivityPanel_module_css_default.memberStatusLine,
|
|
2832
|
+
children: discarded ? t("member.status.discarded") : stopped ? t("member.status.stopped") : team.phase === "staged" ? t("member.status.staged") : historic && owned.length > 0 && owned.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled") ? t("member.status.settled") : memberStatusText(member, team.tasks, t)
|
|
2833
|
+
})]
|
|
2834
|
+
}),
|
|
2835
|
+
(0, react_jsx_runtime.jsxs)("span", {
|
|
2836
|
+
className: ActivityPanel_module_css_default.memberCount,
|
|
2560
2837
|
children: [
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
}),
|
|
2565
|
-
member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
|
|
2566
|
-
className: ActivityPanel_module_css_default.memberRole,
|
|
2567
|
-
children: member.role
|
|
2568
|
-
}),
|
|
2569
|
-
memberModel !== "" && (0, react_jsx_runtime.jsx)("span", {
|
|
2570
|
-
className: ActivityPanel_module_css_default.memberModel,
|
|
2571
|
-
role: "img",
|
|
2572
|
-
"data-member-model": memberModel,
|
|
2573
|
-
title: memberModel,
|
|
2574
|
-
"aria-label": memberModel,
|
|
2575
|
-
children: compactModelLabel(memberModel)
|
|
2576
|
-
}),
|
|
2577
|
-
(0, react_jsx_runtime.jsxs)("span", {
|
|
2578
|
-
className: ActivityPanel_module_css_default.memberState,
|
|
2579
|
-
"data-activity": member.activity,
|
|
2580
|
-
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), discarded ? t("member.state.notCreated") : stopped ? t("member.state.stopped") : team.phase === "staged" ? t("member.state.staged") : memberStateLabel(member, team.tasks, historic, t)]
|
|
2581
|
-
})
|
|
2838
|
+
member.done,
|
|
2839
|
+
"/",
|
|
2840
|
+
member.total
|
|
2582
2841
|
]
|
|
2583
|
-
})
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
(0, react_jsx_runtime.
|
|
2589
|
-
className: ActivityPanel_module_css_default.
|
|
2590
|
-
children:
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
"data-task-model": model || void 0,
|
|
2615
|
-
title: taskTitle(task, model),
|
|
2616
|
-
children: task.state === "running" && shortModel !== "" ? `${task.id} · ${shortModel}` : task.id
|
|
2617
|
-
}, task.id);
|
|
2618
|
-
})
|
|
2619
|
-
})]
|
|
2620
|
-
})
|
|
2621
|
-
]
|
|
2622
|
-
}, member.id || member.name);
|
|
2623
|
-
})]
|
|
2624
|
-
})
|
|
2842
|
+
})
|
|
2843
|
+
]
|
|
2844
|
+
}),
|
|
2845
|
+
(0, react_jsx_runtime.jsxs)("div", {
|
|
2846
|
+
className: ActivityPanel_module_css_default.assignmentLine,
|
|
2847
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
2848
|
+
className: ActivityPanel_module_css_default.assignmentLabel,
|
|
2849
|
+
children: t(discarded ? "assignment.discarded" : team.phase === "staged" ? "assignment.staged" : "assignment.label")
|
|
2850
|
+
}), (0, react_jsx_runtime.jsx)("span", {
|
|
2851
|
+
className: ActivityPanel_module_css_default.assignmentTasks,
|
|
2852
|
+
children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
2853
|
+
className: ActivityPanel_module_css_default.taskEmpty,
|
|
2854
|
+
children: t("assignment.empty")
|
|
2855
|
+
}) : owned.map((task) => {
|
|
2856
|
+
const model = taskModelLabel(task, team.members);
|
|
2857
|
+
const shortModel = compactModelLabel(model);
|
|
2858
|
+
return (0, react_jsx_runtime.jsx)("span", {
|
|
2859
|
+
className: ActivityPanel_module_css_default.assignmentChip,
|
|
2860
|
+
"data-state": discarded ? "cancelled" : taskTone(task.state, task.status),
|
|
2861
|
+
"data-task-model": model || void 0,
|
|
2862
|
+
title: taskTitle(task, model),
|
|
2863
|
+
children: task.state === "running" && shortModel !== "" ? `${task.id} · ${shortModel}` : task.id
|
|
2864
|
+
}, task.id);
|
|
2865
|
+
})
|
|
2866
|
+
})]
|
|
2867
|
+
})
|
|
2868
|
+
]
|
|
2869
|
+
}, member.id || member.name);
|
|
2870
|
+
})]
|
|
2871
|
+
})] });
|
|
2872
|
+
})()
|
|
2625
2873
|
]
|
|
2626
2874
|
}),
|
|
2627
2875
|
(0, react_jsx_runtime.jsx)(DependencyMap, {
|
|
2628
2876
|
tasks: team.tasks,
|
|
2629
2877
|
members: team.members,
|
|
2630
2878
|
t,
|
|
2631
|
-
discarded
|
|
2879
|
+
discarded,
|
|
2880
|
+
workspace,
|
|
2881
|
+
onSelectTask: setSelectedTaskId
|
|
2632
2882
|
})
|
|
2633
2883
|
]
|
|
2634
2884
|
}), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
|
|
@@ -2658,13 +2908,13 @@ window.__ModuleLoader__.load({
|
|
|
2658
2908
|
onClick: () => {
|
|
2659
2909
|
stopTeam();
|
|
2660
2910
|
},
|
|
2661
|
-
children: [(0, react_jsx_runtime.jsx)(
|
|
2911
|
+
children: [(0, react_jsx_runtime.jsx)(IconStopFill16, {}), stopping ? t("team.stopping") : t("team.stopConfirm")]
|
|
2662
2912
|
})]
|
|
2663
2913
|
}),
|
|
2664
2914
|
children: stopError !== "" && (0, react_jsx_runtime.jsxs)("p", {
|
|
2665
2915
|
className: ActivityPanel_module_css_default.stopModalError,
|
|
2666
2916
|
role: "alert",
|
|
2667
|
-
children: [(0, react_jsx_runtime.jsx)(
|
|
2917
|
+
children: [(0, react_jsx_runtime.jsx)(IconWarningOutline16, {}), stopError]
|
|
2668
2918
|
})
|
|
2669
2919
|
})] });
|
|
2670
2920
|
}
|
|
@@ -2711,7 +2961,7 @@ window.__ModuleLoader__.load({
|
|
|
2711
2961
|
const gestureRef = (0, react.useRef)(null);
|
|
2712
2962
|
const frameRef = (0, react.useRef)(null);
|
|
2713
2963
|
const pendingLayoutRef = (0, react.useRef)(null);
|
|
2714
|
-
const current = (0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot)
|
|
2964
|
+
const current = currentSessionId((0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot));
|
|
2715
2965
|
const autoOpenTrackerRef = (0, react.useRef)({
|
|
2716
2966
|
sessionId: current,
|
|
2717
2967
|
restoreComplete: false,
|
|
@@ -3052,7 +3302,7 @@ window.__ModuleLoader__.load({
|
|
|
3052
3302
|
onClick: toggleDock,
|
|
3053
3303
|
"aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
|
|
3054
3304
|
title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
|
|
3055
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
3305
|
+
children: (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, {})
|
|
3056
3306
|
}), (0, react_jsx_runtime.jsx)("button", {
|
|
3057
3307
|
type: "button",
|
|
3058
3308
|
className: ActivityPanel_module_css_default.iconButton,
|
|
@@ -3063,7 +3313,7 @@ window.__ModuleLoader__.load({
|
|
|
3063
3313
|
},
|
|
3064
3314
|
"aria-label": t("activity.collapse"),
|
|
3065
3315
|
title: t("activity.collapse"),
|
|
3066
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
3316
|
+
children: (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, {})
|
|
3067
3317
|
})]
|
|
3068
3318
|
})]
|
|
3069
3319
|
}),
|
|
@@ -3142,6 +3392,271 @@ window.__ModuleLoader__.load({
|
|
|
3142
3392
|
})] });
|
|
3143
3393
|
}
|
|
3144
3394
|
//#endregion
|
|
3395
|
+
//#region lib/client/workspace-state.js
|
|
3396
|
+
function createWorkspaceState() {
|
|
3397
|
+
let snapshot = {
|
|
3398
|
+
statuses: /* @__PURE__ */ new Map(),
|
|
3399
|
+
history: /* @__PURE__ */ new Map(),
|
|
3400
|
+
selected: /* @__PURE__ */ new Map()
|
|
3401
|
+
};
|
|
3402
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
3403
|
+
const publish = (next) => {
|
|
3404
|
+
snapshot = next;
|
|
3405
|
+
for (const listener of listeners) listener();
|
|
3406
|
+
};
|
|
3407
|
+
return {
|
|
3408
|
+
getSnapshot: () => snapshot,
|
|
3409
|
+
subscribe: (listener) => {
|
|
3410
|
+
listeners.add(listener);
|
|
3411
|
+
return () => {
|
|
3412
|
+
listeners.delete(listener);
|
|
3413
|
+
};
|
|
3414
|
+
},
|
|
3415
|
+
status(session, status) {
|
|
3416
|
+
if (snapshot.statuses.get(session) === status) return;
|
|
3417
|
+
publish({
|
|
3418
|
+
...snapshot,
|
|
3419
|
+
statuses: new Map(snapshot.statuses).set(session, status)
|
|
3420
|
+
});
|
|
3421
|
+
},
|
|
3422
|
+
select(session, team) {
|
|
3423
|
+
if (snapshot.selected.get(session) === team) return;
|
|
3424
|
+
publish({
|
|
3425
|
+
...snapshot,
|
|
3426
|
+
selected: new Map(snapshot.selected).set(session, team)
|
|
3427
|
+
});
|
|
3428
|
+
},
|
|
3429
|
+
remember(session, data) {
|
|
3430
|
+
const owner = data.captainSessionId || session;
|
|
3431
|
+
if (owner !== session) return;
|
|
3432
|
+
publish({
|
|
3433
|
+
...snapshot,
|
|
3434
|
+
history: new Map(snapshot.history).set(`${owner}:${data.teamId}`, {
|
|
3435
|
+
...data,
|
|
3436
|
+
captainSessionId: owner
|
|
3437
|
+
}),
|
|
3438
|
+
selected: new Map(snapshot.selected).set(owner, data.teamId)
|
|
3439
|
+
});
|
|
3440
|
+
}
|
|
3441
|
+
};
|
|
3442
|
+
}
|
|
3443
|
+
/** Records restored at mount never reopen a closed tab; new teams are announced once. */
|
|
3444
|
+
function createTeamDiscovery() {
|
|
3445
|
+
let restored = false;
|
|
3446
|
+
let known = /* @__PURE__ */ new Set();
|
|
3447
|
+
return (teams) => {
|
|
3448
|
+
const added = restored ? teams.find((team) => !known.has(team.teamId))?.teamId : void 0;
|
|
3449
|
+
known = new Set(teams.map((team) => team.teamId));
|
|
3450
|
+
restored = true;
|
|
3451
|
+
return added;
|
|
3452
|
+
};
|
|
3453
|
+
}
|
|
3454
|
+
//#endregion
|
|
3455
|
+
//#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/WorkspaceActivity.module.css.mjs
|
|
3456
|
+
const css = ".eDfHrq_root{height:100%;min-height:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);font-family:inherit;overflow:auto;container:eDfHrq_team-workspace/inline-size}.eDfHrq_content{max-width:1400px;margin:0 auto;padding:12px 20px 28px}.eDfHrq_selector{flex-wrap:wrap;gap:6px;margin-bottom:24px;display:flex}.eDfHrq_selector button{border:1px solid var(--dsw-alias-border-l2);text-align:left;overflow-wrap:anywhere;border-radius:8px;align-items:center;gap:12px;max-width:100%;padding:8px 10px;display:flex}.eDfHrq_selector span{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.eDfHrq_selector button[aria-pressed=true]{background:var(--dsw-alias-bg-module-platform);border-color:var(--dsw-alias-label-tertiary)}.eDfHrq_root button{color:inherit;cursor:pointer;font-family:inherit}.eDfHrq_root button:active{transform:scale(.98)}.eDfHrq_root button:focus-visible{outline:2px solid var(--dsw-alias-label-secondary);outline-offset:3px}.eDfHrq_empty{max-width:42ch;padding:36px 0}.eDfHrq_emptyMark{color:var(--dsw-alias-label-tertiary);font-size:32px}.eDfHrq_empty h3{margin:16px 0 10px;font-size:16px;font-weight:550}.eDfHrq_empty p{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.8}.eDfHrq_empty button,.eDfHrq_error button{background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;font-size:12px}.eDfHrq_error{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;align-items:start;gap:12px;margin-bottom:20px;padding:12px;font-size:12px;line-height:1.65;display:flex}.eDfHrq_error button{flex:none}.eDfHrq_skeleton{gap:16px;padding-top:20px;display:grid}.eDfHrq_skeleton i{background:var(--dsw-alias-bg-module-platform);border-radius:8px;height:66px;animation:1.8s ease-in-out infinite alternate eDfHrq_breathe}.eDfHrq_skeleton i:first-child{width:70%;height:36px}.eDfHrq_skeleton i:last-child{animation-delay:.3s}@keyframes eDfHrq_breathe{to{opacity:.45}}@container (width>=720px){.eDfHrq_content{padding:20px 28px 32px}}@media (prefers-reduced-motion:reduce){.eDfHrq_skeleton i{animation:none}}";
|
|
3457
|
+
const tagId = "@nanmicoder/dsh-agent-teams/WorkspaceActivity.module.css";
|
|
3458
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
3459
|
+
const tag = document.createElement("style");
|
|
3460
|
+
tag.dataset.plugin = "@nanmicoder/dsh-agent-teams";
|
|
3461
|
+
tag.dataset.pluginCss = tagId;
|
|
3462
|
+
tag.textContent = css;
|
|
3463
|
+
document.head.appendChild(tag);
|
|
3464
|
+
}
|
|
3465
|
+
var WorkspaceActivity_module_css_default = {
|
|
3466
|
+
"breathe": "eDfHrq_breathe",
|
|
3467
|
+
"content": "eDfHrq_content",
|
|
3468
|
+
"empty": "eDfHrq_empty",
|
|
3469
|
+
"emptyMark": "eDfHrq_emptyMark",
|
|
3470
|
+
"error": "eDfHrq_error",
|
|
3471
|
+
"root": "eDfHrq_root",
|
|
3472
|
+
"selector": "eDfHrq_selector",
|
|
3473
|
+
"skeleton": "eDfHrq_skeleton",
|
|
3474
|
+
"team-workspace": "eDfHrq_team-workspace"
|
|
3475
|
+
};
|
|
3476
|
+
//#endregion
|
|
3477
|
+
//#region lib/client/WorkspaceActivity.js
|
|
3478
|
+
/** Native workspace content; discovery remains mounted independently of tab lifetime. */
|
|
3479
|
+
const TEAM_TAB_KIND = "agent-teams";
|
|
3480
|
+
const TEAM_TAB_ID = "@nanmicoder/dsh-agent-teams/activity";
|
|
3481
|
+
/** Optional host integration is observable so installing/removing it also switches the fallback. */
|
|
3482
|
+
function createWorkspaceBridge() {
|
|
3483
|
+
let sidebar;
|
|
3484
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
3485
|
+
return {
|
|
3486
|
+
getSnapshot: () => sidebar,
|
|
3487
|
+
subscribe: (listener) => {
|
|
3488
|
+
listeners.add(listener);
|
|
3489
|
+
return () => {
|
|
3490
|
+
listeners.delete(listener);
|
|
3491
|
+
};
|
|
3492
|
+
},
|
|
3493
|
+
set(value) {
|
|
3494
|
+
sidebar = value;
|
|
3495
|
+
for (const listener of listeners) listener();
|
|
3496
|
+
}
|
|
3497
|
+
};
|
|
3498
|
+
}
|
|
3499
|
+
function ActivitySurface({ bridge, state, ...props }) {
|
|
3500
|
+
const sidebar = (0, react.useSyncExternalStore)(bridge.subscribe, bridge.getSnapshot);
|
|
3501
|
+
return sidebar === void 0 ? (0, react_jsx_runtime.jsx)(ActivityPanel, { ...props }) : (0, react_jsx_runtime.jsx)(WorkspaceMonitor, {
|
|
3502
|
+
...props,
|
|
3503
|
+
sidebar,
|
|
3504
|
+
state
|
|
3505
|
+
});
|
|
3506
|
+
}
|
|
3507
|
+
function WorkspaceMonitor({ sessionsList, sidebar, state }) {
|
|
3508
|
+
const current = currentSessionId((0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot));
|
|
3509
|
+
const targets = (0, react.useSyncExternalStore)(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);
|
|
3510
|
+
const currentTargets = (0, react.useMemo)(() => targets.filter((target) => target.sessionId === current), [targets, current]);
|
|
3511
|
+
const discover = (0, react.useMemo)(() => createTeamDiscovery(), [current]);
|
|
3512
|
+
(0, react.useEffect)(() => {
|
|
3513
|
+
if (current === void 0) return;
|
|
3514
|
+
state.status(current, "loading");
|
|
3515
|
+
const controller = startActivityPolling(currentTargets, {
|
|
3516
|
+
discoverySessionId: current,
|
|
3517
|
+
onStatus(status) {
|
|
3518
|
+
state.status(current, status);
|
|
3519
|
+
},
|
|
3520
|
+
publishSnapshots(update) {
|
|
3521
|
+
updateActivitySnapshots(update);
|
|
3522
|
+
if (update.teams === void 0) return;
|
|
3523
|
+
const added = discover(update.teams.filter((team) => team.captainSessionId === current));
|
|
3524
|
+
if (added !== void 0 && sidebar.mounted.getSnapshot() === current && !sidebar.isExpanded()) {
|
|
3525
|
+
state.select(current, added);
|
|
3526
|
+
sidebar.openTab(TEAM_TAB_KIND);
|
|
3527
|
+
}
|
|
3528
|
+
}
|
|
3529
|
+
});
|
|
3530
|
+
return () => {
|
|
3531
|
+
controller.stop();
|
|
3532
|
+
};
|
|
3533
|
+
}, [
|
|
3534
|
+
current,
|
|
3535
|
+
currentTargets,
|
|
3536
|
+
discover,
|
|
3537
|
+
sidebar,
|
|
3538
|
+
state
|
|
3539
|
+
]);
|
|
3540
|
+
(0, react.useEffect)(() => {
|
|
3541
|
+
const open = (event) => {
|
|
3542
|
+
if (current === void 0 || sidebar.mounted.getSnapshot() !== current) return;
|
|
3543
|
+
const data = event.detail;
|
|
3544
|
+
if (data?.captainSessionId && data.captainSessionId !== current) return;
|
|
3545
|
+
if (data?.teamId) state.remember(current, data);
|
|
3546
|
+
sidebar.openTab(TEAM_TAB_KIND);
|
|
3547
|
+
};
|
|
3548
|
+
window.addEventListener(OPEN_PANEL_EVENT, open);
|
|
3549
|
+
return () => {
|
|
3550
|
+
window.removeEventListener(OPEN_PANEL_EVENT, open);
|
|
3551
|
+
};
|
|
3552
|
+
}, [
|
|
3553
|
+
current,
|
|
3554
|
+
sidebar,
|
|
3555
|
+
state
|
|
3556
|
+
]);
|
|
3557
|
+
return null;
|
|
3558
|
+
}
|
|
3559
|
+
function WorkspaceActivity({ sessionId, useTabInfo, t, state, modelDirectories, openMember }) {
|
|
3560
|
+
const { tab } = useTabInfo();
|
|
3561
|
+
const snapshots = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
|
|
3562
|
+
const local = (0, react.useSyncExternalStore)(state.subscribe, state.getSnapshot);
|
|
3563
|
+
const [retry, setRetry] = (0, react.useState)(0);
|
|
3564
|
+
const live = snapshots.teams.filter((team) => team.captainSessionId === sessionId);
|
|
3565
|
+
const archived = snapshots.archivedTeams.filter((team) => team.captainSessionId === sessionId && !live.some((item) => item.teamId === team.teamId));
|
|
3566
|
+
const historic = [...local.history.values()].filter((team) => team.captainSessionId === sessionId && !live.some((item) => item.teamId === team.teamId) && !archived.some((item) => item.teamId === team.teamId)).map((team) => historicCardTeam(team, sessionId));
|
|
3567
|
+
const records = [
|
|
3568
|
+
...live,
|
|
3569
|
+
...archived,
|
|
3570
|
+
...historic
|
|
3571
|
+
];
|
|
3572
|
+
const selected = records.find((team) => team.teamId === local.selected.get(sessionId)) ?? records[0];
|
|
3573
|
+
const history = selected !== void 0 && !live.includes(selected);
|
|
3574
|
+
const status = local.statuses.get(sessionId) ?? "loading";
|
|
3575
|
+
(0, react.useEffect)(() => {
|
|
3576
|
+
if (retry === 0 || !tab.visible) return;
|
|
3577
|
+
const controller = startActivityPolling([], {
|
|
3578
|
+
discoverySessionId: sessionId,
|
|
3579
|
+
onStatus: (value) => state.status(sessionId, value)
|
|
3580
|
+
});
|
|
3581
|
+
controller.firstTick.finally(() => {
|
|
3582
|
+
controller.stop();
|
|
3583
|
+
});
|
|
3584
|
+
return () => {
|
|
3585
|
+
controller.stop();
|
|
3586
|
+
};
|
|
3587
|
+
}, [
|
|
3588
|
+
retry,
|
|
3589
|
+
sessionId,
|
|
3590
|
+
state,
|
|
3591
|
+
tab.visible
|
|
3592
|
+
]);
|
|
3593
|
+
const backToChat = () => {
|
|
3594
|
+
tab.actions.close();
|
|
3595
|
+
requestAnimationFrame(() => document.querySelector("[data-composer-card] [contenteditable=\"true\"][role=\"textbox\"], [data-composer-card] textarea")?.focus());
|
|
3596
|
+
};
|
|
3597
|
+
return (0, react_jsx_runtime.jsx)("div", {
|
|
3598
|
+
className: WorkspaceActivity_module_css_default.root,
|
|
3599
|
+
"data-agent-teams-workspace": true,
|
|
3600
|
+
"data-session-id": sessionId,
|
|
3601
|
+
children: (0, react_jsx_runtime.jsxs)("div", {
|
|
3602
|
+
className: WorkspaceActivity_module_css_default.content,
|
|
3603
|
+
children: [
|
|
3604
|
+
status === "error" && (0, react_jsx_runtime.jsxs)("div", {
|
|
3605
|
+
className: WorkspaceActivity_module_css_default.error,
|
|
3606
|
+
role: "alert",
|
|
3607
|
+
children: [(0, react_jsx_runtime.jsx)("span", { children: t("workspace.error") }), (0, react_jsx_runtime.jsx)("button", {
|
|
3608
|
+
onClick: () => setRetry((value) => value + 1),
|
|
3609
|
+
children: t("workspace.retry")
|
|
3610
|
+
})]
|
|
3611
|
+
}),
|
|
3612
|
+
records.length > 1 && (0, react_jsx_runtime.jsx)("nav", {
|
|
3613
|
+
className: WorkspaceActivity_module_css_default.selector,
|
|
3614
|
+
"aria-label": t("workspace.title"),
|
|
3615
|
+
children: records.map((team) => (0, react_jsx_runtime.jsxs)("button", {
|
|
3616
|
+
"aria-pressed": selected?.teamId === team.teamId,
|
|
3617
|
+
onClick: () => state.select(sessionId, team.teamId),
|
|
3618
|
+
children: [team.name, (0, react_jsx_runtime.jsx)("span", { children: t(live.includes(team) ? "workspace.current" : "workspace.history") })]
|
|
3619
|
+
}, team.teamId))
|
|
3620
|
+
}),
|
|
3621
|
+
selected === void 0 ? status === "loading" ? (0, react_jsx_runtime.jsxs)("div", {
|
|
3622
|
+
className: WorkspaceActivity_module_css_default.skeleton,
|
|
3623
|
+
role: "status",
|
|
3624
|
+
"aria-label": t("workspace.loading"),
|
|
3625
|
+
children: [
|
|
3626
|
+
(0, react_jsx_runtime.jsx)("i", {}),
|
|
3627
|
+
(0, react_jsx_runtime.jsx)("i", {}),
|
|
3628
|
+
(0, react_jsx_runtime.jsx)("i", {})
|
|
3629
|
+
]
|
|
3630
|
+
}) : (0, react_jsx_runtime.jsxs)("section", {
|
|
3631
|
+
className: WorkspaceActivity_module_css_default.empty,
|
|
3632
|
+
children: [
|
|
3633
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
3634
|
+
className: WorkspaceActivity_module_css_default.emptyMark,
|
|
3635
|
+
"aria-hidden": true,
|
|
3636
|
+
children: "↳"
|
|
3637
|
+
}),
|
|
3638
|
+
(0, react_jsx_runtime.jsx)("h3", { children: t("workspace.emptyTitle") }),
|
|
3639
|
+
(0, react_jsx_runtime.jsx)("p", { children: t("workspace.emptyBody") }),
|
|
3640
|
+
(0, react_jsx_runtime.jsx)("button", {
|
|
3641
|
+
onClick: backToChat,
|
|
3642
|
+
children: t("workspace.back")
|
|
3643
|
+
})
|
|
3644
|
+
]
|
|
3645
|
+
}) : (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)(TeamSection, {
|
|
3646
|
+
team: selected,
|
|
3647
|
+
workspace: true,
|
|
3648
|
+
historic: history,
|
|
3649
|
+
modelDirectory: selected.phase === "staged" ? modelDirectories.directoryFor(sessionId) : void 0,
|
|
3650
|
+
onContinuePlanning: backToChat,
|
|
3651
|
+
onDiscarded: backToChat,
|
|
3652
|
+
onNavigate: openMember,
|
|
3653
|
+
t
|
|
3654
|
+
}, `${sessionId}:${selected.teamId}`) })
|
|
3655
|
+
]
|
|
3656
|
+
})
|
|
3657
|
+
});
|
|
3658
|
+
}
|
|
3659
|
+
//#endregion
|
|
3145
3660
|
//#region lib/client/agent-teams-card-definition.js
|
|
3146
3661
|
/**
|
|
3147
3662
|
* AgentTeams conversation card: a lightweight in-conversation summary shown
|
|
@@ -3197,7 +3712,7 @@ window.__ModuleLoader__.load({
|
|
|
3197
3712
|
},
|
|
3198
3713
|
update: (context, match) => {
|
|
3199
3714
|
if (match.event.type !== "tool/result") return context.state;
|
|
3200
|
-
if (match.event.data.error !== void 0 || match.event.data.message
|
|
3715
|
+
if (match.event.data.error !== void 0 || toolResultFailed(match.event.data.message)) return context.state;
|
|
3201
3716
|
return {
|
|
3202
3717
|
...context.state,
|
|
3203
3718
|
accepted: true
|
|
@@ -3224,6 +3739,53 @@ window.__ModuleLoader__.load({
|
|
|
3224
3739
|
};
|
|
3225
3740
|
}
|
|
3226
3741
|
};
|
|
3742
|
+
/** V4 tool-role results carry isError directly; older logs nest tool-result blocks. */
|
|
3743
|
+
function toolResultFailed(message) {
|
|
3744
|
+
return message.isError === true || message.content.some((block) => typeof block === "object" && block !== null && "type" in block && block.type === "tool-result" && "isError" in block && block.isError === true);
|
|
3745
|
+
}
|
|
3746
|
+
/** Keep summaries tied to the create turn, including multiple teams in one turn. */
|
|
3747
|
+
function teamCardsForTurn(nodes, turn) {
|
|
3748
|
+
return [...nodes].filter((node) => node.kind === "agent-teams" && (node.location.kind === "turn" || node.location.kind === "step") && node.location.turn.turn === turn);
|
|
3749
|
+
}
|
|
3750
|
+
//#endregion
|
|
3751
|
+
//#region lib/client/TeamChatEntry.js
|
|
3752
|
+
/** Session-owned entry points: a persistent title action and a durable turn card. */
|
|
3753
|
+
function TeamChatEntry({ sessionId, t }) {
|
|
3754
|
+
const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
|
|
3755
|
+
const team = [...teams, ...archivedTeams].find((team) => team.captainSessionId === sessionId);
|
|
3756
|
+
if (!team) return null;
|
|
3757
|
+
return (0, react_jsx_runtime.jsxs)("button", {
|
|
3758
|
+
className: AgentTeamsCard_module_css_default.chatEntry,
|
|
3759
|
+
"data-team-chat-entry": true,
|
|
3760
|
+
type: "button",
|
|
3761
|
+
title: t("workspace.focus"),
|
|
3762
|
+
onClick: () => openActivityPanel({
|
|
3763
|
+
teamId: team.teamId,
|
|
3764
|
+
captainSessionId: sessionId,
|
|
3765
|
+
teamName: team.name,
|
|
3766
|
+
members: team.members
|
|
3767
|
+
}),
|
|
3768
|
+
children: [(0, react_jsx_runtime.jsx)("img", {
|
|
3769
|
+
src: LEAD_ART,
|
|
3770
|
+
alt: "",
|
|
3771
|
+
"aria-hidden": true
|
|
3772
|
+
}), t("workspace.focus")]
|
|
3773
|
+
});
|
|
3774
|
+
}
|
|
3775
|
+
function TeamTurnCard({ sessionId, turn, useChat, t, openMember }) {
|
|
3776
|
+
const cards = teamCardsForTurn(useChat((snapshot) => snapshot.nodes).values(), turn.turn);
|
|
3777
|
+
if (turn.status !== "closed" || cards.length === 0) return null;
|
|
3778
|
+
return (0, react_jsx_runtime.jsx)("div", {
|
|
3779
|
+
className: AgentTeamsCard_module_css_default.turnCards,
|
|
3780
|
+
"data-team-turn-cards": true,
|
|
3781
|
+
children: cards.map((node) => (0, react_jsx_runtime.jsx)(AgentTeamsSummary, {
|
|
3782
|
+
data: node.data,
|
|
3783
|
+
sessionId,
|
|
3784
|
+
t,
|
|
3785
|
+
openMember
|
|
3786
|
+
}, node.key))
|
|
3787
|
+
});
|
|
3788
|
+
}
|
|
3227
3789
|
//#endregion
|
|
3228
3790
|
//#region lib/client/locales.js
|
|
3229
3791
|
/** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */
|
|
@@ -3231,6 +3793,25 @@ window.__ModuleLoader__.load({
|
|
|
3231
3793
|
const AGENT_TEAMS_LOCALE_NAMESPACE = "agentTeams";
|
|
3232
3794
|
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
3233
3795
|
const zh = {
|
|
3796
|
+
"workspace.dependencies": "从左到右:完成前置后解锁 · 点击查看详情",
|
|
3797
|
+
"workspace.title": "团队协作",
|
|
3798
|
+
"workspace.guide": "查看成员分工、任务依赖与执行进度",
|
|
3799
|
+
"workspace.eyebrow": "AGENT TEAMS",
|
|
3800
|
+
"workspace.description": "队长统筹分工,成员按任务依赖并行协作。",
|
|
3801
|
+
"workspace.relationships": "队长协调成员分工;任务连线表示前置依赖。点击任务可定位负责成员。",
|
|
3802
|
+
"workspace.emptyTitle": "当前会话还没有团队",
|
|
3803
|
+
"workspace.emptyBody": "在聊天中使用 /agent-teams 描述目标,确认计划后即可在这里查看协作进度。",
|
|
3804
|
+
"workspace.loading": "正在读取团队状态",
|
|
3805
|
+
"workspace.error": "暂时无法连接团队服务,正在自动重试。已加载的状态可能不是最新。",
|
|
3806
|
+
"workspace.retry": "重新连接",
|
|
3807
|
+
"workspace.current": "当前团队",
|
|
3808
|
+
"workspace.history": "历史记录",
|
|
3809
|
+
"workspace.back": "返回对话",
|
|
3810
|
+
"workspace.tasks": "项任务",
|
|
3811
|
+
"workspace.members": "名成员",
|
|
3812
|
+
"workspace.completed": "已完成",
|
|
3813
|
+
"workspace.focus": "查看团队",
|
|
3814
|
+
"workspace.noTasks": "等待队长拆解任务",
|
|
3234
3815
|
"card.memberCount": "{count} 名成员",
|
|
3235
3816
|
"action.openActivityPanel": "打开活动面板",
|
|
3236
3817
|
"activity.panelButton": "活动面板",
|
|
@@ -3309,6 +3890,8 @@ window.__ModuleLoader__.load({
|
|
|
3309
3890
|
"dependency.hint.pinned": "{taskId} 已固定 · Esc 取消",
|
|
3310
3891
|
"task.runningAria": "运行中",
|
|
3311
3892
|
"task.model": "{model}",
|
|
3893
|
+
"task.detail.cancelled": "任务已取消,不会继续执行",
|
|
3894
|
+
"task.detail.failed": "任务失败,等待明确重试",
|
|
3312
3895
|
"task.detail.completed": "已完成并交付",
|
|
3313
3896
|
"task.detail.noPrerequisite": "无前置,可立即开工",
|
|
3314
3897
|
"task.detail.ready": "前置已就绪,可开工",
|
|
@@ -3412,6 +3995,7 @@ window.__ModuleLoader__.load({
|
|
|
3412
3995
|
"members.toggle": "{count} 名成员",
|
|
3413
3996
|
"members.collapse": "收起",
|
|
3414
3997
|
"members.expand": "展开",
|
|
3998
|
+
"members.expandFinished": "展开已结束({count})",
|
|
3415
3999
|
"members.empty": "暂无成员,等待队长组建团队",
|
|
3416
4000
|
"assignment.label": "队长派发",
|
|
3417
4001
|
"assignment.staged": "计划任务",
|
|
@@ -3422,6 +4006,25 @@ window.__ModuleLoader__.load({
|
|
|
3422
4006
|
};
|
|
3423
4007
|
/** English dictionary, checked complete against the Chinese source key set. */
|
|
3424
4008
|
const en = {
|
|
4009
|
+
"workspace.dependencies": "Left to right: prerequisites unlock tasks · Select for details",
|
|
4010
|
+
"workspace.title": "Team workspace",
|
|
4011
|
+
"workspace.guide": "Members, task dependencies, and execution progress",
|
|
4012
|
+
"workspace.eyebrow": "AGENT TEAMS",
|
|
4013
|
+
"workspace.description": "The captain coordinates. Members work in parallel as dependencies clear.",
|
|
4014
|
+
"workspace.relationships": "The captain coordinates members. Connections show task prerequisites. Select a task to locate its owner.",
|
|
4015
|
+
"workspace.emptyTitle": "No team in this conversation yet",
|
|
4016
|
+
"workspace.emptyBody": "Use /agent-teams in chat to describe your goal. Review the plan, then follow the team here.",
|
|
4017
|
+
"workspace.loading": "Loading team activity",
|
|
4018
|
+
"workspace.error": "The team service is unavailable. Retrying automatically; loaded activity may be out of date.",
|
|
4019
|
+
"workspace.retry": "Reconnect",
|
|
4020
|
+
"workspace.current": "Current team",
|
|
4021
|
+
"workspace.history": "History",
|
|
4022
|
+
"workspace.back": "Back to conversation",
|
|
4023
|
+
"workspace.tasks": "tasks",
|
|
4024
|
+
"workspace.members": "members",
|
|
4025
|
+
"workspace.completed": "completed",
|
|
4026
|
+
"workspace.focus": "View team",
|
|
4027
|
+
"workspace.noTasks": "Waiting for the captain to define tasks",
|
|
3425
4028
|
"card.memberCount": "{count} members",
|
|
3426
4029
|
"action.openActivityPanel": "Open activity panel",
|
|
3427
4030
|
"activity.panelButton": "Activity panel",
|
|
@@ -3500,6 +4103,8 @@ window.__ModuleLoader__.load({
|
|
|
3500
4103
|
"dependency.hint.pinned": "{taskId} pinned · Esc to clear",
|
|
3501
4104
|
"task.runningAria": "Running",
|
|
3502
4105
|
"task.model": "{model}",
|
|
4106
|
+
"task.detail.cancelled": "Cancelled; execution will not continue",
|
|
4107
|
+
"task.detail.failed": "Failed; awaiting an explicit retry",
|
|
3503
4108
|
"task.detail.completed": "Completed and delivered",
|
|
3504
4109
|
"task.detail.noPrerequisite": "No prerequisites; ready to start",
|
|
3505
4110
|
"task.detail.ready": "Prerequisites ready; can start",
|
|
@@ -3603,6 +4208,7 @@ window.__ModuleLoader__.load({
|
|
|
3603
4208
|
"members.toggle": "Members {count}",
|
|
3604
4209
|
"members.collapse": "Collapse",
|
|
3605
4210
|
"members.expand": "Expand",
|
|
4211
|
+
"members.expandFinished": "Show finished ({count})",
|
|
3606
4212
|
"members.empty": "No members yet; waiting for the captain to assemble the team",
|
|
3607
4213
|
"assignment.label": "Captain assigned",
|
|
3608
4214
|
"assignment.staged": "Planned task",
|
|
@@ -3612,36 +4218,6 @@ window.__ModuleLoader__.load({
|
|
|
3612
4218
|
"archive.discardedLabel": "Plan discarded · Archived history"
|
|
3613
4219
|
};
|
|
3614
4220
|
//#endregion
|
|
3615
|
-
//#region lib/client/session-navigation.js
|
|
3616
|
-
/** Version-tolerant navigation into durable AgentTeams member transcripts. */
|
|
3617
|
-
/**
|
|
3618
|
-
* Open one member's persisted transcript.
|
|
3619
|
-
*
|
|
3620
|
-
* Harness rc.8 intentionally removed cold subagents from the ordinary session
|
|
3621
|
-
* list. They must first be rediscovered in their parent's catalog, then opened
|
|
3622
|
-
* with the exact parent/child/mode address. Older runtimes have only `open()`;
|
|
3623
|
-
* the fallback preserves ordinary-session navigation. New layouts also select
|
|
3624
|
-
* the Conversation panel and cancel catalog refreshes superseded by navigation.
|
|
3625
|
-
*/
|
|
3626
|
-
async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout) {
|
|
3627
|
-
const navigation = layout?.beginNavigation?.();
|
|
3628
|
-
if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
|
|
3629
|
-
sessions.open(childSessionId);
|
|
3630
|
-
layout?.selectPanel?.(null);
|
|
3631
|
-
return "session";
|
|
3632
|
-
}
|
|
3633
|
-
await sessions.refreshSubagents(parentSessionId);
|
|
3634
|
-
if (navigation?.aborted) return "cancelled";
|
|
3635
|
-
const retained = sessions.subagentAddress?.(childSessionId);
|
|
3636
|
-
sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
|
|
3637
|
-
parentSessionId,
|
|
3638
|
-
childSessionId,
|
|
3639
|
-
mode: "continuable"
|
|
3640
|
-
});
|
|
3641
|
-
layout?.selectPanel?.(null);
|
|
3642
|
-
return "subagent";
|
|
3643
|
-
}
|
|
3644
|
-
//#endregion
|
|
3645
4221
|
//#region lib/client/index.js
|
|
3646
4222
|
/** Required services: conversation nodes, slots, sessions navigation, and locale. */
|
|
3647
4223
|
const inject = [
|
|
@@ -3663,24 +4239,67 @@ window.__ModuleLoader__.load({
|
|
|
3663
4239
|
* monitor via a window event — the recovery path for an old session.
|
|
3664
4240
|
*/
|
|
3665
4241
|
function apply(ctx) {
|
|
4242
|
+
const bridge = createWorkspaceBridge();
|
|
4243
|
+
const state = createWorkspaceState();
|
|
3666
4244
|
ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, {
|
|
3667
4245
|
zh,
|
|
3668
4246
|
en
|
|
3669
4247
|
}), "agent-teams: dictionaries");
|
|
3670
4248
|
const openMember = (parentId, childId) => {
|
|
3671
|
-
openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout).catch((error) => {
|
|
4249
|
+
openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout, ctx.get("uiWorkspace")).catch((error) => {
|
|
3672
4250
|
console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
|
|
3673
4251
|
});
|
|
3674
4252
|
};
|
|
3675
4253
|
const Panel = ({ t, usePanelInfo }) => {
|
|
3676
|
-
|
|
3677
|
-
|
|
4254
|
+
const conversationVisible = (usePanelInfo ?? useLegacyPanelInfo)((panel) => panel.activePanelId === null);
|
|
4255
|
+
return (0, react_jsx_runtime.jsx)(ActivitySurface, {
|
|
4256
|
+
bridge,
|
|
4257
|
+
state,
|
|
4258
|
+
conversationVisible,
|
|
3678
4259
|
sessionsList: ctx.sessions.list,
|
|
3679
4260
|
modelDirectories: ctx.modelDirectories,
|
|
3680
4261
|
openMember,
|
|
3681
4262
|
t
|
|
3682
4263
|
});
|
|
3683
4264
|
};
|
|
4265
|
+
ctx.inject(["sidebarRight", "sidebarRightTabs"], (native) => {
|
|
4266
|
+
const t = native.locale.bind(AGENT_TEAMS_LOCALE_NAMESPACE);
|
|
4267
|
+
native.effect(() => native.sidebarRightTabs.register({
|
|
4268
|
+
id: TEAM_TAB_ID,
|
|
4269
|
+
kind: TEAM_TAB_KIND,
|
|
4270
|
+
title: () => t("workspace.title")
|
|
4271
|
+
}));
|
|
4272
|
+
native.slots.inject("conversation.session.header.actions", () => native.slots.register({
|
|
4273
|
+
name: "conversation.session.header.actions",
|
|
4274
|
+
id: "agent-teams-entry",
|
|
4275
|
+
order: 50,
|
|
4276
|
+
locale: AGENT_TEAMS_LOCALE_NAMESPACE
|
|
4277
|
+
}, TeamChatEntry));
|
|
4278
|
+
native.slots.inject("conversation.chat.turnTail", () => native.slots.register({
|
|
4279
|
+
name: "conversation.chat.turnTail",
|
|
4280
|
+
id: "agent-teams-summary",
|
|
4281
|
+
order: 50,
|
|
4282
|
+
locale: AGENT_TEAMS_LOCALE_NAMESPACE,
|
|
4283
|
+
inject: () => ({ openMember })
|
|
4284
|
+
}, TeamTurnCard));
|
|
4285
|
+
native.slots.inject("sidebar.right.pane.tab", () => {
|
|
4286
|
+
const dispose = native.slots.register({
|
|
4287
|
+
name: "sidebar.right.pane.tab",
|
|
4288
|
+
key: TEAM_TAB_ID,
|
|
4289
|
+
locale: AGENT_TEAMS_LOCALE_NAMESPACE,
|
|
4290
|
+
inject: () => ({
|
|
4291
|
+
state,
|
|
4292
|
+
modelDirectories: native.modelDirectories,
|
|
4293
|
+
openMember
|
|
4294
|
+
})
|
|
4295
|
+
}, WorkspaceActivity);
|
|
4296
|
+
bridge.set(native.sidebarRight);
|
|
4297
|
+
return () => {
|
|
4298
|
+
bridge.set(void 0);
|
|
4299
|
+
dispose();
|
|
4300
|
+
};
|
|
4301
|
+
});
|
|
4302
|
+
});
|
|
3684
4303
|
ctx.slots.inject("shell.overlay", () => ctx.slots.register({
|
|
3685
4304
|
name: "shell.overlay",
|
|
3686
4305
|
id: "agent-teams-activity",
|
|
@@ -3697,7 +4316,10 @@ window.__ModuleLoader__.load({
|
|
|
3697
4316
|
name: "conversation.chat.node",
|
|
3698
4317
|
key: "agent-teams",
|
|
3699
4318
|
locale: AGENT_TEAMS_LOCALE_NAMESPACE,
|
|
3700
|
-
inject: () => ({
|
|
4319
|
+
inject: () => ({
|
|
4320
|
+
openMember,
|
|
4321
|
+
workspaceBridge: bridge
|
|
4322
|
+
})
|
|
3701
4323
|
}, AgentTeamsCard));
|
|
3702
4324
|
}
|
|
3703
4325
|
//#endregion
|