@sleep2agi/agent-network-dashboard 0.6.3-preview.55 → 0.6.3-preview.56

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 (151) hide show
  1. package/.next/BUILD_COMMIT +1 -1
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/diagnostics/route-bundle-stats.json +26 -26
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/prerender-manifest.json +3 -3
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  17. package/.next/server/app/admin.html +1 -1
  18. package/.next/server/app/admin.rsc +1 -1
  19. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  20. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  22. package/.next/server/app/index.html +2 -2
  23. package/.next/server/app/index.rsc +2 -2
  24. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  25. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  26. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/login/page.js.nft.json +1 -1
  28. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/login.html +2 -2
  30. package/.next/server/app/login.rsc +2 -2
  31. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  33. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  34. package/.next/server/app/logs.html +1 -1
  35. package/.next/server/app/logs.rsc +1 -1
  36. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  37. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  38. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  39. package/.next/server/app/messages.html +1 -1
  40. package/.next/server/app/messages.rsc +1 -1
  41. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  42. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  44. package/.next/server/app/node.html +1 -1
  45. package/.next/server/app/node.rsc +1 -1
  46. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  48. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  49. package/.next/server/app/nodes/[alias]/page.js.nft.json +1 -1
  50. package/.next/server/app/nodes/[alias]/page_client-reference-manifest.js +1 -1
  51. package/.next/server/app/nodes/page.js.nft.json +1 -1
  52. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/nodes.html +2 -2
  54. package/.next/server/app/nodes.rsc +2 -2
  55. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  56. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  57. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
  58. package/.next/server/app/page.js.nft.json +1 -1
  59. package/.next/server/app/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app/providers/page.js.nft.json +1 -1
  61. package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
  62. package/.next/server/app/providers.html +2 -2
  63. package/.next/server/app/providers.rsc +2 -2
  64. package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
  65. package/.next/server/app/providers.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +2 -2
  67. package/.next/server/app/scheduled-tasks.html +1 -1
  68. package/.next/server/app/scheduled-tasks.rsc +1 -1
  69. package/.next/server/app/scheduled-tasks.segments/_full.segment.rsc +1 -1
  70. package/.next/server/app/scheduled-tasks.segments/_tree.segment.rsc +1 -1
  71. package/.next/server/app/scheduled-tasks.segments/scheduled-tasks/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/server-logs.html +1 -1
  73. package/.next/server/app/server-logs.rsc +1 -1
  74. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  75. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  76. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  77. package/.next/server/app/servers.html +1 -1
  78. package/.next/server/app/servers.rsc +1 -1
  79. package/.next/server/app/servers.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/servers.segments/_tree.segment.rsc +1 -1
  81. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
  82. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  83. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/settings/networks.html +2 -2
  85. package/.next/server/app/settings/networks.rsc +2 -2
  86. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +2 -2
  89. package/.next/server/app/settings/page.js.nft.json +1 -1
  90. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  91. package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
  92. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/tokens.html +2 -2
  94. package/.next/server/app/settings/tokens.rsc +2 -2
  95. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +2 -2
  98. package/.next/server/app/settings.html +2 -2
  99. package/.next/server/app/settings.rsc +2 -2
  100. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  101. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  102. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  103. package/.next/server/app/skillhub.html +1 -1
  104. package/.next/server/app/skillhub.rsc +1 -1
  105. package/.next/server/app/skillhub.segments/_full.segment.rsc +1 -1
  106. package/.next/server/app/skillhub.segments/_tree.segment.rsc +1 -1
  107. package/.next/server/app/skillhub.segments/skillhub/__PAGE__.segment.rsc +1 -1
  108. package/.next/server/app/tasks.html +1 -1
  109. package/.next/server/app/tasks.rsc +1 -1
  110. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  111. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  112. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  113. package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js +1 -1
  114. package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js.map +1 -1
  115. package/.next/server/chunks/ssr/_0q4m25o._.js +0 -0
  116. package/.next/server/chunks/ssr/_0q4m25o._.js.map +1 -1
  117. package/.next/server/chunks/ssr/_1z1o6o3._.js +0 -0
  118. package/.next/server/chunks/ssr/_1z1o6o3._.js.map +1 -1
  119. package/.next/server/chunks/ssr/app_081zy6c._.js +1 -1
  120. package/.next/server/chunks/ssr/app_081zy6c._.js.map +1 -1
  121. package/.next/server/chunks/ssr/app_0iz553k._.js +1 -1
  122. package/.next/server/chunks/ssr/app_0iz553k._.js.map +1 -1
  123. package/.next/server/chunks/ssr/app_0los-eu._.js +1 -1
  124. package/.next/server/chunks/ssr/app_0los-eu._.js.map +1 -1
  125. package/.next/server/chunks/ssr/app_0x7s72b._.js +1 -1
  126. package/.next/server/chunks/ssr/app_0x7s72b._.js.map +1 -1
  127. package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js +1 -1
  128. package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js.map +1 -1
  129. package/.next/server/middleware-build-manifest.js +3 -3
  130. package/.next/server/pages/404.html +1 -1
  131. package/.next/server/pages/500.html +1 -1
  132. package/.next/server/server-reference-manifest.js +1 -1
  133. package/.next/server/server-reference-manifest.json +1 -1
  134. package/.next/static/chunks/{3jjgc6skrbwx_.js → 0agh8mvmpke4j.js} +1 -1
  135. package/.next/static/chunks/{2vcrtfhj6hc_2.js → 0nqbg3txyq72t.js} +1 -1
  136. package/.next/static/chunks/14c8u_tcund0g.js +0 -0
  137. package/.next/static/chunks/{3_ixl_eog1g4p.js → 28o3ssg0_q2n-.js} +1 -1
  138. package/.next/static/chunks/{0me1-941ysjh6.js → 2aymmcz4h9k0-.js} +1 -1
  139. package/.next/static/chunks/{326h2ihhnae5a.js → 2gsbf8zv54tds.js} +1 -1
  140. package/.next/static/chunks/{2501pshuqx52y.js → 3jxk7q1jxyvol.js} +1 -1
  141. package/.next/trace +2 -2
  142. package/.next/trace-build +1 -1
  143. package/app/components/NodeLifecycleMenu.tsx +6 -1
  144. package/app/providers/page.tsx +23 -4
  145. package/app/settings/networks/page.tsx +9 -1
  146. package/app/settings/tokens/page.tsx +21 -1
  147. package/package.json +1 -1
  148. package/.next/static/chunks/2mlxk28w-tx84.js +0 -0
  149. /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → trj9RsCWuEDMfq9BuoKfl}/_buildManifest.js +0 -0
  150. /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → trj9RsCWuEDMfq9BuoKfl}/_clientMiddlewareManifest.js +0 -0
  151. /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → trj9RsCWuEDMfq9BuoKfl}/_ssgManifest.js +0 -0
@@ -49,6 +49,7 @@ export default function ProvidersPage() {
49
49
  const [mock, setMock] = useState(false);
50
50
  const [editing, setEditing] = useState<ProviderDraft | null>(null);
51
51
  const [showForm, setShowForm] = useState(false);
52
+ const [toggleError, setToggleError] = useState<string | null>(null);
52
53
  const [expandedId, setExpandedId] = useState<string | null>(null);
53
54
 
54
55
  const fetchProviders = useCallback(async () => {
@@ -73,10 +74,19 @@ export default function ProvidersPage() {
73
74
  };
74
75
  const toggleEnabled = async (p: Provider) => {
75
76
  setProviders(prev => prev.map(x => (x.provider_id || x.name) === (p.provider_id || p.name) ? { ...x, enabled: !x.enabled } : x)); // optimistic
76
- await fetch('/api/anet/providers', {
77
- method: 'POST', headers: { 'Content-Type': 'application/json' },
78
- body: JSON.stringify({ provider_id: p.provider_id, enabled: !p.enabled }),
79
- }).catch(() => {});
77
+ setToggleError(null);
78
+ // The optimistic flip above is corrected by the refetch below, so a failed
79
+ // write used to show as the switch quietly sliding back with no reason
80
+ // given — indistinguishable from a mis-click. Say what happened instead.
81
+ try {
82
+ const res = await fetch('/api/anet/providers', {
83
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
84
+ body: JSON.stringify({ provider_id: p.provider_id, enabled: !p.enabled }),
85
+ });
86
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
87
+ } catch (e) {
88
+ setToggleError(`${p.name}: ${e instanceof Error ? e.message : '请求失败'}`);
89
+ }
80
90
  fetchProviders();
81
91
  };
82
92
 
@@ -93,6 +103,15 @@ export default function ProvidersPage() {
93
103
  新增供应商
94
104
  </button>
95
105
  </div>
106
+ {toggleError && (
107
+ <div
108
+ data-testid="providers-toggle-error"
109
+ className="mb-4 rounded-md border border-[var(--border)] bg-[var(--bg-elevated)] px-3 py-2 text-sm text-[var(--fg-muted)]"
110
+ >
111
+ <span className="text-[var(--fg)]">启用状态未能保存({toggleError})</span>
112
+ <span className="ml-2 text-xs">开关已回到服务端的实际状态,请确认 hub 可达后重试。</span>
113
+ </div>
114
+ )}
96
115
 
97
116
  <div className="max-w-3xl space-y-4">
98
117
  <p className="text-sm text-gray-500">
@@ -7,7 +7,15 @@ import { EmptyState } from '../../components/EmptyState';
7
7
  import { AliasAvatar } from '../../components/AliasAvatar';
8
8
  import useSWR from 'swr';
9
9
 
10
- const fetcher = (url: string) => fetch(url).then(r => r.json());
10
+ // Without the res.ok check a 401 or 500 carrying a JSON body resolves as a
11
+ // successful load, so SWR reports no error and the page renders whatever the
12
+ // error payload happened to contain — or an empty list, which is
13
+ // indistinguishable from "you have no networks".
14
+ const fetcher = async (url: string) => {
15
+ const r = await fetch(url);
16
+ if (!r.ok) throw new Error(`HTTP ${r.status}`);
17
+ return r.json();
18
+ };
11
19
 
12
20
  interface Network {
13
21
  network_id: string;
@@ -18,14 +18,22 @@ export default function TokensPage() {
18
18
  const [tokens, setTokens] = useState<Token[]>([]);
19
19
  const [loading, setLoading] = useState(true);
20
20
  const [newName, setNewName] = useState('');
21
+ const [loadError, setLoadError] = useState<string | null>(null);
21
22
  const [createResult, setCreateResult] = useState<{ token?: string; error?: string }>({});
22
23
 
23
24
  const fetchTokens = useCallback(async () => {
25
+ // A swallowed failure here used to render the empty state, which tells the
26
+ // user they have no tokens and invites them to create one — indistinguishable
27
+ // from a hub that is down, and it invites duplicates. Surface it instead.
28
+ setLoadError(null);
24
29
  try {
25
30
  const res = await fetch('/api/hub/tokens');
31
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
26
32
  const data = await res.json();
27
33
  setTokens(data.tokens || []);
28
- } catch {} finally { setLoading(false); }
34
+ } catch (e) {
35
+ setLoadError(e instanceof Error ? e.message : '请求失败');
36
+ } finally { setLoading(false); }
29
37
  }, []);
30
38
 
31
39
  useEffect(() => { fetchTokens(); }, [fetchTokens]);
@@ -100,6 +108,18 @@ export default function TokensPage() {
100
108
  <h2 className="text-sm font-semibold text-gray-300 mb-3">Active Tokens ({tokens.length})</h2>
101
109
  {loading ? (
102
110
  <div className="animate-pulse space-y-2">{[1,2].map(i => <div key={i} className="h-12 bg-gray-800/20 rounded" />)}</div>
111
+ ) : loadError ? (
112
+ <div
113
+ data-testid="tokens-load-error"
114
+ className="rounded-md border border-[var(--border)] bg-[var(--bg-elevated)] px-3 py-3 text-sm text-[var(--fg-muted)]"
115
+ >
116
+ <div className="text-[var(--fg)]">无法加载 token 列表({loadError})</div>
117
+ <div className="mt-1 text-xs">这不代表你没有 token —— 请先确认 hub 可达,不要重复创建。</div>
118
+ <button
119
+ onClick={() => { setLoading(true); fetchTokens(); }}
120
+ className="mt-2 rounded-md border border-[var(--border)] px-2 py-1 text-xs text-[var(--fg)] hover:bg-[var(--hover-tint)]"
121
+ >重试</button>
122
+ </div>
103
123
  ) : tokens.length === 0 ? (
104
124
  <EmptyState
105
125
  variant="tokens"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.6.3-preview.55",
3
+ "version": "0.6.3-preview.56",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "main": "apps/desktop/electron/main.cjs",
6
6
  "scripts": {