Inventory
The Hermes agent continuously discovers hardware and software on each endpoint and reports it to the server. Inventory is collected in modules, and each module can be streamed individually to the server as it completes — so partial results land without waiting for a full pass.
What's collected#
Hermes organizes collection into discrete inventory modules. Each module targets one area of the endpoint; on Windows the data is read from WMI, the registry, DISM, and performance counters.
| Module | What it covers |
|---|---|
os | Operating system identity, edition, build, and domain membership |
hardware | Manufacturer, model, serial, processor, RAM, chassis, BIOS |
bootsecurity | Secure Boot state, TPM presence/version, pending-restart status |
processors | Installed CPUs and their characteristics |
memory | Physical memory and per-slot detail (including DDR type) |
storage | Storage devices and volumes |
network | Network configuration and interfaces |
shares | Shared folders exposed by the endpoint |
software | Installed software / applications |
services | Windows services and their state |
environment | Environment variables |
updates | Installed hotfixes / KB updates |
features | Windows optional features (enumerated via DISM) |
localgroups | Local groups and membership |
metrics | Real-time CPU, memory, and disk metrics |
agentinfo | Reported state of the Hermes agent itself |
Collection on Windows uses WMI, the registry, DISM (for optional features), and performance counters (for real-time metrics). Modules complete independently and stream to the server as they finish.
Detail fields#
The key fields reported per area:
| Area | Key fields |
|---|---|
| OS | ProductName, DisplayVersion, OsBuild, Domain, IsServerOs, IsServerCore |
| Hardware | Manufacturer, Model, Serial, UUID, Processor, RAM, ChassisType, IsVirtualMachine, BiosVersion |
| BootSecurity | SecureBoot, TPM present / version, RestartPending |
| MemorySlots | Per-slot detail including DDR type |
| StorageDevices | Storage device inventory |
| NetworkConfig / Interfaces / Shares | Network configuration, interfaces, and shared folders |
| Software | Installed applications |
| WindowsUpdates | Installed hotfixes / KBs |
| WindowsFeatures | Optional Windows features |
| WindowsServices | Services and state |
| LocalGroups | Local groups and membership |
| EnvironmentVariables | Environment variables |
| AgentInfo | Hermes agent self-report |
| CertificateInfo | Certificate inventory |
Derived agent flags#
From the reported inventory, the server derives a set of flags it uses to classify each agent:
IsServer— the endpoint is running a server OS.IsDomainController— derived from the presence of the AD-Domain-Services feature.IsVirtualMachine— the endpoint is a virtual machine.IsDomainJoined— the endpoint is joined to a domain.DomainName— the domain the endpoint belongs to.
How it's stored#
The server persists reported inventory in JSON columns:
| Column | Holds |
|---|---|
HardwareJson | Hardware inventory |
SoftwareJson | Installed software inventory |
NetworkJson | Network configuration and interfaces |
ModuleDataJson | Output from custom modules |
Querying inventory#
Inventory for an agent is read from GET api/agents/{agentId}/inventory, with
sub-routes for each area:
| Sub-route | Returns |
|---|---|
.../inventory/os | Operating system inventory |
.../inventory/hardware | Hardware inventory |
.../inventory/metrics | Real-time CPU / memory / disk metrics |
.../inventory/processors | Processor inventory |
.../inventory/memory | Memory and slot inventory |
.../inventory/storage | Storage devices |
.../inventory/network | Network configuration and interfaces |
.../inventory/software | Installed software |
.../inventory/updates | Installed hotfixes / KBs |
.../inventory/services | Windows services |
.../inventory/features | Windows optional features |
A refresh can be triggered from the server, optionally scoped to specific modules, with a
force_refresh flag. Fetch the
hardware inventory for an agent over the API:
# Fetch hardware inventory for one agent
$headers = @{ Authorization = "Bearer $token" }
Invoke-RestMethod `
-Uri "https://athena.example.com:8443/api/agents/$agentId/inventory/hardware" `
-Headers $headers `
-SkipCertificateCheck
Refresh intervals#
Two cadences govern how often the server hears from an agent:
| Setting | Default | Purpose |
|---|---|---|
HeartbeatIntervalSeconds | 90 | Lightweight heartbeat — confirms the agent is alive |
StatusUpdateIntervalSeconds | 180 | Full status / inventory update |