@nanmicoder/dsh-agent-teams 0.1.10 → 0.1.12
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 +3 -1
- package/README_ZH.md +3 -1
- package/lib/client/ActivityPanel.js +88 -69
- package/lib/client/AgentTeamsCard.js +5 -3
- package/lib/client/activity-monitor.js +32 -7
- package/lib/client/index.js +14 -4
- package/lib/client/locales.js +165 -0
- package/lib/client/session-navigation.js +21 -0
- package/lib/client.js +360 -135
- package/lib/client.js.map +1 -1
- package/lib/members.js +21 -47
- package/lib/snapshot.js +4 -15
- package/lib/tools.js +1 -1
- package/lib/types/client/ActivityPanel.d.ts +5 -3
- package/lib/types/client/AgentTeamsCard.d.ts +2 -2
- package/lib/types/client/activity-monitor.d.ts +13 -3
- package/lib/types/client/index.d.ts +8 -1
- package/lib/types/client/locales.d.ts +169 -0
- package/lib/types/client/session-navigation.d.ts +22 -0
- package/lib/types/members.d.ts +17 -13
- package/package.json +1 -1
- package/release-notes/v0.1.11.md +52 -0
- package/release-notes/v0.1.12.md +54 -0
package/lib/client.js
CHANGED
|
@@ -246,12 +246,17 @@ window.__ModuleLoader__.load({
|
|
|
246
246
|
/**
|
|
247
247
|
* Start the single polling loop for the current session's requested targets.
|
|
248
248
|
*
|
|
249
|
-
* With
|
|
250
|
-
*
|
|
251
|
-
*
|
|
249
|
+
* With neither targets nor a discovery session this is deliberately inert.
|
|
250
|
+
* A discovery session performs one live+archive pass after selection/restart;
|
|
251
|
+
* it keeps polling only while that captain still owns a live team. This
|
|
252
|
+
* restores legacy/cardless history without turning every ordinary session
|
|
253
|
+
* into a permanent one-second filesystem scan. Explicit card targets retain
|
|
254
|
+
* the normal cadence, and archive state is refreshed when a target or a
|
|
255
|
+
* previously discovered live team disappears.
|
|
252
256
|
*/
|
|
253
257
|
function startActivityPolling(monitorTargets, runtime = {}) {
|
|
254
|
-
|
|
258
|
+
const discoverySessionId = runtime.discoverySessionId?.trim();
|
|
259
|
+
if (monitorTargets.length === 0 && (discoverySessionId === void 0 || discoverySessionId === "")) return {
|
|
255
260
|
firstTick: Promise.resolve(),
|
|
256
261
|
stop: () => {}
|
|
257
262
|
};
|
|
@@ -264,9 +269,12 @@ window.__ModuleLoader__.load({
|
|
|
264
269
|
const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;
|
|
265
270
|
let cancelled = false;
|
|
266
271
|
let inFlight = false;
|
|
272
|
+
let discoveryComplete = false;
|
|
273
|
+
let discoveredLiveKeys = /* @__PURE__ */ new Set();
|
|
267
274
|
let controller;
|
|
268
275
|
const tick = async () => {
|
|
269
276
|
if (inFlight || cancelled) return;
|
|
277
|
+
if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0) return;
|
|
270
278
|
inFlight = true;
|
|
271
279
|
controller = new AbortController();
|
|
272
280
|
try {
|
|
@@ -279,8 +287,12 @@ window.__ModuleLoader__.load({
|
|
|
279
287
|
if (cancelled || !Array.isArray(body.teams)) return;
|
|
280
288
|
const liveTeams = body.teams;
|
|
281
289
|
publishSnapshots({ teams: liveTeams });
|
|
290
|
+
const previousDiscoveredKeys = discoveredLiveKeys;
|
|
291
|
+
discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));
|
|
292
|
+
const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));
|
|
282
293
|
const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));
|
|
283
|
-
|
|
294
|
+
const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;
|
|
295
|
+
if (missing.length === 0 && !needsDiscoveryArchive && !discoveredTeamArchived) return;
|
|
284
296
|
const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {
|
|
285
297
|
cache: "no-store",
|
|
286
298
|
signal: controller.signal
|
|
@@ -289,6 +301,7 @@ window.__ModuleLoader__.load({
|
|
|
289
301
|
const archivedBody = await archivedResponse.json();
|
|
290
302
|
if (cancelled || !Array.isArray(archivedBody.teams)) return;
|
|
291
303
|
publishSnapshots({ archivedTeams: archivedBody.teams });
|
|
304
|
+
discoveryComplete = true;
|
|
292
305
|
settleTargets(new Set(missing.map((target) => target.key)));
|
|
293
306
|
} catch (error) {
|
|
294
307
|
if (error?.name === "AbortError") return;
|
|
@@ -401,7 +414,7 @@ window.__ModuleLoader__.load({
|
|
|
401
414
|
} }));
|
|
402
415
|
}
|
|
403
416
|
/** Render one durable team as a compact conversation card. */
|
|
404
|
-
function AgentTeamsCard({ node,
|
|
417
|
+
function AgentTeamsCard({ node, openMember, sessionId, t }) {
|
|
405
418
|
const data = node.data;
|
|
406
419
|
const owner = data.captainSessionId || sessionId;
|
|
407
420
|
const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
|
|
@@ -441,9 +454,9 @@ window.__ModuleLoader__.load({
|
|
|
441
454
|
title: resolved.teamName,
|
|
442
455
|
children: resolved.teamName
|
|
443
456
|
}),
|
|
444
|
-
(0, react_jsx_runtime.
|
|
457
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
445
458
|
className: AgentTeamsCard_module_css_default.memberCount,
|
|
446
|
-
children:
|
|
459
|
+
children: t("card.memberCount", { count: resolved.members.length })
|
|
447
460
|
}),
|
|
448
461
|
(0, react_jsx_runtime.jsx)("button", {
|
|
449
462
|
type: "button",
|
|
@@ -451,9 +464,9 @@ window.__ModuleLoader__.load({
|
|
|
451
464
|
onClick: () => {
|
|
452
465
|
openActivityPanel(resolved);
|
|
453
466
|
},
|
|
454
|
-
"aria-label": "
|
|
455
|
-
title: "
|
|
456
|
-
children: "
|
|
467
|
+
"aria-label": t("action.openActivityPanel"),
|
|
468
|
+
title: t("action.openActivityPanel"),
|
|
469
|
+
children: t("activity.panelButton")
|
|
457
470
|
})
|
|
458
471
|
]
|
|
459
472
|
}), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -462,7 +475,7 @@ window.__ModuleLoader__.load({
|
|
|
462
475
|
type: "button",
|
|
463
476
|
className: AgentTeamsCard_module_css_default.member,
|
|
464
477
|
onClick: () => {
|
|
465
|
-
if (member.id !== "")
|
|
478
|
+
if (member.id !== "") openMember(owner, member.id);
|
|
466
479
|
},
|
|
467
480
|
title: member.role === "" ? member.name : `${member.name} · ${member.role}`,
|
|
468
481
|
children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
|
|
@@ -637,7 +650,7 @@ window.__ModuleLoader__.load({
|
|
|
637
650
|
}
|
|
638
651
|
//#endregion
|
|
639
652
|
//#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
|
|
640
|
-
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,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);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-label-primary) 14%, 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-line-strong);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-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, 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-label-primary) 14%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-label-primary) 18%, 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-line-normal);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-bg-fill-neutral);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:1;touch-action:none;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:8px;top:44px;bottom:8px;left:0}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:8px;bottom:0;left:12px;right:12px}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:18px;height:18px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:1px solid var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.52;width:7px;height:7px;position:absolute;bottom:4px;right:4px}.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-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex}.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_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-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));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_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-line-strong);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-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.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-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));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-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.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-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.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-bg-fill-neutral)}.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-line-normal));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-line-normal));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-module))}.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-module);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-bg-fill-business);width:34px;height:34px;color:var(--dsw-alias-label-on-fill);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-module)) 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-bg-fill-neutral);min-height:16px;color:var(--dsw-alias-label-secondary);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}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.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-line-normal);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-line-strong);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-line-normal);background:var(--dsw-alias-bg-module);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-module))}.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) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.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-line-strong);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-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.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-line-normal);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-bg-fill-neutral);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-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.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_historicPill{background:var(--dsw-alias-bg-fill-neutral);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_archivedWrap:before{color:var(--dsw-alias-label-tertiary);content:\"已结束 · 历史归档\";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{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}}";
|
|
653
|
+
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,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);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-label-primary) 14%, 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-line-strong);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-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, 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-label-primary) 14%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-label-primary) 18%, 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-line-normal);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-bg-fill-neutral);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:1;touch-action:none;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:8px;top:44px;bottom:8px;left:0}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:8px;bottom:0;left:12px;right:12px}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:18px;height:18px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:1px solid var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.52;width:7px;height:7px;position:absolute;bottom:4px;right:4px}.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-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex}.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_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-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));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_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-line-strong);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-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.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-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));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-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.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-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.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-bg-fill-neutral)}.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-line-normal));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-line-normal));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-module))}.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-module);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-bg-fill-business);width:34px;height:34px;color:var(--dsw-alias-label-on-fill);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-module)) 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-bg-fill-neutral);min-height:16px;color:var(--dsw-alias-label-secondary);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}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.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-line-normal);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-line-strong);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-line-normal);background:var(--dsw-alias-bg-module);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-module))}.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) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.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-line-strong);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-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.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-line-normal);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-bg-fill-neutral);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-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.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_historicPill{background:var(--dsw-alias-bg-fill-neutral);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{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}}";
|
|
641
654
|
const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
|
|
642
655
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
643
656
|
const tag = document.createElement("style");
|
|
@@ -654,7 +667,7 @@ window.__ModuleLoader__.load({
|
|
|
654
667
|
"agentTeamsPulse": "aYQbCq_agentTeamsPulse",
|
|
655
668
|
"agentTeamsThink": "aYQbCq_agentTeamsThink",
|
|
656
669
|
"agentTeamsUnreadPulse": "aYQbCq_agentTeamsUnreadPulse",
|
|
657
|
-
"
|
|
670
|
+
"archiveLabel": "aYQbCq_archiveLabel",
|
|
658
671
|
"assignmentChip": "aYQbCq_assignmentChip",
|
|
659
672
|
"assignmentLabel": "aYQbCq_assignmentLabel",
|
|
660
673
|
"assignmentLine": "aYQbCq_assignmentLine",
|
|
@@ -809,15 +822,19 @@ window.__ModuleLoader__.load({
|
|
|
809
822
|
/** Badge text follows the raw task status (finer than the 4 visual states):
|
|
810
823
|
* claimed/pending/failed/cancelled keep their own labels and colors. */
|
|
811
824
|
const TASK_STATUS_LABEL = {
|
|
812
|
-
pending: "
|
|
813
|
-
claimed: "
|
|
814
|
-
in_progress: "
|
|
815
|
-
completed: "
|
|
816
|
-
failed: "
|
|
817
|
-
cancelled: "
|
|
825
|
+
pending: "task.status.pending",
|
|
826
|
+
claimed: "task.status.claimed",
|
|
827
|
+
in_progress: "task.status.inProgress",
|
|
828
|
+
completed: "task.status.completed",
|
|
829
|
+
failed: "task.status.failed",
|
|
830
|
+
cancelled: "task.status.cancelled"
|
|
818
831
|
};
|
|
819
|
-
function taskStatusLabel(status) {
|
|
820
|
-
|
|
832
|
+
function taskStatusLabel(status, t) {
|
|
833
|
+
const key = TASK_STATUS_LABEL[status];
|
|
834
|
+
return key === void 0 ? status : t(key);
|
|
835
|
+
}
|
|
836
|
+
function formatTaskIds(ids, t) {
|
|
837
|
+
return ids.join(t("format.listSeparator"));
|
|
821
838
|
}
|
|
822
839
|
/** Badge/bar coloring key: visual state, widened for terminal statuses. */
|
|
823
840
|
function taskTone(state, status) {
|
|
@@ -867,14 +884,14 @@ window.__ModuleLoader__.load({
|
|
|
867
884
|
});
|
|
868
885
|
}
|
|
869
886
|
/** Collapsed badge: an always-visible corner pill while any team exists. */
|
|
870
|
-
function CollapsedBadge({ count, busy, onClick }) {
|
|
887
|
+
function CollapsedBadge({ count, busy, onClick, t }) {
|
|
871
888
|
return (0, react_jsx_runtime.jsxs)("button", {
|
|
872
889
|
type: "button",
|
|
873
890
|
className: ActivityPanel_module_css_default.badge,
|
|
874
891
|
"data-agent-teams-collapsed": true,
|
|
875
892
|
"data-busy": busy,
|
|
876
893
|
onClick,
|
|
877
|
-
"aria-label":
|
|
894
|
+
"aria-label": t("activity.badgeAria", { count }),
|
|
878
895
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
879
896
|
className: ActivityPanel_module_css_default.badgeDot,
|
|
880
897
|
"data-busy": busy,
|
|
@@ -885,62 +902,68 @@ window.__ModuleLoader__.load({
|
|
|
885
902
|
})]
|
|
886
903
|
});
|
|
887
904
|
}
|
|
888
|
-
function memberStateLabel(member, tasks, historic) {
|
|
905
|
+
function memberStateLabel(member, tasks, historic, t) {
|
|
889
906
|
const owned = tasks.filter((task) => task.assignee === member.name);
|
|
890
|
-
if (member.activity === "working") return "
|
|
891
|
-
if (owned.some((task) => task.status === "failed")) return "
|
|
892
|
-
if (owned.some((task) => task.state === "blocked")) return "
|
|
893
|
-
if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "
|
|
894
|
-
if (member.status === "removed") return historic ? "
|
|
895
|
-
if (owned.length > 0) return "
|
|
896
|
-
return "
|
|
907
|
+
if (member.activity === "working") return t("member.state.working");
|
|
908
|
+
if (owned.some((task) => task.status === "failed")) return t("member.state.failed");
|
|
909
|
+
if (owned.some((task) => task.state === "blocked")) return t("member.state.waiting");
|
|
910
|
+
if (owned.length > 0 && owned.every((task) => task.status === "completed")) return t("member.state.delivered");
|
|
911
|
+
if (member.status === "removed") return t(historic ? "member.state.left" : "member.state.removed");
|
|
912
|
+
if (owned.length > 0) return t("member.state.pending");
|
|
913
|
+
return t("member.state.unassigned");
|
|
897
914
|
}
|
|
898
|
-
function memberStatusText(member, tasks) {
|
|
915
|
+
function memberStatusText(member, tasks, t) {
|
|
899
916
|
const owned = tasks.filter((task) => task.assignee === member.name);
|
|
900
917
|
const current = owned.find((task) => task.id === member.currentTask);
|
|
901
918
|
const blocked = owned.find((task) => task.state === "blocked");
|
|
902
|
-
if (member.activity === "working" && current !== void 0) return
|
|
903
|
-
if (member.activity === "working") return "
|
|
919
|
+
if (member.activity === "working" && current !== void 0) return t("member.status.executing", { taskId: current.id });
|
|
920
|
+
if (member.activity === "working") return t("member.status.working");
|
|
904
921
|
if (blocked !== void 0) {
|
|
905
922
|
const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== "completed");
|
|
906
|
-
if (dependency !== void 0) return
|
|
907
|
-
|
|
923
|
+
if (dependency !== void 0) return t("member.status.waitingOn", {
|
|
924
|
+
taskId: dependency.id,
|
|
925
|
+
assignee: dependency.assignee || t("task.assignee.unclaimed")
|
|
926
|
+
});
|
|
927
|
+
return t("member.status.waitingPrerequisite");
|
|
908
928
|
}
|
|
909
|
-
if (member.total === 0) return "
|
|
910
|
-
if (member.done === member.total) return "
|
|
911
|
-
return member.activity === "idle" ? "
|
|
929
|
+
if (member.total === 0) return t("member.status.waitingAssignment");
|
|
930
|
+
if (member.done === member.total) return t("member.status.delivered");
|
|
931
|
+
return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");
|
|
912
932
|
}
|
|
913
933
|
function compactTaskLabel(subject) {
|
|
914
934
|
const withoutVerb = subject.replace(/^开发\s*/u, "").replace(/^\d+[-_.、\s]*/u, "");
|
|
915
935
|
const head = withoutVerb.split(/[((·::]/u)[0]?.trim() ?? withoutVerb;
|
|
916
936
|
return head.length > 18 ? `${head.slice(0, 17)}…` : head;
|
|
917
937
|
}
|
|
918
|
-
function taskSummary(team) {
|
|
938
|
+
function taskSummary(team, t) {
|
|
919
939
|
const completed = team.tasks.filter((task) => task.status === "completed");
|
|
920
940
|
const running = team.tasks.filter((task) => task.state === "running");
|
|
921
941
|
const blocked = team.tasks.filter((task) => task.state === "blocked");
|
|
922
942
|
const ready = team.tasks.filter((task) => task.state === "open" && task.status !== "completed");
|
|
923
|
-
if (team.tasks.length === 0) return "
|
|
924
|
-
if (completed.length === team.tasks.length) return
|
|
925
|
-
if (blocked.length > 0 && running.length > 0) return
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
return "
|
|
943
|
+
if (team.tasks.length === 0) return t("task.summary.waitingBreakdown");
|
|
944
|
+
if (completed.length === team.tasks.length) return t("task.summary.allDelivered", { count: completed.length });
|
|
945
|
+
if (blocked.length > 0 && running.length > 0) return t("task.summary.blockedAndRunning", {
|
|
946
|
+
tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),
|
|
947
|
+
more: blocked.length > 3 ? t("task.summary.more", { count: blocked.length - 3 }) : ""
|
|
948
|
+
});
|
|
949
|
+
if (running.length > 0) return t("task.summary.running", { tasks: formatTaskIds(running.map((task) => task.id), t) });
|
|
950
|
+
if (ready.length > 0) return t("task.summary.ready", { tasks: formatTaskIds(ready.map((task) => task.id), t) });
|
|
951
|
+
if (blocked.length > 0) return t("task.summary.blocked", { tasks: formatTaskIds(blocked.map((task) => task.id), t) });
|
|
952
|
+
return t("task.summary.waitingSchedule");
|
|
930
953
|
}
|
|
931
|
-
function ProgressOverview({ team }) {
|
|
954
|
+
function ProgressOverview({ team, t }) {
|
|
932
955
|
const running = team.tasks.filter((task) => task.state === "running").length;
|
|
933
956
|
const blocked = team.tasks.filter((task) => task.state === "blocked").length;
|
|
934
957
|
const completed = team.tasks.filter((task) => task.status === "completed").length;
|
|
935
958
|
const summaryTone = blocked > 0 ? "warning" : completed === team.tasks.length && team.tasks.length > 0 ? "completed" : "running";
|
|
936
959
|
return (0, react_jsx_runtime.jsxs)("section", {
|
|
937
960
|
className: ActivityPanel_module_css_default.progressOverview,
|
|
938
|
-
"aria-label": "
|
|
961
|
+
"aria-label": t("progress.aria"),
|
|
939
962
|
"data-progress-summary": true,
|
|
940
963
|
children: [
|
|
941
964
|
(0, react_jsx_runtime.jsx)("span", {
|
|
942
965
|
className: ActivityPanel_module_css_default.progressTitle,
|
|
943
|
-
children: "
|
|
966
|
+
children: t("progress.title")
|
|
944
967
|
}),
|
|
945
968
|
team.tasks.length > 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
946
969
|
className: ActivityPanel_module_css_default.progressSegments,
|
|
@@ -950,29 +973,29 @@ window.__ModuleLoader__.load({
|
|
|
950
973
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
951
974
|
className: ActivityPanel_module_css_default.progressLegend,
|
|
952
975
|
children: [
|
|
953
|
-
(0, react_jsx_runtime.
|
|
976
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
954
977
|
"data-state": "running",
|
|
955
|
-
children:
|
|
978
|
+
children: t("progress.running", { count: running })
|
|
956
979
|
}),
|
|
957
|
-
(0, react_jsx_runtime.
|
|
980
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
958
981
|
"data-state": "blocked",
|
|
959
|
-
children:
|
|
982
|
+
children: t("progress.blocked", { count: blocked })
|
|
960
983
|
}),
|
|
961
|
-
(0, react_jsx_runtime.
|
|
984
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
962
985
|
"data-state": "completed",
|
|
963
|
-
children:
|
|
986
|
+
children: t("progress.delivered", { count: completed })
|
|
964
987
|
})
|
|
965
988
|
]
|
|
966
989
|
}),
|
|
967
990
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
968
991
|
className: ActivityPanel_module_css_default.progressSummary,
|
|
969
992
|
"data-state": summaryTone,
|
|
970
|
-
children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team) })]
|
|
993
|
+
children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team, t) })]
|
|
971
994
|
})
|
|
972
995
|
]
|
|
973
996
|
});
|
|
974
997
|
}
|
|
975
|
-
function DependencyMap({ tasks }) {
|
|
998
|
+
function DependencyMap({ tasks, t }) {
|
|
976
999
|
const [open, setOpen] = (0, react.useState)(true);
|
|
977
1000
|
const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
|
|
978
1001
|
const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
|
|
@@ -1015,7 +1038,7 @@ window.__ModuleLoader__.load({
|
|
|
1015
1038
|
const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));
|
|
1016
1039
|
return (0, react_jsx_runtime.jsxs)("section", {
|
|
1017
1040
|
className: ActivityPanel_module_css_default.dependencySection,
|
|
1018
|
-
"aria-label": "
|
|
1041
|
+
"aria-label": t("dependency.aria"),
|
|
1019
1042
|
"data-dependency-map": true,
|
|
1020
1043
|
children: [(0, react_jsx_runtime.jsxs)("header", {
|
|
1021
1044
|
className: ActivityPanel_module_css_default.sectionHead,
|
|
@@ -1030,11 +1053,11 @@ window.__ModuleLoader__.load({
|
|
|
1030
1053
|
(0, react_jsx_runtime.jsx)(Chevron, { open }),
|
|
1031
1054
|
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
|
|
1032
1055
|
" ",
|
|
1033
|
-
parallel ? "
|
|
1056
|
+
t(parallel ? "dependency.parallel" : "dependency.title")
|
|
1034
1057
|
]
|
|
1035
1058
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1036
1059
|
className: ActivityPanel_module_css_default.sectionHint,
|
|
1037
|
-
children: pinnedTaskId === null ? parallel ? "
|
|
1060
|
+
children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
|
|
1038
1061
|
})]
|
|
1039
1062
|
}), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
|
|
1040
1063
|
className: ActivityPanel_module_css_default.dagViewport,
|
|
@@ -1099,7 +1122,7 @@ window.__ModuleLoader__.load({
|
|
|
1099
1122
|
}),
|
|
1100
1123
|
task.state === "running" && (0, react_jsx_runtime.jsx)("span", {
|
|
1101
1124
|
className: ActivityPanel_module_css_default.dagRunningState,
|
|
1102
|
-
"aria-label": "
|
|
1125
|
+
"aria-label": t("task.runningAria"),
|
|
1103
1126
|
children: (0, react_jsx_runtime.jsx)(WorkGlyph, { active: true })
|
|
1104
1127
|
})
|
|
1105
1128
|
]
|
|
@@ -1124,27 +1147,27 @@ window.__ModuleLoader__.load({
|
|
|
1124
1147
|
(0, react_jsx_runtime.jsx)("span", {
|
|
1125
1148
|
className: ActivityPanel_module_css_default.taskDetailBadge,
|
|
1126
1149
|
"data-state": taskTone(detailTask.state, detailTask.status),
|
|
1127
|
-
children: taskStatusLabel(detailTask.status)
|
|
1150
|
+
children: taskStatusLabel(detailTask.status, t)
|
|
1128
1151
|
})
|
|
1129
1152
|
]
|
|
1130
1153
|
}),
|
|
1131
1154
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1132
1155
|
className: ActivityPanel_module_css_default.taskDetailLine,
|
|
1133
1156
|
children: [
|
|
1134
|
-
detailTask.assignee || "
|
|
1157
|
+
detailTask.assignee || t("task.assignee.unclaimed"),
|
|
1135
1158
|
" · ",
|
|
1136
|
-
detailTask.status === "completed" ? "
|
|
1159
|
+
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) })
|
|
1137
1160
|
]
|
|
1138
1161
|
}),
|
|
1139
1162
|
(0, react_jsx_runtime.jsx)("span", {
|
|
1140
1163
|
className: ActivityPanel_module_css_default.taskDetailMeta,
|
|
1141
|
-
children: dependents.length === 0 ? "
|
|
1164
|
+
children: dependents.length === 0 ? t("task.detail.noDownstream") : t("task.detail.unlocks", { tasks: formatTaskIds(dependents.map((task) => task.id), t) })
|
|
1142
1165
|
})
|
|
1143
1166
|
]
|
|
1144
1167
|
})] })]
|
|
1145
1168
|
});
|
|
1146
1169
|
}
|
|
1147
|
-
function TeamSection({ team, onNavigate, historic = false }) {
|
|
1170
|
+
function TeamSection({ team, onNavigate, t, historic = false }) {
|
|
1148
1171
|
const [membersOpen, setMembersOpen] = (0, react.useState)(true);
|
|
1149
1172
|
const busyCount = team.members.filter((member) => member.activity === "working").length;
|
|
1150
1173
|
const assignedCount = team.tasks.filter((task) => task.assignee !== "").length;
|
|
@@ -1164,27 +1187,25 @@ window.__ModuleLoader__.load({
|
|
|
1164
1187
|
}),
|
|
1165
1188
|
historic && (0, react_jsx_runtime.jsx)("span", {
|
|
1166
1189
|
className: ActivityPanel_module_css_default.historicPill,
|
|
1167
|
-
children: "
|
|
1190
|
+
children: t("team.ended")
|
|
1168
1191
|
}),
|
|
1169
1192
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1170
1193
|
className: ActivityPanel_module_css_default.teamStats,
|
|
1171
1194
|
children: [
|
|
1172
|
-
(0, react_jsx_runtime.
|
|
1195
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
1173
1196
|
"data-stat": "members",
|
|
1174
|
-
children:
|
|
1197
|
+
children: t("team.stats.members", { count: team.members.length })
|
|
1175
1198
|
}),
|
|
1176
|
-
(0, react_jsx_runtime.
|
|
1199
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
1177
1200
|
"data-stat": "tasks",
|
|
1178
|
-
children:
|
|
1179
|
-
completedCount,
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
" 完成"
|
|
1183
|
-
]
|
|
1201
|
+
children: t("team.stats.completed", {
|
|
1202
|
+
completed: completedCount,
|
|
1203
|
+
total: team.tasks.length
|
|
1204
|
+
})
|
|
1184
1205
|
}),
|
|
1185
|
-
(0, react_jsx_runtime.
|
|
1206
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
1186
1207
|
"data-stat": "messages",
|
|
1187
|
-
children:
|
|
1208
|
+
children: t("team.stats.messages", { count: team.messageCount })
|
|
1188
1209
|
})
|
|
1189
1210
|
]
|
|
1190
1211
|
})
|
|
@@ -1192,7 +1213,7 @@ window.__ModuleLoader__.load({
|
|
|
1192
1213
|
}),
|
|
1193
1214
|
(0, react_jsx_runtime.jsxs)("section", {
|
|
1194
1215
|
className: ActivityPanel_module_css_default.delegationSection,
|
|
1195
|
-
"aria-label": "
|
|
1216
|
+
"aria-label": t("delegation.aria"),
|
|
1196
1217
|
"data-delegation-map": true,
|
|
1197
1218
|
children: [
|
|
1198
1219
|
(0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -1213,30 +1234,30 @@ window.__ModuleLoader__.load({
|
|
|
1213
1234
|
className: ActivityPanel_module_css_default.captainLine,
|
|
1214
1235
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
1215
1236
|
className: ActivityPanel_module_css_default.captainName,
|
|
1216
|
-
children: "
|
|
1237
|
+
children: t("captain.name")
|
|
1217
1238
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1218
1239
|
className: ActivityPanel_module_css_default.captainRole,
|
|
1219
|
-
children: "
|
|
1240
|
+
children: t("captain.role")
|
|
1220
1241
|
})]
|
|
1221
|
-
}), (0, react_jsx_runtime.
|
|
1242
|
+
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1222
1243
|
className: ActivityPanel_module_css_default.captainSummary,
|
|
1223
|
-
children:
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
team.members.length,
|
|
1228
|
-
" 名成员"
|
|
1229
|
-
]
|
|
1244
|
+
children: t("captain.summary", {
|
|
1245
|
+
tasks: assignedCount,
|
|
1246
|
+
members: team.members.length
|
|
1247
|
+
})
|
|
1230
1248
|
})]
|
|
1231
1249
|
}),
|
|
1232
1250
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1233
1251
|
className: ActivityPanel_module_css_default.captainState,
|
|
1234
1252
|
"data-busy": busyCount > 0,
|
|
1235
|
-
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ?
|
|
1253
|
+
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ? t("captain.state.working", { count: busyCount }) : t(allCompleted ? "captain.state.collected" : "captain.state.waiting")]
|
|
1236
1254
|
})
|
|
1237
1255
|
]
|
|
1238
1256
|
}),
|
|
1239
|
-
(0, react_jsx_runtime.jsx)(ProgressOverview, {
|
|
1257
|
+
(0, react_jsx_runtime.jsx)(ProgressOverview, {
|
|
1258
|
+
team,
|
|
1259
|
+
t
|
|
1260
|
+
}),
|
|
1240
1261
|
(0, react_jsx_runtime.jsxs)("button", {
|
|
1241
1262
|
type: "button",
|
|
1242
1263
|
className: ActivityPanel_module_css_default.membersToggle,
|
|
@@ -1245,17 +1266,13 @@ window.__ModuleLoader__.load({
|
|
|
1245
1266
|
},
|
|
1246
1267
|
"aria-expanded": membersOpen,
|
|
1247
1268
|
"data-members-toggle": true,
|
|
1248
|
-
children: [(0, react_jsx_runtime.jsxs)("span", { children: [
|
|
1249
|
-
(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }),
|
|
1250
|
-
"成员 ",
|
|
1251
|
-
team.members.length
|
|
1252
|
-
] }), (0, react_jsx_runtime.jsx)("span", { children: membersOpen ? "收起" : "展开" })]
|
|
1269
|
+
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: t(membersOpen ? "members.collapse" : "members.expand") })]
|
|
1253
1270
|
}),
|
|
1254
1271
|
membersOpen && (0, react_jsx_runtime.jsxs)("div", {
|
|
1255
1272
|
className: ActivityPanel_module_css_default.delegationTree,
|
|
1256
1273
|
children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
|
|
1257
1274
|
className: ActivityPanel_module_css_default.emptyHint,
|
|
1258
|
-
children: "
|
|
1275
|
+
children: t("members.empty")
|
|
1259
1276
|
}), team.members.map((member) => {
|
|
1260
1277
|
const owned = team.tasks.filter((task) => task.assignee === member.name);
|
|
1261
1278
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -1272,7 +1289,7 @@ window.__ModuleLoader__.load({
|
|
|
1272
1289
|
className: ActivityPanel_module_css_default.memberRow,
|
|
1273
1290
|
"data-activity": member.activity,
|
|
1274
1291
|
onClick: () => {
|
|
1275
|
-
if (member.id !== "") onNavigate(member.id);
|
|
1292
|
+
if (member.id !== "") onNavigate(team.captainSessionId, member.id);
|
|
1276
1293
|
},
|
|
1277
1294
|
children: [
|
|
1278
1295
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
@@ -1311,12 +1328,12 @@ window.__ModuleLoader__.load({
|
|
|
1311
1328
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1312
1329
|
className: ActivityPanel_module_css_default.memberState,
|
|
1313
1330
|
"data-activity": member.activity,
|
|
1314
|
-
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic)]
|
|
1331
|
+
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic, t)]
|
|
1315
1332
|
})
|
|
1316
1333
|
]
|
|
1317
1334
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1318
1335
|
className: ActivityPanel_module_css_default.memberStatusLine,
|
|
1319
|
-
children: memberStatusText(member, team.tasks)
|
|
1336
|
+
children: memberStatusText(member, team.tasks, t)
|
|
1320
1337
|
})]
|
|
1321
1338
|
}),
|
|
1322
1339
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
@@ -1333,12 +1350,12 @@ window.__ModuleLoader__.load({
|
|
|
1333
1350
|
className: ActivityPanel_module_css_default.assignmentLine,
|
|
1334
1351
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
1335
1352
|
className: ActivityPanel_module_css_default.assignmentLabel,
|
|
1336
|
-
children: "
|
|
1353
|
+
children: t("assignment.label")
|
|
1337
1354
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1338
1355
|
className: ActivityPanel_module_css_default.assignmentTasks,
|
|
1339
1356
|
children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
1340
1357
|
className: ActivityPanel_module_css_default.taskEmpty,
|
|
1341
|
-
children: "
|
|
1358
|
+
children: t("assignment.empty")
|
|
1342
1359
|
}) : owned.map((task) => (0, react_jsx_runtime.jsx)("span", {
|
|
1343
1360
|
className: ActivityPanel_module_css_default.assignmentChip,
|
|
1344
1361
|
"data-state": taskTone(task.state, task.status),
|
|
@@ -1353,7 +1370,10 @@ window.__ModuleLoader__.load({
|
|
|
1353
1370
|
})
|
|
1354
1371
|
]
|
|
1355
1372
|
}),
|
|
1356
|
-
(0, react_jsx_runtime.jsx)(DependencyMap, {
|
|
1373
|
+
(0, react_jsx_runtime.jsx)(DependencyMap, {
|
|
1374
|
+
tasks: team.tasks,
|
|
1375
|
+
t
|
|
1376
|
+
})
|
|
1357
1377
|
]
|
|
1358
1378
|
});
|
|
1359
1379
|
}
|
|
@@ -1380,14 +1400,11 @@ window.__ModuleLoader__.load({
|
|
|
1380
1400
|
captainInbox: []
|
|
1381
1401
|
};
|
|
1382
1402
|
}
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
* session is the one currently open. */
|
|
1386
|
-
function ActivityPanel({ sessionsList, openSession }) {
|
|
1387
|
-
const navigateToSession = (id) => {
|
|
1403
|
+
function ActivityPanel({ sessionsList, openMember, t }) {
|
|
1404
|
+
const navigateToSession = (parentId, childId) => {
|
|
1388
1405
|
setOpen(false);
|
|
1389
1406
|
setWasActive(false);
|
|
1390
|
-
|
|
1407
|
+
openMember(parentId, childId);
|
|
1391
1408
|
};
|
|
1392
1409
|
const [open, setOpen] = (0, react.useState)(false);
|
|
1393
1410
|
const [openOwner, setOpenOwner] = (0, react.useState)();
|
|
@@ -1480,12 +1497,12 @@ window.__ModuleLoader__.load({
|
|
|
1480
1497
|
geometry.width
|
|
1481
1498
|
]);
|
|
1482
1499
|
(0, react.useEffect)(() => {
|
|
1483
|
-
if (
|
|
1484
|
-
const controller = startActivityPolling(currentTargets);
|
|
1500
|
+
if (current === void 0) return;
|
|
1501
|
+
const controller = startActivityPolling(currentTargets, { discoverySessionId: current });
|
|
1485
1502
|
return () => {
|
|
1486
1503
|
controller.stop();
|
|
1487
1504
|
};
|
|
1488
|
-
}, [currentTargets]);
|
|
1505
|
+
}, [current, currentTargets]);
|
|
1489
1506
|
(0, react.useEffect)(() => {
|
|
1490
1507
|
const onOpenPanel = (event) => {
|
|
1491
1508
|
const activeSession = currentRef.current;
|
|
@@ -1662,6 +1679,7 @@ window.__ModuleLoader__.load({
|
|
|
1662
1679
|
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {
|
|
1663
1680
|
count: visibleCount,
|
|
1664
1681
|
busy,
|
|
1682
|
+
t,
|
|
1665
1683
|
onClick: () => {
|
|
1666
1684
|
if (current === void 0) return;
|
|
1667
1685
|
setOpenOwner(current);
|
|
@@ -1677,7 +1695,7 @@ window.__ModuleLoader__.load({
|
|
|
1677
1695
|
"data-compact": compact || void 0,
|
|
1678
1696
|
"data-dragging": interaction === "dragging" || void 0,
|
|
1679
1697
|
"data-resizing": interaction === "resizing" || void 0,
|
|
1680
|
-
"aria-label": "
|
|
1698
|
+
"aria-label": t("activity.panelAria"),
|
|
1681
1699
|
children: [
|
|
1682
1700
|
(0, react_jsx_runtime.jsxs)("header", {
|
|
1683
1701
|
className: ActivityPanel_module_css_default.panelHead,
|
|
@@ -1688,7 +1706,7 @@ window.__ModuleLoader__.load({
|
|
|
1688
1706
|
"data-drag-handle": !compact || void 0,
|
|
1689
1707
|
children: [(0, react_jsx_runtime.jsxs)("span", {
|
|
1690
1708
|
className: ActivityPanel_module_css_default.panelTitle,
|
|
1691
|
-
children: ["
|
|
1709
|
+
children: [t("activity.title"), (0, react_jsx_runtime.jsx)("span", {
|
|
1692
1710
|
className: ActivityPanel_module_css_default.panelDot,
|
|
1693
1711
|
"data-busy": busy,
|
|
1694
1712
|
"aria-hidden": true
|
|
@@ -1701,8 +1719,8 @@ window.__ModuleLoader__.load({
|
|
|
1701
1719
|
"data-control": "dock",
|
|
1702
1720
|
"data-mode": geometry.mode,
|
|
1703
1721
|
onClick: toggleDock,
|
|
1704
|
-
"aria-label": geometry.mode === "docked" ? "
|
|
1705
|
-
title: geometry.mode === "docked" ? "
|
|
1722
|
+
"aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
|
|
1723
|
+
title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
|
|
1706
1724
|
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
|
|
1707
1725
|
}), (0, react_jsx_runtime.jsx)("button", {
|
|
1708
1726
|
type: "button",
|
|
@@ -1712,8 +1730,8 @@ window.__ModuleLoader__.load({
|
|
|
1712
1730
|
setOpen(false);
|
|
1713
1731
|
setOpenOwner(void 0);
|
|
1714
1732
|
},
|
|
1715
|
-
"aria-label": "
|
|
1716
|
-
title: "
|
|
1733
|
+
"aria-label": t("activity.collapse"),
|
|
1734
|
+
title: t("activity.collapse"),
|
|
1717
1735
|
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
|
|
1718
1736
|
})]
|
|
1719
1737
|
})]
|
|
@@ -1722,27 +1740,33 @@ window.__ModuleLoader__.load({
|
|
|
1722
1740
|
className: ActivityPanel_module_css_default.teams,
|
|
1723
1741
|
children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
1724
1742
|
className: ActivityPanel_module_css_default.emptyHint,
|
|
1725
|
-
children: "
|
|
1743
|
+
children: t("activity.empty")
|
|
1726
1744
|
}) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
1727
1745
|
visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {
|
|
1728
1746
|
team,
|
|
1729
|
-
onNavigate: navigateToSession
|
|
1747
|
+
onNavigate: navigateToSession,
|
|
1748
|
+
t
|
|
1730
1749
|
}, team.teamId)),
|
|
1731
|
-
visibleArchived.map((team) => (0, react_jsx_runtime.
|
|
1750
|
+
visibleArchived.map((team) => (0, react_jsx_runtime.jsxs)("div", {
|
|
1732
1751
|
"data-team-id": team.teamId,
|
|
1733
1752
|
"data-historic": true,
|
|
1734
1753
|
className: ActivityPanel_module_css_default.archivedWrap,
|
|
1735
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
1754
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
1755
|
+
className: ActivityPanel_module_css_default.archiveLabel,
|
|
1756
|
+
children: t("archive.label")
|
|
1757
|
+
}), (0, react_jsx_runtime.jsx)(TeamSection, {
|
|
1736
1758
|
team,
|
|
1737
1759
|
onNavigate: navigateToSession,
|
|
1760
|
+
t,
|
|
1738
1761
|
historic: true
|
|
1739
|
-
})
|
|
1762
|
+
})]
|
|
1740
1763
|
}, `${team.captainSessionId}:${team.teamId}`)),
|
|
1741
1764
|
visibleHistoric.map(({ data: team, owner }) => {
|
|
1742
1765
|
const teamKey = `${owner}:${team.teamId}`;
|
|
1743
1766
|
return (0, react_jsx_runtime.jsx)(TeamSection, {
|
|
1744
1767
|
team: historicCardTeam(team, owner),
|
|
1745
1768
|
onNavigate: navigateToSession,
|
|
1769
|
+
t,
|
|
1746
1770
|
historic: true
|
|
1747
1771
|
}, teamKey);
|
|
1748
1772
|
})
|
|
@@ -1867,12 +1891,205 @@ window.__ModuleLoader__.load({
|
|
|
1867
1891
|
}
|
|
1868
1892
|
};
|
|
1869
1893
|
//#endregion
|
|
1894
|
+
//#region lib/client/locales.js
|
|
1895
|
+
/** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */
|
|
1896
|
+
/** Dictionary namespace owned by the AgentTeams client plugin. */
|
|
1897
|
+
const AGENT_TEAMS_LOCALE_NAMESPACE = "agentTeams";
|
|
1898
|
+
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
1899
|
+
const zh = {
|
|
1900
|
+
"card.memberCount": "{count} 名成员",
|
|
1901
|
+
"action.openActivityPanel": "打开活动面板",
|
|
1902
|
+
"activity.panelButton": "活动面板",
|
|
1903
|
+
"activity.badgeAria": "AgentTeams 活动,{count} 个团队",
|
|
1904
|
+
"activity.panelAria": "AgentTeams 活动面板",
|
|
1905
|
+
"activity.title": "AgentTeams 活动",
|
|
1906
|
+
"activity.float": "切换为浮动面板",
|
|
1907
|
+
"activity.dockRight": "停靠到右侧",
|
|
1908
|
+
"activity.collapse": "收起活动面板",
|
|
1909
|
+
"activity.empty": "暂无团队活动",
|
|
1910
|
+
"format.listSeparator": "、",
|
|
1911
|
+
"task.status.pending": "待领取",
|
|
1912
|
+
"task.status.claimed": "已认领",
|
|
1913
|
+
"task.status.inProgress": "进行中",
|
|
1914
|
+
"task.status.completed": "已完成",
|
|
1915
|
+
"task.status.failed": "失败",
|
|
1916
|
+
"task.status.cancelled": "已取消",
|
|
1917
|
+
"member.state.working": "工作中",
|
|
1918
|
+
"member.state.failed": "有失败",
|
|
1919
|
+
"member.state.waiting": "等待",
|
|
1920
|
+
"member.state.delivered": "已交付",
|
|
1921
|
+
"member.state.left": "已离队",
|
|
1922
|
+
"member.state.removed": "已移除",
|
|
1923
|
+
"member.state.pending": "待执行",
|
|
1924
|
+
"member.state.unassigned": "待派工",
|
|
1925
|
+
"member.status.executing": "正在执行 {taskId}",
|
|
1926
|
+
"member.status.working": "正在处理已派任务",
|
|
1927
|
+
"member.status.waitingOn": "等待 {taskId} · {assignee}",
|
|
1928
|
+
"member.status.waitingPrerequisite": "等待前置任务",
|
|
1929
|
+
"member.status.waitingAssignment": "等待队长派工",
|
|
1930
|
+
"member.status.delivered": "任务已交付",
|
|
1931
|
+
"member.status.idle": "待继续执行",
|
|
1932
|
+
"member.status.unknown": "状态未知",
|
|
1933
|
+
"task.assignee.unclaimed": "待认领",
|
|
1934
|
+
"task.summary.waitingBreakdown": "等待队长拆解任务",
|
|
1935
|
+
"task.summary.allDelivered": "全部 {count} 项任务已交付",
|
|
1936
|
+
"task.summary.blockedAndRunning": "{tasks}{more} 等待前置,其余已开工",
|
|
1937
|
+
"task.summary.more": " 等 {count} 项",
|
|
1938
|
+
"task.summary.running": "{tasks} 正在执行",
|
|
1939
|
+
"task.summary.ready": "{tasks} 已就绪待开工",
|
|
1940
|
+
"task.summary.blocked": "{tasks} 等待前置",
|
|
1941
|
+
"task.summary.waitingSchedule": "等待下一轮调度",
|
|
1942
|
+
"progress.aria": "团队总进度",
|
|
1943
|
+
"progress.title": "总进度",
|
|
1944
|
+
"progress.running": "■ 进行中 {count}",
|
|
1945
|
+
"progress.blocked": "■ 等待依赖 {count}",
|
|
1946
|
+
"progress.delivered": "■ 已交付 {count}",
|
|
1947
|
+
"dependency.aria": "任务依赖链",
|
|
1948
|
+
"dependency.parallel": "并行任务",
|
|
1949
|
+
"dependency.title": "任务依赖",
|
|
1950
|
+
"dependency.hint.parallel": "无前后依赖 · 点击查看详情",
|
|
1951
|
+
"dependency.hint.chain": "悬停高亮依赖链 · 点击固定",
|
|
1952
|
+
"dependency.hint.pinned": "{taskId} 已固定 · Esc 取消",
|
|
1953
|
+
"task.runningAria": "运行中",
|
|
1954
|
+
"task.detail.completed": "已完成并交付",
|
|
1955
|
+
"task.detail.noPrerequisite": "无前置,可立即开工",
|
|
1956
|
+
"task.detail.ready": "前置已就绪,可开工",
|
|
1957
|
+
"task.detail.waitingOn": "等待 {tasks}",
|
|
1958
|
+
"task.detail.noDownstream": "无下游任务",
|
|
1959
|
+
"task.detail.unlocks": "完成后解锁 {tasks}",
|
|
1960
|
+
"team.ended": "已结束",
|
|
1961
|
+
"team.stats.members": "{count} 名成员",
|
|
1962
|
+
"team.stats.completed": "{completed}/{total} 完成",
|
|
1963
|
+
"team.stats.messages": "{count} 条消息",
|
|
1964
|
+
"delegation.aria": "队长派工关系",
|
|
1965
|
+
"captain.name": "队长",
|
|
1966
|
+
"captain.role": "拆解 · 派发 · 汇总",
|
|
1967
|
+
"captain.summary": "已派发 {tasks} 项任务给 {members} 名成员",
|
|
1968
|
+
"captain.state.working": "{count} 人执行中",
|
|
1969
|
+
"captain.state.collected": "已收齐",
|
|
1970
|
+
"captain.state.waiting": "等待回报",
|
|
1971
|
+
"members.toggle": "{count} 名成员",
|
|
1972
|
+
"members.collapse": "收起",
|
|
1973
|
+
"members.expand": "展开",
|
|
1974
|
+
"members.empty": "暂无成员,等待队长组建团队",
|
|
1975
|
+
"assignment.label": "队长派发",
|
|
1976
|
+
"assignment.empty": "暂无任务",
|
|
1977
|
+
"archive.label": "已结束 · 历史归档"
|
|
1978
|
+
};
|
|
1979
|
+
/** English dictionary, checked complete against the Chinese source key set. */
|
|
1980
|
+
const en = {
|
|
1981
|
+
"card.memberCount": "{count} members",
|
|
1982
|
+
"action.openActivityPanel": "Open activity panel",
|
|
1983
|
+
"activity.panelButton": "Activity panel",
|
|
1984
|
+
"activity.badgeAria": "AgentTeams activity, {count} teams",
|
|
1985
|
+
"activity.panelAria": "AgentTeams activity panel",
|
|
1986
|
+
"activity.title": "AgentTeams activity",
|
|
1987
|
+
"activity.float": "Switch to floating panel",
|
|
1988
|
+
"activity.dockRight": "Dock to the right",
|
|
1989
|
+
"activity.collapse": "Collapse activity panel",
|
|
1990
|
+
"activity.empty": "No team activity",
|
|
1991
|
+
"format.listSeparator": ", ",
|
|
1992
|
+
"task.status.pending": "Unclaimed",
|
|
1993
|
+
"task.status.claimed": "Claimed",
|
|
1994
|
+
"task.status.inProgress": "In progress",
|
|
1995
|
+
"task.status.completed": "Completed",
|
|
1996
|
+
"task.status.failed": "Failed",
|
|
1997
|
+
"task.status.cancelled": "Cancelled",
|
|
1998
|
+
"member.state.working": "Working",
|
|
1999
|
+
"member.state.failed": "Has failures",
|
|
2000
|
+
"member.state.waiting": "Waiting",
|
|
2001
|
+
"member.state.delivered": "Delivered",
|
|
2002
|
+
"member.state.left": "Left team",
|
|
2003
|
+
"member.state.removed": "Removed",
|
|
2004
|
+
"member.state.pending": "Pending",
|
|
2005
|
+
"member.state.unassigned": "Awaiting assignment",
|
|
2006
|
+
"member.status.executing": "Working on {taskId}",
|
|
2007
|
+
"member.status.working": "Working on assigned tasks",
|
|
2008
|
+
"member.status.waitingOn": "Waiting for {taskId} · {assignee}",
|
|
2009
|
+
"member.status.waitingPrerequisite": "Waiting for prerequisites",
|
|
2010
|
+
"member.status.waitingAssignment": "Waiting for the captain to assign work",
|
|
2011
|
+
"member.status.delivered": "Tasks delivered",
|
|
2012
|
+
"member.status.idle": "Ready to continue",
|
|
2013
|
+
"member.status.unknown": "Status unknown",
|
|
2014
|
+
"task.assignee.unclaimed": "Unclaimed",
|
|
2015
|
+
"task.summary.waitingBreakdown": "Waiting for the captain to break down the work",
|
|
2016
|
+
"task.summary.allDelivered": "All {count} tasks delivered",
|
|
2017
|
+
"task.summary.blockedAndRunning": "{tasks}{more} waiting on prerequisites; other work has started",
|
|
2018
|
+
"task.summary.more": " and {count} more",
|
|
2019
|
+
"task.summary.running": "{tasks} in progress",
|
|
2020
|
+
"task.summary.ready": "{tasks} ready to start",
|
|
2021
|
+
"task.summary.blocked": "{tasks} waiting on prerequisites",
|
|
2022
|
+
"task.summary.waitingSchedule": "Waiting for the next scheduling round",
|
|
2023
|
+
"progress.aria": "Overall team progress",
|
|
2024
|
+
"progress.title": "Overall progress",
|
|
2025
|
+
"progress.running": "■ In progress {count}",
|
|
2026
|
+
"progress.blocked": "■ Waiting {count}",
|
|
2027
|
+
"progress.delivered": "■ Delivered {count}",
|
|
2028
|
+
"dependency.aria": "Task dependency chain",
|
|
2029
|
+
"dependency.parallel": "Parallel tasks",
|
|
2030
|
+
"dependency.title": "Task dependencies",
|
|
2031
|
+
"dependency.hint.parallel": "No dependencies · Click for details",
|
|
2032
|
+
"dependency.hint.chain": "Hover to highlight dependencies · Click to pin",
|
|
2033
|
+
"dependency.hint.pinned": "{taskId} pinned · Esc to clear",
|
|
2034
|
+
"task.runningAria": "Running",
|
|
2035
|
+
"task.detail.completed": "Completed and delivered",
|
|
2036
|
+
"task.detail.noPrerequisite": "No prerequisites; ready to start",
|
|
2037
|
+
"task.detail.ready": "Prerequisites ready; can start",
|
|
2038
|
+
"task.detail.waitingOn": "Waiting for {tasks}",
|
|
2039
|
+
"task.detail.noDownstream": "No downstream tasks",
|
|
2040
|
+
"task.detail.unlocks": "Unlocks {tasks} when complete",
|
|
2041
|
+
"team.ended": "Ended",
|
|
2042
|
+
"team.stats.members": "{count} members",
|
|
2043
|
+
"team.stats.completed": "{completed}/{total} completed",
|
|
2044
|
+
"team.stats.messages": "{count} messages",
|
|
2045
|
+
"delegation.aria": "Captain delegation map",
|
|
2046
|
+
"captain.name": "Captain",
|
|
2047
|
+
"captain.role": "Break down · Delegate · Synthesize",
|
|
2048
|
+
"captain.summary": "Assigned {tasks} tasks to {members} members",
|
|
2049
|
+
"captain.state.working": "{count} active",
|
|
2050
|
+
"captain.state.collected": "All reports received",
|
|
2051
|
+
"captain.state.waiting": "Waiting for reports",
|
|
2052
|
+
"members.toggle": "Members {count}",
|
|
2053
|
+
"members.collapse": "Collapse",
|
|
2054
|
+
"members.expand": "Expand",
|
|
2055
|
+
"members.empty": "No members yet; waiting for the captain to assemble the team",
|
|
2056
|
+
"assignment.label": "Captain assigned",
|
|
2057
|
+
"assignment.empty": "No tasks",
|
|
2058
|
+
"archive.label": "Ended · Archived history"
|
|
2059
|
+
};
|
|
2060
|
+
//#endregion
|
|
2061
|
+
//#region lib/client/session-navigation.js
|
|
2062
|
+
/** Version-tolerant navigation into durable AgentTeams member transcripts. */
|
|
2063
|
+
/**
|
|
2064
|
+
* Open one member's persisted transcript.
|
|
2065
|
+
*
|
|
2066
|
+
* Harness rc.8 intentionally removed cold subagents from the ordinary session
|
|
2067
|
+
* list. They must first be rediscovered in their parent's catalog, then opened
|
|
2068
|
+
* with the exact parent/child/mode address. Older runtimes have only `open()`;
|
|
2069
|
+
* the fallback preserves the plugin's rc.6 peer range.
|
|
2070
|
+
*/
|
|
2071
|
+
async function openAgentTeamMember(sessions, parentSessionId, childSessionId) {
|
|
2072
|
+
if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
|
|
2073
|
+
sessions.open(childSessionId);
|
|
2074
|
+
return "session";
|
|
2075
|
+
}
|
|
2076
|
+
await sessions.refreshSubagents(parentSessionId);
|
|
2077
|
+
const retained = sessions.subagentAddress?.(childSessionId);
|
|
2078
|
+
sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
|
|
2079
|
+
parentSessionId,
|
|
2080
|
+
childSessionId,
|
|
2081
|
+
mode: "continuable"
|
|
2082
|
+
});
|
|
2083
|
+
return "subagent";
|
|
2084
|
+
}
|
|
2085
|
+
//#endregion
|
|
1870
2086
|
//#region lib/client/index.js
|
|
1871
|
-
/** Required services: conversation nodes, slots,
|
|
2087
|
+
/** Required services: conversation nodes, slots, sessions navigation, and locale. */
|
|
1872
2088
|
const inject = [
|
|
1873
2089
|
"conversationEvents",
|
|
1874
2090
|
"slots",
|
|
1875
|
-
"sessions"
|
|
2091
|
+
"sessions",
|
|
2092
|
+
"locale"
|
|
1876
2093
|
];
|
|
1877
2094
|
/** The replayed user message is the canonical transcript entry. */
|
|
1878
2095
|
function HiddenAgentTeamsCommand() {
|
|
@@ -1884,17 +2101,26 @@ window.__ModuleLoader__.load({
|
|
|
1884
2101
|
* monitor via a window event — the recovery path for an old session.
|
|
1885
2102
|
*/
|
|
1886
2103
|
function apply(ctx) {
|
|
1887
|
-
|
|
2104
|
+
ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, {
|
|
2105
|
+
zh,
|
|
2106
|
+
en
|
|
2107
|
+
}), "agent-teams: dictionaries");
|
|
2108
|
+
const openMember = (parentId, childId) => {
|
|
2109
|
+
openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {
|
|
2110
|
+
console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
|
|
2111
|
+
});
|
|
2112
|
+
};
|
|
2113
|
+
const Panel = ({ t }) => (0, react_jsx_runtime.jsx)(ActivityPanel, {
|
|
1888
2114
|
sessionsList: ctx.sessions.list,
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
}
|
|
2115
|
+
openMember,
|
|
2116
|
+
t
|
|
1892
2117
|
});
|
|
1893
2118
|
ctx.slots.inject("shell.overlay", () => ctx.slots.register({
|
|
1894
2119
|
name: "shell.overlay",
|
|
1895
2120
|
id: "agent-teams-activity",
|
|
1896
2121
|
order: 80,
|
|
1897
|
-
label: "AgentTeams activity"
|
|
2122
|
+
label: "AgentTeams activity",
|
|
2123
|
+
locale: AGENT_TEAMS_LOCALE_NAMESPACE
|
|
1898
2124
|
}, Panel));
|
|
1899
2125
|
ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({
|
|
1900
2126
|
name: "conversation.chat.commandview",
|
|
@@ -1904,9 +2130,8 @@ window.__ModuleLoader__.load({
|
|
|
1904
2130
|
ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
|
|
1905
2131
|
name: "conversation.chat.node",
|
|
1906
2132
|
key: "agent-teams",
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
} })
|
|
2133
|
+
locale: AGENT_TEAMS_LOCALE_NAMESPACE,
|
|
2134
|
+
inject: () => ({ openMember })
|
|
1910
2135
|
}, AgentTeamsCard));
|
|
1911
2136
|
}
|
|
1912
2137
|
//#endregion
|