Pulse/frontend-modern/src/components/Settings/AgentStepSection.tsx
rcourtman 6333a445e9 feat: add native Windows service support and expandable host details
Windows Host Agent Enhancements:
- Implement native Windows service support using golang.org/x/sys/windows/svc
- Add Windows Event Log integration for troubleshooting
- Create professional PowerShell installation/uninstallation scripts
- Add process termination and retry logic to handle Windows file locking
- Register uninstall endpoint at /uninstall-host-agent.ps1

Host Agent UI Improvements:
- Add expandable drawer to Hosts page (click row to view details)
- Display system info, network interfaces, disks, and temperatures in cards
- Replace status badges with subtle colored indicators
- Remove redundant master-detail sidebar layout
- Add search filtering for hosts

Technical Details:
- service_windows.go: Windows service lifecycle management with graceful shutdown
- service_stub.go: Cross-platform compatibility for non-Windows builds
- install-host-agent.ps1: Full Windows installation with validation
- uninstall-host-agent.ps1: Clean removal with process termination and retries
- HostsOverview.tsx: Expandable row pattern matching Docker/Proxmox pages

Files Added:
- cmd/pulse-host-agent/service_windows.go
- cmd/pulse-host-agent/service_stub.go
- scripts/install-host-agent.ps1
- scripts/uninstall-host-agent.ps1
- frontend-modern/src/components/Hosts/HostsOverview.tsx
- frontend-modern/src/components/Hosts/HostsFilter.tsx

The Windows service now starts reliably with automatic restart on failure,
and the uninstall script handles file locking gracefully without requiring reboots.
2025-10-23 22:11:56 +00:00

34 lines
1.1 KiB
TypeScript

import type { Component, JSX } from 'solid-js';
import { Show } from 'solid-js';
interface AgentStepSectionProps {
step: string;
title: string;
description?: string;
children: JSX.Element;
}
export const AgentStepSection: Component<AgentStepSectionProps> = (props) => {
return (
<section class="space-y-5">
<header class="space-y-2">
<div class="flex items-center gap-2">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-full bg-blue-100 dark:bg-blue-900/30 text-xs font-bold text-blue-700 dark:text-blue-300">
{props.step.replace('Step ', '')}
</span>
<h3 class="text-lg font-semibold text-gray-900 dark:text-gray-100">
{props.title}
</h3>
</div>
<Show when={props.description}>
<p class="text-sm text-gray-600 dark:text-gray-400 leading-relaxed ml-9">
{props.description}
</p>
</Show>
</header>
<div class="ml-9">{props.children}</div>
</section>
);
};
export default AgentStepSection;