feat(monitor): display configured gateway endpoint dynamically

This commit is contained in:
luccast
2026-02-05 11:23:09 -05:00
parent 00d88aa1a8
commit fbc7ed9c09
4 changed files with 29 additions and 5 deletions
+3 -1
View File
@@ -12,6 +12,7 @@ interface SettingsPanelProps {
persistenceStartedAt: number | null
persistenceSessionCount: number
persistenceActionCount: number
gatewayEndpoint: string
open: boolean
onOpenChange: (open: boolean) => void
onHistoricalModeChange: (enabled: boolean) => void
@@ -37,6 +38,7 @@ export function SettingsPanel({
persistenceStartedAt,
persistenceSessionCount,
persistenceActionCount,
gatewayEndpoint,
open,
onOpenChange,
onHistoricalModeChange,
@@ -305,7 +307,7 @@ export function SettingsPanel({
<div className="font-console text-[10px] text-shell-500 space-y-1.5">
<div>
<span className="text-crab-600">&gt;</span> endpoint: ws://127.0.0.1:18789
<span className="text-crab-600">&gt;</span> endpoint: {gatewayEndpoint}
</div>
<div>
<span className="text-crab-600">&gt;</span> protocol: v3
+8 -3
View File
@@ -12,6 +12,8 @@ import {
createConnectParams,
} from './protocol'
const DEFAULT_GATEWAY_URL = process.env.CLAWDBOT_URL || 'ws://127.0.0.1:18789'
interface ChallengePayload {
nonce: string
ts: number
@@ -32,7 +34,7 @@ export class ClawdbotClient {
private _connecting = false
constructor(
private url: string = 'ws://127.0.0.1:18789',
private url: string = DEFAULT_GATEWAY_URL,
private token?: string
) {}
@@ -239,11 +241,14 @@ export class ClawdbotClient {
// Singleton instance for server use
let clientInstance: ClawdbotClient | null = null
export function getClawdbotEndpoint(): string {
return DEFAULT_GATEWAY_URL
}
export function getClawdbotClient(): ClawdbotClient {
if (!clientInstance) {
const url = process.env.CLAWDBOT_URL || 'ws://127.0.0.1:18789'
const token = process.env.CLAWDBOT_API_TOKEN
clientInstance = new ClawdbotClient(url, token)
clientInstance = new ClawdbotClient(DEFAULT_GATEWAY_URL, token)
}
return clientInstance
}
+5 -1
View File
@@ -2,7 +2,7 @@ import { initTRPC } from '@trpc/server'
import { observable } from '@trpc/server/observable'
import superjson from 'superjson'
import { z } from 'zod'
import { getClawdbotClient } from '~/integrations/openclaw/client'
import { getClawdbotClient, getClawdbotEndpoint } from '~/integrations/openclaw/client'
import { getPersistenceService } from '~/integrations/openclaw/persistence'
import {
parseEventFrame,
@@ -72,6 +72,10 @@ const openclawRouter = router({
return { connected: client.connected }
}),
gatewayEndpoint: publicProcedure.query(() => {
return { url: getClawdbotEndpoint() }
}),
setDebugMode: publicProcedure
.input(z.object({ enabled: z.boolean() }))
.mutation(({ input }) => {
+13
View File
@@ -64,6 +64,7 @@ function MonitorPageWrapper() {
const RETRY_DELAY = 3000
const MAX_RETRIES = 10
const DEFAULT_GATEWAY_ENDPOINT = 'ws://127.0.0.1:18789'
function MonitorPage() {
const [connected, setConnected] = useState(false)
@@ -73,6 +74,7 @@ function MonitorPage() {
const [debugMode, setDebugMode] = useState(false)
const [logCollection, setLogCollection] = useState(false)
const [logCount, setLogCount] = useState(0)
const [gatewayEndpoint, setGatewayEndpoint] = useState(DEFAULT_GATEWAY_ENDPOINT)
const [selectedSession, setSelectedSession] = useState<string | null>(null)
// Persistence service state
@@ -116,8 +118,18 @@ function MonitorPage() {
useEffect(() => {
checkStatus()
checkPersistenceStatus()
loadGatewayEndpoint()
}, [])
const loadGatewayEndpoint = async () => {
try {
const data = await trpc.openclaw.gatewayEndpoint.query()
setGatewayEndpoint(data.url)
} catch {
// keep default
}
}
const checkPersistenceStatus = async () => {
try {
const status = await trpc.openclaw.persistenceStatus.query()
@@ -468,6 +480,7 @@ function MonitorPage() {
persistenceStartedAt={persistenceStartedAt}
persistenceSessionCount={persistenceSessionCount}
persistenceActionCount={persistenceActionCount}
gatewayEndpoint={gatewayEndpoint}
open={settingsOpen}
onOpenChange={setSettingsOpen}
onHistoricalModeChange={handleHistoricalModeChange}