@sleep2agi/agent-network-dashboard 0.4.6-preview.93 → 0.4.6-preview.95
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +31 -31
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +11 -11
- package/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +13 -13
- package/.next/server/app/admin.segments/_full.segment.rsc +13 -13
- package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
- package/.next/server/app/admin.segments/_index.segment.rsc +6 -6
- package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +13 -13
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +13 -13
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +6 -6
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +13 -13
- package/.next/server/app/login.segments/_full.segment.rsc +13 -13
- package/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/server/app/login.segments/_index.segment.rsc +6 -6
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/login.segments/login.segment.rsc +3 -3
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +13 -13
- package/.next/server/app/logs.segments/_full.segment.rsc +13 -13
- package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/logs.segments/_index.segment.rsc +6 -6
- package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +13 -13
- package/.next/server/app/messages.segments/_full.segment.rsc +13 -13
- package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
- package/.next/server/app/messages.segments/_index.segment.rsc +6 -6
- package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +13 -13
- package/.next/server/app/node.segments/_full.segment.rsc +13 -13
- package/.next/server/app/node.segments/_head.segment.rsc +4 -4
- package/.next/server/app/node.segments/_index.segment.rsc +6 -6
- package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/node.segments/node.segment.rsc +3 -3
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +13 -13
- package/.next/server/app/nodes.segments/_full.segment.rsc +13 -13
- package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/_index.segment.rsc +6 -6
- package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +13 -13
- package/.next/server/app/server-logs.segments/_full.segment.rsc +13 -13
- package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/_index.segment.rsc +6 -6
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
- package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +13 -13
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +13 -13
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +6 -6
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +13 -13
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +13 -13
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +6 -6
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +13 -13
- package/.next/server/app/settings.segments/_full.segment.rsc +13 -13
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +6 -6
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +13 -13
- package/.next/server/app/tasks.segments/_full.segment.rsc +13 -13
- package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/_index.segment.rsc +6 -6
- package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +2 -2
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{0w3m56zhfnsnx.js → 0psj~t8v5g~0f.js} +1 -1
- package/.next/static/chunks/{00~cfz801.8jw.js → 0vtwyfm_e4iy4.js} +1 -1
- package/.next/static/chunks/0zib-j2xxyuao.js +2 -0
- package/.next/static/chunks/{15wwkb4d80d6j.js → 12pfexi13ou3~.js} +1 -1
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/HelpOverlay.tsx +8 -0
- package/app/components/TopoGraph.tsx +69 -19
- package/package.json +1 -1
- package/scripts/topo-help-overlay-r87-test.mjs +64 -0
- package/scripts/topo-vendor-pin-test.mjs +125 -0
- package/.next/static/chunks/0s9z~74kvdvwl.js +0 -2
- /package/.next/static/{BRiXukYWE4x2ckMl_bIlO → zo4BFXQpgPnIuuEsfYxCV}/_buildManifest.js +0 -0
- /package/.next/static/{BRiXukYWE4x2ckMl_bIlO → zo4BFXQpgPnIuuEsfYxCV}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{BRiXukYWE4x2ckMl_bIlO → zo4BFXQpgPnIuuEsfYxCV}/_ssgManifest.js +0 -0
|
@@ -833,6 +833,25 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
|
|
|
833
833
|
// without inventing a new pin slot. Stores the vendor `initial`
|
|
834
834
|
// (single char or "?") that matches the tally key.
|
|
835
835
|
const [hoveredVendor, setHoveredVendor] = useState<string | null>(null);
|
|
836
|
+
// Round 88 / Loop: vendor filter pin. R80 added hover-to-dim on the
|
|
837
|
+
// vendor letters but the filter released as soon as the cursor left
|
|
838
|
+
// — vendor was the only filter dimension without a sticky variant
|
|
839
|
+
// (R60 status, R63 group, R69 Cmd+K all support pin). This state
|
|
840
|
+
// closes the gap. Same pattern as pinnedStatus / pinnedGroup:
|
|
841
|
+
// per-tab sessionStorage persistence, Esc clears, activeVendor =
|
|
842
|
+
// hoveredVendor ?? pinnedVendor so hover still wins for spot-
|
|
843
|
+
// comparison while a pin is active.
|
|
844
|
+
const [pinnedVendor, setPinnedVendor] = useState<string | null>(() => {
|
|
845
|
+
if (typeof window === 'undefined') return null;
|
|
846
|
+
try { return sessionStorage.getItem('anet-topo-pinned-vendor'); } catch { return null; }
|
|
847
|
+
});
|
|
848
|
+
const activeVendor = hoveredVendor ?? pinnedVendor;
|
|
849
|
+
useEffect(() => {
|
|
850
|
+
try {
|
|
851
|
+
if (pinnedVendor) sessionStorage.setItem('anet-topo-pinned-vendor', pinnedVendor);
|
|
852
|
+
else sessionStorage.removeItem('anet-topo-pinned-vendor');
|
|
853
|
+
} catch {}
|
|
854
|
+
}, [pinnedVendor]);
|
|
836
855
|
// Round 55 / Loop: hovering a legend status row dims nodes whose status
|
|
837
856
|
// doesn't match. The legend was passive — "what does this colour mean".
|
|
838
857
|
// Now it answers "show me all of these" the same way R8 group-focus
|
|
@@ -1154,9 +1173,13 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
|
|
|
1154
1173
|
// R63: extends to pinnedGroup too. Clears WHATEVER pin is active
|
|
1155
1174
|
// (one Esc collapses all topology pins) so the keyboard escape
|
|
1156
1175
|
// route stays a single key, not "Esc maybe Esc again".
|
|
1157
|
-
else if (e.key === 'Escape' && !chatAlias && (pinnedStatus || pinnedGroup)) {
|
|
1176
|
+
else if (e.key === 'Escape' && !chatAlias && (pinnedStatus || pinnedGroup || pinnedVendor)) {
|
|
1177
|
+
// R88: extend the universal-cancel to pinnedVendor too. One Esc
|
|
1178
|
+
// collapses every topology pin (matches R62/R63's "single key,
|
|
1179
|
+
// not Esc-maybe-Esc-again" promise).
|
|
1158
1180
|
if (pinnedStatus) setPinnedStatus(null);
|
|
1159
|
-
if (pinnedGroup)
|
|
1181
|
+
if (pinnedGroup) setPinnedGroup(null);
|
|
1182
|
+
if (pinnedVendor) setPinnedVendor(null);
|
|
1160
1183
|
e.preventDefault();
|
|
1161
1184
|
}
|
|
1162
1185
|
};
|
|
@@ -1167,7 +1190,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
|
|
|
1167
1190
|
// and pinnedStatus so the Escape branch reads fresh state (re-binding
|
|
1168
1191
|
// the listener on these state changes is sub-ms — cheaper than refs).
|
|
1169
1192
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1170
|
-
}, [fitView, chatAlias, pinnedStatus, pinnedGroup]);
|
|
1193
|
+
}, [fitView, chatAlias, pinnedStatus, pinnedGroup, pinnedVendor]);
|
|
1171
1194
|
|
|
1172
1195
|
const toggleFullscreen = () => {
|
|
1173
1196
|
const el = containerRef.current;
|
|
@@ -1433,21 +1456,48 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
|
|
|
1433
1456
|
{vendorDist.length > 1 && (
|
|
1434
1457
|
<span
|
|
1435
1458
|
className="hidden sm:inline-flex items-center gap-2 px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20 font-mono"
|
|
1436
|
-
title="Hover
|
|
1459
|
+
title="Hover to highlight; click to pin"
|
|
1437
1460
|
>
|
|
1438
|
-
{vendorDist.map(v =>
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1461
|
+
{vendorDist.map(v => {
|
|
1462
|
+
const isPinned = pinnedVendor === v.initial;
|
|
1463
|
+
// R88: click toggles a sticky filter the same way R60
|
|
1464
|
+
// pressure-bar segments toggle pinnedStatus. Visual
|
|
1465
|
+
// mirror = inset boxShadow using the vendor's own
|
|
1466
|
+
// colour, so each pinned letter sings in its own hue
|
|
1467
|
+
// (Anthropic green / OpenAI cyan / 书 blue / ?).
|
|
1468
|
+
return (
|
|
1469
|
+
<span
|
|
1470
|
+
key={v.initial}
|
|
1471
|
+
role="button"
|
|
1472
|
+
tabIndex={0}
|
|
1473
|
+
aria-pressed={isPinned}
|
|
1474
|
+
className="inline-flex items-baseline gap-0.5 px-1 rounded"
|
|
1475
|
+
data-vendor-letter={v.initial}
|
|
1476
|
+
data-vendor-pinned={isPinned ? 'true' : 'false'}
|
|
1477
|
+
title={isPinned
|
|
1478
|
+
? `Vendor "${v.initial}" pinned — click again or Esc to clear`
|
|
1479
|
+
: `Hover to highlight "${v.initial}"; click to pin`}
|
|
1480
|
+
style={{
|
|
1481
|
+
cursor: 'pointer',
|
|
1482
|
+
boxShadow: isPinned
|
|
1483
|
+
? `inset 0 0 0 1px ${v.color}, inset 0 0 0 2px rgba(255,255,255,0.45)`
|
|
1484
|
+
: undefined,
|
|
1485
|
+
}}
|
|
1486
|
+
onMouseEnter={() => setHoveredVendor(v.initial)}
|
|
1487
|
+
onMouseLeave={() => setHoveredVendor(prev => prev === v.initial ? null : prev)}
|
|
1488
|
+
onClick={() => setPinnedVendor(prev => prev === v.initial ? null : v.initial)}
|
|
1489
|
+
onKeyDown={(e) => {
|
|
1490
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
1491
|
+
e.preventDefault();
|
|
1492
|
+
setPinnedVendor(prev => prev === v.initial ? null : v.initial);
|
|
1493
|
+
}
|
|
1494
|
+
}}
|
|
1495
|
+
>
|
|
1496
|
+
<span style={{ color: v.color }}>{v.initial}</span>
|
|
1497
|
+
<span className="text-gray-500">:{v.count}</span>
|
|
1498
|
+
</span>
|
|
1499
|
+
);
|
|
1500
|
+
})}
|
|
1451
1501
|
</span>
|
|
1452
1502
|
)}
|
|
1453
1503
|
{/* Round 42 / Loop: extend active-links chip with the timestamp
|
|
@@ -2230,10 +2280,10 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
|
|
|
2230
2280
|
// chip and the avatar always agree on grouping.
|
|
2231
2281
|
opacity: hoveredEdgeEndpoints && !hoveredEdgeEndpoints.has(session.alias) && chatAlias !== session.alias
|
|
2232
2282
|
? 0.28
|
|
2233
|
-
:
|
|
2283
|
+
: activeVendor && chatAlias !== session.alias && (() => {
|
|
2234
2284
|
const v = vendorForModel(session.model);
|
|
2235
2285
|
const initial = v.id === 'unknown' ? '?' : v.initial;
|
|
2236
|
-
return initial !==
|
|
2286
|
+
return initial !== activeVendor;
|
|
2237
2287
|
})()
|
|
2238
2288
|
? 0.28
|
|
2239
2289
|
: activeStatus && chatAlias !== session.alias && !(
|
package/package.json
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/* Round 87 verification: HelpOverlay catches up on R83 (pressure-bar
|
|
2
|
+
* segment hover preview) + R86 (group-label hover preview). Continues
|
|
3
|
+
* the R59/R62/R65/R70/R78/R81 docs-catch-up cadence (~5 rounds).
|
|
4
|
+
*
|
|
5
|
+
* Stacks five generations of help-overlay assertions — any future
|
|
6
|
+
* regression that drops an entry will be caught by one of:
|
|
7
|
+
* R87 (this) → R81 → R78 → R74 → R70 → R65 → R59
|
|
8
|
+
*/
|
|
9
|
+
import { chromium } from 'playwright';
|
|
10
|
+
import { readFileSync } from 'node:fs';
|
|
11
|
+
|
|
12
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
13
|
+
const browser = await chromium.launch({ headless: true });
|
|
14
|
+
|
|
15
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
16
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
17
|
+
await ctx.addInitScript(() => {
|
|
18
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
19
|
+
});
|
|
20
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
21
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
22
|
+
const page = await ctx.newPage();
|
|
23
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
24
|
+
await page.waitForTimeout(800);
|
|
25
|
+
|
|
26
|
+
await page.keyboard.press('?');
|
|
27
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
28
|
+
|
|
29
|
+
const items = await page.evaluate(() => {
|
|
30
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
31
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
32
|
+
let active = null;
|
|
33
|
+
for (const g of groups) {
|
|
34
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
35
|
+
active = g.parentElement;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
await browser.close();
|
|
43
|
+
|
|
44
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
45
|
+
const results = {
|
|
46
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
47
|
+
r87_groupLabelHover: has('Preview a team focus — hover a group label (R86)'),
|
|
48
|
+
// R81 priors
|
|
49
|
+
r81_workingChip: has('Highlight working nodes — chip-row sibling of legend (R79)'),
|
|
50
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
51
|
+
// R78 priors
|
|
52
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
53
|
+
r78_activeLinks: has('Brighten all active flows — hover'),
|
|
54
|
+
// R74 / R70 / R65 / R59 priors — five generations of docs catch-up
|
|
55
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
56
|
+
r70_cmdkPin: has('(R69)'),
|
|
57
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
58
|
+
r62_pinChip: has('Pin a status filter (R60/R61)'),
|
|
59
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
60
|
+
};
|
|
61
|
+
const ok = Object.values(results).every(Boolean);
|
|
62
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R87:`, JSON.stringify(results),
|
|
63
|
+
`\n items=`, items);
|
|
64
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/* Round 88 verification: clicking a vendor letter in the distribution
|
|
2
|
+
* chip toggles a sticky pin — closes the only filter dimension that
|
|
3
|
+
* still released on mouseleave (R60 status, R63 group, R69 Cmd+K all
|
|
4
|
+
* support pin). Composes via activeVendor = hoveredVendor ??
|
|
5
|
+
* pinnedVendor so hover still wins for spot comparison.
|
|
6
|
+
*
|
|
7
|
+
* Fleet: 2 Claude (alpha, gamma) + 1 GPT (beta). Click A → alpha + gamma
|
|
8
|
+
* stay bright across mouseleave; pinned-style boxShadow on the A
|
|
9
|
+
* letter; aria-pressed="true". Hover O while A pinned → transient O
|
|
10
|
+
* preview (alpha/gamma dim, beta lit); mouseleave → A pin restores.
|
|
11
|
+
* Esc clears the pin (R62/R63 universal-cancel extends to vendor).
|
|
12
|
+
* SessionStorage round-trips.
|
|
13
|
+
*/
|
|
14
|
+
import { chromium } from 'playwright';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
|
|
17
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
18
|
+
const browser = await chromium.launch({ headless: true });
|
|
19
|
+
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1400, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
sessionStorage.removeItem('anet-topo-pinned-status');
|
|
28
|
+
sessionStorage.removeItem('anet-topo-pinned-group');
|
|
29
|
+
sessionStorage.removeItem('anet-topo-pinned-vendor');
|
|
30
|
+
} catch {}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
34
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
35
|
+
const r = await route.fetch();
|
|
36
|
+
const b = await r.json();
|
|
37
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
38
|
+
const sessions = [
|
|
39
|
+
{ alias: 'alpha', status: 'idle', model: 'claude-opus-4', runtime: 'cli-claude-code',
|
|
40
|
+
network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
41
|
+
{ alias: 'beta', status: 'idle', model: 'gpt-5', runtime: 'codex-cli',
|
|
42
|
+
network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
43
|
+
{ alias: 'gamma', status: 'idle', model: 'claude-opus-4', runtime: 'cli-claude-code',
|
|
44
|
+
network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
45
|
+
];
|
|
46
|
+
await route.fulfill({ response: r, json: { ...b, sessions } });
|
|
47
|
+
});
|
|
48
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
49
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
50
|
+
const page = await ctx.newPage();
|
|
51
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
52
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 3, { timeout: 30000 });
|
|
53
|
+
await page.waitForTimeout(400);
|
|
54
|
+
|
|
55
|
+
const ops = () => page.evaluate(() => {
|
|
56
|
+
const o = {};
|
|
57
|
+
for (const a of ['alpha', 'beta', 'gamma']) {
|
|
58
|
+
const g = document.querySelector(`g[data-node="${a}"]`);
|
|
59
|
+
o[a] = g ? +(g.style.opacity || '1') : null;
|
|
60
|
+
}
|
|
61
|
+
return o;
|
|
62
|
+
});
|
|
63
|
+
const meta = () => page.evaluate(() => {
|
|
64
|
+
const a = document.querySelector('[data-vendor-letter="A"]');
|
|
65
|
+
const o = document.querySelector('[data-vendor-letter="O"]');
|
|
66
|
+
return {
|
|
67
|
+
A: { pinned: a?.getAttribute('data-vendor-pinned'), aria: a?.getAttribute('aria-pressed'), shadow: (a?.getAttribute('style') || '').includes('inset') },
|
|
68
|
+
O: { pinned: o?.getAttribute('data-vendor-pinned'), aria: o?.getAttribute('aria-pressed'), shadow: (o?.getAttribute('style') || '').includes('inset') },
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
const storage = () => page.evaluate(() => sessionStorage.getItem('anet-topo-pinned-vendor'));
|
|
72
|
+
|
|
73
|
+
const before = await ops();
|
|
74
|
+
const beforeMeta = await meta();
|
|
75
|
+
|
|
76
|
+
// Click A to pin. Mouse moves away — pin survives.
|
|
77
|
+
await page.locator('[data-vendor-letter="A"]').click();
|
|
78
|
+
await page.mouse.move(10, 10);
|
|
79
|
+
await page.waitForTimeout(300);
|
|
80
|
+
const afterClickA = await ops();
|
|
81
|
+
const afterClickAMeta = await meta();
|
|
82
|
+
const afterClickAStorage = await storage();
|
|
83
|
+
|
|
84
|
+
// Hover O while A pinned — transient O preview wins.
|
|
85
|
+
await page.locator('[data-vendor-letter="O"]').hover();
|
|
86
|
+
await page.waitForTimeout(250);
|
|
87
|
+
const hoverOWhilePinA = await ops();
|
|
88
|
+
|
|
89
|
+
// Leave — A pin restores.
|
|
90
|
+
await page.mouse.move(10, 10);
|
|
91
|
+
await page.waitForTimeout(250);
|
|
92
|
+
const leaveOWhilePinA = await ops();
|
|
93
|
+
|
|
94
|
+
// Esc clears the vendor pin.
|
|
95
|
+
await page.keyboard.press('Escape');
|
|
96
|
+
await page.waitForTimeout(250);
|
|
97
|
+
const afterEsc = await ops();
|
|
98
|
+
const afterEscMeta = await meta();
|
|
99
|
+
const afterEscStorage = await storage();
|
|
100
|
+
|
|
101
|
+
await browser.close();
|
|
102
|
+
|
|
103
|
+
const bright = (v) => v != null && v >= 0.55;
|
|
104
|
+
const dim = (v) => v != null && v < 0.4;
|
|
105
|
+
const results = {
|
|
106
|
+
before_baseline: bright(before.alpha) && bright(before.beta) && bright(before.gamma),
|
|
107
|
+
before_noPinMeta: beforeMeta.A.pinned === 'false' && beforeMeta.A.aria === 'false' && !beforeMeta.A.shadow,
|
|
108
|
+
pinA_keepsClaudes: bright(afterClickA.alpha) && bright(afterClickA.gamma),
|
|
109
|
+
pinA_dimsGPT: dim(afterClickA.beta),
|
|
110
|
+
pinA_metaSet: afterClickAMeta.A.pinned === 'true' && afterClickAMeta.A.aria === 'true' && afterClickAMeta.A.shadow,
|
|
111
|
+
pinA_storagePersisted: afterClickAStorage === 'A',
|
|
112
|
+
hoverOPinA_transientO: bright(hoverOWhilePinA.beta) && dim(hoverOWhilePinA.alpha) && dim(hoverOWhilePinA.gamma),
|
|
113
|
+
leaveOPinA_aRestored: bright(leaveOWhilePinA.alpha) && bright(leaveOWhilePinA.gamma) && dim(leaveOWhilePinA.beta),
|
|
114
|
+
esc_releasesPin: bright(afterEsc.alpha) && bright(afterEsc.beta) && bright(afterEsc.gamma),
|
|
115
|
+
esc_metaCleared: afterEscMeta.A.pinned === 'false' && afterEscMeta.A.aria === 'false' && !afterEscMeta.A.shadow,
|
|
116
|
+
esc_storageCleared: afterEscStorage === null,
|
|
117
|
+
};
|
|
118
|
+
const ok = Object.values(results).every(Boolean);
|
|
119
|
+
console.log(`${ok ? '✅' : '❌'} vendor pin:`, JSON.stringify(results),
|
|
120
|
+
`\n before=`, before,
|
|
121
|
+
`\n afterClickA=`, afterClickA,
|
|
122
|
+
`\n hoverOPinA=`, hoverOWhilePinA,
|
|
123
|
+
`\n leaveOPinA=`, leaveOWhilePinA,
|
|
124
|
+
`\n afterEsc=`, afterEsc);
|
|
125
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,136,(e,t,a)=>{},7454,(e,t,a)=>{var r=e.i(20888);e.r(136);var s=e.r(23910),n=s&&"object"==typeof s&&"default"in s?s:{default:s},l=void 0!==r.default&&r.default.env&&!0,i=function(e){return"[object String]"===Object.prototype.toString.call(e)},o=function(){function e(e){var t=void 0===e?{}:e,a=t.name,r=void 0===a?"stylesheet":a,s=t.optimizeForSpeed,n=void 0===s?l:s;d(i(r),"`name` must be a string"),this._name=r,this._deletedRulePlaceholder="#"+r+"-deleted-rule____{}",d("boolean"==typeof n,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=n,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var o="u">typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=o?o.getAttribute("content"):null}var t,a=e.prototype;return a.setOptimizeForSpeed=function(e){d("boolean"==typeof e,"`setOptimizeForSpeed` accepts a boolean"),d(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=e,this.inject()},a.isOptimizeForSpeed=function(){return this._optimizeForSpeed},a.inject=function(){var e=this;if(d(!this._injected,"sheet already injected"),this._injected=!0,"u">typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(l||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(t,a){return"number"==typeof a?e._serverSheet.cssRules[a]={cssText:t}:e._serverSheet.cssRules.push({cssText:t}),a},deleteRule:function(t){e._serverSheet.cssRules[t]=null}}},a.getSheetForTag=function(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]},a.getSheet=function(){return this.getSheetForTag(this._tags[this._tags.length-1])},a.insertRule=function(e,t){if(d(i(e),"`insertRule` accepts only strings"),"u"<typeof window)return"number"!=typeof t&&(t=this._serverSheet.cssRules.length),this._serverSheet.insertRule(e,t),this._rulesCount++;if(this._optimizeForSpeed){var a=this.getSheet();"number"!=typeof t&&(t=a.cssRules.length);try{a.insertRule(e,t)}catch(t){return l||console.warn("StyleSheet: illegal rule: \n\n"+e+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),-1}}else{var r=this._tags[t];this._tags.push(this.makeStyleTag(this._name,e,r))}return this._rulesCount++},a.replaceRule=function(e,t){if(this._optimizeForSpeed||"u"<typeof window){var a="u">typeof window?this.getSheet():this._serverSheet;if(t.trim()||(t=this._deletedRulePlaceholder),!a.cssRules[e])return e;a.deleteRule(e);try{a.insertRule(t,e)}catch(r){l||console.warn("StyleSheet: illegal rule: \n\n"+t+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),a.insertRule(this._deletedRulePlaceholder,e)}}else{var r=this._tags[e];d(r,"old rule at index `"+e+"` not found"),r.textContent=t}return e},a.deleteRule=function(e){if("u"<typeof window)return void this._serverSheet.deleteRule(e);if(this._optimizeForSpeed)this.replaceRule(e,"");else{var t=this._tags[e];d(t,"rule at index `"+e+"` not found"),t.parentNode.removeChild(t),this._tags[e]=null}},a.flush=function(){this._injected=!1,this._rulesCount=0,"u">typeof window?(this._tags.forEach(function(e){return e&&e.parentNode.removeChild(e)}),this._tags=[]):this._serverSheet.cssRules=[]},a.cssRules=function(){var e=this;return"u"<typeof window?this._serverSheet.cssRules:this._tags.reduce(function(t,a){return a?t=t.concat(Array.prototype.map.call(e.getSheetForTag(a).cssRules,function(t){return t.cssText===e._deletedRulePlaceholder?null:t})):t.push(null),t},[])},a.makeStyleTag=function(e,t,a){t&&d(i(t),"makeStyleTag accepts only strings as second parameter");var r=document.createElement("style");this._nonce&&r.setAttribute("nonce",this._nonce),r.type="text/css",r.setAttribute("data-"+e,""),t&&r.appendChild(document.createTextNode(t));var s=document.head||document.getElementsByTagName("head")[0];return a?s.insertBefore(r,a):s.appendChild(r),r},t=[{key:"length",get:function(){return this._rulesCount}}],function(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(e.prototype,t),e}();function d(e,t){if(!e)throw Error("StyleSheet: "+t+".")}var c=function(e){for(var t=5381,a=e.length;a;)t=33*t^e.charCodeAt(--a);return t>>>0},h={};function u(e,t){if(!t)return"jsx-"+e;var a=String(t),r=e+a;return h[r]||(h[r]="jsx-"+c(e+"-"+a)),h[r]}function x(e,t){"u"<typeof window&&(t=t.replace(/\/style/gi,"\\/style"));var a=e+t;return h[a]||(h[a]=t.replace(/__jsx-style-dynamic-selector/g,e)),h[a]}var m=function(){function e(e){var t=void 0===e?{}:e,a=t.styleSheet,r=void 0===a?null:a,s=t.optimizeForSpeed,n=void 0!==s&&s;this._sheet=r||new o({name:"styled-jsx",optimizeForSpeed:n}),this._sheet.inject(),r&&"boolean"==typeof n&&(this._sheet.setOptimizeForSpeed(n),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),this._fromServer=void 0,this._indices={},this._instancesCounts={}}var t=e.prototype;return t.add=function(e){var t=this;void 0===this._optimizeForSpeed&&(this._optimizeForSpeed=Array.isArray(e.children),this._sheet.setOptimizeForSpeed(this._optimizeForSpeed),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),"u">typeof window&&!this._fromServer&&(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(e,t){return e[t]=0,e},{}));var a=this.getIdAndRules(e),r=a.styleId,s=a.rules;if(r in this._instancesCounts){this._instancesCounts[r]+=1;return}var n=s.map(function(e){return t._sheet.insertRule(e)}).filter(function(e){return -1!==e});this._indices[r]=n,this._instancesCounts[r]=1},t.remove=function(e){var t=this,a=this.getIdAndRules(e).styleId;if(function(e,t){if(!e)throw Error("StyleSheetRegistry: "+t+".")}(a in this._instancesCounts,"styleId: `"+a+"` not found"),this._instancesCounts[a]-=1,this._instancesCounts[a]<1){var r=this._fromServer&&this._fromServer[a];r?(r.parentNode.removeChild(r),delete this._fromServer[a]):(this._indices[a].forEach(function(e){return t._sheet.deleteRule(e)}),delete this._indices[a]),delete this._instancesCounts[a]}},t.update=function(e,t){this.add(t),this.remove(e)},t.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},t.cssRules=function(){var e=this,t=this._fromServer?Object.keys(this._fromServer).map(function(t){return[t,e._fromServer[t]]}):[],a=this._sheet.cssRules();return t.concat(Object.keys(this._indices).map(function(t){return[t,e._indices[t].map(function(e){return a[e].cssText}).join(e._optimizeForSpeed?"":"\n")]}).filter(function(e){return!!e[1]}))},t.styles=function(e){var t,a;return t=this.cssRules(),void 0===(a=e)&&(a={}),t.map(function(e){var t=e[0],r=e[1];return n.default.createElement("style",{id:"__"+t,key:"__"+t,nonce:a.nonce?a.nonce:void 0,dangerouslySetInnerHTML:{__html:r}})})},t.getIdAndRules=function(e){var t=e.children,a=e.dynamic,r=e.id;if(a){var s=u(r,a);return{styleId:s,rules:Array.isArray(t)?t.map(function(e){return x(s,e)}):[x(s,t)]}}return{styleId:u(r),rules:Array.isArray(t)?t:[t]}},t.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(e,t){return e[t.id.slice(2)]=t,e},{})},e}(),f=s.createContext(null);function p(){return new m}function g(){return s.useContext(f)}f.displayName="StyleSheetContext";var y=n.default.useInsertionEffect||n.default.useLayoutEffect,b="u">typeof window?p():void 0;function v(e){var t=b||g();return t&&("u"<typeof window?t.add(e):y(function(){return t.add(e),function(){t.remove(e)}},[e.id,String(e.dynamic)])),null}v.dynamic=function(e){return e.map(function(e){return u(e[0],e[1])}).join(" ")},a.StyleRegistry=function(e){var t=e.registry,a=e.children,r=s.useContext(f),l=s.useState(function(){return r||t||p()})[0];return n.default.createElement(f.Provider,{value:l},a)},a.createStyleRegistry=p,a.style=v,a.useStyleRegistry=g},6694,(e,t,a)=>{t.exports=e.r(7454).style},18722,e=>{"use strict";var t=e.i(20888),a=e.i(22381),r=e.i(23910),s=e.i(56839),n=e.i(3479);function l({online:e,working:t,total:r,version:s,uptime:n}){let o=r>0?Math.round(e/r*100):0,d=0===r;return(0,a.jsxs)("div",{className:d?"mb-4":"mb-8",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-3 mb-4",children:[(0,a.jsx)("h1",{className:"text-2xl font-bold text-white tracking-tight",children:"Agent Network"}),(0,a.jsxs)("span",{className:"text-xs text-gray-500",children:["CommHub ",s," · ",n]})]}),d?(0,a.jsxs)("div",{className:"anet-stat-strip flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-gray-500 border-t border-b border-[#2a2a4a] py-2",children:[(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,a.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full bg-gray-600"}),(0,a.jsx)("span",{className:"text-gray-300 tabular-nums",children:"0"})," online"]}),(0,a.jsx)("span",{className:"text-gray-700",children:"·"}),(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,a.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full bg-gray-600"}),(0,a.jsx)("span",{className:"text-gray-300 tabular-nums",children:"0"})," working"]}),(0,a.jsx)("span",{className:"text-gray-700",children:"·"}),(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,a.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full bg-gray-600"}),(0,a.jsx)("span",{className:"text-gray-300 tabular-nums",children:"0"})," registered"]})]}):(0,a.jsxs)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[(0,a.jsx)(i,{value:e,label:"Online",sub:`${o}% of fleet`,color:"text-green-400",accent:"from-green-500/20 to-green-500/0",border:"border-green-500/15"}),(0,a.jsx)(i,{value:t,label:"Working",sub:e>0?`${Math.round(t/e*100)}% utilization`:"--",color:"text-cyan-400",accent:"from-cyan-500/20 to-cyan-500/0",border:"border-cyan-500/15"}),(0,a.jsx)(i,{value:r-e,label:"Offline",sub:r-e==0?"All systems go":`${r-e} disconnected`,color:"text-gray-400",accent:"from-gray-500/10 to-gray-500/0",border:"border-gray-500/15"}),(0,a.jsx)(i,{value:r,label:"Total",sub:"Registered nodes",color:"text-white",accent:"from-blue-500/15 to-blue-500/0",border:"border-blue-500/15"})]})]})}function i({value:e,label:t,sub:r,color:s,accent:n,border:l}){let o=s.replace("text-","").split("-")[0];return(0,a.jsxs)("div",{"data-anet-stat-card":o,className:`anet-stat-card relative overflow-hidden rounded-xl border ${l} bg-[#111128] px-4 py-3 transition-all`,children:[(0,a.jsx)("div",{className:`absolute inset-0 bg-gradient-to-br ${n} pointer-events-none`}),(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("div",{className:`text-3xl font-bold ${s} tabular-nums leading-tight`,children:e}),(0,a.jsx)("div",{className:"text-sm text-gray-300 mt-0.5",children:t}),(0,a.jsx)("div",{className:"text-xs text-gray-600 mt-1",children:r})]})]})}function o(){let[e,t]=(0,r.useState)(""),[s,n]=(0,r.useState)(!1),[l,i]=(0,r.useState)(""),o=async()=>{if(e.trim()){n(!0),i("");try{let a=await fetch("/api/hub/broadcast",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:e})}),r=await a.json();r.ok?(i(`Broadcast sent to ${r.recipients} node(s)`),t("")):i(`Failed: ${r.error||"Send error"}`)}catch(e){i(`Failed: ${e instanceof Error?e.message:"Send error"}`)}n(!1),setTimeout(()=>i(""),5e3)}};return(0,a.jsxs)("div",{className:"mb-6",children:[(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)("input",{type:"text",value:e,onChange:e=>t(e.target.value),onKeyDown:e=>"Enter"===e.key&&o(),placeholder:"Broadcast message to all online agents...",maxLength:500,"aria-label":"Broadcast message",className:"flex-1 bg-[#111128] border border-[#2a2a4a] rounded-lg px-4 py-2.5 text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:ring-1 focus:ring-blue-500/20 focus:outline-none transition-colors"}),(0,a.jsx)("button",{onClick:o,disabled:s||!e.trim(),"aria-label":"Send broadcast",className:"flex items-center gap-2 px-5 py-2.5 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-all font-medium cursor-pointer disabled:cursor-not-allowed",children:s?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4 animate-spin",viewBox:"0 0 24 24",fill:"none",children:[(0,a.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",opacity:"0.25"}),(0,a.jsx)("path",{d:"M4 12a8 8 0 018-8",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]}),(0,a.jsx)("span",{children:"Sending…"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,a.jsx)("path",{d:"M3 11v3a1 1 0 0 0 1 1h2l3.29 3.29a1 1 0 0 0 1.71-.71V7.42a1 1 0 0 0-1.71-.71L6 10H4a1 1 0 0 0-1 1Z"}),(0,a.jsx)("path",{d:"M16 8a5 5 0 0 1 0 6",opacity:"0.7"}),(0,a.jsx)("path",{d:"M19 5a9 9 0 0 1 0 12",opacity:"0.45"})]}),(0,a.jsx)("span",{children:"Broadcast"})]})})]}),e.length>0&&(0,a.jsxs)("div",{className:"text-right text-xs text-gray-600 mt-1 tabular-nums",children:[e.length,"/500"]}),l&&(0,a.jsx)("div",{className:`mt-3 text-sm text-center anet-fade-in ${l.startsWith("Failed")?"text-red-400":"text-green-400/80"}`,children:l})]})}var d=e.i(46228),c=e.i(43058),h=e.i(59276),u=e.i(59746);function x({alias:e,onClose:t}){let[s,n]=(0,r.useState)({x:0,y:0}),[l,i]=(0,r.useState)({w:380,h:520}),o=(0,r.useRef)({active:!1,startX:0,startY:0,baseX:0,baseY:0}),m=(0,r.useRef)({active:!1,startX:0,startY:0,baseW:0,baseH:0}),{sessions:f}=(0,h.useSessions)(),p=(0,r.useMemo)(()=>f.find(t=>t.alias===e),[f,e]),g=p&&"offline"!==p.status?null:(0,u.relativeAgo)(p?.last_seen_at),y=(0,r.useCallback)((e,t,a,r)=>({x:Math.min(Math.max(16,e),Math.max(16,window.innerWidth-a-16)),y:Math.min(Math.max(16,t),Math.max(16,window.innerHeight-r-16))}),[]);(0,r.useEffect)(()=>{let e=()=>{let e=window.innerWidth,t=window.innerHeight,a=Math.min(380,e-32),r=Math.min(520,t-96);i({w:a,h:r});let s=e<640;n(y(s?16:e-a-24,s?t-r-16:96,a,r))};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[y]),(0,r.useEffect)(()=>{let e=e=>{"Escape"===e.key&&t()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[t]);let b=e=>{if(o.current.active){o.current.active=!1;try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}},v=e=>{if(m.current.active){m.current.active=!1,e.stopPropagation();try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}};return(0,a.jsxs)("div",{className:"fixed z-50 flex flex-col overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg)] shadow-2xl shadow-black/60 anet-fade-in",style:{left:s.x,top:s.y,width:l.w,height:l.h},role:"dialog","aria-label":`Chat with ${e}`,children:[(0,a.jsxs)("div",{onPointerDown:e=>{0===e.button&&(e.currentTarget.setPointerCapture?.(e.pointerId),o.current={active:!0,startX:e.clientX,startY:e.clientY,baseX:s.x,baseY:s.y})},onPointerMove:e=>{let t=o.current;t.active&&n(y(t.baseX+(e.clientX-t.startX),t.baseY+(e.clientY-t.startY),l.w,l.h))},onPointerUp:b,onPointerCancel:b,className:"flex items-center justify-between px-3 py-2.5 border-b border-[var(--border)] bg-[var(--bg-secondary)] rounded-t-xl cursor-grab active:cursor-grabbing select-none touch-none",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5 min-w-0",children:[(0,a.jsx)(d.AliasAvatar,{alias:e,size:28}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("div",{className:"text-sm font-semibold text-[var(--fg)] truncate",children:e}),p?.project_dir?(0,a.jsxs)("div",{className:"text-[10px] text-[var(--fg-muted)] truncate font-mono",title:p.project_dir,"data-popover-cwd":!0,children:["cwd: ",p.project_dir]}):null,g?(0,a.jsxs)("div",{className:"text-[10px] text-[var(--fg-muted)] truncate","data-popover-lastseen":!0,children:["last seen: ",g]}):null,p?.project_dir||g?null:(0,a.jsx)("div",{className:"text-[10px] text-[var(--fg-muted)]",children:"Drag to move · Esc to close"})]})]}),(0,a.jsx)("button",{onClick:t,onPointerDown:e=>e.stopPropagation(),"aria-label":"Close chat",className:"text-[var(--fg-muted)] hover:text-[var(--fg)] p-1.5 rounded-lg hover:bg-[var(--bg-elevated)] shrink-0",children:(0,a.jsx)("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),(0,a.jsx)("div",{className:"flex-1 min-h-0",children:(0,a.jsx)(c.TaskChatPanel,{alias:e,onClose:t,inline:!0})}),(0,a.jsx)("div",{onPointerDown:e=>{0===e.button&&(e.stopPropagation(),e.currentTarget.setPointerCapture?.(e.pointerId),m.current={active:!0,startX:e.clientX,startY:e.clientY,baseW:l.w,baseH:l.h})},onPointerMove:e=>{let t=m.current;if(!t.active)return;e.stopPropagation();let a=Math.max(300,window.innerWidth-s.x-16),r=Math.max(320,window.innerHeight-s.y-16);i({w:Math.min(a,Math.max(300,t.baseW+(e.clientX-t.startX))),h:Math.min(r,Math.max(320,t.baseH+(e.clientY-t.startY)))})},onPointerUp:v,onPointerCancel:v,"aria-label":"Resize chat",className:"absolute bottom-0 right-0 w-5 h-5 cursor-nwse-resize touch-none z-10",style:{touchAction:"none"},children:(0,a.jsx)("svg",{className:"absolute bottom-0.5 right-0.5 w-3 h-3 text-[var(--fg-dim)]",viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round","aria-hidden":!0,children:(0,a.jsx)("path",{d:"M11 5L5 11M11 9L9 11"})})})]})}let m={id:"unknown",label:"Unknown vendor",mono:{bg:"hsl(220 10% 26%)",ring:"hsl(220 10% 46%)",text:"hsl(220 14% 82%)"},initial:"?",logo:null},f=[{test:e=>e.startsWith("intern"),vendor:{id:"intern",label:"书生 · 上海 AI 实验室",mono:{bg:"hsl(28 38% 24%)",ring:"hsl(32 45% 52%)",text:"hsl(34 60% 82%)"},initial:"书",logo:"/intern_avatar.png"}},{test:e=>e.startsWith("minimax"),vendor:{id:"minimax",label:"MiniMax",mono:{bg:"hsl(18 50% 26%)",ring:"hsl(18 65% 52%)",text:"hsl(20 80% 82%)"},initial:"M",logo:null}},{test:e=>e.startsWith("claude"),vendor:{id:"anthropic",label:"Anthropic",mono:{bg:"hsl(16 32% 26%)",ring:"hsl(16 48% 54%)",text:"hsl(18 60% 84%)"},initial:"A",logo:null}},{test:e=>e.startsWith("gpt")||e.startsWith("codex")||e.startsWith("o1")||e.startsWith("o3")||e.startsWith("o4"),vendor:{id:"openai",label:"OpenAI",mono:{bg:"hsl(165 26% 22%)",ring:"hsl(165 40% 44%)",text:"hsl(165 45% 80%)"},initial:"O",logo:null}}];function p(e){if(!e)return m;let t=e.toLowerCase();for(let e of f)if(e.test(t))return e.vendor;return m}let g={"claude-code-cli":{label:"Claude Code CLI",iconPath:"M4 5h16v14H4z M7 9l3 3-3 3 M13 15h4",color:"#a78bfa"},"codex-sdk":{label:"Codex SDK",iconPath:"M9 7l-5 5 5 5 M15 7l5 5-5 5",color:"#38bdf8"},"claude-agent-sdk":{label:"Claude Agent SDK",iconPath:"M4 7h16v10H4z M8 11h8 M8 14h5",color:"#34d399"},"http-api":{label:"HTTP API",iconPath:"M7 18a4 4 0 010-8 5 5 0 019.6-1.3A3.5 3.5 0 0118 18z",color:"#fbbf24"}};function y(e){return e?g[e]??null:null}function b(e,t,a,r=0){let s=t<=2?Math.PI:1.78*Math.PI,n=-Math.PI/2-s/2,l=t<=1?-Math.PI/2:n+s*e/(t-1)+r;return{x:500+a*Math.cos(l),y:330+a*Math.sin(l)}}function v(e,t,a=0){let r=(e.x+t.x)/2,s=(e.y+t.y)/2,n=t.x-e.x,l=t.y-e.y,i=Math.hypot(n,l)||1,o={x:r+-l/i*a,y:s+n/i*a};return`M${e.x},${e.y} Q${o.x},${o.y} ${t.x},${t.y}`}function j(e,t){return e.length>t?`${e.slice(0,t-1)}...`:e}function w({sessions:e}){let t=(0,r.useRef)(Date.now()),[s,n]=(0,r.useState)(()=>Date.now());(0,r.useEffect)(()=>{t.current=Date.now()},[e]),(0,r.useEffect)(()=>{let e=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(e)},[]);let l=Math.max(0,Math.floor((s-t.current)/1e3)),i=l>10;return(0,a.jsxs)("span",{className:i?"hidden sm:inline px-2.5 py-1 rounded-md bg-amber-500/10 text-amber-300 border border-amber-500/20 font-mono":"hidden sm:inline px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20 font-mono",title:i?`Last sync ${l}s ago — SWR refresh may be lagging`:`Live data \xb7 refreshes every 5s \xb7 last sync ${l}s ago`,"data-freshness-chip":!0,children:["live · ",l,"s"]})}function k(e,t,a){return t?"working"===e.status?{label:"working",primary:a?"#059669":"#22c55e",halo:a?"#d1fae5":"#14532d",text:a?"#065f46":"#dcfce7"}:"idle"===e.status?{label:"idle",primary:a?"#0d9488":"#2dd4bf",halo:a?"#ccfbf1":"#134e4a",text:a?"#115e59":"#ccfbf1"}:{label:e.status||"online",primary:a?"#0284c7":"#38bdf8",halo:a?"#e0f2fe":"#0c4a6e",text:a?"#0c4a6e":"#e0f2fe"}:{label:"offline",primary:a?"#94a3b8":"#6b7280",halo:a?"#e2e8f0":"#111827",text:a?"#475569":"#9ca3af"}}let N={panelStops:["#0b1220","#080814","#101018"],radarStops:[{color:"#22d3ee",opacity:.18},{color:"#22c55e",opacity:.045},{color:"#020617",opacity:0}],arrowFill:"#67e8f9",ringStroke:"#164e63",spokeStroke:{active:"#22d3ee",idle:"#155e75"},flowEdge:"#67e8f9",flowPath:"#e0f2fe",flowParticle:"#fef08a",nodeFill:{online:"#020617",offline:"#080814"},labelBox:{fill:"#020617",stroke:"#1f2937"},legendBox:{fill:"#020617",stroke:"#1f2937"},legendText:"#94a3b8",legendHeadline:"#e5e7eb",legendAccent:"#67e8f9",containerBg:"#080814",containerBorder:"#2a2a4a",topRailGradient:"from-transparent via-cyan-400/70 to-transparent"},S={panelStops:["#f8fafc","#ffffff","#f1f5f9"],radarStops:[{color:"#10b981",opacity:.06},{color:"#3b82f6",opacity:.03},{color:"#ffffff",opacity:0}],arrowFill:"#10b981",ringStroke:"#cbd5e1",spokeStroke:{active:"#10b981",idle:"#cbd5e1"},flowEdge:"#10b981",flowPath:"#475569",flowParticle:"#f59e0b",nodeFill:{online:"#ffffff",offline:"#f8fafc"},labelBox:{fill:"#ffffff",stroke:"#e2e8f0"},legendBox:{fill:"#ffffff",stroke:"#e2e8f0"},legendText:"#475569",legendHeadline:"#0f172a",legendAccent:"#0d9488",containerBg:"#ffffff",containerBorder:"#e3e6eb",topRailGradient:"from-transparent via-emerald-500/40 to-transparent"};function _(e,t){let a=0;for(;a<e.length&&a<t.length&&e[a]===t[a];)a++;return e.slice(0,a)}function M(e){let t=e.length,a=e.map((e,t)=>t),r=e=>{for(;a[e]!==e;)a[e]=a[a[e]],e=a[e];return e},s=(e,t)=>{let s=r(e),n=r(t);s!==n&&(a[s]=n)},n={};for(let t of(e.forEach((e,t)=>{let a=e.project_dir?.trim();a&&(n[a]||=[]).push(t)}),Object.values(n)))for(let e=1;e<t.length;e++)s(t[0],t[e]);let l=e.map((e,t)=>t).sort((t,a)=>e[t].alias.localeCompare(e[a].alias));for(let t=0;t+1<l.length;t++)_(e[l[t]].alias,e[l[t+1]].alias).length>=2&&s(l[t],l[t+1]);let i={};for(let e=0;e<t;e++)(i[r(e)]||=[]).push(e);let o={};for(let t of Object.values(i)){let a;if(1===t.length)a=e[t[0]].alias;else{let r=new Set(t.map(t=>e[t].project_dir?.trim()).filter(Boolean));if(1===r.size){let e=[...r][0];a=e.split("/").filter(Boolean).pop()||e}else(a=t.map(t=>e[t].alias).reduce((e,t)=>_(e,t))).length<2&&(a=e[t[0]].alias)}for(let r of t)o[e[r].alias]=a}return o}function C(e,t){let a=new Map;return e.forEach(e=>{if(!t[e.from_alias]||!t[e.to_alias]||e.from_alias===e.to_alias)return;let r=`${e.from_alias}->${e.to_alias}`,s=a.get(r),n=e.created_at||"",l=s?n>s.last_at?n:s.last_at:n;a.set(r,{key:r,from:e.from_alias,to:e.to_alias,count:(s?.count||0)+1,content:s?.content||e.content,last_at:l})}),[...a.values()].slice(0,18)}function E({sessions:e,sseSessions:t,renameSignal:s}){let n,l,i,o,c,h,m,f,g,_,$,z,P="light"===function(){let[e,t]=(0,r.useState)("dark");return(0,r.useEffect)(()=>{let e=()=>{let e=document.documentElement.getAttribute("data-theme")||"cyber";t("light"===e||"mint"===e?"light":"dark")};e();let a=new MutationObserver(e);return a.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>a.disconnect()},[]),e}(),L=function(){let[e,t]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(!window.matchMedia)return;let e=window.matchMedia("(prefers-reduced-motion: reduce)");t(e.matches);let a=e=>t(e.matches);return e.addEventListener("change",a),()=>e.removeEventListener("change",a)},[]),e}(),T=P?S:N,A="intern"===function(){let[e,t]=(0,r.useState)(null);return(0,r.useEffect)(()=>{try{let e=new URL(window.location.href).searchParams.get("brand");null!==e?""===e||"none"===e?(localStorage.removeItem("anet-brand"),t(null)):(localStorage.setItem("anet-brand",e),t(e)):t(localStorage.getItem("anet-brand"))}catch{}},[]),e}(),[R,I]=(0,r.useState)([]),[F,W]=(0,r.useState)("ring");(0,r.useEffect)(()=>{try{let e=localStorage.getItem("anet-topo-layout");("grid"===e||"ring"===e)&&W(e)}catch{}},[]);let B=()=>W(e=>{let t="ring"===e?"grid":"ring";try{localStorage.setItem("anet-topo-layout",t)}catch{}return t}),[O,D]=(0,r.useState)(.84);(0,r.useEffect)(()=>{try{let e=parseFloat(localStorage.getItem("anet-topo-nodescale")||"");(.7===e||.84===e||1===e)&&D(e)}catch{}},[]),(0,r.useEffect)(()=>{let e=async()=>{try{let e=await fetch("/api/hub/messages?limit=50");if(401===e.status)return void window.location.assign("/login");let t=await e.json();I(t.messages||[])}catch{}};e();let t=setInterval(e,5e3);return()=>clearInterval(t)},[]);let{onlineNodes:H,offlineNodes:Y,nodePositions:X,flowLinks:U,activeAliases:G,groupKeys:K,groupBoxes:J,gridContentBottom:V}=(0,r.useMemo)(()=>{let a=e=>(e.network_id?t[`${e.network_id}:${e.alias}`]:void 0)??t[e.alias],r=(e,t)=>e.alias.localeCompare(t.alias),s=Date.now(),n=e.filter(e=>"offline"!==e.status||a(e)).sort(r),l=e.filter(e=>"offline"===e.status&&!a(e)&&!(e=>{if("offline"!==e.status||a(e)||!e.last_seen_at)return!1;let t=(0,u.parseHubTime)(e.last_seen_at);return null!==t&&s-t>36e5})(e)).sort(r),i={};if("grid"===F){let e=[...n,...l],t=M(e),r=Math.max(1,Math.ceil(Math.sqrt(e.length))),s=700/r,o=Math.round(26*O),d=[];for(let a of e){let e=t[a.alias],r=d[d.length-1];r&&r.key===e?r.members.push(a):d.push({key:e,members:[a]})}let c=[],h=0,u=0;for(;u<d.length;)if(d[u].members.length>=2)c.push({members:d[u].members,startRow:h,centred:!1,isGroup:!0}),h+=Math.ceil(d[u].members.length/r),u++;else{let e=[];for(;u<d.length&&d[u].members.length<2;)e.push(d[u].members[0]),u++;c.push({members:e,startRow:h,centred:!0,isGroup:!1}),h+=Math.ceil(e.length/r)}let x=Math.max(1,h),m=o+20,f=Math.max(2*o+22,m+12,o+(O<.8?12:14)+m+3,Math.min(100,526/x));for(let e of c)e.members.forEach((t,a)=>{let n=Math.floor(a/r),l=a%r,o=Math.min(r,e.members.length-n*r),d=e.centred?(r-o)*s/2:0;i[t.alias]={x:150+d+(l+.5)*s,y:126+(e.startRow+n+.5)*f}});let p=C(R,i),g=new Set;p.forEach(e=>{g.add(e.from),g.add(e.to)});let y=Math.max(8,Math.min(26,f-m-8)),b=c.filter(e=>e.isGroup).map(e=>{let r=e.members.map(e=>i[e.alias]).filter(Boolean),s=r.map(e=>e.x),n=r.map(e=>e.y),l=Math.min(...s),o=Math.min(...n),d=0,c=0,h=0;for(let t of e.members){let e="offline"!==t.status||!!a(t);"working"===t.status?d++:e?c++:h++}return{key:e.members.length?t[e.members[0].alias]:"",count:e.members.length,statuses:{working:d,idle:c,offline:h},x:l-y,y:o-m,w:Math.max(...s)-l+2*y,h:Math.max(...n)-o+m+y}});return{onlineNodes:n,offlineNodes:l,nodePositions:i,flowLinks:p,activeAliases:g,groupKeys:t,groupBoxes:b,gridContentBottom:126+x*f+8}}let o=n.length>14,d=!o&&n.length>8,c=n.length;if(o){let e=Math.ceil(n.length/3),t=n.slice(0,e),a=n.slice(e,2*e),r=n.slice(2*e);t.forEach((e,a)=>{i[e.alias]=b(a,Math.max(t.length,1),145)});let s=t.length<=2?Math.PI:1.78*Math.PI,l=t.length>1?s/(t.length-1):0;a.forEach((e,t)=>{i[e.alias]=b(t,Math.max(a.length,1),215,l/2)}),r.forEach((e,t)=>{i[e.alias]=b(t,Math.max(r.length,1),285)}),c=r.length}else if(d){let e=Math.ceil(n.length/2),t=n.length-e,a=n.slice(0,e),r=n.slice(e);a.forEach((t,a)=>{i[t.alias]=b(a,Math.max(e,1),175)});let s=e<=2?Math.PI:1.78*Math.PI,l=e>1?s/(e-1):0;r.forEach((e,a)=>{i[e.alias]=b(a,Math.max(t,1),260,l/2)}),c=t}else n.forEach((e,t)=>{i[e.alias]=b(t,Math.max(n.length,1),220)});let h=c<=2?Math.PI:1.78*Math.PI,x=c>1?h/(c-1):0,m=c>0?x/2:0,f=325+6*Math.max(0,l.length-4);l.forEach((e,t)=>{i[e.alias]=b(t,Math.max(l.length,1),f,m)});let p=C(R,i),g=new Set;p.forEach(e=>{g.add(e.from),g.add(e.to)});let y=M([...n,...l]);return{onlineNodes:n,offlineNodes:l,nodePositions:i,flowLinks:p,activeAliases:g,groupKeys:y,groupBoxes:[],gridContentBottom:0}},[R,e,t,F,O]),q=H.filter(e=>"working"===e.status).length,Z=(0,r.useMemo)(()=>{let e=new Map;for(let t of[...H,...Y]){let a=p(t.model),r="unknown"===a.id?"?":a.initial,s=e.get(r);s?s.count++:e.set(r,{initial:r,count:1,color:a.mono.text})}return[...e.values()].sort((e,t)=>t.count-e.count)},[H,Y]),Q=H.length+Y.length>16,[ee,et]=(0,r.useState)(null),[ea,er]=(0,r.useState)(null),es=ea??(ee?K[ee]??ee:null),[en,el]=(0,r.useState)(()=>{try{return sessionStorage.getItem("anet-topo-pinned-group")}catch{return null}}),ei=es??en;(0,r.useEffect)(()=>{try{en?sessionStorage.setItem("anet-topo-pinned-group",en):sessionStorage.removeItem("anet-topo-pinned-group")}catch{}},[en]),(0,r.useEffect)(()=>{!en||new Set(Object.values(K)).has(en)||el(null)},[en,K]);let[eo,ed]=(0,r.useState)(null),[ec,eh]=(0,r.useState)(!1),[eu,ex]=(0,r.useState)(null),[em,ef]=(0,r.useState)(null),[ep,eg]=(0,r.useState)(()=>{try{let e=sessionStorage.getItem("anet-topo-pinned-status");return"working"===e||"idle"===e||"offline"===e?e:null}catch{return null}}),ey=em??ep;(0,r.useEffect)(()=>{try{ep?sessionStorage.setItem("anet-topo-pinned-status",ep):sessionStorage.removeItem("anet-topo-pinned-status")}catch{}},[ep]),(0,r.useEffect)(()=>{let e=e=>{let t=e.detail||{};if("clear"===t.kind)eg(null),el(null);else if("status"===t.kind){let e=t.value;("working"===e||"idle"===e||"offline"===e)&&eg(e)}else"group"===t.kind&&"string"==typeof t.value&&el(t.value)};return window.addEventListener("anet:topo-pin",e),()=>window.removeEventListener("anet:topo-pin",e)},[]);let eb=(0,r.useMemo)(()=>{if(!eo)return null;let e=U.find(e=>e.key===eo);return e?new Set([e.from,e.to]):null},[eo,U]),ev=(0,r.useRef)(null),ej=(0,r.useRef)(null),[ew,ek]=(0,r.useState)({zoom:1,x:0,y:0}),eN=(0,r.useRef)(ew),eS=(0,r.useRef)({active:!1,startX:0,startY:0,baseX:0,baseY:0}),[e_,eM]=(0,r.useState)(!1),[eC,eE]=(0,r.useState)(null),[e$,ez]=(0,r.useState)(null);(0,r.useEffect)(()=>{s&&s.from===eC&&eE(s.to)},[s]),(0,r.useEffect)(()=>{eN.current=ew},[ew]),(0,r.useEffect)(()=>{try{let e=localStorage.getItem("anet-topo-view");if(e){let t=JSON.parse(e);"number"==typeof t?.zoom&&ek({zoom:Math.min(4,Math.max(.5,t.zoom)),x:"number"==typeof t.x?t.x:0,y:"number"==typeof t.y?t.y:0})}}catch{}},[]);let[eP]=(0,r.useState)(()=>!!localStorage.getItem("anet-topo-view")),eL=(0,r.useRef)(!1);(0,r.useEffect)(()=>{if(!eL.current){if(eP){eL.current=!0;return}if("grid"===F&&0!==e.length&&V){if(V<=680){eL.current=!0;return}ek({zoom:Math.max(.5,Math.min(1,680/V)),x:0,y:0}),eL.current=!0}}},[F,e.length,V,eP]),(0,r.useEffect)(()=>{try{localStorage.setItem("anet-topo-view",JSON.stringify(ew))}catch{}},[ew]),(0,r.useEffect)(()=>{let e=()=>eM(document.fullscreenElement===ev.current);return document.addEventListener("fullscreenchange",e),()=>document.removeEventListener("fullscreenchange",e)},[]),(0,r.useEffect)(()=>{let e=ej.current;if(!e)return;let t=t=>{if(!e_&&!t.ctrlKey&&!t.metaKey)return;t.preventDefault();let a=e.getBoundingClientRect(),r=(t.clientX-a.left)/a.width*1e3,s=(t.clientY-a.top)/a.height*680;ek(e=>{let a=Math.min(1.08,Math.max(.926,Math.exp(-(6e-4*t.deltaY)))),n=Math.min(4,Math.max(.5,e.zoom*a)),l=n/e.zoom;return{zoom:n,x:r-(r-e.x)*l,y:s-(s-e.y)*l}})};return e.addEventListener("wheel",t,{passive:!1}),()=>e.removeEventListener("wheel",t)},[e_]);let[eT,eA]=(0,r.useState)(!1),eR=e=>{if(eS.current.active){eS.current.active=!1,eA(!1);try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}},eI=e=>{ek(t=>{let a=Math.min(4,Math.max(.5,t.zoom*e)),r=a/t.zoom;return{zoom:a,x:500-(500-t.x)*r,y:340-(340-t.y)*r}})},eF=()=>ek({zoom:1,x:0,y:0}),eW=(0,r.useCallback)(()=>{ek({zoom:!V||V<=680?1:Math.max(.5,Math.min(1,680/V)),x:0,y:0})},[V]);return(0,r.useEffect)(()=>{let e=e=>{"toggle"===(e.detail||{}).kind&&B()},t=e=>{"fit"===(e.detail||{}).kind&&eW()};return window.addEventListener("anet:topo-layout",e),window.addEventListener("anet:topo-view",t),()=>{window.removeEventListener("anet:topo-layout",e),window.removeEventListener("anet:topo-view",t)}},[eW]),(0,r.useEffect)(()=>{let e=e=>{if(e.ctrlKey||e.metaKey||e.altKey)return;let t=document.activeElement;if(t){let e=t.tagName;if("INPUT"===e||"TEXTAREA"===e||"SELECT"===e||t.isContentEditable)return}"+"===e.key||"="===e.key?(eI(1.2),e.preventDefault()):"-"===e.key||"_"===e.key?(eI(1/1.2),e.preventDefault()):"0"===e.key?(eF(),e.preventDefault()):"f"===e.key||"F"===e.key?(eW(),e.preventDefault()):"l"===e.key||"L"===e.key?(B(),e.preventDefault()):"Escape"===e.key&&!eC&&(ep||en)&&(ep&&eg(null),en&&el(null),e.preventDefault())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[eW,eC,ep,en]),(0,a.jsxs)("section",{className:"w-full max-w-6xl mx-auto mb-8",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between mb-3 px-1",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-xs uppercase text-gray-600 tracking-wider",children:"Network Topology"}),(0,a.jsx)("h2",{className:"text-lg text-white font-semibold",children:"Command mesh"})]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,a.jsxs)("div",{className:"inline-flex rounded-md border border-gray-500/25 overflow-hidden",role:"group","aria-label":"Topology layout",children:[(0,a.jsx)("button",{onClick:()=>{"ring"!==F&&B()},"aria-pressed":"ring"===F,title:"Ring layout (l to toggle)",className:`px-2.5 py-1 transition-colors ${"ring"===F?"bg-cyan-500/15 text-cyan-300":"text-gray-500 hover:text-gray-400"}`,children:"Ring"}),(0,a.jsx)("button",{onClick:()=>{"grid"!==F&&B()},"aria-pressed":"grid"===F,title:"Grid layout (l to toggle)",className:`px-2.5 py-1 border-l border-gray-500/25 transition-colors ${"grid"===F?"bg-cyan-500/15 text-cyan-300":"text-gray-500 hover:text-gray-400"}`,children:"Grid"})]}),(0,a.jsxs)("span",{className:"px-2.5 py-1 rounded-md bg-green-500/10 text-green-300 border border-green-500/20","data-working-chip":!0,"data-pin-mirror":"working"===ep?"true":"false",title:q>0?"working"===ep?"Pinned — Esc to clear":"Hover to highlight working nodes":void 0,style:{cursor:q>0?"pointer":void 0,boxShadow:"working"===ep?"inset 0 0 0 1px #4ade80, inset 0 0 0 2px rgba(255,255,255,0.45)":void 0},onMouseEnter:()=>{q>0&&ef("working")},onMouseLeave:()=>ef(e=>"working"===e?null:e),children:[q," working"]}),(0,a.jsxs)("span",{className:"px-2.5 py-1 rounded-md bg-cyan-500/10 text-cyan-300 border border-cyan-500/20","data-online-chip":!0,"data-pin-mirror":"idle"===ep?"true":"false",title:H.length>0?"idle"===ep?"Pinned — Esc to clear":"Hover to highlight online nodes":void 0,style:{cursor:H.length>0?"pointer":void 0,boxShadow:"idle"===ep?"inset 0 0 0 1px #67e8f9, inset 0 0 0 2px rgba(255,255,255,0.45)":void 0},onMouseEnter:()=>{let e=H.length-q;q>0?ef("working"):e>0&&ef("idle")},onMouseLeave:()=>ef(e=>"working"===e||"idle"===e?null:e),children:[H.length," online"]}),(()=>{let e=H.length-q,t=Y.length,r=q+e+t;if(0===r)return null;let s=(e,t,s,n)=>{if(0===e)return null;let l=ep===s;return(0,a.jsx)("span",{"data-pressure-seg":s,role:"button",tabIndex:0,"aria-pressed":l,title:`${e} ${n} — click to ${l?"release filter":"highlight"}`,style:{width:`${e/r*100}%`,background:t,height:"100%",cursor:"pointer",boxShadow:l?`inset 0 0 0 1px ${t}, inset 0 0 0 2px rgba(255,255,255,0.6)`:void 0},onClick:e=>{e.stopPropagation(),eg(e=>e===s?null:s)},onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),eg(e=>e===s?null:s))},onMouseEnter:()=>ef(s),onMouseLeave:()=>ef(e=>e===s?null:e)},s)};return(0,a.jsxs)("span",{className:"hidden sm:inline-flex items-center gap-2 px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20 font-mono",title:`${q} working \xb7 ${e} idle \xb7 ${t} offline`,"data-fleet-pressure":!0,children:[(0,a.jsx)("span",{className:"text-[10px] tracking-wide",children:"pressure"}),(0,a.jsxs)("span",{className:"inline-flex h-1.5 w-16 rounded-full overflow-hidden",style:{background:"rgb(75 85 99 / 0.25)"},children:[s(q,P?"#059669":"#22c55e","working","working"),s(e,P?"#0d9488":"#2dd4bf","idle","idle"),s(t,P?"#94a3b8":"#6b7280","offline","offline")]})]})})(),ep&&(n="working"===ep?q:"idle"===ep?H.length-q:Y.length,(0,a.jsxs)("span",{"data-active-filter":"status","data-filter-match-count":n,className:"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in",title:"Click to clear filter",onClick:()=>eg(null),style:{background:"working"===ep?P?"#05966914":"#22c55e1f":"idle"===ep?P?"#0d948814":"#2dd4bf1f":P?"#94a3b814":"#6b72801f",color:"working"===ep?P?"#047857":"#86efac":"idle"===ep?P?"#0f766e":"#5eead4":P?"#475569":"#9ca3af",borderColor:"currentColor",cursor:"pointer"},children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"hidden sm:inline","data-filter-prefix":!0,children:"filter: "}),ep,(0,a.jsxs)("span",{className:"opacity-70",children:[" · ",n]})]}),(0,a.jsx)("button",{type:"button","aria-label":`Clear ${ep} filter`,onClick:e=>{e.stopPropagation(),eg(null)},className:"ml-0.5 leading-none hover:opacity-70",style:{background:"transparent",color:"inherit",cursor:"pointer",padding:0},children:"×"})]})),en&&(l=Object.values(K).filter(e=>e===en).length,(0,a.jsxs)("span",{"data-active-filter":"group","data-filter-match-count":l,className:"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in",title:"Click to clear filter",onClick:()=>el(null),style:{background:P?"#67e8f914":"#67e8f91f",color:T.legendAccent,borderColor:"currentColor",cursor:"pointer"},children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"hidden sm:inline","data-filter-prefix":!0,children:"filter: "}),en,(0,a.jsxs)("span",{className:"opacity-70",children:[" · ",l]})]}),(0,a.jsx)("button",{type:"button","aria-label":`Clear group filter ${en}`,onClick:e=>{e.stopPropagation(),el(null)},className:"ml-0.5 leading-none hover:opacity-70",style:{background:"transparent",color:"inherit",cursor:"pointer",padding:0},children:"×"})]})),Z.length>1&&(0,a.jsx)("span",{className:"hidden sm:inline-flex items-center gap-2 px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20 font-mono",title:"Hover a letter to highlight that vendor",children:Z.map(e=>(0,a.jsxs)("span",{className:"inline-flex items-baseline gap-0.5","data-vendor-letter":e.initial,style:{cursor:"pointer"},onMouseEnter:()=>ex(e.initial),onMouseLeave:()=>ex(t=>t===e.initial?null:t),children:[(0,a.jsx)("span",{style:{color:e.color},children:e.initial}),(0,a.jsxs)("span",{className:"text-gray-500",children:[":",e.count]})]},e.initial))}),(o=null!==(i=U.reduce((e,t)=>{if(!t.last_at)return e;let a=(0,u.parseHubTime)(t.last_at);return null===a?e:null===e||a>e?a:e},null))?(0,u.relativeAgo)(new Date(i).toISOString()):null,(0,a.jsxs)("span",{className:"hidden sm:inline px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20","data-active-links-chip":!0,title:U.length>0?"Hover to brighten all active flows":void 0,style:{cursor:U.length>0?"pointer":void 0},onMouseEnter:()=>{U.length>0&&eh(!0)},onMouseLeave:()=>eh(!1),children:[U.length," active link",1===U.length?"":"s",o?(0,a.jsxs)("span",{className:"text-gray-500",children:[" · last ",o]}):null]})),(0,a.jsx)(w,{sessions:e})]})]}),(0,a.jsxs)("div",{ref:ev,className:`relative overflow-hidden rounded-lg border shadow-2xl ${P?"shadow-zinc-900/5":"shadow-cyan-950/30"} ${e_?"flex items-center justify-center":""}`,style:{background:T.containerBg,borderColor:T.containerBorder},children:[(0,a.jsx)("div",{className:`absolute inset-x-0 top-0 h-px bg-gradient-to-r ${T.topRailGradient}`}),(0,a.jsxs)("svg",{ref:ej,viewBox:"0 0 1000 680",className:"w-full h-auto block",preserveAspectRatio:"xMidYMid meet",onPointerDown:e=>{0===e.button&&(e.currentTarget.setPointerCapture?.(e.pointerId),eS.current={active:!0,startX:e.clientX,startY:e.clientY,baseX:eN.current.x,baseY:eN.current.y},eA(!0))},onPointerMove:e=>{let t=eS.current;if(!t.active)return;let a=ej.current;if(!a)return;let r=a.getBoundingClientRect(),s=(e.clientX-t.startX)/r.width*1e3,n=(e.clientY-t.startY)/r.height*680;ek(e=>({...e,x:t.baseX+s,y:t.baseY+n}))},onPointerUp:eR,onPointerLeave:eR,onDoubleClick:e=>{let t=e.target;t?.closest("g[data-node]")||eF()},style:{cursor:eT?"grabbing":"grab",touchAction:"none"},children:[(0,a.jsxs)("defs",{children:[(0,a.jsxs)("linearGradient",{id:"topo-panel",x1:"0",x2:"1",y1:"0",y2:"1",children:[(0,a.jsx)("stop",{offset:"0%",stopColor:T.panelStops[0]}),(0,a.jsx)("stop",{offset:"48%",stopColor:T.panelStops[1]}),(0,a.jsx)("stop",{offset:"100%",stopColor:T.panelStops[2]})]}),(0,a.jsxs)("radialGradient",{id:"topo-radar",cx:"50%",cy:"50%",r:"55%",children:[(0,a.jsx)("stop",{offset:"0%",stopColor:T.radarStops[0].color,stopOpacity:T.radarStops[0].opacity}),(0,a.jsx)("stop",{offset:"45%",stopColor:T.radarStops[1].color,stopOpacity:T.radarStops[1].opacity}),(0,a.jsx)("stop",{offset:"100%",stopColor:T.radarStops[2].color,stopOpacity:T.radarStops[2].opacity})]}),!P&&(0,a.jsxs)("filter",{id:"topo-glow",children:[(0,a.jsx)("feGaussianBlur",{stdDeviation:"4",result:"blur"}),(0,a.jsxs)("feMerge",{children:[(0,a.jsx)("feMergeNode",{in:"blur"}),(0,a.jsx)("feMergeNode",{in:"SourceGraphic"})]})]}),[{id:"topo-arrow-s",size:12},{id:"topo-arrow",size:16},{id:"topo-arrow-l",size:22}].map(e=>(0,a.jsx)("marker",{id:e.id,viewBox:"0 0 10 10",refX:"8",refY:"5",markerWidth:e.size,markerHeight:e.size,markerUnits:"userSpaceOnUse",orient:"auto-start-reverse",children:(0,a.jsx)("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:T.arrowFill})},e.id)),(0,a.jsxs)("radialGradient",{id:"topo-sweep",cx:"0%",cy:"50%",r:"100%",children:[(0,a.jsx)("stop",{offset:"0%",stopColor:P?"#0d9488":"#22d3ee",stopOpacity:P?.18:.32}),(0,a.jsx)("stop",{offset:"70%",stopColor:P?"#0d9488":"#22d3ee",stopOpacity:P?.1:.18}),(0,a.jsx)("stop",{offset:"100%",stopColor:P?"#0d9488":"#22d3ee",stopOpacity:"0"})]})]}),(0,a.jsx)("rect",{width:"1000",height:"680",fill:"url(#topo-panel)"}),(0,a.jsxs)("g",{transform:`translate(${ew.x} ${ew.y}) scale(${ew.zoom})`,children:["ring"===F&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("circle",{cx:500,cy:330,r:"330",fill:"url(#topo-radar)",style:{pointerEvents:"none"}}),!P&&(0,a.jsx)("g",{opacity:"0.5",style:{pointerEvents:"none"},children:Array.from({length:28}).map((e,t)=>{let r=9301*t+49297;return(0,a.jsx)("circle",{cx:13*r%1e3,cy:7*r%680,r:t%3==0?1.2:.7,fill:"#a5b4fc",opacity:.35+t%4*.05},t)})}),(0,a.jsx)("g",{style:{transformOrigin:"500px 330px",transformBox:"view-box",pointerEvents:"none"},className:"anet-topo-sweep",opacity:P?.7:1,children:(0,a.jsx)("path",{d:`M 500 330 L 830 330 A 330 330 0 0 0 ${500+330*Math.cos(-Math.PI/4.5)} ${330+330*Math.sin(-Math.PI/4.5)} Z`,fill:"url(#topo-sweep)"})}),[90,170,250,330].map(e=>(0,a.jsx)("circle",{cx:500,cy:330,r:e,fill:"none",stroke:T.ringStroke,strokeWidth:"1",opacity:P?.6:.35},e)),(H.length>14?[145,215,285]:H.length>8?[175,260]:H.length>0?[220]:[]).map(e=>(0,a.jsx)("circle",{cx:500,cy:330,r:e,fill:"none",stroke:T.ringStroke,strokeWidth:"0.7",strokeDasharray:"2 8",opacity:P?.32:.42,style:{pointerEvents:"none"},"data-tier-ring":e},`tier-${e}`)),!P&&[0,.25,.5,.75].map((e,t)=>(0,a.jsx)("g",{children:(0,a.jsx)("circle",{cx:830,cy:330,r:0===t?2.8:2.2,fill:"#22d3ee",opacity:.9,filter:"url(#topo-glow)",children:(0,a.jsx)("animateTransform",{attributeName:"transform",type:"rotate",from:`${360*e} 500 330`,to:`${360*e+360} 500 330`,dur:"16s",repeatCount:"indefinite"})})},`orbit-${t}`)),[0,30,60,90,120,150].map(e=>(0,a.jsx)("line",{x1:500-360*Math.cos(e*Math.PI/180),y1:330-360*Math.sin(e*Math.PI/180),x2:500+360*Math.cos(e*Math.PI/180),y2:330+360*Math.sin(e*Math.PI/180),stroke:T.ringStroke,strokeWidth:"1",opacity:P?.35:.18},e))]}),"ring"===F&&H.map((e,t)=>{let r=X[e.alias];if(!r)return null;let s=v({x:500,y:330},r,0),n=G.has(e.alias);return(0,a.jsx)("path",{d:s,fill:"none",stroke:n?T.spokeStroke.active:T.spokeStroke.idle,strokeWidth:n?2:1,strokeDasharray:n?"none":"6 14",opacity:n?.7:.45,className:n?void 0:"anet-topo-spoke-flow",style:n?void 0:{animationDelay:`${-(.25*t)}s`}},`hub-${e.alias}`)}),J.map(e=>{let t=ei===e.key,r=en===e.key;return(0,a.jsxs)("g",{"data-group":e.key,className:"transition-opacity",style:{opacity:!ei||t?1:.28},children:[(0,a.jsx)("rect",{x:e.x,y:e.y,width:e.w,height:e.h,rx:"14",fill:P?"#0f172a":"#a5b4fc",fillOpacity:r?P?.08:.13:t?P?.05:.09:P?.025:.045,stroke:r||t?T.legendAccent:T.ringStroke,strokeWidth:r?3:t?2:1.5,strokeDasharray:r||t?"none":"6 6","data-group-box-pinned":r?"true":"false","data-group-box-live":r||t||!(e.statuses.working>0)?"false":"true",className:r||t||!(e.statuses.working>0)?void 0:"anet-topo-groupbox-live",style:{transition:"stroke 200ms ease-out, stroke-width 200ms ease-out, fill-opacity 200ms ease-out",pointerEvents:"none"}}),(0,a.jsxs)("g",{role:"button",tabIndex:0,"aria-pressed":en===e.key,"data-group-label-hit":e.key,style:{pointerEvents:"all",cursor:"pointer"},onPointerDown:e=>e.stopPropagation(),onClick:()=>el(t=>t===e.key?null:e.key),onPointerEnter:()=>er(e.key),onPointerLeave:()=>er(t=>t===e.key?null:t),children:[(0,a.jsx)("rect",{x:e.x+6,y:e.y+2,width:Math.min(e.w-12,240),height:20,fill:"transparent"}),(0,a.jsxs)("text",{x:e.x+12,y:e.y+14,fill:t?T.legendHeadline:T.legendText,fontSize:"13",fontFamily:"monospace",fontWeight:"700",style:{transition:"fill 200ms ease-out"},"data-group-label":e.key,children:[e.key,(0,a.jsxs)("tspan",{dx:"6",fill:T.legendText,fontSize:"11",fontWeight:"400",children:["· ",e.count]}),e.statuses.working>0&&(0,a.jsxs)("tspan",{dx:"8",fill:P?"#059669":"#22c55e",fontSize:"11",fontWeight:"600",children:[e.statuses.working,"w"]}),e.statuses.idle>0&&(0,a.jsxs)("tspan",{dx:"4",fill:P?"#0d9488":"#2dd4bf",fontSize:"11",fontWeight:"600",children:[e.statuses.idle,"i"]}),e.statuses.offline>0&&(0,a.jsxs)("tspan",{dx:"4",fill:P?"#94a3b8":"#6b7280",fontSize:"11",fontWeight:"600",children:[e.statuses.offline,"o"]})]})]})]},`grp-${e.key}`)}),U.map((e,t)=>{let r=X[e.from],s=X[e.to];if(!r||!s)return null;let n=(t%2==0?1:-1)*Math.min(36,.18*Math.hypot(s.x-r.x,s.y-r.y)),l=v(r,s,n),i=Math.min(2+e.count,7),o=Math.max(.9,2.6/Math.sqrt(e.count)),d=Math.max(.35,1-(e.last_at?Math.max(0,Date.now()-Date.parse(e.last_at)):0)/3e5),c=e.count<=2?"topo-arrow-s":e.count<=4?"topo-arrow":"topo-arrow-l",h=(0,u.relativeAgo)(e.last_at),x=`${e.from} → ${e.to}
|
|
2
|
-
${e.count} message${1===e.count?"":"s"}${h?` \xb7 last ${h}`:""}`,m=eo===e.key,f=K[e.from]??e.from,p=K[e.to]??e.to,g=m?2:eo?.35:ee||ei?e.from===ee||e.to===ee?1.7:ei&&f===ei&&p===ei?1.3:.35:ec?1.5:1,y=m?Math.min(1.4*i,10):i;return(0,a.jsxs)("g",{children:[(0,a.jsx)("path",{d:l,fill:"none",stroke:"transparent",strokeWidth:Math.max(i+10,16),style:{pointerEvents:"stroke"},"data-edge-hitbox":!0,onMouseEnter:()=>ed(e.key),onMouseLeave:()=>ed(t=>t===e.key?null:t),children:(0,a.jsx)("title",{children:x})}),(0,a.jsx)("path",{d:l,fill:"none",stroke:T.flowEdge,strokeWidth:y,opacity:Math.min(1,(P?.22:.28)*d*g),filter:P?void 0:"url(#topo-glow)",markerEnd:`url(#${c})`,className:"transition-opacity duration-300",style:{pointerEvents:"none"}}),(0,a.jsx)("path",{id:`flow-path-${t}`,d:l,fill:"none",stroke:T.flowPath,strokeWidth:"1",strokeDasharray:"2 12",opacity:Math.min(1,(P?.4:.75)*d*g),className:"transition-opacity duration-300"}),!L&&(0,a.jsx)("circle",{r:"4",fill:T.flowParticle,filter:P?void 0:"url(#topo-glow)",opacity:Math.min(1,d*g),children:(0,a.jsx)("animateMotion",{dur:`${o}s`,repeatCount:"indefinite",path:l})}),!L&&d>.5&&(0,a.jsxs)("circle",{cx:s.x,cy:s.y,r:"0",fill:"none",stroke:T.flowEdge,strokeWidth:"1.5",opacity:"0",style:{pointerEvents:"none"},"data-arrival-ping":e.key,children:[(0,a.jsx)("animate",{attributeName:"r",values:"0;14;22",dur:`${o}s`,begin:`-${(.92*o).toFixed(2)}s`,repeatCount:"indefinite"}),(0,a.jsx)("animate",{attributeName:"opacity",values:"0;0.55;0",dur:`${o}s`,begin:`-${(.92*o).toFixed(2)}s`,repeatCount:"indefinite"})]}),!L&&d>.5&&e.count>=3&&(0,a.jsxs)("circle",{cx:r.x,cy:r.y,r:"0",fill:"none",stroke:T.flowEdge,strokeWidth:"1.5",opacity:"0",style:{pointerEvents:"none"},"data-dispatch-pulse":e.key,children:[(0,a.jsx)("animate",{attributeName:"r",values:"0;12;18",dur:`${o}s`,begin:"0s",repeatCount:"indefinite"}),(0,a.jsx)("animate",{attributeName:"opacity",values:"0;0.45;0",dur:`${o}s`,begin:"0s",repeatCount:"indefinite"})]})]},e.key)}),"ring"===F&&(0,a.jsxs)("g",{"data-topo-hub":!0,style:{cursor:"pointer"},onPointerDown:e=>e.stopPropagation(),onClick:()=>{eW(),ez({ts:Date.now(),x:500,y:330,r0:18,color:P?"#059669":"#10b981"}),setTimeout(()=>ez(e=>e&&500===e.x&&330===e.y?null:e),600)},children:[(0,a.jsx)("title",{children:(c=e.length,h=["Network hub",`${c} session${1===c?"":"s"}`],H.length>0&&h.push(`${H.length} online`),q>0&&h.push(`${q} working`),U.length>0&&h.push(`${U.length} active link${1===U.length?"":"s"}`),h.join(" · ")+"\nclick to fit view")}),(f=[.52,.58,.65,.72][m=0===q?0:q<=2?1:q<=5?2:3],g=[.16,.2,.26,.32][m],_=[4,3.2,2.7,2.4][m],$=`0.32;${f};0.32`,z=`0.08;${g};0.08`,(0,a.jsx)("circle",{cx:500,cy:330,r:"18",fill:P?"#d1fae5":"#10b981",opacity:P?.42:.12,"data-hub-busyness":m,children:!L&&(0,a.jsx)("animate",{attributeName:"opacity",values:P?$:z,dur:`${_}s`,repeatCount:"indefinite"})})),(0,a.jsx)("circle",{cx:500,cy:330,r:"10",fill:P?"#059669":"#10b981"}),(0,a.jsx)("circle",{cx:500,cy:330,r:"5",fill:"#d1fae5",opacity:"0.9"})]}),[...H,...Y].map((e,r)=>{var s,n;let l,i,o,c,h,x,m,f,g,b=X[e.alias];if(!b)return null;let v=(e.network_id?t[`${e.network_id}:${e.alias}`]:void 0)??t[e.alias],w="offline"!==e.status||!!v,N=k(e,w,P),S=G.has(e.alias),_=Math.round((w?26:18)*O),M=!Q||ee===e.alias||ew.zoom>=1.4,C=!ei||(K[e.alias]??e.alias)===ei,E=0;if("ring"===F){let t=X[e.alias];if(t){let e=Math.hypot(t.x-500,t.y-330);E=e<195?0:e<270?1:e<310?2:3}}return(0,a.jsxs)("g",{"data-node":e.alias,"data-tier-idx":"ring"===F?E:-1,className:"group transition-opacity anet-fade-in",style:{cursor:"pointer",opacity:eb&&!eb.has(e.alias)&&eC!==e.alias||eu&&eC!==e.alias&&("unknown"===(l=p(e.model)).id?"?":l.initial)!==eu||ey&&eC!==e.alias&&!("working"===ey?"working"===e.status:"idle"===ey?w&&"working"!==e.status:!w)?.28:C?eC===e.alias||w?1:.6:.32,animationDelay:"ring"===F?`${180*E+r%6*25}ms`:`${25*Math.min(r,24)}ms`,transform:L||ee!==e.alias?void 0:"translateY(-2px)",transition:"transform 180ms cubic-bezier(0.4,0,0.2,1)"},onPointerDown:e=>e.stopPropagation(),onPointerEnter:()=>et(e.alias),onPointerLeave:()=>et(t=>t===e.alias?null:t),onClick:()=>{eE(e.alias),ez({ts:Date.now(),x:b.x,y:b.y,r0:_,color:N.primary}),setTimeout(()=>ez(e=>e&&Date.now()-e.ts>=590?null:e),600)},children:[(i=!w&&e.last_seen_at?(0,u.relativeAgo)(e.last_seen_at):null,(0,a.jsx)("title",{children:[(s=e.model,n=e.runtime,o=p(s),c=y(n),h=[],"unknown"!==o.id&&h.push(o.label),s&&h.push(s),c&&h.push(c.label),h.join(" · ")||e.alias),e.project_dir?`cwd: ${e.project_dir}`:null,i?`last seen: ${i}`:null].filter(Boolean).join("\n")})),(0,a.jsx)("circle",{cx:b.x,cy:b.y,r:_+12,fill:"none",stroke:N.primary,strokeWidth:"2",className:"opacity-0 group-hover:opacity-70 transition-opacity duration-150",style:{pointerEvents:"none"}}),eC===e.alias&&(0,a.jsx)("circle",{cx:b.x,cy:b.y,r:_+14,fill:"none",stroke:N.primary,strokeWidth:"2.5",opacity:P?.85:.95,filter:P?void 0:"url(#topo-glow)",className:"transition-opacity duration-200",style:{pointerEvents:"none"}}),S&&!L&&(0,a.jsxs)("circle",{cx:b.x,cy:b.y,r:_+14,fill:N.primary,opacity:P?.08:.12,children:[(0,a.jsx)("animate",{attributeName:"r",values:`${_+8};${_+22};${_+8}`,dur:"2.4s",repeatCount:"indefinite"}),(0,a.jsx)("animate",{attributeName:"opacity",values:P?"0.12;0.02;0.12":"0.18;0.04;0.18",dur:"2.4s",repeatCount:"indefinite"})]}),(0,a.jsx)("circle",{cx:b.x,cy:b.y,r:_+8,fill:N.halo,opacity:w?P?.85:.65:P?.4:.25,className:"transition-[fill,opacity] duration-300 ease-out"}),(0,a.jsx)("circle",{cx:b.x,cy:b.y,r:_,fill:w?T.nodeFill.online:T.nodeFill.offline,stroke:N.primary,strokeWidth:w?3:1.5,strokeDasharray:w?"none":"5 5",filter:w&&!P?"url(#topo-glow)":void 0,className:"transition-[fill,stroke] duration-300 ease-out"}),(()=>{let t=Math.round((w?14:10)*O),r=2*_,s=p(e.model),n=/书生|书小生|intern/i.test(e.alias);if(A||n||s.logo)return(0,a.jsx)("image",{href:s.logo??"/intern_avatar.png",x:b.x-r/2,y:b.y-r/2,width:r,height:r,preserveAspectRatio:"xMidYMid meet"});if("unknown"!==s.id)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("circle",{cx:b.x,cy:b.y,r:t,fill:s.mono.bg,stroke:s.mono.ring,strokeWidth:"1"}),(0,a.jsx)("text",{x:b.x,y:b.y,dy:"0.34em",textAnchor:"middle",fill:s.mono.text,fontSize:t,fontFamily:"monospace",fontWeight:"700",children:s.initial})]});let l=(0,d.aliasAvatarColors)(K[e.alias]||e.alias);return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("circle",{cx:b.x,cy:b.y,r:t,fill:l.bg,stroke:l.ring,strokeWidth:"1"}),(0,a.jsx)("text",{x:b.x,y:b.y,dy:"0.34em",textAnchor:"middle",fill:l.text,fontSize:t,fontFamily:"monospace",fontWeight:"700",children:(0,d.aliasInitial)(e.alias)})]})})(),(()=>{let t=y(e.runtime);if(!t)return null;let r=w?7:5.5,s=b.x+.72*_,n=b.y+.72*_,l=2*r*.62;return(0,a.jsxs)("g",{style:{pointerEvents:"none"},children:[(0,a.jsx)("circle",{cx:s,cy:n,r:r,fill:T.containerBg,stroke:t.color,strokeWidth:"1.5"}),(0,a.jsx)("g",{transform:`translate(${s-l/2} ${n-l/2}) scale(${l/24})`,children:(0,a.jsx)("path",{d:t.iconPath,fill:"none",stroke:t.color,strokeWidth:"2.4",strokeLinecap:"round",strokeLinejoin:"round"})})]})})(),"working"===e.status&&(m=(x=v??0)>=4?"0.7s":x>=2?"0.9s":"1.2s",(0,a.jsx)("circle",{cx:b.x,cy:b.y-(_-6),r:"2.5",fill:T.flowParticle,"data-pulse-dur":m,opacity:L?.6:void 0,children:!L&&(0,a.jsx)("animate",{attributeName:"opacity",values:"1;0.25;1",dur:m,repeatCount:"indefinite"})})),(g=(f=O<.8)?88:100,M?(0,a.jsxs)("g",{transform:`translate(${b.x}, ${b.y+_+(f?18:22)})`,style:{pointerEvents:"none"},className:"transition-transform duration-200 group-hover:-translate-y-[1.5px]",children:[(0,a.jsx)("rect",{x:-g/2,y:f?-12:-14,width:g,height:f?36:42,rx:"6",fill:T.labelBox.fill,stroke:T.labelBox.stroke,opacity:P?1:.94}),(0,a.jsx)("text",{x:"0",y:"1",textAnchor:"middle",fill:N.text,fontSize:f?11:12,fontFamily:"monospace",fontWeight:"700",children:j(e.alias,f?11:12)}),(0,a.jsxs)("text",{x:"0",y:f?15:17,textAnchor:"middle",fill:N.primary,fontSize:f?8:9,fontFamily:"monospace",children:[N.label,w&&null!=v?` sse:${v}`:""]})]}):(0,a.jsx)("text",{x:b.x,y:b.y+_+(f?12:14),textAnchor:"middle",fill:N.text,fontSize:f?9:10,fontFamily:"monospace",fontWeight:"700",opacity:.9,className:"transition-transform duration-200 group-hover:-translate-y-[1.5px]",style:{pointerEvents:"none",paintOrder:"stroke"},stroke:T.containerBg,strokeWidth:"3",children:j(e.alias,f?9:10)}))]},e.alias)}),e$&&!L&&(0,a.jsxs)("circle",{cx:e$.x,cy:e$.y,r:e$.r0+4,fill:"none",stroke:e$.color,strokeWidth:"2",opacity:"0",style:{pointerEvents:"none"},children:[(0,a.jsx)("animate",{attributeName:"r",values:`${e$.r0+4};${e$.r0+30}`,dur:"0.5s",fill:"freeze"}),(0,a.jsx)("animate",{attributeName:"opacity",values:"0.7;0",dur:"0.5s",fill:"freeze"})]},e$.ts)]}),(0,a.jsxs)("g",{transform:"translate(16, 16)",children:[(0,a.jsx)("rect",{x:"0",y:"0",width:"230",height:"84",rx:"10",fill:T.legendBox.fill,stroke:T.legendBox.stroke,opacity:P?.97:.92,style:{filter:P?"drop-shadow(0 2px 6px rgba(15,23,42,0.08))":"drop-shadow(0 2px 6px rgba(0,0,0,0.45))"},"data-topo-panel-elevation":"recent"}),(0,a.jsx)("text",{x:"13",y:"21",fill:T.legendHeadline,fontSize:"12",fontFamily:"monospace",fontWeight:"700",children:"recent signal"}),(0,a.jsxs)("text",{x:"150",y:"21",fill:T.legendAccent,fontSize:"10",fontFamily:"monospace",children:[R.length," msgs"]}),0===U.length?(0,a.jsx)("text",{x:"115",y:"60",textAnchor:"middle",fill:T.legendText,fontSize:"10",fontFamily:"monospace",fontStyle:"italic",opacity:.65,"data-recent-signal-empty":!0,children:"no flow yet"}):U.slice(0,3).map((e,t)=>(0,a.jsxs)("g",{"data-recent-row":e.key,style:{cursor:"pointer"},onMouseEnter:()=>ed(e.key),onMouseLeave:()=>ed(t=>t===e.key?null:t),children:[(0,a.jsx)("rect",{x:"6",y:38+16*t-10,width:"218",height:"14",fill:"transparent"}),(0,a.jsxs)("text",{x:"13",y:38+16*t,fill:eo===e.key?T.legendHeadline:T.legendText,fontSize:"9",fontFamily:"monospace",style:{transition:"fill 150ms ease-out"},children:[j(e.from,6)," ","->"," ",j(e.to,6)," / ",e.count," / ",j(e.content,12)]})]},e.key))]}),(0,a.jsxs)("g",{transform:"translate(760, 16)",children:[(0,a.jsx)("rect",{x:"0",y:"0",width:"224",height:"96",rx:"10",fill:T.legendBox.fill,stroke:T.legendBox.stroke,opacity:P?.97:.92,style:{filter:P?"drop-shadow(0 2px 6px rgba(15,23,42,0.08))":"drop-shadow(0 2px 6px rgba(0,0,0,0.45))"},"data-topo-panel-elevation":"legend"}),[{key:"working",y0:24,y1:28,fill:P?"#059669":"#22c55e",label:"working node"},{key:"idle",y0:48,y1:52,fill:P?"#0d9488":"#2dd4bf",label:"online idle"},{key:"offline",y0:72,y1:76,fill:P?"#94a3b8":"#6b7280",label:"offline / no SSE"}].map(e=>{let t=ep===e.key;return(0,a.jsxs)("g",{"data-legend-status":e.key,role:"button",tabIndex:0,"aria-pressed":t,style:{cursor:"pointer"},onPointerDown:e=>e.stopPropagation(),onMouseEnter:()=>ef(e.key),onMouseLeave:()=>ef(t=>t===e.key?null:t),onClick:()=>eg(t=>t===e.key?null:e.key),children:[(0,a.jsx)("rect",{x:"6",y:e.y0-12,width:"170",height:"22",fill:"transparent"}),(0,a.jsx)("circle",{cx:"16",cy:e.y0,r:"5.5",fill:e.fill}),t&&(0,a.jsx)("circle",{cx:"16",cy:e.y0,r:"8",fill:"none",stroke:e.fill,strokeWidth:"1.5"}),(0,a.jsx)("text",{x:"30",y:e.y1,fill:em===e.key||t?T.legendHeadline:T.legendText,fontSize:"11",fontFamily:"monospace",style:{transition:"fill 150ms ease-out"},children:e.label})]},e.key)}),(0,a.jsx)("path",{d:"M140,72 Q164,48 196,72",fill:"none",stroke:T.flowEdge,strokeWidth:"3",markerEnd:"url(#topo-arrow)",style:{pointerEvents:"none"}})]})]}),(()=>{if(.01>Math.abs(ew.zoom-1)&&1>Math.abs(ew.x)&&1>Math.abs(ew.y)||H.length+Y.length===0)return null;let e=-ew.x/ew.zoom*.12,r=-ew.y/ew.zoom*.12058823529411765,s=1e3/ew.zoom*.12,n=680/ew.zoom*.12058823529411765;return(0,a.jsx)("div",{className:"absolute right-3 rounded-md border shadow-lg shadow-black/30 overflow-hidden anet-fade-in",style:{bottom:56,background:T.legendBox.fill,borderColor:T.containerBorder,cursor:"crosshair"},role:"img","aria-label":"Topology minimap — click to recenter",title:"Minimap · click to recenter",onClick:e=>{let t=e.currentTarget.getBoundingClientRect(),a=(e.clientX-t.left)/t.width,r=(e.clientY-t.top)/t.height;ek(e=>({...e,x:500-1e3*a*e.zoom,y:340-680*r*e.zoom}))},"data-topo-minimap":!0,children:(0,a.jsxs)("svg",{width:120,height:82,viewBox:"0 0 120 82",style:{display:"block"},children:[[...H,...Y].map(e=>{let r=X[e.alias];if(!r)return null;let s=(e.network_id?t[`${e.network_id}:${e.alias}`]:void 0)??t[e.alias],n="offline"!==e.status||!!s,l=k(e,n,P);return(0,a.jsx)("circle",{cx:.12*r.x,cy:.12058823529411765*r.y,r:n?1.7:1.2,fill:l.primary,opacity:n?.9:.5},e.alias)}),(0,a.jsx)("rect",{x:Math.max(0,e),y:Math.max(0,r),width:Math.max(0,Math.min(120-Math.max(0,e),s)),height:Math.max(0,Math.min(82-Math.max(0,r),n)),fill:"none",stroke:T.legendAccent,strokeWidth:"1",opacity:"0.9"})]})})})(),(0,a.jsxs)("div",{className:"absolute bottom-3 right-3 flex items-center gap-1.5 text-xs select-none",children:[(0,a.jsx)("div",{className:"flex items-center rounded-md border overflow-hidden",style:{background:T.legendBox.fill,borderColor:T.containerBorder},role:"group","aria-label":"Node size",children:[["S",.7],["M",.84],["L",1]].map(([e,t],r)=>(0,a.jsx)("button",{onClick:()=>(e=>{D(e);try{localStorage.setItem("anet-topo-nodescale",String(e))}catch{}})(t),"aria-pressed":O===t,title:`Node size: ${"S"===e?"small":"M"===e?"medium":"large"}`,className:`px-2 py-1 transition-colors ${r>0?"border-l":""} ${O===t?"bg-cyan-500/15 text-cyan-300":"hover:bg-white/5"}`,style:{color:O===t?void 0:T.legendText,borderColor:T.containerBorder},children:e},e))}),(0,a.jsxs)("div",{className:"flex items-center rounded-md border overflow-hidden",style:{background:T.legendBox.fill,borderColor:T.containerBorder},children:[(0,a.jsx)("button",{onClick:()=>eI(1/1.2),className:"px-2 py-1 hover:bg-white/5 transition-colors",style:{color:T.legendText},"aria-label":"Zoom out",title:"Zoom out (−)",children:(0,a.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:(0,a.jsx)("path",{d:"M5 12h14"})})}),(0,a.jsxs)("span",{className:"px-2 py-1 tabular-nums border-x text-center",style:{color:T.legendText,borderColor:T.containerBorder,minWidth:46},title:"Current zoom level",children:[Math.round(100*ew.zoom),"%"]}),(0,a.jsx)("button",{onClick:()=>eI(1.2),className:"px-2 py-1 hover:bg-white/5 transition-colors",style:{color:T.legendText},"aria-label":"Zoom in",title:"Zoom in (+)",children:(0,a.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:(0,a.jsx)("path",{d:"M12 5v14M5 12h14"})})})]}),(0,a.jsx)("button",{onClick:eF,className:"p-1.5 rounded-md border hover:bg-white/5 transition-colors",style:{background:T.legendBox.fill,borderColor:T.containerBorder,color:T.legendText},"aria-label":"Reset view",title:"Reset zoom + pan (0, or double-click the canvas)",children:(0,a.jsxs)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[(0,a.jsx)("path",{d:"M3 12a9 9 0 1 0 9-9 9 9 0 0 0-6.4 2.6L3 8"}),(0,a.jsx)("path",{d:"M3 3v5h5"})]})}),(0,a.jsx)("button",{onClick:()=>{let e=ev.current;if(e)if(document.fullscreenElement)document.exitFullscreen?.();else{let t=e.requestFullscreen||e.webkitRequestFullscreen;t?.call(e)}},className:"p-1.5 rounded-md border hover:bg-white/5 transition-colors",style:{background:T.legendBox.fill,borderColor:T.containerBorder,color:T.legendText},"aria-label":e_?"Exit fullscreen":"Enter fullscreen",title:e_?"Exit fullscreen":"Fullscreen",children:e_?(0,a.jsx)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:(0,a.jsx)("path",{d:"M8 3v4a1 1 0 0 1-1 1H3M21 8h-4a1 1 0 0 1-1-1V3M3 16h4a1 1 0 0 1 1 1v4M16 21v-4a1 1 0 0 1 1-1h4"})}):(0,a.jsx)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:(0,a.jsx)("path",{d:"M3 8V5a2 2 0 0 1 2-2h3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M21 16v3a2 2 0 0 1-2 2h-3"})})})]}),eC&&(0,a.jsx)(x,{alias:eC,onClose:()=>eE(null)})]})]})}let $={working:{bg:"bg-green-900/30 border-green-800/30",text:"text-green-300",dot:"bg-green-500",glow:"shadow-green-500/10"},idle:{bg:"bg-cyan-900/30 border-cyan-800/30",text:"text-cyan-300",dot:"bg-cyan-400",glow:"shadow-cyan-500/5"},blocked:{bg:"bg-yellow-900/30 border-yellow-800/30",text:"text-yellow-300",dot:"bg-yellow-500",glow:""},error:{bg:"bg-red-900/30 border-red-800/30",text:"text-red-300",dot:"bg-red-500",glow:""}},z={bg:"bg-gray-800/50 border-gray-700/30",text:"text-gray-500",dot:"bg-gray-500",glow:""};function P({session:e,hasSse:t,sseCount:r,onChat:l}){let i=t&&$[e.status]||z;return(0,a.jsxs)(s.default,{href:`/node?alias=${encodeURIComponent(e.alias)}`,prefetch:!1,className:`anet-agent-card group relative block rounded-xl border p-4 transition-all duration-300 cursor-pointer hover:-translate-y-0.5 ${t?`bg-[#111128] border-[#2a2a4a] hover:border-cyan-500/30 hover:shadow-lg ${i.glow}`:"bg-[#0d0d1a] border-[#1a1a2a] opacity-40"}`,children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,a.jsx)(d.AliasAvatar,{alias:e.alias,size:22}),(0,a.jsx)("span",{className:"font-semibold text-white truncate text-sm",title:e.alias,children:e.alias}),(0,a.jsx)("span",{className:`inline-block w-1.5 h-1.5 rounded-full shrink-0 ${i.dot} ${t&&"working"===e.status?"animate-pulse":""}`})]}),(0,a.jsx)("span",{className:`text-[11px] px-2 py-0.5 rounded-md border shrink-0 ${i.bg} ${i.text}`,children:t?e.status:"offline"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,a.jsx)("span",{className:"text-xs text-gray-600 bg-[#0a0a15] px-2 py-0.5 rounded border border-[#1a1a2a]",children:e.agent||"unknown"}),t&&(0,a.jsxs)("span",{className:"text-[10px] text-green-500",children:["SSE:",r]})]}),e.task?(0,a.jsx)("div",{className:"text-xs text-gray-400 bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a] line-clamp-2",title:e.task,children:e.task}):(0,a.jsx)("div",{className:"text-xs text-gray-700 italic",children:"No active task"}),e.progress>0&&(0,a.jsxs)("div",{className:"mt-3",children:[(0,a.jsxs)("div",{className:"flex justify-between text-[10px] mb-1",children:[(0,a.jsx)("span",{className:"text-gray-600",children:"Progress"}),(0,a.jsxs)("span",{className:i.text,children:[e.progress,"%"]})]}),(0,a.jsx)("div",{className:"w-full bg-gray-800 rounded-full h-1.5 overflow-hidden",children:(0,a.jsx)("div",{className:`h-1.5 rounded-full transition-all duration-700 ${"working"===e.status?"bg-green-500":"bg-cyan-500"}`,style:{width:`${Math.min(e.progress,100)}%`}})})]}),(0,a.jsxs)("div",{className:"mt-3 flex justify-between items-center text-[10px] text-gray-600",children:[(0,a.jsx)("span",{className:"truncate",title:e.server||"",children:e.server||"--"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[l&&t&&(0,a.jsx)("button",{onClick:t=>{t.preventDefault(),t.stopPropagation(),l(e.alias)},className:"text-cyan-400 hover:text-cyan-300 px-1.5 py-0.5 rounded border border-cyan-500/20 hover:bg-cyan-500/10 transition-colors",children:"Chat"}),(0,a.jsx)("span",{children:(0,n.timeAgo)(e.updated_at)}),(0,a.jsx)("svg",{"aria-hidden":!0,className:"w-3 h-3 text-gray-700 opacity-0 -translate-x-1 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-200",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,a.jsx)("path",{d:"M9 18l6-6-6-6"})})]})]})]})}function L({messages:e}){return 0===e.length?null:(0,a.jsxs)("div",{className:"mt-8",children:[(0,a.jsxs)("h2",{className:"text-lg font-semibold text-white mb-3 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-gray-500",children:"Inbox"}),(0,a.jsx)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30",children:e.length})]}),(0,a.jsx)("div",{className:"space-y-2 max-h-96 overflow-y-auto pr-1 scrollbar-thin",children:e.map(e=>(0,a.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-4 py-3 text-sm transition-colors hover:border-[#3a3a5a]",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-xs mb-1.5",children:[e.from_session&&(0,a.jsx)(d.AliasAvatar,{alias:e.from_session,size:16}),(0,a.jsx)("span",{className:"text-gray-200 font-medium truncate",children:e.from_session}),(0,a.jsx)("span",{className:"ml-auto text-gray-600 shrink-0",title:e.created_at,children:(0,n.timeAgo)(e.created_at)})]}),(0,a.jsx)("div",{className:"text-gray-300 leading-relaxed line-clamp-3",title:e.content||"",children:(0,n.previewContent)(e.content)})]},e.id))})]})}function T(){return(0,a.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,a.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3 mb-8 anet-skeleton-pulse",children:[1,2,3,4].map(e=>(0,a.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] px-4 py-3",children:[(0,a.jsx)(A,{w:"2.5rem",h:"1.75rem"}),(0,a.jsx)(A,{w:"3.5rem",h:"0.75rem",className:"mt-2"}),(0,a.jsx)(A,{w:"5rem",h:"0.625rem",className:"mt-1"})]},e))}),(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-3 anet-skeleton-pulse",children:[(0,a.jsx)(A,{w:"6rem",h:"2.5rem",rounded:"0.75rem"}),(0,a.jsxs)("div",{className:"flex-1 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-2.5 flex items-center gap-3",children:[(0,a.jsx)("div",{className:"w-8 h-8 rounded-full anet-skeleton-bar"}),(0,a.jsxs)("div",{className:"flex-1",children:[(0,a.jsx)(A,{w:"6rem",h:"0.875rem"}),(0,a.jsx)(A,{w:"10rem",h:"0.625rem",className:"mt-1"})]})]})]}),(0,a.jsx)("div",{className:"mb-6 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 anet-skeleton-pulse",children:(0,a.jsx)(A,{w:"14rem",h:"0.875rem"})}),(0,a.jsx)("div",{className:"grid grid-cols-3 gap-2 sm:gap-3 mb-3 anet-skeleton-pulse",children:[1,2,3].map(e=>(0,a.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] px-3 py-3",children:[(0,a.jsx)(A,{w:"2rem",h:"1.25rem"}),(0,a.jsx)(A,{w:"2.5rem",h:"0.75rem",className:"mt-1"}),(0,a.jsx)(A,{w:"3.5rem",h:"0.625rem",className:"mt-px"})]},e))}),(0,a.jsx)("div",{className:"grid grid-cols-3 gap-2 sm:gap-3 mb-6 anet-skeleton-pulse",children:[1,2,3].map(e=>(0,a.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] px-3 py-2.5 flex items-center justify-center gap-2",children:[(0,a.jsx)("div",{className:"w-4 h-4 rounded anet-skeleton-bar"}),(0,a.jsx)(A,{w:"4rem",h:"0.75rem"})]},e))}),(0,a.jsxs)("div",{className:"mb-6 flex gap-2 anet-skeleton-pulse",children:[(0,a.jsx)("div",{className:"flex-1 h-10 rounded-lg border border-[#2a2a4a] bg-[#111128]"}),(0,a.jsx)("div",{className:"w-28 h-10 rounded-lg anet-skeleton-bar"})]}),(0,a.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-3 sm:gap-4 anet-skeleton-pulse",children:[1,2,3,4].map(e=>(0,a.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] p-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,a.jsx)("div",{className:"w-2 h-2 rounded-full anet-skeleton-bar"}),(0,a.jsx)(A,{w:"6rem",h:"0.875rem"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)(A,{w:"100%",h:"0.625rem"}),(0,a.jsx)(A,{w:"75%",h:"0.625rem"}),(0,a.jsx)(A,{w:"55%",h:"0.625rem"})]})]},e))})]})}function A({w:e,h:t,rounded:r,className:s}){return(0,a.jsx)("div",{className:`anet-skeleton-bar ${s||""}`,style:{width:e,height:t,borderRadius:r||"0.375rem"}})}var R=e.i(76161),I=e.i(98025),F=e.i(11449);function W(){let{setNetworkId:e}=(0,F.useNetworkId)(),[t,s]=(0,r.useState)({user:null,networks:[],currentNetwork:"",token:""}),[n,l]=(0,r.useState)(!1),[i,o]=(0,r.useState)(""),[d,c]=(0,r.useState)(""),[h,u]=(0,r.useState)(""),[x,m]=(0,r.useState)(!1);(0,r.useEffect)(()=>{let e=sessionStorage.getItem("anet_v3_auth");if(e)try{s(JSON.parse(e))}catch{}},[]);let[f,p]=(0,r.useState)(!1),[g,y]=(0,r.useState)(""),[b,v]=(0,r.useState)(""),j=async()=>{try{await fetch(`/api/hub/auth?token=${t.token}&endpoint=/api/auth/me`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"update_profile",token:t.token,display_name:g,email:b})});let e=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"update_profile",token:t.token,display_name:g,email:b})}),a=await e.json();if(a.ok&&a.user){let e={...t,user:a.user};s(e),sessionStorage.setItem("anet_v3_auth",JSON.stringify(e)),p(!1)}}catch{}};if(!t.user)return null;let w=(t.user.display_name||t.user.username).slice(0,2).toUpperCase();return(0,a.jsxs)("div",{className:"flex items-center justify-between bg-[#111128] border border-[#2a2a4a] rounded-lg px-4 py-2.5 mb-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"w-8 h-8 rounded-full bg-gradient-to-br from-cyan-500 to-blue-600 flex items-center justify-center text-xs font-bold text-white",children:w}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-sm text-white font-medium",children:t.user.display_name||t.user.username}),(0,a.jsxs)("div",{className:"text-[10px] text-gray-500",children:[t.user.role," · ",t.user.user_id]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[t.networks.length>0&&(0,a.jsx)("select",{value:t.currentNetwork,onChange:a=>{let r={...t,currentNetwork:a.target.value};s(r),e(a.target.value),sessionStorage.setItem("anet_v3_auth",JSON.stringify(r))},className:"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white focus:outline-none",children:t.networks.map(e=>(0,a.jsx)("option",{value:e.network_id,children:e.network_name},e.network_id))}),(0,a.jsxs)("button",{onClick:()=>{y(t.user?.display_name||""),v(""),p(!f)},className:"text-xs text-gray-500 hover:text-gray-300 whitespace-nowrap","aria-label":"Edit profile",children:[(0,a.jsx)("span",{className:"hidden sm:inline",children:"Edit"}),(0,a.jsx)("svg",{className:"sm:hidden w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"1.5",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.862 4.487z"})})]}),(0,a.jsxs)("button",{onClick:()=>{s({user:null,networks:[],currentNetwork:"",token:""}),sessionStorage.removeItem("anet_v3_auth")},className:"text-xs text-gray-500 hover:text-gray-300 whitespace-nowrap","aria-label":"Sign out",children:[(0,a.jsx)("span",{className:"hidden sm:inline",children:"Sign out"}),(0,a.jsx)("svg",{className:"sm:hidden w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"1.5",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9"})})]})]}),f&&(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2 mt-2 pt-2 border-t border-[#2a2a4a]",children:[(0,a.jsx)("input",{type:"text",value:g,onChange:e=>y(e.target.value),placeholder:"Display name",className:"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white placeholder-gray-600 focus:outline-none w-32"}),(0,a.jsx)("input",{type:"email",value:b,onChange:e=>v(e.target.value),placeholder:"Email",className:"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white placeholder-gray-600 focus:outline-none w-40"}),(0,a.jsx)("button",{onClick:j,className:"px-2 py-1 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded",children:"Save"})]})]})}var B=e.i(6694);function O({tabs:e,activeTab:t,onOpenTab:r,onCloseTab:s,onSetActive:n,onClose:l}){return 0===e.length?null:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{onClick:l,className:"jsx-f7cf3d1a6fdfc074 fixed inset-0 bg-black/30 z-40 lg:hidden"}),(0,a.jsxs)("div",{className:"jsx-f7cf3d1a6fdfc074 fixed top-0 right-0 h-full w-full lg:w-[500px] bg-[#0a0a1a] border-l border-[#2a2a4a] z-50 flex flex-col shadow-2xl shadow-black/60 animate-slide-in",children:[(0,a.jsxs)("div",{className:"jsx-f7cf3d1a6fdfc074 flex items-center border-b border-[#2a2a4a] bg-[#0d0d1a] overflow-x-auto",children:[(0,a.jsx)("div",{className:"jsx-f7cf3d1a6fdfc074 flex-1 flex min-w-0",children:e.map(e=>(0,a.jsxs)("button",{onClick:()=>n(e),className:`jsx-f7cf3d1a6fdfc074 flex items-center gap-1.5 px-3 py-2.5 text-xs border-b-2 transition-colors shrink-0 ${t===e?"border-cyan-400 text-cyan-300 bg-cyan-500/5":"border-transparent text-gray-500 hover:text-gray-300"}`,children:[(0,a.jsx)("div",{className:`jsx-f7cf3d1a6fdfc074 w-2 h-2 rounded-full ${t===e?"bg-cyan-400":"bg-gray-600"}`}),(0,a.jsx)("span",{className:"jsx-f7cf3d1a6fdfc074 max-w-[80px] truncate",children:e}),(0,a.jsx)("button",{onClick:t=>{t.stopPropagation(),s(e)},className:"jsx-f7cf3d1a6fdfc074 ml-1 text-gray-600 hover:text-gray-300 p-0.5",children:"×"})]},e))}),(0,a.jsx)("button",{onClick:l,className:"jsx-f7cf3d1a6fdfc074 text-gray-500 hover:text-white px-3 py-2.5 shrink-0 border-l border-[#2a2a4a]",children:(0,a.jsx)("svg",{fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,className:"jsx-f7cf3d1a6fdfc074 w-4 h-4",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12",className:"jsx-f7cf3d1a6fdfc074"})})})]}),(0,a.jsx)("div",{className:"jsx-f7cf3d1a6fdfc074 flex-1 relative overflow-hidden",children:e.map(e=>(0,a.jsx)("div",{className:`jsx-f7cf3d1a6fdfc074 absolute inset-0 ${t===e?"block":"hidden"}`,children:(0,a.jsx)(D,{alias:e})},e))})]}),(0,a.jsx)(B.default,{id:"f7cf3d1a6fdfc074",children:"@keyframes slide-in{0%{transform:translate(100%)}to{transform:translate(0)}}.animate-slide-in{animation:.2s ease-out slide-in}"})]})}function D({alias:e}){return(0,a.jsx)(c.TaskChatPanel,{alias:e,onClose:()=>{},inline:!0})}function H({sessions:e,onClose:t}){let[s,n]=(0,r.useState)(new Set),[l,i]=(0,r.useState)(""),[o,c]=(0,r.useState)("normal"),[h,u]=(0,r.useState)(!1),[x,m]=(0,r.useState)([]),[f,p]=(0,r.useState)(""),g=e.filter(e=>"offline"!==e.status).filter(e=>!f||e.alias.toLowerCase().includes(f.toLowerCase())||(e.agent||"").toLowerCase().includes(f.toLowerCase())),y=async()=>{if(!l.trim()||0===s.size||h)return;u(!0),m([]);let e=[...s].map(async e=>{try{let t=await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:e,task:l,priority:o})}),a=await t.json();return{alias:e,ok:!!a.ok,error:a.error}}catch(t){return{alias:e,ok:!1,error:"send failed"}}});m(await Promise.all(e)),u(!1)},b=x.filter(e=>e.ok).length;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"fixed inset-0 bg-black/50 z-40 anet-fade-in",onClick:t}),(0,a.jsxs)("div",{className:"fixed inset-4 lg:inset-x-[15%] lg:inset-y-[5%] bg-[#0a0a1a] border border-[#2a2a4a] rounded-2xl z-50 flex flex-col shadow-2xl shadow-black/70 overflow-hidden anet-fade-in",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b border-[#2a2a4a] bg-[#0d0d1a]",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-bold text-white",children:"Dispatch Task"}),(0,a.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:"Send a task to one or more agents"})]}),(0,a.jsx)("button",{onClick:t,className:"text-gray-500 hover:text-white p-1.5 rounded-lg hover:bg-[#1a1a2a]",children:(0,a.jsx)("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),(0,a.jsxs)("div",{className:"flex-1 flex flex-col lg:flex-row overflow-hidden",children:[(0,a.jsxs)("div",{className:"lg:w-[280px] border-b lg:border-b-0 lg:border-r border-[#2a2a4a] flex flex-col",children:[(0,a.jsxs)("div",{className:"px-4 py-3 border-b border-[#2a2a4a]",children:[(0,a.jsx)("input",{type:"text",value:f,onChange:e=>p(e.target.value),placeholder:"Filter agents...",className:"w-full bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-xs text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none"}),(0,a.jsxs)("div",{className:"flex items-center justify-between mt-2",children:[(0,a.jsx)("button",{onClick:()=>{s.size===g.length?n(new Set):n(new Set(g.map(e=>e.alias)))},className:"text-[10px] text-cyan-400 hover:text-cyan-300",children:s.size===g.length?"Deselect all":`Select all (${g.length})`}),(0,a.jsxs)("span",{className:"text-[10px] text-gray-600",children:[s.size," selected"]})]})]}),(0,a.jsxs)("div",{className:"flex-1 overflow-y-auto px-2 py-2 space-y-0.5 max-h-[200px] lg:max-h-none",children:[g.map(e=>(0,a.jsxs)("button",{onClick:()=>{var t;return t=e.alias,void n(e=>{let a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a})},className:`w-full flex items-center gap-2 px-3 py-2 rounded-lg text-xs text-left transition-colors ${s.has(e.alias)?"bg-cyan-500/10 text-cyan-300 border border-cyan-500/20":"text-gray-400 hover:bg-[#1a1a2a]"}`,children:[(0,a.jsx)(d.AliasAvatar,{alias:e.alias,size:16}),(0,a.jsx)("div",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${"working"===e.status?"bg-green-400":"idle"===e.status?"bg-cyan-400":"bg-gray-500"}`}),(0,a.jsx)("span",{className:"truncate flex-1",children:e.alias}),(0,a.jsx)("span",{className:"text-[9px] text-gray-600",children:e.agent||"--"})]},e.alias)),0===g.length&&(0,a.jsx)("div",{className:"text-center text-xs text-gray-600 py-4",children:"No online agents"})]})]}),(0,a.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,a.jsxs)("div",{className:"flex-1 px-6 py-4 flex flex-col",children:[(0,a.jsx)("label",{className:"text-xs text-gray-500 uppercase mb-2",children:"Task Prompt"}),(0,a.jsx)("textarea",{value:l,onChange:e=>i(e.target.value),placeholder:"Enter the task you want to dispatch...",className:"flex-1 min-h-[120px] bg-[#111128] border border-[#2a2a4a] rounded-xl px-4 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none resize-none"}),(0,a.jsxs)("div",{className:"flex items-center gap-3 mt-4",children:[(0,a.jsxs)("select",{value:o,onChange:e=>c(e.target.value),className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-xs text-white focus:outline-none",children:[(0,a.jsx)("option",{value:"normal",children:"Normal priority"}),(0,a.jsx)("option",{value:"high",children:"High priority"}),(0,a.jsx)("option",{value:"low",children:"Low priority"})]}),(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("button",{onClick:y,disabled:h||!l.trim()||0===s.size,className:"px-6 py-2.5 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-xl transition-all shadow-lg shadow-cyan-500/10 disabled:shadow-none active:scale-95",children:h?(0,a.jsxs)("span",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin"}),"Sending..."]}):`Dispatch to ${s.size} agent${s.size>1?"s":""}`})]})]}),x.length>0&&(0,a.jsxs)("div",{className:"px-6 py-3 border-t border-[#2a2a4a] bg-[#0d0d1a]",children:[(0,a.jsxs)("div",{className:"text-xs text-gray-500 mb-2",children:[b,"/",x.length," dispatched successfully"]}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1.5",children:x.map(e=>(0,a.jsxs)("span",{className:`flex items-center gap-1.5 text-[10px] pl-1 pr-2 py-0.5 rounded-full border ${e.ok?"text-green-300 border-green-500/20 bg-green-500/5":"text-red-300 border-red-500/20 bg-red-500/5"}`,children:[(0,a.jsx)(d.AliasAvatar,{alias:e.alias,size:14}),(0,a.jsx)("span",{children:e.alias}),(0,a.jsx)("span",{"aria-hidden":!0,children:e.ok?"✓":e.error||"✗"})]},e.alias))})]})]})]})]})]})}var Y=e.i(2684),X=e.i(50111);e.s(["default",0,function(){let e,i,c,u,x;(0,r.useEffect)(()=>{sessionStorage.getItem("anet_v3_auth")||(fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),window.location.assign("/login"))},[]);let{sessions:m,hint:f,error:p,isLoading:g}=(0,h.useSessions)(),{health:y}=(0,h.useHealth)(),{config:b}=(0,h.useAnetConfig)(),{tasks:v}=(0,h.useTasks)({limit:"500"}),{stats:j}=(0,h.useStats)(),[w,k]=(0,r.useState)(window.innerWidth>=1024),[N,S]=(0,r.useState)(!1),_=function(){let[e,t]=(0,r.useState)([]),[a,s]=(0,r.useState)("");return{tabs:e,activeTab:a,openTab:e=>{t(t=>t.includes(e)?t:[...t,e]),s(e)},closeTab:e=>{t(t=>{let r=t.filter(t=>t!==e);return a===e&&s(r[r.length-1]||""),r})},closeAll:()=>{t([]),s("")},setActiveTab:s}}(),[M,C]=(0,r.useState)(!1),[$,z]=(0,r.useState)([]),[A,F]=(0,r.useState)("all"),[B,D]=(0,r.useState)(null),{mutate:U}=(0,X.useSWRConfig)(),G="1"!==t.default.env.NEXT_PUBLIC_DISABLE_SSE,{connected:K,supported:J}=(0,Y.useSSE)({url:"/api/hub/events",enabled:G,onEvent:e=>{if("node.renamed"===e.type){U("/api/hub/status");let t=e.data;t?.old_alias&&t?.new_alias&&D({from:t.old_alias,to:t.new_alias,ts:Date.now()});return}["new_task","new_message","new_reply","node_status_changed","broadcast"].includes(e.type)&&(U("/api/hub/status"),U(e=>"string"==typeof e&&e.startsWith("/api/hub/tasks"),void 0,{revalidate:!0}))}});if((0,r.useEffect)(()=>{let e=()=>{fetch("/api/hub/inbox").then(e=>e.json()).then(e=>{e.messages?.length&&z(t=>{let a=new Set(t.map(e=>e.id));return[...e.messages.filter(e=>!a.has(e.id)),...t].slice(0,100)})}).catch(()=>{})};e();let t=setInterval(e,1e4);return()=>clearInterval(t)},[]),g)return(0,a.jsx)(T,{});let V=y?.sse_sessions||{},q=e=>(e.network_id?V[`${e.network_id}:${e.alias}`]:void 0)??V[e.alias],Z=e=>"offline"!==e.status||!!q(e),Q=m.filter(Z).length,ee=m.length,et=m.filter(e=>"working"===e.status).length,ea=y?(0,n.formatUptime)(y.uptime):"--",er=y?.version||"--",es=!!(b?.hub&&b.tokenConfigured),en=b?.source==="file"?"Local config":b?.source==="runtime-env"?"Runtime env":"Config missing",el={};if(j?.tasks?.by_status?.length)for(let e of j.tasks.by_status)el[e.status]=e.count;else for(let e of v)el[e.status]=(el[e.status]||0)+1;let ei=[...m].sort((e,t)=>{let a=+!!Z(e),r=+!!Z(t);if(a!==r)return r-a;let s=+("working"===e.status);return("working"===t.status)-s}),eo=0===m.length&&!p;return(0,a.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,a.jsx)("div",{className:"lg:ml-0 ml-10",children:(0,a.jsx)(l,{online:Q,working:et,total:ee,version:er,uptime:ea})}),(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[!eo&&(0,a.jsx)("button",{onClick:()=>C(!0),className:"px-4 py-2 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 text-white text-sm font-medium rounded-xl shadow-lg shadow-cyan-500/10 transition-all active:scale-95 shrink-0",children:"⚡ Dispatch"}),(0,a.jsx)("div",{className:"flex-1",children:(0,a.jsx)(W,{})})]}),(0,a.jsxs)("section",{className:"mb-6 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 shadow-lg shadow-black/20",children:[(0,a.jsxs)("button",{onClick:()=>S(!N),className:"w-full flex items-center justify-between text-left",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,a.jsx)("span",{className:"uppercase text-gray-600",children:"Config"}),(0,a.jsx)("span",{className:`w-2 h-2 rounded-full ${es?"bg-green-400":"bg-red-400"}`}),(0,a.jsx)("span",{className:"text-gray-500",children:en})]}),(0,a.jsx)("svg",{className:`w-4 h-4 text-gray-600 transition-transform ${N?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),N&&(0,a.jsxs)("div",{className:"mt-3 pt-3 border-t border-[#2a2a4a]",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsx)("div",{className:"min-w-0",children:(0,a.jsxs)("div",{className:"text-gray-100 truncate text-sm",title:b?.hub||void 0,children:["Hub: ",(0,a.jsx)("span",{className:b?.hub?"text-cyan-300":"text-red-300",children:b?.hub?.trim()||"not configured"})]})}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2 text-xs",children:(0,a.jsxs)("span",{className:`px-2.5 py-1 rounded-md border ${b?.tokenConfigured?"bg-blue-500/5 text-blue-300 border-blue-500/20":"bg-gray-500/5 text-gray-400 border-gray-500/20"}`,children:["Token: ",b?.tokenPreview||"not configured"]})})]}),b?.error&&(0,a.jsx)("div",{className:"mt-2 text-xs text-gray-600",children:b.error})]})]}),Object.keys(el).length>0&&(0,a.jsxs)("section",{className:"mb-6 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 shadow-lg shadow-black/20",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("div",{className:"text-xs uppercase text-gray-600",children:"Task Status"}),(0,a.jsx)(s.default,{href:"/tasks",prefetch:!1,className:"text-xs text-cyan-400 hover:text-cyan-300",children:"View all →"})]}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:["running","delivered","acked","replied","created","failed","cancelled","expired","closed"].filter(e=>el[e]).map(e=>(0,a.jsxs)(s.default,{href:`/tasks?status=${e}`,prefetch:!1,className:`px-2.5 py-1 rounded-md border text-xs ${I.STATUS_CHIP_CLASS[e]} hover:opacity-80 transition-opacity`,children:[e,": ",el[e]]},e))})]}),!eo&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"text-[10px] uppercase tracking-[0.12em] text-gray-600 mb-2",children:"Quick navigation"}),(0,a.jsx)("section",{className:"mb-3 grid grid-cols-3 gap-2 sm:gap-3",children:(e=m.filter(e=>Z(e)&&"working"!==e.status).length,i=ee-Q,c=v.filter(e=>"failed"===e.status).length,[{href:"/nodes",label:"Nodes",value:`${Q}/${ee}`,sub:`${ee>0?Math.round(Q/ee*100):0}% online`,color:"text-green-400 border-green-500/20",popover:0===ee?null:[{k:"working",v:et,dot:"",color:"#4ade80"},{k:"idle",v:e,dot:"",color:"#22d3ee"},{k:"offline",v:i,dot:"",color:"#9ca3af"}]},{href:"/tasks",label:"Tasks",value:String(Object.values(el).reduce((e,t)=>e+t,0)||0),sub:"all-time",color:"text-cyan-400 border-cyan-500/20",popover:0===Object.keys(el).length?null:["running","replied","failed","cancelled","expired","closed","created","delivered","acked"].filter(e=>el[e]).map(e=>({k:e,v:el[e],dot:"",color:({running:"#4ade80",replied:"#a78bfa",failed:"#f87171",cancelled:"#facc15",expired:"#fb923c",closed:"#9ca3af",created:"#9ca3af",delivered:"#60a5fa",acked:"#22d3ee"})[e]||"#9ca3af"}))},{href:"/tasks?status=failed",label:"Failed",value:String(el.failed||0),sub:el.failed?"needs review":"none",color:el.failed?"text-red-400 border-red-500/25":"text-gray-500 border-gray-700/30",popover:c?[{k:`${c} in current view`,v:"",dot:"",color:"#f87171"}]:[{k:"no failures yet",v:"",dot:"",color:"#4b5563"}]}].map(e=>(0,a.jsxs)(s.default,{href:e.href,prefetch:!1,className:`anet-stat-link group relative rounded-xl border ${e.color} bg-[#111128] px-3 py-3 transition-all hover:-translate-y-px`,children:[(0,a.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,a.jsx)("div",{className:`text-xl font-semibold tabular-nums ${e.color.split(" ")[0]}`,children:e.value}),(0,a.jsx)("div",{className:"hidden sm:block text-[10px] text-gray-600 group-hover:text-gray-400 transition-colors",children:"View →"})]}),(0,a.jsx)("div",{className:"text-[11px] text-gray-400 mt-0.5",children:e.label}),(0,a.jsx)("div",{className:"text-[10px] text-gray-600 mt-px",children:e.sub}),e.popover&&e.popover.length>0&&(0,a.jsxs)("div",{className:"anet-stat-popover hidden md:block pointer-events-none absolute left-2 right-2 top-full mt-1 z-20 rounded-lg border border-[#2a2a4a] bg-[#0d0d1a] shadow-lg shadow-black/30 px-3 py-2 opacity-0 translate-y-[-2px] group-hover:opacity-100 group-hover:translate-y-0 transition-all duration-150 delay-100",children:[(0,a.jsx)("div",{className:"text-[10px] text-gray-600 uppercase tracking-wider mb-1.5",children:"Breakdown"}),(0,a.jsx)("ul",{className:"space-y-1",children:e.popover.map(e=>(0,a.jsxs)("li",{className:"flex items-center gap-2 text-[11px]",children:[(0,a.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:e.color},"aria-hidden":!0}),(0,a.jsx)("span",{className:"text-gray-400 capitalize",children:e.k}),""!==e.v&&(0,a.jsx)("span",{className:"ml-auto text-gray-300 tabular-nums font-medium",children:e.v})]},e.k))})]})]},e.href)))}),(0,a.jsx)("section",{className:"mb-6 grid grid-cols-3 gap-2 sm:gap-3",children:[{href:"/messages",label:"Messages",icon:"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"},{href:"/logs",label:"Audit log",icon:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8"},{href:"/admin",label:"Admin",icon:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4z M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2"}].map(e=>(0,a.jsxs)(s.default,{href:e.href,prefetch:!1,className:"anet-nav-tile flex items-center justify-center gap-2 rounded-xl border border-[#2a2a4a] bg-[#111128] px-3 py-2.5 text-[12px] text-gray-400 hover:text-gray-200 transition-colors",children:[(0,a.jsx)("svg",{className:"w-4 h-4 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,a.jsx)("path",{d:e.icon})}),(0,a.jsx)("span",{children:e.label})]},e.href))}),(0,a.jsx)(o,{}),v.length>0&&(0,a.jsxs)("section",{className:"mb-6 bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,a.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Recent Activity"}),(0,a.jsx)(s.default,{href:"/tasks",className:"text-xs text-cyan-400 hover:text-cyan-300",children:"All tasks →"})]}),(0,a.jsx)("div",{className:"space-y-2 max-h-40 overflow-y-auto",children:v.slice(0,5).map(e=>(0,a.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,a.jsx)("span",{className:"w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:I.STATUS_DOT_HEX[e.status]||"#6b7280"}}),e.from_name&&(0,a.jsx)(d.AliasAvatar,{alias:e.from_name,size:14}),(0,a.jsx)("span",{className:"text-gray-300 shrink-0 max-w-[20%] truncate",children:e.from_name||"?"}),(0,a.jsx)("span",{className:"text-gray-600",children:"→"}),e.to_name&&(0,a.jsx)(d.AliasAvatar,{alias:e.to_name,size:14}),(0,a.jsx)("span",{className:"text-gray-300 shrink-0 max-w-[20%] truncate",children:e.to_name||"?"}),(0,a.jsx)("span",{className:"text-gray-500 truncate flex-1",title:e.content||"",children:(0,n.previewContent)(e.content).slice(0,60)}),(0,a.jsx)("span",{className:`shrink-0 px-1.5 py-0.5 rounded text-[10px] border ${I.STATUS_CHIP_CLASS[e.status]||"text-gray-500 border-gray-700/30"}`,children:e.status})]},e.task_id))})]})]}),p&&(0,a.jsxs)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-4 py-3 rounded-lg mb-6 text-sm flex items-center justify-between",role:"alert",children:[(0,a.jsx)("span",{children:String(p)}),(0,a.jsx)("span",{className:"text-gray-500 text-xs",children:"Check CommHub connection"})]}),m.length>0&&(0,a.jsx)("div",{className:"flex justify-center mb-4",children:(0,a.jsx)("button",{onClick:()=>k(!w),className:"text-xs text-gray-500 hover:text-gray-300 border border-gray-700/50 px-4 py-1.5 rounded-lg transition-colors hover:border-gray-600 cursor-pointer",children:w?"Hide Topology":"Show Topology"})}),!w&&m.length>0&&(0,a.jsx)("div",{className:"lg:hidden text-center text-xs text-gray-600 mb-4",children:"Topology hidden on mobile for better readability"}),w&&m.length>0&&(0,a.jsx)(E,{sessions:m,sseSessions:V,renameSignal:B}),0!==m.length||p?(u={all:ei.length,working:ei.filter(e=>Z(e)&&"working"===e.status).length,idle:ei.filter(e=>Z(e)&&"working"!==e.status).length,offline:ei.filter(e=>!Z(e)).length},x=ei.filter(e=>"all"===A||("offline"===A?!Z(e):"working"===A?Z(e)&&"working"===e.status:"idle"!==A||Z(e)&&"working"!==e.status)),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"mb-3 flex flex-wrap items-center gap-1",children:[{key:"all",label:"All"},{key:"working",label:"Working",dot:"#4ade80"},{key:"idle",label:"Idle",dot:"#22d3ee"},{key:"offline",label:"Offline",dot:"#6b7280"}].map(e=>(0,a.jsxs)("button",{type:"button",onClick:()=>F(e.key),disabled:0===u[e.key]&&"all"!==e.key,className:`flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs transition-colors disabled:opacity-30 disabled:cursor-not-allowed ${A===e.key?"bg-cyan-500/10 text-cyan-300 border border-cyan-500/30":"text-gray-500 hover:text-gray-200 hover:bg-[#1a1a2a] border border-transparent"}`,children:[e.dot&&(0,a.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full",style:{backgroundColor:e.dot}}),(0,a.jsx)("span",{children:e.label}),(0,a.jsx)("span",{className:`text-[10px] tabular-nums ${A===e.key?"text-cyan-400":"text-gray-600"}`,children:u[e.key]})]},e.key))}),(0,a.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-3 sm:gap-4",children:x.map(e=>(0,a.jsx)(P,{session:e,hasSse:Z(e),sseCount:q(e)||0,onChat:_.openTab},e.alias))}),0===x.length&&(0,a.jsxs)("div",{className:"mt-4 text-center text-xs text-gray-600",children:['No agents match "',A,'" — ',(0,a.jsx)("button",{onClick:()=>F("all"),className:"underline hover:text-gray-400",children:"Show all"})]})]})):(0,a.jsx)(R.NodesEmptyState,{hint:f,taskHistoryCount:Object.values(el).reduce((e,t)=>e+t,0)}),(0,a.jsx)(L,{messages:$}),(0,a.jsx)("div",{className:"mt-8 text-center text-xs text-gray-600 flex items-center justify-center gap-2 flex-wrap",children:J&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${K?"bg-green-400":"bg-gray-600"}`}),K?"SSE live":"SWR polling"]})}),M&&(0,a.jsx)(H,{sessions:m,onClose:()=>C(!1)}),_.tabs.length>0&&(0,a.jsx)(O,{tabs:_.tabs,activeTab:_.activeTab,onOpenTab:_.openTab,onCloseTab:_.closeTab,onSetActive:_.setActiveTab,onClose:_.closeAll})]})}],18722)}]);
|
|
File without changes
|
/package/.next/static/{BRiXukYWE4x2ckMl_bIlO → zo4BFXQpgPnIuuEsfYxCV}/_clientMiddlewareManifest.js
RENAMED
|
File without changes
|
|
File without changes
|