From 045193673f0be896f0eb2903ae4e8e7fb68afdc7 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Wed, 21 Oct 2026 04:01:32 -0400 Subject: [PATCH 1/2] fix(server): find the resource monitor when the server runs from its build output Signed-off-by: Yordis Prieto --- .../ResourceMonitorBinary.test.ts | 34 ++++++++++++++++ .../ResourceMonitorBinary.ts | 39 +++++++------------ 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/apps/server/src/resourceTelemetry/ResourceMonitorBinary.test.ts b/apps/server/src/resourceTelemetry/ResourceMonitorBinary.test.ts index c79b7f466f12..b9171480943e 100644 --- a/apps/server/src/resourceTelemetry/ResourceMonitorBinary.test.ts +++ b/apps/server/src/resourceTelemetry/ResourceMonitorBinary.test.ts @@ -3,6 +3,7 @@ import * as HostProcess from "@t3tools/shared/HostProcess"; import { afterEach, assert, describe, it, vi } from "@effect/vitest"; import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; +import * as Path from "effect/Path"; import * as ServerConfig from "../config.ts"; import * as ResourceMonitorBinary from "./ResourceMonitorBinary.ts"; @@ -88,6 +89,39 @@ describe("ResourceMonitorBinary", () => { }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)), ); + it.effect("looks for cargo build output from both the source and the bundled server layout", () => + Effect.gen(function* () { + const fileSystem = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const baseDir = yield* fileSystem.makeTempDirectoryScoped({ + prefix: "t3-resource-monitor-binary-", + }); + const service = yield* ResourceMonitorBinary.make().pipe( + Effect.provide(ServerConfig.layerTest(process.cwd(), baseDir)), + Effect.provideService(HostProcess.Platform, "darwin"), + Effect.provideService(HostProcess.Architecture, "arm64"), + Effect.provideService(HostProcess.Environment, {}), + ); + const error = yield* Effect.flip(service.resolve); + + assert.instanceOf(error, ResourceMonitorBinary.ResourceMonitorBinaryNotFound); + const candidates = (error as ResourceMonitorBinary.ResourceMonitorBinaryNotFound).candidates; + for (const crateRelative of [ + "../../../../native/resource-monitor", + "../../../native/resource-monitor", + ]) { + const crateDirectory = path.resolve(import.meta.dirname, crateRelative); + for (const output of [ + path.join("target", "aarch64-apple-darwin", "release"), + path.join("target", "release"), + path.join("target", "debug"), + ]) { + assert.include(candidates, path.join(crateDirectory, output, "t3-resource-monitor")); + } + } + }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)), + ); + it.effect("rejects bundled glibc binaries on musl Linux hosts", () => Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; diff --git a/apps/server/src/resourceTelemetry/ResourceMonitorBinary.ts b/apps/server/src/resourceTelemetry/ResourceMonitorBinary.ts index c7f69f5668c2..d582698d9ce3 100644 --- a/apps/server/src/resourceTelemetry/ResourceMonitorBinary.ts +++ b/apps/server/src/resourceTelemetry/ResourceMonitorBinary.ts @@ -146,6 +146,20 @@ export const make = Effect.fn("resourceTelemetry.resourceMonitorBinary.make")(fu environment.T3CODE_RESOURCE_MONITOR_PATH, config.resourceMonitorPath, ].filter((candidate): candidate is string => Boolean(candidate)); + const cargoOutputDirectories = + rustTarget === undefined + ? [] + : [ + path.join("target", rustTarget, "release"), + path.join("target", "release"), + path.join("target", "debug"), + ]; + const sourceCandidates = [ + path.resolve(import.meta.dirname, "../../../../native/resource-monitor"), + path.resolve(import.meta.dirname, "../../../native/resource-monitor"), + ].flatMap((crateDirectory) => + cargoOutputDirectories.map((directory) => path.join(crateDirectory, directory, executableName)), + ); const bundledCandidates = platformKey === undefined || rustTarget === undefined ? [] @@ -153,30 +167,7 @@ export const make = Effect.fn("resourceTelemetry.resourceMonitorBinary.make")(fu path.resolve(import.meta.dirname, "resource-monitor", platformKey, executableName), path.resolve(import.meta.dirname, "resource-monitor", executableName), path.resolve(import.meta.dirname, "../resource-monitor", executableName), - path.resolve( - import.meta.dirname, - "../../../../native/resource-monitor/target", - rustTarget, - "release", - executableName, - ), - path.resolve( - import.meta.dirname, - "../../../native/resource-monitor/target", - rustTarget, - "release", - executableName, - ), - path.resolve( - import.meta.dirname, - "../../../../native/resource-monitor/target/release", - executableName, - ), - path.resolve( - import.meta.dirname, - "../../../../native/resource-monitor/target/debug", - executableName, - ), + ...sourceCandidates, ]; if (overrideCandidates.length === 0 && bundledCandidates.length === 0) { return ResourceMonitorBinary.of({ From dddc63a50904bac756e79708aebe0a9efff6962f Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Wed, 21 Oct 2026 04:01:34 -0400 Subject: [PATCH 2/2] fix(web): clear the stale resource monitor error after a successful retry Signed-off-by: Yordis Prieto --- .../src/components/settings/ResourceTelemetryDiagnostics.tsx | 4 ++++ apps/web/src/lib/resourceTelemetryState.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/apps/web/src/components/settings/ResourceTelemetryDiagnostics.tsx b/apps/web/src/components/settings/ResourceTelemetryDiagnostics.tsx index 3fd3b83f2143..f4fdcad5cfdb 100644 --- a/apps/web/src/components/settings/ResourceTelemetryDiagnostics.tsx +++ b/apps/web/src/components/settings/ResourceTelemetryDiagnostics.tsx @@ -822,6 +822,7 @@ export function ResourceTelemetryDiagnostics({ }, environmentId, ); + const refreshHistory = history.refresh; const signalServerProcess = useAtomCommand(serverEnvironment.signalProcess, { reportFailure: false, }); @@ -929,6 +930,9 @@ export function ResourceTelemetryDiagnostics({ return; setIsRetrying(true); void retryTelemetry() + .then(() => { + refreshHistory(); + }) .catch((error: unknown) => { toastManager.add({ type: "error", diff --git a/apps/web/src/lib/resourceTelemetryState.ts b/apps/web/src/lib/resourceTelemetryState.ts index 0c2b2b0fecbc..18693b79aa42 100644 --- a/apps/web/src/lib/resourceTelemetryState.ts +++ b/apps/web/src/lib/resourceTelemetryState.ts @@ -52,6 +52,7 @@ export function useResourceTelemetry( if (result._tag === "Failure") { throw Cause.squash(result.cause); } + query.refresh(); return result.value.snapshot; };