@nanmicoder/dsh-agent-teams 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/README_ZH.md +5 -3
- package/lib/client/ActivityPanel.js +76 -61
- package/lib/client/AgentTeamsCard.js +2 -2
- package/lib/client/activity-monitor.js +38 -13
- package/lib/client/index.js +7 -3
- package/lib/client/locales.js +165 -0
- package/lib/client.js +337 -127
- package/lib/client.js.map +1 -1
- package/lib/index.js +3 -3
- package/lib/scheduler.js +49 -11
- package/lib/types/client/ActivityPanel.d.ts +4 -2
- package/lib/types/client/AgentTeamsCard.d.ts +1 -1
- package/lib/types/client/activity-monitor.d.ts +18 -6
- package/lib/types/client/index.d.ts +8 -1
- package/lib/types/client/locales.d.ts +169 -0
- package/lib/types/scheduler.d.ts +4 -1
- package/package.json +1 -1
- package/release-notes/v0.1.12.md +54 -0
- package/release-notes/v0.1.13.md +60 -0
package/lib/client.js
CHANGED
|
@@ -241,18 +241,30 @@ window.__ModuleLoader__.load({
|
|
|
241
241
|
}
|
|
242
242
|
/** Poll cadence for the live host snapshot route. */
|
|
243
243
|
const ACTIVITY_POLL_MS = 1e3;
|
|
244
|
+
/**
|
|
245
|
+
* Low-frequency probe cadence while a cardless discovery session still owns
|
|
246
|
+
* no team. The probe keeps the panel able to pick up a team created later in
|
|
247
|
+
* that session (e.g. a run_code-wrapped agent_teams_create) without turning
|
|
248
|
+
* every ordinary session into a one-second filesystem scan.
|
|
249
|
+
*/
|
|
250
|
+
const ACTIVITY_PROBE_MS = 5e3;
|
|
244
251
|
/** Host route serving live and archived team snapshots. */
|
|
245
252
|
const ACTIVITY_STATE_URL = "/plugins/dsh-agent-teams/state";
|
|
246
253
|
/**
|
|
247
254
|
* Start the single polling loop for the current session's requested targets.
|
|
248
255
|
*
|
|
249
256
|
* With neither targets nor a discovery session this is deliberately inert.
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
257
|
+
* Explicit card targets poll at the live cadence from the start. A discovery
|
|
258
|
+
* session performs an immediate live+archive restore pass, then — while it
|
|
259
|
+
* still owns no team — probes on a low-frequency cadence, so a team created
|
|
260
|
+
* later in that session (e.g. a run_code-wrapped agent_teams_create) is
|
|
261
|
+
* discovered without a manual reload, without turning every ordinary session
|
|
262
|
+
* into a one-second filesystem scan. The moment a team for the discovery
|
|
263
|
+
* session appears, the controller upgrades to the live one-second cadence for
|
|
264
|
+
* the rest of its lifetime. The caller — the session view, which stops the
|
|
265
|
+
* controller when the session is no longer current — bounds the lifetime, and
|
|
266
|
+
* archive state is refreshed when a target or a previously discovered live
|
|
267
|
+
* team disappears.
|
|
256
268
|
*/
|
|
257
269
|
function startActivityPolling(monitorTargets, runtime = {}) {
|
|
258
270
|
const discoverySessionId = runtime.discoverySessionId?.trim();
|
|
@@ -269,12 +281,20 @@ window.__ModuleLoader__.load({
|
|
|
269
281
|
const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;
|
|
270
282
|
let cancelled = false;
|
|
271
283
|
let inFlight = false;
|
|
284
|
+
let hot = monitorTargets.length > 0;
|
|
272
285
|
let discoveryComplete = false;
|
|
273
286
|
let discoveredLiveKeys = /* @__PURE__ */ new Set();
|
|
274
287
|
let controller;
|
|
288
|
+
let timer;
|
|
289
|
+
const intervalMs = () => hot ? ACTIVITY_POLL_MS : ACTIVITY_PROBE_MS;
|
|
290
|
+
const reschedule = () => {
|
|
291
|
+
cancel(timer);
|
|
292
|
+
timer = schedule(() => {
|
|
293
|
+
tick();
|
|
294
|
+
}, intervalMs());
|
|
295
|
+
};
|
|
275
296
|
const tick = async () => {
|
|
276
297
|
if (inFlight || cancelled) return;
|
|
277
|
-
if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0) return;
|
|
278
298
|
inFlight = true;
|
|
279
299
|
controller = new AbortController();
|
|
280
300
|
try {
|
|
@@ -289,6 +309,10 @@ window.__ModuleLoader__.load({
|
|
|
289
309
|
publishSnapshots({ teams: liveTeams });
|
|
290
310
|
const previousDiscoveredKeys = discoveredLiveKeys;
|
|
291
311
|
discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));
|
|
312
|
+
if (!hot && discoveredLiveKeys.size > 0) {
|
|
313
|
+
hot = true;
|
|
314
|
+
reschedule();
|
|
315
|
+
}
|
|
292
316
|
const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));
|
|
293
317
|
const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));
|
|
294
318
|
const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;
|
|
@@ -310,9 +334,9 @@ window.__ModuleLoader__.load({
|
|
|
310
334
|
}
|
|
311
335
|
};
|
|
312
336
|
const firstTick = tick();
|
|
313
|
-
|
|
337
|
+
if (timer === void 0) timer = schedule(() => {
|
|
314
338
|
tick();
|
|
315
|
-
},
|
|
339
|
+
}, intervalMs());
|
|
316
340
|
return {
|
|
317
341
|
firstTick,
|
|
318
342
|
stop: () => {
|
|
@@ -414,7 +438,7 @@ window.__ModuleLoader__.load({
|
|
|
414
438
|
} }));
|
|
415
439
|
}
|
|
416
440
|
/** Render one durable team as a compact conversation card. */
|
|
417
|
-
function AgentTeamsCard({ node, openMember, sessionId }) {
|
|
441
|
+
function AgentTeamsCard({ node, openMember, sessionId, t }) {
|
|
418
442
|
const data = node.data;
|
|
419
443
|
const owner = data.captainSessionId || sessionId;
|
|
420
444
|
const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
|
|
@@ -454,9 +478,9 @@ window.__ModuleLoader__.load({
|
|
|
454
478
|
title: resolved.teamName,
|
|
455
479
|
children: resolved.teamName
|
|
456
480
|
}),
|
|
457
|
-
(0, react_jsx_runtime.
|
|
481
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
458
482
|
className: AgentTeamsCard_module_css_default.memberCount,
|
|
459
|
-
children:
|
|
483
|
+
children: t("card.memberCount", { count: resolved.members.length })
|
|
460
484
|
}),
|
|
461
485
|
(0, react_jsx_runtime.jsx)("button", {
|
|
462
486
|
type: "button",
|
|
@@ -464,9 +488,9 @@ window.__ModuleLoader__.load({
|
|
|
464
488
|
onClick: () => {
|
|
465
489
|
openActivityPanel(resolved);
|
|
466
490
|
},
|
|
467
|
-
"aria-label": "
|
|
468
|
-
title: "
|
|
469
|
-
children: "
|
|
491
|
+
"aria-label": t("action.openActivityPanel"),
|
|
492
|
+
title: t("action.openActivityPanel"),
|
|
493
|
+
children: t("activity.panelButton")
|
|
470
494
|
})
|
|
471
495
|
]
|
|
472
496
|
}), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -650,7 +674,7 @@ window.__ModuleLoader__.load({
|
|
|
650
674
|
}
|
|
651
675
|
//#endregion
|
|
652
676
|
//#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
|
|
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_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}}";
|
|
677
|
+
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}}";
|
|
654
678
|
const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
|
|
655
679
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
656
680
|
const tag = document.createElement("style");
|
|
@@ -667,7 +691,7 @@ window.__ModuleLoader__.load({
|
|
|
667
691
|
"agentTeamsPulse": "aYQbCq_agentTeamsPulse",
|
|
668
692
|
"agentTeamsThink": "aYQbCq_agentTeamsThink",
|
|
669
693
|
"agentTeamsUnreadPulse": "aYQbCq_agentTeamsUnreadPulse",
|
|
670
|
-
"
|
|
694
|
+
"archiveLabel": "aYQbCq_archiveLabel",
|
|
671
695
|
"assignmentChip": "aYQbCq_assignmentChip",
|
|
672
696
|
"assignmentLabel": "aYQbCq_assignmentLabel",
|
|
673
697
|
"assignmentLine": "aYQbCq_assignmentLine",
|
|
@@ -822,15 +846,19 @@ window.__ModuleLoader__.load({
|
|
|
822
846
|
/** Badge text follows the raw task status (finer than the 4 visual states):
|
|
823
847
|
* claimed/pending/failed/cancelled keep their own labels and colors. */
|
|
824
848
|
const TASK_STATUS_LABEL = {
|
|
825
|
-
pending: "
|
|
826
|
-
claimed: "
|
|
827
|
-
in_progress: "
|
|
828
|
-
completed: "
|
|
829
|
-
failed: "
|
|
830
|
-
cancelled: "
|
|
849
|
+
pending: "task.status.pending",
|
|
850
|
+
claimed: "task.status.claimed",
|
|
851
|
+
in_progress: "task.status.inProgress",
|
|
852
|
+
completed: "task.status.completed",
|
|
853
|
+
failed: "task.status.failed",
|
|
854
|
+
cancelled: "task.status.cancelled"
|
|
831
855
|
};
|
|
832
|
-
function taskStatusLabel(status) {
|
|
833
|
-
|
|
856
|
+
function taskStatusLabel(status, t) {
|
|
857
|
+
const key = TASK_STATUS_LABEL[status];
|
|
858
|
+
return key === void 0 ? status : t(key);
|
|
859
|
+
}
|
|
860
|
+
function formatTaskIds(ids, t) {
|
|
861
|
+
return ids.join(t("format.listSeparator"));
|
|
834
862
|
}
|
|
835
863
|
/** Badge/bar coloring key: visual state, widened for terminal statuses. */
|
|
836
864
|
function taskTone(state, status) {
|
|
@@ -880,14 +908,14 @@ window.__ModuleLoader__.load({
|
|
|
880
908
|
});
|
|
881
909
|
}
|
|
882
910
|
/** Collapsed badge: an always-visible corner pill while any team exists. */
|
|
883
|
-
function CollapsedBadge({ count, busy, onClick }) {
|
|
911
|
+
function CollapsedBadge({ count, busy, onClick, t }) {
|
|
884
912
|
return (0, react_jsx_runtime.jsxs)("button", {
|
|
885
913
|
type: "button",
|
|
886
914
|
className: ActivityPanel_module_css_default.badge,
|
|
887
915
|
"data-agent-teams-collapsed": true,
|
|
888
916
|
"data-busy": busy,
|
|
889
917
|
onClick,
|
|
890
|
-
"aria-label":
|
|
918
|
+
"aria-label": t("activity.badgeAria", { count }),
|
|
891
919
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
892
920
|
className: ActivityPanel_module_css_default.badgeDot,
|
|
893
921
|
"data-busy": busy,
|
|
@@ -898,62 +926,68 @@ window.__ModuleLoader__.load({
|
|
|
898
926
|
})]
|
|
899
927
|
});
|
|
900
928
|
}
|
|
901
|
-
function memberStateLabel(member, tasks, historic) {
|
|
929
|
+
function memberStateLabel(member, tasks, historic, t) {
|
|
902
930
|
const owned = tasks.filter((task) => task.assignee === member.name);
|
|
903
|
-
if (member.activity === "working") return "
|
|
904
|
-
if (owned.some((task) => task.status === "failed")) return "
|
|
905
|
-
if (owned.some((task) => task.state === "blocked")) return "
|
|
906
|
-
if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "
|
|
907
|
-
if (member.status === "removed") return historic ? "
|
|
908
|
-
if (owned.length > 0) return "
|
|
909
|
-
return "
|
|
931
|
+
if (member.activity === "working") return t("member.state.working");
|
|
932
|
+
if (owned.some((task) => task.status === "failed")) return t("member.state.failed");
|
|
933
|
+
if (owned.some((task) => task.state === "blocked")) return t("member.state.waiting");
|
|
934
|
+
if (owned.length > 0 && owned.every((task) => task.status === "completed")) return t("member.state.delivered");
|
|
935
|
+
if (member.status === "removed") return t(historic ? "member.state.left" : "member.state.removed");
|
|
936
|
+
if (owned.length > 0) return t("member.state.pending");
|
|
937
|
+
return t("member.state.unassigned");
|
|
910
938
|
}
|
|
911
|
-
function memberStatusText(member, tasks) {
|
|
939
|
+
function memberStatusText(member, tasks, t) {
|
|
912
940
|
const owned = tasks.filter((task) => task.assignee === member.name);
|
|
913
941
|
const current = owned.find((task) => task.id === member.currentTask);
|
|
914
942
|
const blocked = owned.find((task) => task.state === "blocked");
|
|
915
|
-
if (member.activity === "working" && current !== void 0) return
|
|
916
|
-
if (member.activity === "working") return "
|
|
943
|
+
if (member.activity === "working" && current !== void 0) return t("member.status.executing", { taskId: current.id });
|
|
944
|
+
if (member.activity === "working") return t("member.status.working");
|
|
917
945
|
if (blocked !== void 0) {
|
|
918
946
|
const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== "completed");
|
|
919
|
-
if (dependency !== void 0) return
|
|
920
|
-
|
|
947
|
+
if (dependency !== void 0) return t("member.status.waitingOn", {
|
|
948
|
+
taskId: dependency.id,
|
|
949
|
+
assignee: dependency.assignee || t("task.assignee.unclaimed")
|
|
950
|
+
});
|
|
951
|
+
return t("member.status.waitingPrerequisite");
|
|
921
952
|
}
|
|
922
|
-
if (member.total === 0) return "
|
|
923
|
-
if (member.done === member.total) return "
|
|
924
|
-
return member.activity === "idle" ? "
|
|
953
|
+
if (member.total === 0) return t("member.status.waitingAssignment");
|
|
954
|
+
if (member.done === member.total) return t("member.status.delivered");
|
|
955
|
+
return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");
|
|
925
956
|
}
|
|
926
957
|
function compactTaskLabel(subject) {
|
|
927
958
|
const withoutVerb = subject.replace(/^开发\s*/u, "").replace(/^\d+[-_.、\s]*/u, "");
|
|
928
959
|
const head = withoutVerb.split(/[((·::]/u)[0]?.trim() ?? withoutVerb;
|
|
929
960
|
return head.length > 18 ? `${head.slice(0, 17)}…` : head;
|
|
930
961
|
}
|
|
931
|
-
function taskSummary(team) {
|
|
962
|
+
function taskSummary(team, t) {
|
|
932
963
|
const completed = team.tasks.filter((task) => task.status === "completed");
|
|
933
964
|
const running = team.tasks.filter((task) => task.state === "running");
|
|
934
965
|
const blocked = team.tasks.filter((task) => task.state === "blocked");
|
|
935
966
|
const ready = team.tasks.filter((task) => task.state === "open" && task.status !== "completed");
|
|
936
|
-
if (team.tasks.length === 0) return "
|
|
937
|
-
if (completed.length === team.tasks.length) return
|
|
938
|
-
if (blocked.length > 0 && running.length > 0) return
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
return "
|
|
967
|
+
if (team.tasks.length === 0) return t("task.summary.waitingBreakdown");
|
|
968
|
+
if (completed.length === team.tasks.length) return t("task.summary.allDelivered", { count: completed.length });
|
|
969
|
+
if (blocked.length > 0 && running.length > 0) return t("task.summary.blockedAndRunning", {
|
|
970
|
+
tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),
|
|
971
|
+
more: blocked.length > 3 ? t("task.summary.more", { count: blocked.length - 3 }) : ""
|
|
972
|
+
});
|
|
973
|
+
if (running.length > 0) return t("task.summary.running", { tasks: formatTaskIds(running.map((task) => task.id), t) });
|
|
974
|
+
if (ready.length > 0) return t("task.summary.ready", { tasks: formatTaskIds(ready.map((task) => task.id), t) });
|
|
975
|
+
if (blocked.length > 0) return t("task.summary.blocked", { tasks: formatTaskIds(blocked.map((task) => task.id), t) });
|
|
976
|
+
return t("task.summary.waitingSchedule");
|
|
943
977
|
}
|
|
944
|
-
function ProgressOverview({ team }) {
|
|
978
|
+
function ProgressOverview({ team, t }) {
|
|
945
979
|
const running = team.tasks.filter((task) => task.state === "running").length;
|
|
946
980
|
const blocked = team.tasks.filter((task) => task.state === "blocked").length;
|
|
947
981
|
const completed = team.tasks.filter((task) => task.status === "completed").length;
|
|
948
982
|
const summaryTone = blocked > 0 ? "warning" : completed === team.tasks.length && team.tasks.length > 0 ? "completed" : "running";
|
|
949
983
|
return (0, react_jsx_runtime.jsxs)("section", {
|
|
950
984
|
className: ActivityPanel_module_css_default.progressOverview,
|
|
951
|
-
"aria-label": "
|
|
985
|
+
"aria-label": t("progress.aria"),
|
|
952
986
|
"data-progress-summary": true,
|
|
953
987
|
children: [
|
|
954
988
|
(0, react_jsx_runtime.jsx)("span", {
|
|
955
989
|
className: ActivityPanel_module_css_default.progressTitle,
|
|
956
|
-
children: "
|
|
990
|
+
children: t("progress.title")
|
|
957
991
|
}),
|
|
958
992
|
team.tasks.length > 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
959
993
|
className: ActivityPanel_module_css_default.progressSegments,
|
|
@@ -963,29 +997,29 @@ window.__ModuleLoader__.load({
|
|
|
963
997
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
964
998
|
className: ActivityPanel_module_css_default.progressLegend,
|
|
965
999
|
children: [
|
|
966
|
-
(0, react_jsx_runtime.
|
|
1000
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
967
1001
|
"data-state": "running",
|
|
968
|
-
children:
|
|
1002
|
+
children: t("progress.running", { count: running })
|
|
969
1003
|
}),
|
|
970
|
-
(0, react_jsx_runtime.
|
|
1004
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
971
1005
|
"data-state": "blocked",
|
|
972
|
-
children:
|
|
1006
|
+
children: t("progress.blocked", { count: blocked })
|
|
973
1007
|
}),
|
|
974
|
-
(0, react_jsx_runtime.
|
|
1008
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
975
1009
|
"data-state": "completed",
|
|
976
|
-
children:
|
|
1010
|
+
children: t("progress.delivered", { count: completed })
|
|
977
1011
|
})
|
|
978
1012
|
]
|
|
979
1013
|
}),
|
|
980
1014
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
981
1015
|
className: ActivityPanel_module_css_default.progressSummary,
|
|
982
1016
|
"data-state": summaryTone,
|
|
983
|
-
children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team) })]
|
|
1017
|
+
children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team, t) })]
|
|
984
1018
|
})
|
|
985
1019
|
]
|
|
986
1020
|
});
|
|
987
1021
|
}
|
|
988
|
-
function DependencyMap({ tasks }) {
|
|
1022
|
+
function DependencyMap({ tasks, t }) {
|
|
989
1023
|
const [open, setOpen] = (0, react.useState)(true);
|
|
990
1024
|
const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
|
|
991
1025
|
const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
|
|
@@ -1028,7 +1062,7 @@ window.__ModuleLoader__.load({
|
|
|
1028
1062
|
const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));
|
|
1029
1063
|
return (0, react_jsx_runtime.jsxs)("section", {
|
|
1030
1064
|
className: ActivityPanel_module_css_default.dependencySection,
|
|
1031
|
-
"aria-label": "
|
|
1065
|
+
"aria-label": t("dependency.aria"),
|
|
1032
1066
|
"data-dependency-map": true,
|
|
1033
1067
|
children: [(0, react_jsx_runtime.jsxs)("header", {
|
|
1034
1068
|
className: ActivityPanel_module_css_default.sectionHead,
|
|
@@ -1043,11 +1077,11 @@ window.__ModuleLoader__.load({
|
|
|
1043
1077
|
(0, react_jsx_runtime.jsx)(Chevron, { open }),
|
|
1044
1078
|
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
|
|
1045
1079
|
" ",
|
|
1046
|
-
parallel ? "
|
|
1080
|
+
t(parallel ? "dependency.parallel" : "dependency.title")
|
|
1047
1081
|
]
|
|
1048
1082
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1049
1083
|
className: ActivityPanel_module_css_default.sectionHint,
|
|
1050
|
-
children: pinnedTaskId === null ? parallel ? "
|
|
1084
|
+
children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
|
|
1051
1085
|
})]
|
|
1052
1086
|
}), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
|
|
1053
1087
|
className: ActivityPanel_module_css_default.dagViewport,
|
|
@@ -1112,7 +1146,7 @@ window.__ModuleLoader__.load({
|
|
|
1112
1146
|
}),
|
|
1113
1147
|
task.state === "running" && (0, react_jsx_runtime.jsx)("span", {
|
|
1114
1148
|
className: ActivityPanel_module_css_default.dagRunningState,
|
|
1115
|
-
"aria-label": "
|
|
1149
|
+
"aria-label": t("task.runningAria"),
|
|
1116
1150
|
children: (0, react_jsx_runtime.jsx)(WorkGlyph, { active: true })
|
|
1117
1151
|
})
|
|
1118
1152
|
]
|
|
@@ -1137,27 +1171,27 @@ window.__ModuleLoader__.load({
|
|
|
1137
1171
|
(0, react_jsx_runtime.jsx)("span", {
|
|
1138
1172
|
className: ActivityPanel_module_css_default.taskDetailBadge,
|
|
1139
1173
|
"data-state": taskTone(detailTask.state, detailTask.status),
|
|
1140
|
-
children: taskStatusLabel(detailTask.status)
|
|
1174
|
+
children: taskStatusLabel(detailTask.status, t)
|
|
1141
1175
|
})
|
|
1142
1176
|
]
|
|
1143
1177
|
}),
|
|
1144
1178
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1145
1179
|
className: ActivityPanel_module_css_default.taskDetailLine,
|
|
1146
1180
|
children: [
|
|
1147
|
-
detailTask.assignee || "
|
|
1181
|
+
detailTask.assignee || t("task.assignee.unclaimed"),
|
|
1148
1182
|
" · ",
|
|
1149
|
-
detailTask.status === "completed" ? "
|
|
1183
|
+
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) })
|
|
1150
1184
|
]
|
|
1151
1185
|
}),
|
|
1152
1186
|
(0, react_jsx_runtime.jsx)("span", {
|
|
1153
1187
|
className: ActivityPanel_module_css_default.taskDetailMeta,
|
|
1154
|
-
children: dependents.length === 0 ? "
|
|
1188
|
+
children: dependents.length === 0 ? t("task.detail.noDownstream") : t("task.detail.unlocks", { tasks: formatTaskIds(dependents.map((task) => task.id), t) })
|
|
1155
1189
|
})
|
|
1156
1190
|
]
|
|
1157
1191
|
})] })]
|
|
1158
1192
|
});
|
|
1159
1193
|
}
|
|
1160
|
-
function TeamSection({ team, onNavigate, historic = false }) {
|
|
1194
|
+
function TeamSection({ team, onNavigate, t, historic = false }) {
|
|
1161
1195
|
const [membersOpen, setMembersOpen] = (0, react.useState)(true);
|
|
1162
1196
|
const busyCount = team.members.filter((member) => member.activity === "working").length;
|
|
1163
1197
|
const assignedCount = team.tasks.filter((task) => task.assignee !== "").length;
|
|
@@ -1177,27 +1211,25 @@ window.__ModuleLoader__.load({
|
|
|
1177
1211
|
}),
|
|
1178
1212
|
historic && (0, react_jsx_runtime.jsx)("span", {
|
|
1179
1213
|
className: ActivityPanel_module_css_default.historicPill,
|
|
1180
|
-
children: "
|
|
1214
|
+
children: t("team.ended")
|
|
1181
1215
|
}),
|
|
1182
1216
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1183
1217
|
className: ActivityPanel_module_css_default.teamStats,
|
|
1184
1218
|
children: [
|
|
1185
|
-
(0, react_jsx_runtime.
|
|
1219
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
1186
1220
|
"data-stat": "members",
|
|
1187
|
-
children:
|
|
1221
|
+
children: t("team.stats.members", { count: team.members.length })
|
|
1188
1222
|
}),
|
|
1189
|
-
(0, react_jsx_runtime.
|
|
1223
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
1190
1224
|
"data-stat": "tasks",
|
|
1191
|
-
children:
|
|
1192
|
-
completedCount,
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
" 完成"
|
|
1196
|
-
]
|
|
1225
|
+
children: t("team.stats.completed", {
|
|
1226
|
+
completed: completedCount,
|
|
1227
|
+
total: team.tasks.length
|
|
1228
|
+
})
|
|
1197
1229
|
}),
|
|
1198
|
-
(0, react_jsx_runtime.
|
|
1230
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
1199
1231
|
"data-stat": "messages",
|
|
1200
|
-
children:
|
|
1232
|
+
children: t("team.stats.messages", { count: team.messageCount })
|
|
1201
1233
|
})
|
|
1202
1234
|
]
|
|
1203
1235
|
})
|
|
@@ -1205,7 +1237,7 @@ window.__ModuleLoader__.load({
|
|
|
1205
1237
|
}),
|
|
1206
1238
|
(0, react_jsx_runtime.jsxs)("section", {
|
|
1207
1239
|
className: ActivityPanel_module_css_default.delegationSection,
|
|
1208
|
-
"aria-label": "
|
|
1240
|
+
"aria-label": t("delegation.aria"),
|
|
1209
1241
|
"data-delegation-map": true,
|
|
1210
1242
|
children: [
|
|
1211
1243
|
(0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -1226,30 +1258,30 @@ window.__ModuleLoader__.load({
|
|
|
1226
1258
|
className: ActivityPanel_module_css_default.captainLine,
|
|
1227
1259
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
1228
1260
|
className: ActivityPanel_module_css_default.captainName,
|
|
1229
|
-
children: "
|
|
1261
|
+
children: t("captain.name")
|
|
1230
1262
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1231
1263
|
className: ActivityPanel_module_css_default.captainRole,
|
|
1232
|
-
children: "
|
|
1264
|
+
children: t("captain.role")
|
|
1233
1265
|
})]
|
|
1234
|
-
}), (0, react_jsx_runtime.
|
|
1266
|
+
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1235
1267
|
className: ActivityPanel_module_css_default.captainSummary,
|
|
1236
|
-
children:
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
team.members.length,
|
|
1241
|
-
" 名成员"
|
|
1242
|
-
]
|
|
1268
|
+
children: t("captain.summary", {
|
|
1269
|
+
tasks: assignedCount,
|
|
1270
|
+
members: team.members.length
|
|
1271
|
+
})
|
|
1243
1272
|
})]
|
|
1244
1273
|
}),
|
|
1245
1274
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1246
1275
|
className: ActivityPanel_module_css_default.captainState,
|
|
1247
1276
|
"data-busy": busyCount > 0,
|
|
1248
|
-
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ?
|
|
1277
|
+
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")]
|
|
1249
1278
|
})
|
|
1250
1279
|
]
|
|
1251
1280
|
}),
|
|
1252
|
-
(0, react_jsx_runtime.jsx)(ProgressOverview, {
|
|
1281
|
+
(0, react_jsx_runtime.jsx)(ProgressOverview, {
|
|
1282
|
+
team,
|
|
1283
|
+
t
|
|
1284
|
+
}),
|
|
1253
1285
|
(0, react_jsx_runtime.jsxs)("button", {
|
|
1254
1286
|
type: "button",
|
|
1255
1287
|
className: ActivityPanel_module_css_default.membersToggle,
|
|
@@ -1258,17 +1290,13 @@ window.__ModuleLoader__.load({
|
|
|
1258
1290
|
},
|
|
1259
1291
|
"aria-expanded": membersOpen,
|
|
1260
1292
|
"data-members-toggle": true,
|
|
1261
|
-
children: [(0, react_jsx_runtime.jsxs)("span", { children: [
|
|
1262
|
-
(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }),
|
|
1263
|
-
"成员 ",
|
|
1264
|
-
team.members.length
|
|
1265
|
-
] }), (0, react_jsx_runtime.jsx)("span", { children: membersOpen ? "收起" : "展开" })]
|
|
1293
|
+
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") })]
|
|
1266
1294
|
}),
|
|
1267
1295
|
membersOpen && (0, react_jsx_runtime.jsxs)("div", {
|
|
1268
1296
|
className: ActivityPanel_module_css_default.delegationTree,
|
|
1269
1297
|
children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
|
|
1270
1298
|
className: ActivityPanel_module_css_default.emptyHint,
|
|
1271
|
-
children: "
|
|
1299
|
+
children: t("members.empty")
|
|
1272
1300
|
}), team.members.map((member) => {
|
|
1273
1301
|
const owned = team.tasks.filter((task) => task.assignee === member.name);
|
|
1274
1302
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -1324,12 +1352,12 @@ window.__ModuleLoader__.load({
|
|
|
1324
1352
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
1325
1353
|
className: ActivityPanel_module_css_default.memberState,
|
|
1326
1354
|
"data-activity": member.activity,
|
|
1327
|
-
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic)]
|
|
1355
|
+
children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic, t)]
|
|
1328
1356
|
})
|
|
1329
1357
|
]
|
|
1330
1358
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1331
1359
|
className: ActivityPanel_module_css_default.memberStatusLine,
|
|
1332
|
-
children: memberStatusText(member, team.tasks)
|
|
1360
|
+
children: memberStatusText(member, team.tasks, t)
|
|
1333
1361
|
})]
|
|
1334
1362
|
}),
|
|
1335
1363
|
(0, react_jsx_runtime.jsxs)("span", {
|
|
@@ -1346,12 +1374,12 @@ window.__ModuleLoader__.load({
|
|
|
1346
1374
|
className: ActivityPanel_module_css_default.assignmentLine,
|
|
1347
1375
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
1348
1376
|
className: ActivityPanel_module_css_default.assignmentLabel,
|
|
1349
|
-
children: "
|
|
1377
|
+
children: t("assignment.label")
|
|
1350
1378
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1351
1379
|
className: ActivityPanel_module_css_default.assignmentTasks,
|
|
1352
1380
|
children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
1353
1381
|
className: ActivityPanel_module_css_default.taskEmpty,
|
|
1354
|
-
children: "
|
|
1382
|
+
children: t("assignment.empty")
|
|
1355
1383
|
}) : owned.map((task) => (0, react_jsx_runtime.jsx)("span", {
|
|
1356
1384
|
className: ActivityPanel_module_css_default.assignmentChip,
|
|
1357
1385
|
"data-state": taskTone(task.state, task.status),
|
|
@@ -1366,7 +1394,10 @@ window.__ModuleLoader__.load({
|
|
|
1366
1394
|
})
|
|
1367
1395
|
]
|
|
1368
1396
|
}),
|
|
1369
|
-
(0, react_jsx_runtime.jsx)(DependencyMap, {
|
|
1397
|
+
(0, react_jsx_runtime.jsx)(DependencyMap, {
|
|
1398
|
+
tasks: team.tasks,
|
|
1399
|
+
t
|
|
1400
|
+
})
|
|
1370
1401
|
]
|
|
1371
1402
|
});
|
|
1372
1403
|
}
|
|
@@ -1393,10 +1424,7 @@ window.__ModuleLoader__.load({
|
|
|
1393
1424
|
captainInbox: []
|
|
1394
1425
|
};
|
|
1395
1426
|
}
|
|
1396
|
-
|
|
1397
|
-
* snapshots and historic card summaries are only shown while their captain
|
|
1398
|
-
* session is the one currently open. */
|
|
1399
|
-
function ActivityPanel({ sessionsList, openMember }) {
|
|
1427
|
+
function ActivityPanel({ sessionsList, openMember, t }) {
|
|
1400
1428
|
const navigateToSession = (parentId, childId) => {
|
|
1401
1429
|
setOpen(false);
|
|
1402
1430
|
setWasActive(false);
|
|
@@ -1675,6 +1703,7 @@ window.__ModuleLoader__.load({
|
|
|
1675
1703
|
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {
|
|
1676
1704
|
count: visibleCount,
|
|
1677
1705
|
busy,
|
|
1706
|
+
t,
|
|
1678
1707
|
onClick: () => {
|
|
1679
1708
|
if (current === void 0) return;
|
|
1680
1709
|
setOpenOwner(current);
|
|
@@ -1690,7 +1719,7 @@ window.__ModuleLoader__.load({
|
|
|
1690
1719
|
"data-compact": compact || void 0,
|
|
1691
1720
|
"data-dragging": interaction === "dragging" || void 0,
|
|
1692
1721
|
"data-resizing": interaction === "resizing" || void 0,
|
|
1693
|
-
"aria-label": "
|
|
1722
|
+
"aria-label": t("activity.panelAria"),
|
|
1694
1723
|
children: [
|
|
1695
1724
|
(0, react_jsx_runtime.jsxs)("header", {
|
|
1696
1725
|
className: ActivityPanel_module_css_default.panelHead,
|
|
@@ -1701,7 +1730,7 @@ window.__ModuleLoader__.load({
|
|
|
1701
1730
|
"data-drag-handle": !compact || void 0,
|
|
1702
1731
|
children: [(0, react_jsx_runtime.jsxs)("span", {
|
|
1703
1732
|
className: ActivityPanel_module_css_default.panelTitle,
|
|
1704
|
-
children: ["
|
|
1733
|
+
children: [t("activity.title"), (0, react_jsx_runtime.jsx)("span", {
|
|
1705
1734
|
className: ActivityPanel_module_css_default.panelDot,
|
|
1706
1735
|
"data-busy": busy,
|
|
1707
1736
|
"aria-hidden": true
|
|
@@ -1714,8 +1743,8 @@ window.__ModuleLoader__.load({
|
|
|
1714
1743
|
"data-control": "dock",
|
|
1715
1744
|
"data-mode": geometry.mode,
|
|
1716
1745
|
onClick: toggleDock,
|
|
1717
|
-
"aria-label": geometry.mode === "docked" ? "
|
|
1718
|
-
title: geometry.mode === "docked" ? "
|
|
1746
|
+
"aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
|
|
1747
|
+
title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
|
|
1719
1748
|
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
|
|
1720
1749
|
}), (0, react_jsx_runtime.jsx)("button", {
|
|
1721
1750
|
type: "button",
|
|
@@ -1725,8 +1754,8 @@ window.__ModuleLoader__.load({
|
|
|
1725
1754
|
setOpen(false);
|
|
1726
1755
|
setOpenOwner(void 0);
|
|
1727
1756
|
},
|
|
1728
|
-
"aria-label": "
|
|
1729
|
-
title: "
|
|
1757
|
+
"aria-label": t("activity.collapse"),
|
|
1758
|
+
title: t("activity.collapse"),
|
|
1730
1759
|
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
|
|
1731
1760
|
})]
|
|
1732
1761
|
})]
|
|
@@ -1735,27 +1764,33 @@ window.__ModuleLoader__.load({
|
|
|
1735
1764
|
className: ActivityPanel_module_css_default.teams,
|
|
1736
1765
|
children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
1737
1766
|
className: ActivityPanel_module_css_default.emptyHint,
|
|
1738
|
-
children: "
|
|
1767
|
+
children: t("activity.empty")
|
|
1739
1768
|
}) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
1740
1769
|
visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {
|
|
1741
1770
|
team,
|
|
1742
|
-
onNavigate: navigateToSession
|
|
1771
|
+
onNavigate: navigateToSession,
|
|
1772
|
+
t
|
|
1743
1773
|
}, team.teamId)),
|
|
1744
|
-
visibleArchived.map((team) => (0, react_jsx_runtime.
|
|
1774
|
+
visibleArchived.map((team) => (0, react_jsx_runtime.jsxs)("div", {
|
|
1745
1775
|
"data-team-id": team.teamId,
|
|
1746
1776
|
"data-historic": true,
|
|
1747
1777
|
className: ActivityPanel_module_css_default.archivedWrap,
|
|
1748
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
1778
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
1779
|
+
className: ActivityPanel_module_css_default.archiveLabel,
|
|
1780
|
+
children: t("archive.label")
|
|
1781
|
+
}), (0, react_jsx_runtime.jsx)(TeamSection, {
|
|
1749
1782
|
team,
|
|
1750
1783
|
onNavigate: navigateToSession,
|
|
1784
|
+
t,
|
|
1751
1785
|
historic: true
|
|
1752
|
-
})
|
|
1786
|
+
})]
|
|
1753
1787
|
}, `${team.captainSessionId}:${team.teamId}`)),
|
|
1754
1788
|
visibleHistoric.map(({ data: team, owner }) => {
|
|
1755
1789
|
const teamKey = `${owner}:${team.teamId}`;
|
|
1756
1790
|
return (0, react_jsx_runtime.jsx)(TeamSection, {
|
|
1757
1791
|
team: historicCardTeam(team, owner),
|
|
1758
1792
|
onNavigate: navigateToSession,
|
|
1793
|
+
t,
|
|
1759
1794
|
historic: true
|
|
1760
1795
|
}, teamKey);
|
|
1761
1796
|
})
|
|
@@ -1880,6 +1915,173 @@ window.__ModuleLoader__.load({
|
|
|
1880
1915
|
}
|
|
1881
1916
|
};
|
|
1882
1917
|
//#endregion
|
|
1918
|
+
//#region lib/client/locales.js
|
|
1919
|
+
/** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */
|
|
1920
|
+
/** Dictionary namespace owned by the AgentTeams client plugin. */
|
|
1921
|
+
const AGENT_TEAMS_LOCALE_NAMESPACE = "agentTeams";
|
|
1922
|
+
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
1923
|
+
const zh = {
|
|
1924
|
+
"card.memberCount": "{count} 名成员",
|
|
1925
|
+
"action.openActivityPanel": "打开活动面板",
|
|
1926
|
+
"activity.panelButton": "活动面板",
|
|
1927
|
+
"activity.badgeAria": "AgentTeams 活动,{count} 个团队",
|
|
1928
|
+
"activity.panelAria": "AgentTeams 活动面板",
|
|
1929
|
+
"activity.title": "AgentTeams 活动",
|
|
1930
|
+
"activity.float": "切换为浮动面板",
|
|
1931
|
+
"activity.dockRight": "停靠到右侧",
|
|
1932
|
+
"activity.collapse": "收起活动面板",
|
|
1933
|
+
"activity.empty": "暂无团队活动",
|
|
1934
|
+
"format.listSeparator": "、",
|
|
1935
|
+
"task.status.pending": "待领取",
|
|
1936
|
+
"task.status.claimed": "已认领",
|
|
1937
|
+
"task.status.inProgress": "进行中",
|
|
1938
|
+
"task.status.completed": "已完成",
|
|
1939
|
+
"task.status.failed": "失败",
|
|
1940
|
+
"task.status.cancelled": "已取消",
|
|
1941
|
+
"member.state.working": "工作中",
|
|
1942
|
+
"member.state.failed": "有失败",
|
|
1943
|
+
"member.state.waiting": "等待",
|
|
1944
|
+
"member.state.delivered": "已交付",
|
|
1945
|
+
"member.state.left": "已离队",
|
|
1946
|
+
"member.state.removed": "已移除",
|
|
1947
|
+
"member.state.pending": "待执行",
|
|
1948
|
+
"member.state.unassigned": "待派工",
|
|
1949
|
+
"member.status.executing": "正在执行 {taskId}",
|
|
1950
|
+
"member.status.working": "正在处理已派任务",
|
|
1951
|
+
"member.status.waitingOn": "等待 {taskId} · {assignee}",
|
|
1952
|
+
"member.status.waitingPrerequisite": "等待前置任务",
|
|
1953
|
+
"member.status.waitingAssignment": "等待队长派工",
|
|
1954
|
+
"member.status.delivered": "任务已交付",
|
|
1955
|
+
"member.status.idle": "待继续执行",
|
|
1956
|
+
"member.status.unknown": "状态未知",
|
|
1957
|
+
"task.assignee.unclaimed": "待认领",
|
|
1958
|
+
"task.summary.waitingBreakdown": "等待队长拆解任务",
|
|
1959
|
+
"task.summary.allDelivered": "全部 {count} 项任务已交付",
|
|
1960
|
+
"task.summary.blockedAndRunning": "{tasks}{more} 等待前置,其余已开工",
|
|
1961
|
+
"task.summary.more": " 等 {count} 项",
|
|
1962
|
+
"task.summary.running": "{tasks} 正在执行",
|
|
1963
|
+
"task.summary.ready": "{tasks} 已就绪待开工",
|
|
1964
|
+
"task.summary.blocked": "{tasks} 等待前置",
|
|
1965
|
+
"task.summary.waitingSchedule": "等待下一轮调度",
|
|
1966
|
+
"progress.aria": "团队总进度",
|
|
1967
|
+
"progress.title": "总进度",
|
|
1968
|
+
"progress.running": "■ 进行中 {count}",
|
|
1969
|
+
"progress.blocked": "■ 等待依赖 {count}",
|
|
1970
|
+
"progress.delivered": "■ 已交付 {count}",
|
|
1971
|
+
"dependency.aria": "任务依赖链",
|
|
1972
|
+
"dependency.parallel": "并行任务",
|
|
1973
|
+
"dependency.title": "任务依赖",
|
|
1974
|
+
"dependency.hint.parallel": "无前后依赖 · 点击查看详情",
|
|
1975
|
+
"dependency.hint.chain": "悬停高亮依赖链 · 点击固定",
|
|
1976
|
+
"dependency.hint.pinned": "{taskId} 已固定 · Esc 取消",
|
|
1977
|
+
"task.runningAria": "运行中",
|
|
1978
|
+
"task.detail.completed": "已完成并交付",
|
|
1979
|
+
"task.detail.noPrerequisite": "无前置,可立即开工",
|
|
1980
|
+
"task.detail.ready": "前置已就绪,可开工",
|
|
1981
|
+
"task.detail.waitingOn": "等待 {tasks}",
|
|
1982
|
+
"task.detail.noDownstream": "无下游任务",
|
|
1983
|
+
"task.detail.unlocks": "完成后解锁 {tasks}",
|
|
1984
|
+
"team.ended": "已结束",
|
|
1985
|
+
"team.stats.members": "{count} 名成员",
|
|
1986
|
+
"team.stats.completed": "{completed}/{total} 完成",
|
|
1987
|
+
"team.stats.messages": "{count} 条消息",
|
|
1988
|
+
"delegation.aria": "队长派工关系",
|
|
1989
|
+
"captain.name": "队长",
|
|
1990
|
+
"captain.role": "拆解 · 派发 · 汇总",
|
|
1991
|
+
"captain.summary": "已派发 {tasks} 项任务给 {members} 名成员",
|
|
1992
|
+
"captain.state.working": "{count} 人执行中",
|
|
1993
|
+
"captain.state.collected": "已收齐",
|
|
1994
|
+
"captain.state.waiting": "等待回报",
|
|
1995
|
+
"members.toggle": "{count} 名成员",
|
|
1996
|
+
"members.collapse": "收起",
|
|
1997
|
+
"members.expand": "展开",
|
|
1998
|
+
"members.empty": "暂无成员,等待队长组建团队",
|
|
1999
|
+
"assignment.label": "队长派发",
|
|
2000
|
+
"assignment.empty": "暂无任务",
|
|
2001
|
+
"archive.label": "已结束 · 历史归档"
|
|
2002
|
+
};
|
|
2003
|
+
/** English dictionary, checked complete against the Chinese source key set. */
|
|
2004
|
+
const en = {
|
|
2005
|
+
"card.memberCount": "{count} members",
|
|
2006
|
+
"action.openActivityPanel": "Open activity panel",
|
|
2007
|
+
"activity.panelButton": "Activity panel",
|
|
2008
|
+
"activity.badgeAria": "AgentTeams activity, {count} teams",
|
|
2009
|
+
"activity.panelAria": "AgentTeams activity panel",
|
|
2010
|
+
"activity.title": "AgentTeams activity",
|
|
2011
|
+
"activity.float": "Switch to floating panel",
|
|
2012
|
+
"activity.dockRight": "Dock to the right",
|
|
2013
|
+
"activity.collapse": "Collapse activity panel",
|
|
2014
|
+
"activity.empty": "No team activity",
|
|
2015
|
+
"format.listSeparator": ", ",
|
|
2016
|
+
"task.status.pending": "Unclaimed",
|
|
2017
|
+
"task.status.claimed": "Claimed",
|
|
2018
|
+
"task.status.inProgress": "In progress",
|
|
2019
|
+
"task.status.completed": "Completed",
|
|
2020
|
+
"task.status.failed": "Failed",
|
|
2021
|
+
"task.status.cancelled": "Cancelled",
|
|
2022
|
+
"member.state.working": "Working",
|
|
2023
|
+
"member.state.failed": "Has failures",
|
|
2024
|
+
"member.state.waiting": "Waiting",
|
|
2025
|
+
"member.state.delivered": "Delivered",
|
|
2026
|
+
"member.state.left": "Left team",
|
|
2027
|
+
"member.state.removed": "Removed",
|
|
2028
|
+
"member.state.pending": "Pending",
|
|
2029
|
+
"member.state.unassigned": "Awaiting assignment",
|
|
2030
|
+
"member.status.executing": "Working on {taskId}",
|
|
2031
|
+
"member.status.working": "Working on assigned tasks",
|
|
2032
|
+
"member.status.waitingOn": "Waiting for {taskId} · {assignee}",
|
|
2033
|
+
"member.status.waitingPrerequisite": "Waiting for prerequisites",
|
|
2034
|
+
"member.status.waitingAssignment": "Waiting for the captain to assign work",
|
|
2035
|
+
"member.status.delivered": "Tasks delivered",
|
|
2036
|
+
"member.status.idle": "Ready to continue",
|
|
2037
|
+
"member.status.unknown": "Status unknown",
|
|
2038
|
+
"task.assignee.unclaimed": "Unclaimed",
|
|
2039
|
+
"task.summary.waitingBreakdown": "Waiting for the captain to break down the work",
|
|
2040
|
+
"task.summary.allDelivered": "All {count} tasks delivered",
|
|
2041
|
+
"task.summary.blockedAndRunning": "{tasks}{more} waiting on prerequisites; other work has started",
|
|
2042
|
+
"task.summary.more": " and {count} more",
|
|
2043
|
+
"task.summary.running": "{tasks} in progress",
|
|
2044
|
+
"task.summary.ready": "{tasks} ready to start",
|
|
2045
|
+
"task.summary.blocked": "{tasks} waiting on prerequisites",
|
|
2046
|
+
"task.summary.waitingSchedule": "Waiting for the next scheduling round",
|
|
2047
|
+
"progress.aria": "Overall team progress",
|
|
2048
|
+
"progress.title": "Overall progress",
|
|
2049
|
+
"progress.running": "■ In progress {count}",
|
|
2050
|
+
"progress.blocked": "■ Waiting {count}",
|
|
2051
|
+
"progress.delivered": "■ Delivered {count}",
|
|
2052
|
+
"dependency.aria": "Task dependency chain",
|
|
2053
|
+
"dependency.parallel": "Parallel tasks",
|
|
2054
|
+
"dependency.title": "Task dependencies",
|
|
2055
|
+
"dependency.hint.parallel": "No dependencies · Click for details",
|
|
2056
|
+
"dependency.hint.chain": "Hover to highlight dependencies · Click to pin",
|
|
2057
|
+
"dependency.hint.pinned": "{taskId} pinned · Esc to clear",
|
|
2058
|
+
"task.runningAria": "Running",
|
|
2059
|
+
"task.detail.completed": "Completed and delivered",
|
|
2060
|
+
"task.detail.noPrerequisite": "No prerequisites; ready to start",
|
|
2061
|
+
"task.detail.ready": "Prerequisites ready; can start",
|
|
2062
|
+
"task.detail.waitingOn": "Waiting for {tasks}",
|
|
2063
|
+
"task.detail.noDownstream": "No downstream tasks",
|
|
2064
|
+
"task.detail.unlocks": "Unlocks {tasks} when complete",
|
|
2065
|
+
"team.ended": "Ended",
|
|
2066
|
+
"team.stats.members": "{count} members",
|
|
2067
|
+
"team.stats.completed": "{completed}/{total} completed",
|
|
2068
|
+
"team.stats.messages": "{count} messages",
|
|
2069
|
+
"delegation.aria": "Captain delegation map",
|
|
2070
|
+
"captain.name": "Captain",
|
|
2071
|
+
"captain.role": "Break down · Delegate · Synthesize",
|
|
2072
|
+
"captain.summary": "Assigned {tasks} tasks to {members} members",
|
|
2073
|
+
"captain.state.working": "{count} active",
|
|
2074
|
+
"captain.state.collected": "All reports received",
|
|
2075
|
+
"captain.state.waiting": "Waiting for reports",
|
|
2076
|
+
"members.toggle": "Members {count}",
|
|
2077
|
+
"members.collapse": "Collapse",
|
|
2078
|
+
"members.expand": "Expand",
|
|
2079
|
+
"members.empty": "No members yet; waiting for the captain to assemble the team",
|
|
2080
|
+
"assignment.label": "Captain assigned",
|
|
2081
|
+
"assignment.empty": "No tasks",
|
|
2082
|
+
"archive.label": "Ended · Archived history"
|
|
2083
|
+
};
|
|
2084
|
+
//#endregion
|
|
1883
2085
|
//#region lib/client/session-navigation.js
|
|
1884
2086
|
/** Version-tolerant navigation into durable AgentTeams member transcripts. */
|
|
1885
2087
|
/**
|
|
@@ -1906,11 +2108,12 @@ window.__ModuleLoader__.load({
|
|
|
1906
2108
|
}
|
|
1907
2109
|
//#endregion
|
|
1908
2110
|
//#region lib/client/index.js
|
|
1909
|
-
/** Required services: conversation nodes, slots,
|
|
2111
|
+
/** Required services: conversation nodes, slots, sessions navigation, and locale. */
|
|
1910
2112
|
const inject = [
|
|
1911
2113
|
"conversationEvents",
|
|
1912
2114
|
"slots",
|
|
1913
|
-
"sessions"
|
|
2115
|
+
"sessions",
|
|
2116
|
+
"locale"
|
|
1914
2117
|
];
|
|
1915
2118
|
/** The replayed user message is the canonical transcript entry. */
|
|
1916
2119
|
function HiddenAgentTeamsCommand() {
|
|
@@ -1922,20 +2125,26 @@ window.__ModuleLoader__.load({
|
|
|
1922
2125
|
* monitor via a window event — the recovery path for an old session.
|
|
1923
2126
|
*/
|
|
1924
2127
|
function apply(ctx) {
|
|
2128
|
+
ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, {
|
|
2129
|
+
zh,
|
|
2130
|
+
en
|
|
2131
|
+
}), "agent-teams: dictionaries");
|
|
1925
2132
|
const openMember = (parentId, childId) => {
|
|
1926
2133
|
openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {
|
|
1927
2134
|
console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
|
|
1928
2135
|
});
|
|
1929
2136
|
};
|
|
1930
|
-
const Panel = () => (0, react_jsx_runtime.jsx)(ActivityPanel, {
|
|
2137
|
+
const Panel = ({ t }) => (0, react_jsx_runtime.jsx)(ActivityPanel, {
|
|
1931
2138
|
sessionsList: ctx.sessions.list,
|
|
1932
|
-
openMember
|
|
2139
|
+
openMember,
|
|
2140
|
+
t
|
|
1933
2141
|
});
|
|
1934
2142
|
ctx.slots.inject("shell.overlay", () => ctx.slots.register({
|
|
1935
2143
|
name: "shell.overlay",
|
|
1936
2144
|
id: "agent-teams-activity",
|
|
1937
2145
|
order: 80,
|
|
1938
|
-
label: "AgentTeams activity"
|
|
2146
|
+
label: "AgentTeams activity",
|
|
2147
|
+
locale: AGENT_TEAMS_LOCALE_NAMESPACE
|
|
1939
2148
|
}, Panel));
|
|
1940
2149
|
ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({
|
|
1941
2150
|
name: "conversation.chat.commandview",
|
|
@@ -1945,6 +2154,7 @@ window.__ModuleLoader__.load({
|
|
|
1945
2154
|
ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
|
|
1946
2155
|
name: "conversation.chat.node",
|
|
1947
2156
|
key: "agent-teams",
|
|
2157
|
+
locale: AGENT_TEAMS_LOCALE_NAMESPACE,
|
|
1948
2158
|
inject: () => ({ openMember })
|
|
1949
2159
|
}, AgentTeamsCard));
|
|
1950
2160
|
}
|