@sleep2agi/agent-network-dashboard 0.1.0-preview.5 → 0.1.0-preview.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/diagnostics/route-bundle-stats.json +2 -2
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin.html +1 -1
  22. package/.next/server/app/admin.rsc +1 -1
  23. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  29. package/.next/server/app/docs.html +1 -1
  30. package/.next/server/app/docs.rsc +1 -1
  31. package/.next/server/app/docs.segments/_full.segment.rsc +1 -1
  32. package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/docs.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  36. package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  37. package/.next/server/app/index.html +2 -2
  38. package/.next/server/app/index.rsc +2 -2
  39. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  40. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  41. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  43. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  44. package/.next/server/app/login.html +1 -1
  45. package/.next/server/app/login.rsc +1 -1
  46. package/.next/server/app/login.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  52. package/.next/server/app/logs.html +1 -1
  53. package/.next/server/app/logs.rsc +1 -1
  54. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  60. package/.next/server/app/messages.html +1 -1
  61. package/.next/server/app/messages.rsc +1 -1
  62. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  68. package/.next/server/app/node.html +1 -1
  69. package/.next/server/app/node.rsc +1 -1
  70. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  76. package/.next/server/app/nodes.html +1 -1
  77. package/.next/server/app/nodes.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  79. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  80. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  82. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  83. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  84. package/.next/server/app/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/settings/networks.html +1 -1
  86. package/.next/server/app/settings/networks.rsc +1 -1
  87. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  94. package/.next/server/app/settings/tokens.html +1 -1
  95. package/.next/server/app/settings/tokens.rsc +1 -1
  96. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  103. package/.next/server/app/settings.html +1 -1
  104. package/.next/server/app/settings.rsc +1 -1
  105. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  106. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  107. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  111. package/.next/server/app/tasks.html +1 -1
  112. package/.next/server/app/tasks.rsc +1 -1
  113. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  114. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  119. package/.next/server/chunks/[root-of-the-server]__0344fys._.js +1 -1
  120. package/.next/server/chunks/[root-of-the-server]__0344fys._.js.map +1 -1
  121. package/.next/server/chunks/[root-of-the-server]__0uf_olq._.js +1 -1
  122. package/.next/server/chunks/[root-of-the-server]__0uf_olq._.js.map +1 -1
  123. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js +1 -1
  124. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js.map +1 -1
  125. package/.next/server/middleware-build-manifest.js +3 -3
  126. package/.next/server/pages/404.html +1 -1
  127. package/.next/server/pages/500.html +1 -1
  128. package/.next/static/chunks/{0o~g2gtcm3~v5.js → 02w9ytw8eey3r.js} +1 -1
  129. package/.next/trace +2 -2
  130. package/.next/trace-build +1 -1
  131. package/app/api/hub/nodes/route.ts +7 -5
  132. package/app/api/hub/tasks/route.ts +8 -6
  133. package/app/lib/useSSE.ts +23 -8
  134. package/package.json +1 -1
  135. /package/.next/static/{oE1CQfUPxWRF4qxM7LJ_r → 2rqnf6RwG7ululyvXyiP5}/_buildManifest.js +0 -0
  136. /package/.next/static/{oE1CQfUPxWRF4qxM7LJ_r → 2rqnf6RwG7ululyvXyiP5}/_clientMiddlewareManifest.js +0 -0
  137. /package/.next/static/{oE1CQfUPxWRF4qxM7LJ_r → 2rqnf6RwG7ululyvXyiP5}/_ssgManifest.js +0 -0
@@ -1,11 +1,13 @@
1
- import { requireDashboardAuth } from '@/app/lib/dashboard-auth';
1
+ import { requireDashboardAuth, getV3UserToken } from '@/app/lib/dashboard-auth';
2
2
 
3
3
  const HUB_URL = process.env.COMMHUB_URL || 'http://47.77.216.1:9200';
4
4
  const AUTH_TOKEN = process.env.COMMHUB_AUTH_TOKEN || '';
5
5
 
6
- function hubHeaders(): Record<string, string> {
6
+ async function hubHeaders(): Promise<Record<string, string>> {
7
+ const userToken = await getV3UserToken();
8
+ const bearer = userToken || AUTH_TOKEN;
7
9
  const h: Record<string, string> = {};
8
- if (AUTH_TOKEN) h['Authorization'] = `Bearer ${AUTH_TOKEN}`;
10
+ if (bearer) h['Authorization'] = `Bearer ${bearer}`;
9
11
  return h;
10
12
  }
11
13
 
@@ -23,7 +25,7 @@ export async function GET(req: Request) {
23
25
  try {
24
26
  const url = `${HUB_URL}/api/nodes${params.toString() ? '?' + params.toString() : ''}`;
25
27
  const res = await fetch(url, {
26
- headers: hubHeaders(),
28
+ headers: await hubHeaders(),
27
29
  next: { revalidate: 0 },
28
30
  });
29
31
  const contentType = res.headers.get('content-type') || '';
@@ -31,7 +33,7 @@ export async function GET(req: Request) {
31
33
  const data = await res.json();
32
34
  if (data.nodes && data.nodes.length > 0) return Response.json(data);
33
35
  // nodes table empty — fall back to sessions, map to node shape
34
- const statusRes = await fetch(`${HUB_URL}/api/status`, { headers: hubHeaders(), next: { revalidate: 0 } });
36
+ const statusRes = await fetch(`${HUB_URL}/api/status`, { headers: await hubHeaders(), next: { revalidate: 0 } });
35
37
  if (statusRes.ok) {
36
38
  const statusData = await statusRes.json();
37
39
  const nodes = (statusData.sessions || []).map((s: Record<string, unknown>) => ({
@@ -1,11 +1,13 @@
1
- import { requireDashboardAuth } from '@/app/lib/dashboard-auth';
1
+ import { requireDashboardAuth, getV3UserToken } from '@/app/lib/dashboard-auth';
2
2
 
3
3
  const HUB_URL = process.env.COMMHUB_URL || 'http://47.77.216.1:9200';
4
4
  const AUTH_TOKEN = process.env.COMMHUB_AUTH_TOKEN || '';
5
5
 
6
- function hubHeaders(): Record<string, string> {
6
+ async function hubHeaders(): Promise<Record<string, string>> {
7
+ const userToken = await getV3UserToken();
8
+ const bearer = userToken || AUTH_TOKEN;
7
9
  const h: Record<string, string> = {};
8
- if (AUTH_TOKEN) h['Authorization'] = `Bearer ${AUTH_TOKEN}`;
10
+ if (bearer) h['Authorization'] = `Bearer ${bearer}`;
9
11
  return h;
10
12
  }
11
13
 
@@ -46,7 +48,7 @@ export async function GET(req: Request) {
46
48
 
47
49
  const tasksRes = await fetch(
48
50
  `${HUB_URL}/api/tasks?${params.toString()}`,
49
- { headers: hubHeaders(), next: { revalidate: 0 } },
51
+ { headers: await hubHeaders(), next: { revalidate: 0 } },
50
52
  );
51
53
  const contentType = tasksRes.headers.get('content-type') || '';
52
54
  if (tasksRes.ok && contentType.includes('application/json')) {
@@ -61,7 +63,7 @@ export async function GET(req: Request) {
61
63
  if (filterFrom) fallbackParams.set('from_name', filterFrom);
62
64
  if (filterTo) fallbackParams.set('to_name', filterTo);
63
65
  fallbackParams.set('limit', String(limit));
64
- const fbRes = await fetch(`${HUB_URL}/api/tasks?${fallbackParams.toString()}`, { headers: hubHeaders(), next: { revalidate: 0 } });
66
+ const fbRes = await fetch(`${HUB_URL}/api/tasks?${fallbackParams.toString()}`, { headers: await hubHeaders(), next: { revalidate: 0 } });
65
67
  if (fbRes.ok) {
66
68
  const fbData = await fbRes.json();
67
69
  if (fbData.ok && fbData.tasks?.length > 0) {
@@ -75,7 +77,7 @@ export async function GET(req: Request) {
75
77
  // Fallback: map /api/completions to tasks shape
76
78
  const compRes = await fetch(
77
79
  `${HUB_URL}/api/completions?limit=${limit}`,
78
- { headers: hubHeaders(), next: { revalidate: 0 } },
80
+ { headers: await hubHeaders(), next: { revalidate: 0 } },
79
81
  );
80
82
  const compData = await compRes.json();
81
83
  const completions: Completion[] = compData.completions || [];
package/app/lib/useSSE.ts CHANGED
@@ -30,22 +30,31 @@ export function useSSE({ url, onEvent, reconnectDelay = 3000, enabled = true }:
30
30
  const reconnectTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
31
31
  const unsupportedRef = useRef(false);
32
32
 
33
+ // Track the active probe + cancel flag so cleanup can abort the in-flight
34
+ // HEAD and prevent the EventSource from being created after unmount. Without
35
+ // this, every navigation leaks one SSE — six leaks saturate the browser's
36
+ // HTTP/1.1 pool and lock up further fetches (including RSC payloads).
37
+ const probeAbortRef = useRef<AbortController | null>(null);
38
+ const cancelledRef = useRef(false);
39
+
33
40
  const connect = useCallback(() => {
34
- if (!enabled || !url || unsupportedRef.current) return;
41
+ if (!enabled || !url || unsupportedRef.current || cancelledRef.current) return;
35
42
 
36
- // Clean up existing connection
37
43
  if (eventSourceRef.current) {
38
44
  eventSourceRef.current.close();
45
+ eventSourceRef.current = null;
39
46
  }
47
+ if (probeAbortRef.current) probeAbortRef.current.abort();
40
48
 
41
49
  const probeUrl = url.includes('?') ? `${url}&probe=1` : `${url}?probe=1`;
42
-
43
50
  const probeController = new AbortController();
51
+ probeAbortRef.current = probeController;
44
52
  const probeTimeout = setTimeout(() => probeController.abort(), 5000);
45
53
 
46
54
  fetch(probeUrl, { method: 'HEAD', cache: 'no-store', signal: probeController.signal })
47
55
  .finally(() => clearTimeout(probeTimeout))
48
56
  .then((res) => {
57
+ if (cancelledRef.current) return;
49
58
  if (res.headers.get('x-anet-sse-available') !== 'true') {
50
59
  unsupportedRef.current = true;
51
60
  setConnected(false);
@@ -57,9 +66,7 @@ export function useSSE({ url, onEvent, reconnectDelay = 3000, enabled = true }:
57
66
  const es = new EventSource(url);
58
67
  eventSourceRef.current = es;
59
68
 
60
- es.onopen = () => {
61
- setConnected(true);
62
- };
69
+ es.onopen = () => setConnected(true);
63
70
 
64
71
  es.onmessage = (e) => {
65
72
  try {
@@ -73,11 +80,13 @@ export function useSSE({ url, onEvent, reconnectDelay = 3000, enabled = true }:
73
80
  setConnected(false);
74
81
  es.close();
75
82
  eventSourceRef.current = null;
76
- // Auto-reconnect
77
- reconnectTimerRef.current = setTimeout(connect, reconnectDelay);
83
+ if (!cancelledRef.current) {
84
+ reconnectTimerRef.current = setTimeout(connect, reconnectDelay);
85
+ }
78
86
  };
79
87
  })
80
88
  .catch(() => {
89
+ if (cancelledRef.current) return;
81
90
  setConnected(false);
82
91
  setSupported(false);
83
92
  });
@@ -85,9 +94,15 @@ export function useSSE({ url, onEvent, reconnectDelay = 3000, enabled = true }:
85
94
 
86
95
  useEffect(() => {
87
96
  unsupportedRef.current = false;
97
+ cancelledRef.current = false;
88
98
  setSupported(enabled ? null : false);
89
99
  connect();
90
100
  return () => {
101
+ cancelledRef.current = true;
102
+ if (probeAbortRef.current) {
103
+ probeAbortRef.current.abort();
104
+ probeAbortRef.current = null;
105
+ }
91
106
  if (eventSourceRef.current) {
92
107
  eventSourceRef.current.close();
93
108
  eventSourceRef.current = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.1.0-preview.5",
3
+ "version": "0.1.0-preview.7",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",