@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.
- package/.next/BUILD_COMMIT +1 -1
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +26 -26
- 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/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.html +1 -1
- package/.next/server/app/admin.rsc +1 -1
- package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page.js.nft.json +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 +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/logs.html +1 -1
- package/.next/server/app/logs.rsc +1 -1
- package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/messages.html +1 -1
- package/.next/server/app/messages.rsc +1 -1
- package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/node.html +1 -1
- package/.next/server/app/node.rsc +1 -1
- package/.next/server/app/node.segments/_full.segment.rsc +1 -1
- package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/nodes/[alias]/page.js.nft.json +1 -1
- package/.next/server/app/nodes/[alias]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes/page.js.nft.json +1 -1
- 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 +2 -2
- package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers/page.js.nft.json +1 -1
- package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers.html +2 -2
- package/.next/server/app/providers.rsc +2 -2
- package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
- package/.next/server/app/providers.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/scheduled-tasks.html +1 -1
- package/.next/server/app/scheduled-tasks.rsc +1 -1
- package/.next/server/app/scheduled-tasks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/scheduled-tasks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/scheduled-tasks.segments/scheduled-tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/server-logs.html +1 -1
- package/.next/server/app/server-logs.rsc +1 -1
- package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/servers.html +1 -1
- package/.next/server/app/servers.rsc +1 -1
- package/.next/server/app/servers.segments/_full.segment.rsc +1 -1
- package/.next/server/app/servers.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/networks/page.js.nft.json +1 -1
- 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 +2 -2
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens/page.js.nft.json +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 +2 -2
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/skillhub.html +1 -1
- package/.next/server/app/skillhub.rsc +1 -1
- package/.next/server/app/skillhub.segments/_full.segment.rsc +1 -1
- package/.next/server/app/skillhub.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/skillhub.segments/skillhub/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tasks.html +1 -1
- package/.next/server/app/tasks.rsc +1 -1
- package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js.map +1 -1
- package/.next/server/chunks/ssr/_0q4m25o._.js +0 -0
- package/.next/server/chunks/ssr/_0q4m25o._.js.map +1 -1
- package/.next/server/chunks/ssr/_1z1o6o3._.js +0 -0
- package/.next/server/chunks/ssr/_1z1o6o3._.js.map +1 -1
- package/.next/server/chunks/ssr/app_081zy6c._.js +1 -1
- package/.next/server/chunks/ssr/app_081zy6c._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0x7s72b._.js +1 -1
- package/.next/server/chunks/ssr/app_0x7s72b._.js.map +1 -1
- package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js +1 -1
- package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- 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/{3jjgc6skrbwx_.js → 0agh8mvmpke4j.js} +1 -1
- package/.next/static/chunks/{2vcrtfhj6hc_2.js → 0nqbg3txyq72t.js} +1 -1
- package/.next/static/chunks/14c8u_tcund0g.js +0 -0
- package/.next/static/chunks/{3_ixl_eog1g4p.js → 28o3ssg0_q2n-.js} +1 -1
- package/.next/static/chunks/{0me1-941ysjh6.js → 2aymmcz4h9k0-.js} +1 -1
- package/.next/static/chunks/{326h2ihhnae5a.js → 2gsbf8zv54tds.js} +1 -1
- package/.next/static/chunks/{2501pshuqx52y.js → 3jxk7q1jxyvol.js} +1 -1
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/NodeLifecycleMenu.tsx +6 -1
- package/app/providers/page.tsx +23 -4
- package/app/settings/networks/page.tsx +9 -1
- package/app/settings/tokens/page.tsx +21 -1
- package/package.json +1 -1
- package/.next/static/chunks/2mlxk28w-tx84.js +0 -0
- /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → trj9RsCWuEDMfq9BuoKfl}/_buildManifest.js +0 -0
- /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → trj9RsCWuEDMfq9BuoKfl}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → trj9RsCWuEDMfq9BuoKfl}/_ssgManifest.js +0 -0
package/app/providers/page.tsx
CHANGED
|
@@ -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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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
|
|
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
|
Binary file
|
|
File without changes
|
/package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → trj9RsCWuEDMfq9BuoKfl}/_clientMiddlewareManifest.js
RENAMED
|
File without changes
|
|
File without changes
|