fix(panel): real auto-updating version + remove fake agent footer; rename companion -> Corrosion host agent
Version badge: was hardcoded '1.0.8' — now single-sourced from frontend/package.json (1.0.0) via Vite define __APP_VERSION__, so it auto-updates on release. Sidebar agent footer: removed the FABRICATED 'asgard-01' host name and the fake 'Agent v1.0.8' line — now shows real server.connection data, or an honest 'No host agent connected' empty state when nothing is deployed (the operator's actual state). Renamed 'Companion agent' -> 'Corrosion host agent' across the UI (ServerView/SetupWizard/Dashboard/Plugins), the binary names (corrosion-host-agent-<os>-<arch>) + CDN path (/host-agent/), the Go Makefile build output, and the Gitea CI workflow — frontend download links and CI output now match. Marketing hero mock host names neutralized (asgard-01 -> rust-host/dune-host/conan-host). DB column names (companion_last_seen) left intact. Build green; zero 'asgard'/'1.0.8' remain in frontend/src. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "frontend",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
1
frontend/src/app-version.d.ts
vendored
Normal file
1
frontend/src/app-version.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
||||
declare const __APP_VERSION__: string
|
||||
@@ -13,6 +13,7 @@ import { useServerStore } from '@/stores/server'
|
||||
import { useThemeGame } from '@/composables/useThemeGame'
|
||||
import { useGameProfile } from '@/config/gameProfiles'
|
||||
import type { NavSection, NavItemDef } from '@/config/gameProfiles'
|
||||
import { safeDate } from '@/utils/formatters'
|
||||
import Logo from '@/components/ds/brand/Logo.vue'
|
||||
import Badge from '@/components/ds/core/Badge.vue'
|
||||
import StatusDot from '@/components/ds/core/StatusDot.vue'
|
||||
@@ -36,7 +37,7 @@ const sidebarOpen = ref(false)
|
||||
function closeSidebar() { sidebarOpen.value = false }
|
||||
|
||||
// ---- App version ----
|
||||
const APP_VERSION = '1.0.8'
|
||||
const APP_VERSION = __APP_VERSION__
|
||||
|
||||
// ---- Game switcher ----
|
||||
const GAME_OPTIONS: GameOption[] = [
|
||||
@@ -94,6 +95,8 @@ function hasVisibleItems(section: NavSection): boolean {
|
||||
}
|
||||
|
||||
// ---- Agent health ----
|
||||
const hasAgent = computed(() => server.connection !== null)
|
||||
|
||||
const agentTone = computed(() => {
|
||||
const cs = server.connection?.connection_status
|
||||
if (cs === 'connected') return 'online' as const
|
||||
@@ -106,9 +109,17 @@ const agentLabel = computed(() => {
|
||||
if (cs === 'degraded') return 'Degraded'
|
||||
return 'Offline'
|
||||
})
|
||||
const agentName = computed(() => {
|
||||
const ip = server.connection?.server_ip
|
||||
return ip ?? 'asgard-01'
|
||||
const agentName = computed(() => server.connection?.server_ip ?? 'Host agent')
|
||||
|
||||
const agentMetaLine = computed(() => {
|
||||
const cs = server.connection?.connection_status
|
||||
let line = cs === 'connected' ? 'Connected' : server.connection?.companion_last_seen
|
||||
? `Last seen ${safeDate(server.connection.companion_last_seen)}`
|
||||
: 'Awaiting first heartbeat'
|
||||
if (server.stats) {
|
||||
line += ` · ${server.stats.player_count}/${server.stats.max_players} players`
|
||||
}
|
||||
return line
|
||||
})
|
||||
|
||||
// ---- Topbar ----
|
||||
@@ -184,18 +195,24 @@ const themeIcon = computed(() => theme.value === 'dark' ? 'sun' : 'moon')
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Agent health footer -->
|
||||
<!-- Host agent footer -->
|
||||
<div class="side__foot">
|
||||
<div class="agent">
|
||||
<!-- Connected: real IP + status badge + meta line -->
|
||||
<div v-if="hasAgent" class="agent">
|
||||
<div class="agent__row">
|
||||
<StatusDot :tone="agentTone" :pulse="agentTone === 'online'" />
|
||||
<span class="agent__name">{{ agentName }}</span>
|
||||
<Badge :tone="agentTone" size="md">{{ agentLabel }}</Badge>
|
||||
</div>
|
||||
<div class="agent__meta">
|
||||
Agent v{{ APP_VERSION }}
|
||||
<template v-if="server.stats"> · {{ server.stats.player_count }}/{{ server.stats.max_players }} players</template>
|
||||
<div class="agent__meta">{{ agentMetaLine }}</div>
|
||||
</div>
|
||||
<!-- Not connected: honest empty state -->
|
||||
<div v-else class="agent agent--empty">
|
||||
<div class="agent__row">
|
||||
<StatusDot tone="offline" />
|
||||
<span class="agent__name agent__name--muted">No host agent connected</span>
|
||||
</div>
|
||||
<div class="agent__meta">Install the Corrosion host agent from the Server page</div>
|
||||
</div>
|
||||
<!-- User / logout row -->
|
||||
<div class="side__user">
|
||||
@@ -373,6 +390,13 @@ body { margin: 0; overflow: hidden; }
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
.agent--empty { opacity: 0.7; }
|
||||
|
||||
.agent__name--muted {
|
||||
color: var(--text-tertiary);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.side__user {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
@@ -259,7 +259,7 @@ function navServer() { router.push('/server') }
|
||||
<EmptyState
|
||||
icon="server"
|
||||
title="No server connected"
|
||||
description="Install the companion agent on your host machine to begin managing your server from Corrosion."
|
||||
description="Install the Corrosion host agent on your host machine to begin managing your server from Corrosion."
|
||||
>
|
||||
<template #action>
|
||||
<Button icon="server" @click="navServer">Set up server</Button>
|
||||
@@ -404,7 +404,7 @@ function navServer() { router.push('/server') }
|
||||
<div class="dash__col dash__col--side">
|
||||
|
||||
<!-- Resources — real stats from agent; null = '—' -->
|
||||
<Panel title="Resources" subtitle="Companion agent telemetry">
|
||||
<Panel title="Resources" subtitle="Host agent telemetry">
|
||||
<div class="solo-meters">
|
||||
<ResourceMeter
|
||||
label="CPU"
|
||||
@@ -418,7 +418,7 @@ function navServer() { router.push('/server') }
|
||||
/>
|
||||
</div>
|
||||
<div v-if="soloCpu === null && soloRamMb === null" class="meters-note">
|
||||
Resource metrics arrive via the companion agent heartbeat.
|
||||
Resource metrics arrive via the host agent heartbeat.
|
||||
<Button size="sm" variant="ghost" icon="server" class="meters-cta" @click="navServer">
|
||||
Agent setup
|
||||
</Button>
|
||||
|
||||
@@ -485,7 +485,7 @@ onMounted(() => {
|
||||
</Panel>
|
||||
|
||||
<Alert tone="info">
|
||||
The plugin will be registered in your plugin list immediately. Your companion agent must be connected
|
||||
The plugin will be registered in your plugin list immediately. Your host agent must be connected
|
||||
for the file to be delivered to the game server. If the agent is offline, re-upload once it reconnects.
|
||||
</Alert>
|
||||
</div>
|
||||
|
||||
@@ -100,22 +100,22 @@ const agentLastSeenLabel = computed(() => {
|
||||
const licenseKey = computed(() => auth.license?.license_key || 'YOUR-LICENSE-KEY')
|
||||
|
||||
const linuxCommands = computed(() => `# Download the agent
|
||||
curl -LO https://cdn.corrosionmgmt.com/companion/latest/corrosion-companion-linux-amd64
|
||||
chmod +x corrosion-companion-linux-amd64
|
||||
curl -LO https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-linux-amd64
|
||||
chmod +x corrosion-host-agent-linux-amd64
|
||||
|
||||
# Start with your license key
|
||||
export LICENSE_ID="${licenseKey.value}"
|
||||
export NATS_URL="nats://nats.corrosionmgmt.com:4222"
|
||||
./corrosion-companion-linux-amd64`)
|
||||
./corrosion-host-agent-linux-amd64`)
|
||||
|
||||
const windowsCommands = computed(() => `# Requires PowerShell (not Command Prompt)
|
||||
# Download the agent
|
||||
Invoke-WebRequest -Uri "https://cdn.corrosionmgmt.com/companion/latest/corrosion-companion-windows-amd64.exe" -OutFile "corrosion-companion-windows-amd64.exe"
|
||||
Invoke-WebRequest -Uri "https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-windows-amd64.exe" -OutFile "corrosion-host-agent-windows-amd64.exe"
|
||||
|
||||
# Start with your license key
|
||||
$env:LICENSE_ID="${licenseKey.value}"
|
||||
$env:NATS_URL="nats://nats.corrosionmgmt.com:4222"
|
||||
.\\corrosion-companion-windows-amd64.exe`)
|
||||
.\\corrosion-host-agent-windows-amd64.exe`)
|
||||
|
||||
async function copySetupCommands() {
|
||||
try {
|
||||
@@ -387,8 +387,8 @@ onMounted(async () => {
|
||||
</div>
|
||||
</Panel>
|
||||
|
||||
<!-- Companion agent -->
|
||||
<Panel title="Companion agent" subtitle="Bare-metal server management binary">
|
||||
<!-- Host agent -->
|
||||
<Panel title="Host agent" subtitle="Bare-metal server management binary">
|
||||
<template #actions>
|
||||
<Badge :tone="isAgentConnected ? 'online' : 'offline'" :dot="true" :pulse="isAgentConnected">
|
||||
{{ isAgentConnected ? 'Active' : 'Inactive' }}
|
||||
@@ -417,20 +417,20 @@ onMounted(async () => {
|
||||
<!-- Download -->
|
||||
<div class="sv__section-head">
|
||||
<Icon name="download" :size="14" />
|
||||
<span>Download companion agent</span>
|
||||
<span>Download host agent</span>
|
||||
</div>
|
||||
<div class="sv__downloads sv__mb">
|
||||
<a
|
||||
href="https://cdn.corrosionmgmt.com/companion/latest/corrosion-companion-linux-amd64"
|
||||
download="corrosion-companion-linux-amd64"
|
||||
href="https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-linux-amd64"
|
||||
download="corrosion-host-agent-linux-amd64"
|
||||
class="sv__dl-link"
|
||||
>
|
||||
<Icon name="download" :size="15" />
|
||||
Linux (amd64)
|
||||
</a>
|
||||
<a
|
||||
href="https://cdn.corrosionmgmt.com/companion/latest/corrosion-companion-windows-amd64.exe"
|
||||
download="corrosion-companion-windows-amd64.exe"
|
||||
href="https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-windows-amd64.exe"
|
||||
download="corrosion-host-agent-windows-amd64.exe"
|
||||
class="sv__dl-link"
|
||||
>
|
||||
<Icon name="download" :size="15" />
|
||||
@@ -461,23 +461,23 @@ onMounted(async () => {
|
||||
<!-- Linux commands -->
|
||||
<div v-if="setupTab === 'linux'" class="sv__codeblock">
|
||||
<p class="sv__cmt"># Download the agent</p>
|
||||
<p>curl -LO https://cdn.corrosionmgmt.com/companion/latest/corrosion-companion-linux-amd64</p>
|
||||
<p>chmod +x corrosion-companion-linux-amd64</p>
|
||||
<p>curl -LO https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-linux-amd64</p>
|
||||
<p>chmod +x corrosion-host-agent-linux-amd64</p>
|
||||
<p class="sv__cmt sv__mt"># Start with your license key</p>
|
||||
<p>export LICENSE_ID=<span class="sv__accent">"{{ licenseKey }}"</span></p>
|
||||
<p>export NATS_URL=<span class="sv__accent">"nats://nats.corrosionmgmt.com:4222"</span></p>
|
||||
<p>./corrosion-companion-linux-amd64</p>
|
||||
<p>./corrosion-host-agent-linux-amd64</p>
|
||||
</div>
|
||||
|
||||
<!-- Windows commands -->
|
||||
<div v-if="setupTab === 'windows'" class="sv__codeblock">
|
||||
<p class="sv__cmt"># Requires PowerShell (not Command Prompt)</p>
|
||||
<p class="sv__cmt"># Download the agent</p>
|
||||
<p>Invoke-WebRequest -Uri <span class="sv__accent">"https://cdn.corrosionmgmt.com/companion/latest/corrosion-companion-windows-amd64.exe"</span> -OutFile <span class="sv__accent">"corrosion-companion-windows-amd64.exe"</span></p>
|
||||
<p>Invoke-WebRequest -Uri <span class="sv__accent">"https://cdn.corrosionmgmt.com/host-agent/latest/corrosion-host-agent-windows-amd64.exe"</span> -OutFile <span class="sv__accent">"corrosion-host-agent-windows-amd64.exe"</span></p>
|
||||
<p class="sv__cmt sv__mt"># Start with your license key</p>
|
||||
<p>$env:LICENSE_ID=<span class="sv__accent">"{{ licenseKey }}"</span></p>
|
||||
<p>$env:NATS_URL=<span class="sv__accent">"nats://nats.corrosionmgmt.com:4222"</span></p>
|
||||
<p>.\corrosion-companion-windows-amd64.exe</p>
|
||||
<p>.\corrosion-host-agent-windows-amd64.exe</p>
|
||||
</div>
|
||||
</Panel>
|
||||
|
||||
@@ -609,7 +609,7 @@ onMounted(async () => {
|
||||
<EmptyState
|
||||
icon="box"
|
||||
title="Docker-managed deployment"
|
||||
:description="profile.label + ' servers are managed via Docker Compose. Connect the companion agent on your Docker host to enable lifecycle management.'"
|
||||
:description="profile.label + ' servers are managed via Docker Compose. Connect the host agent on your Docker host to enable lifecycle management.'"
|
||||
>
|
||||
<template #action>
|
||||
<Badge tone="info">Docker · Compose</Badge>
|
||||
@@ -724,7 +724,7 @@ onMounted(async () => {
|
||||
<EmptyState
|
||||
icon="network"
|
||||
title="Cluster management coming soon"
|
||||
:description="'Connect a ' + profile.label + ' host to manage the main-client cluster from this panel. Cluster configuration requires the companion agent.'"
|
||||
:description="'Connect a ' + profile.label + ' host to manage the main-client cluster from this panel. Cluster configuration requires the host agent.'"
|
||||
/>
|
||||
</Panel>
|
||||
|
||||
@@ -737,7 +737,7 @@ onMounted(async () => {
|
||||
<EmptyState
|
||||
icon="map"
|
||||
title="Sietch management requires a connected Dune host"
|
||||
description="Connect the companion agent on your Dune: Awakening Docker host to manage BattleGroups and Sietches from this panel."
|
||||
description="Connect the host agent on your Dune: Awakening Docker host to manage BattleGroups and Sietches from this panel."
|
||||
/>
|
||||
</Panel>
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ function syncPorts() {
|
||||
}
|
||||
|
||||
const connectionTypes = [
|
||||
{ value: 'bare_metal', label: 'Bare metal / VPS', desc: 'Direct connection via Companion Agent' },
|
||||
{ value: 'bare_metal', label: 'Bare metal / VPS', desc: 'Direct connection via Corrosion host agent' },
|
||||
{ value: 'amp', label: 'AMP (CubeCoders)', desc: 'Connect through AMP panel API' },
|
||||
{ value: 'pterodactyl', label: 'Pterodactyl', desc: 'Connect through Pterodactyl panel API' },
|
||||
]
|
||||
@@ -183,7 +183,7 @@ async function completeSetup() {
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Step 2: Companion agent install -->
|
||||
<!-- Step 2: Corrosion host agent install -->
|
||||
<div v-if="step === 2" class="setup-card">
|
||||
<div class="setup-card__head setup-card__head--center">
|
||||
<div class="setup-icon">
|
||||
@@ -191,12 +191,12 @@ async function completeSetup() {
|
||||
<path d="M5 12.55a11 11 0 0 1 14.08 0M1.42 9a16 16 0 0 1 21.16 0M8.53 16.11a6 6 0 0 1 6.95 0M12 20h.01" />
|
||||
</svg>
|
||||
</div>
|
||||
<h1 class="setup-card__title">Install the Companion Agent</h1>
|
||||
<h1 class="setup-card__title">Install the Corrosion host agent</h1>
|
||||
<p class="setup-card__sub">The agent runs on your server and connects to Corrosion — no inbound ports required.</p>
|
||||
</div>
|
||||
|
||||
<div class="setup-code">
|
||||
<p class="setup-code__comment"># Download and install the Companion Agent</p>
|
||||
<p class="setup-code__comment"># Download and install the Corrosion host agent</p>
|
||||
<p class="setup-code__cmd">curl -sSL https://get.corrosionmgmt.com | sh</p>
|
||||
<p class="setup-code__comment setup-code__comment--mt"># Start the agent with your license key</p>
|
||||
<p class="setup-code__cmd">corrosion-agent start --key {{ auth.license?.license_key ?? 'YOUR-LICENSE-KEY' }}</p>
|
||||
|
||||
@@ -185,7 +185,7 @@ const mockActiveGame = activeGame
|
||||
<span class="g"><Icon name="box" :size="13" /></span>
|
||||
<span class="nm">
|
||||
Main · 2x Vanilla
|
||||
<small>asgard-01 · rust</small>
|
||||
<small>rust-host · rust</small>
|
||||
</span>
|
||||
<span class="st"><b />online</span>
|
||||
</div>
|
||||
@@ -193,7 +193,7 @@ const mockActiveGame = activeGame
|
||||
<span class="g"><Icon name="sun" :size="13" /></span>
|
||||
<span class="nm">
|
||||
Arrakis · Hardcore
|
||||
<small>asgard-01 · dune</small>
|
||||
<small>dune-host · dune</small>
|
||||
</span>
|
||||
<span class="st"><b />online</span>
|
||||
</div>
|
||||
@@ -201,7 +201,7 @@ const mockActiveGame = activeGame
|
||||
<span class="g"><Icon name="swords" :size="13" /></span>
|
||||
<span class="nm">
|
||||
Exiled Lands · PvP-C
|
||||
<small>asgard-02 · conan</small>
|
||||
<small>conan-host · conan</small>
|
||||
</span>
|
||||
<span class="st"><b />online</span>
|
||||
</div>
|
||||
|
||||
@@ -2,12 +2,18 @@ import { defineConfig } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
import tailwindcss from '@tailwindcss/vite'
|
||||
import { fileURLToPath, URL } from 'node:url'
|
||||
import { readFileSync } from 'node:fs'
|
||||
|
||||
const pkg = JSON.parse(readFileSync(new URL('./package.json', import.meta.url), 'utf-8'))
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
vue(),
|
||||
tailwindcss(),
|
||||
],
|
||||
define: {
|
||||
__APP_VERSION__: JSON.stringify(pkg.version),
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||
|
||||
Reference in New Issue
Block a user