fix(desktop): report real hostname/platform/arch in heartbeat

Renderer was registering clients with navigator.platform ("MacIntel") and
a hardcoded "renderer-preview" cpu_arch. Source device info from the main
process (os.hostname + process.platform/arch) via a new device-info IPC,
and let heartbeats always send the authoritative runtime values so stale
registrations self-heal.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-20 11:59:35 +08:00
parent 4d0c4510ef
commit 9bfe0fab48
5 changed files with 51 additions and 14 deletions
@@ -1,3 +1,5 @@
import { hostname } from "node:os";
import { ApiClientError } from "@geo/http-client";
import type {
DesktopArticleContent,
@@ -489,9 +491,9 @@ async function sendHeartbeat(source: "startup" | "timer"): Promise<void> {
try {
const response = await heartbeatDesktopClient({
device_name: state.client?.device_name ?? `Desktop ${process.platform}`,
os: state.client?.os ?? process.platform,
cpu_arch: state.client?.cpu_arch ?? process.arch,
device_name: hostname() || state.client?.device_name || `Desktop ${process.platform}`,
os: process.platform,
cpu_arch: process.arch,
client_version: state.client?.client_version ?? "0.1.0-dev",
channel: state.client?.channel ?? "dev",
account_ids: state.accounts.filter((account) => account.health === "live").map((account) => account.id),