frontend: print sdk version

rabbitprincess committed Mar 22, 2026 at 00:10 UTC 496201d55a1d8e819e0acd8f01822a6c06405888
3 files changed +22 -23
frontend/src/components/ServerListView.tsx
+18 -21
@@ -27,11 +27,11 @@ type ListServer = ClientServer | AdminServer;
27 interface OfficialRegistryRelay {
28 url: string;
29 status: "online" | "unreachable";
30 - version?: string;
30 + releaseVersion?: string;
31 }
32
33 interface RelayDomainResponse {
34 - version?: string;
34 + release_version?: string;
35 }
36
37 interface OfficialRegistryDocument {
@@ -52,10 +52,17 @@ async function loadOfficialRegistryRelay(
52 return {
53 url: relayURL,
54 status: "online",
55 - version: typeof domain?.version === "string" ? domain.version.trim() : "",
55 + releaseVersion:
56 + typeof domain?.release_version === "string"
57 + ? domain.release_version.trim()
58 + : "",
59 };
60 } catch {
58 - return { url: relayURL, status: "unreachable", version: "" };
61 + return {
62 + url: relayURL,
63 + status: "unreachable",
64 + releaseVersion: "",
65 + };
66 }
67 }
68
@@ -647,15 +654,6 @@ export function ServerListView({
654 ) : officialRegistryAvailable ? (
655 <div className="mt-6 grid gap-3 md:grid-cols-2 xl:grid-cols-3">
656 {officialRegistryRelays.map((relay) => {
650 - const statusLabel = {
651 - online: "ONLINE",
652 - unreachable: "OFFLINE",
653 - }[relay.status];
654 - const statusClass = {
655 - online: "bg-primary/12 text-primary",
656 - unreachable: "bg-secondary text-text-muted",
657 - }[relay.status];
658 -
657 return (
658 <div
659 key={relay.url}
@@ -670,16 +668,15 @@ export function ServerListView({
668 {relay.url}
669 </a>
670 <div className="flex shrink-0 flex-wrap items-center gap-2">
673 - <span
674 - className={`rounded-full px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] ${statusClass}`}
675 - >
676 - {statusLabel}
677 - </span>
678 - {relay.version && (
671 + {relay.status === "unreachable" ? (
672 + <span className="rounded-full bg-background px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-text-muted ring-1 ring-border">
673 + Offline
674 + </span>
675 + ) : relay.releaseVersion ? (
676 <span className="rounded-full bg-background px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-text-muted ring-1 ring-border">
680 - SDK {relay.version}
677 + Release {relay.releaseVersion}
678 </span>
682 - )}
679 + ) : null}
680 </div>
681 </div>
682 );
portal/api_server.go
+2 -1
@@ -164,7 +164,8 @@ func (s *Server) handleDomain(w http.ResponseWriter, r *http.Request) {
164 }
165
166 utils.WriteAPIData(w, http.StatusOK, types.DomainResponse{
167 - Version: types.SDKProtocolVersion,
167 + SDKVersion: types.SDKProtocolVersion,
168 + ReleaseVersion: types.ReleaseVersion,
169 })
170 }
171
types/api.go
+2 -1
@@ -115,7 +115,8 @@ type UnregisterRequest struct {
115 }
116
117 type DomainResponse struct {
118 - Version string `json:"version"`
118 + SDKVersion string `json:"sdk_version"`
119 + ReleaseVersion string `json:"release_version"`
120 }
121
122 type TunnelStatusResponse struct {