yuzu

status

What it doesReports agent version, system info, health, modules, connection, switch, and config
Version-
KindCollector · read-only · gathered (device.status.version, device.status.info, device.status.health, device.status.plugins, device.status.modules, device.status.connection, device.status.switch, device.status.config)
PlatformsWindows ✅ · macOS ✅ · Linux ✅
Actionsconfig (definition device.status.config) · connection (definition device.status.connection) · health (definition device.status.health) · info (definition device.status.info) · modules (definition device.status.modules) · plugins (definition device.status.plugins) · switch (definition device.status.switch) · version (definition device.status.version)
Securityversion: securable Inventory · operation Read · risk Low · dispatch ReadOnly · approval gate None; info: securable Inventory · operation Read · risk Low · dispatch ReadOnly · approval gate None; health: securable Inventory · operation Read · risk Low · dispatch ReadOnly · approval gate None; plugins: securable Inventory · operation Read · risk Low · dispatch ReadOnly · approval gate None; modules: securable Inventory · operation Read · risk Low · dispatch ReadOnly · approval gate None; connection: securable Inventory · operation Read · risk Low · dispatch ReadOnly · approval gate None; switch: securable PluginSecret · operation Read · risk Medium · dispatch ReadOnly · approval gate None; config: securable Inventory · operation Read · risk Low · dispatch ReadOnly · approval gate None
Rolesexecute: version: endpoint-admin, endpoint-operator; info: endpoint-admin, endpoint-operator; health: endpoint-admin, endpoint-operator; plugins: endpoint-admin, endpoint-operator; modules: endpoint-admin, endpoint-operator; connection: endpoint-admin; switch: endpoint-admin; config: endpoint-admin · author: content-author

How it works

version and info are pure reads that never touch plugin state: version formats three compile-time constants (yuzu::kFullVersionString/kBuildNumber/kGitCommitHash), info calls uname(2)+gethostname(3) on Linux/macOS or GetNativeSystemInfo+GetComputerNameA on Windows. health reads process memory via the platform’s own API (/proc/self/status, Mach task_info, or K32GetProcessMemoryInfo) and computes uptime from a steady_clock timestamp taken in init().

The other five actions — plugins, modules, connection, switch, config — all read the agent’s in-process config map through one helper, cfg(), which forwards to yuzu_ctx_get_config() against a raw context pointer captured in init(). That map is a snapshot: the agent copies its master config into every plugin’s own context once, right after every plugin finishes loading, so these five actions only ever see the config as it stood at that moment (see Caveats).

The plugin deliberately does not call yuzu_ctx_get_secret() (always returns nullptr on this agent build) and does not shell out, open a socket, or mutate anything — execute() is a flat action-name dispatch with no side effects beyond the one init_time_ timestamp.

flowchart LR
  OP["Operator / workflow"] --> SRV["Server - authz: Inventory.Read, or PluginSecret.Read for switch"]
  SRV -->|"gRPC mTLS"| HOST["Agent plugin host"] --> EX["status.execute"]
  EX --> WIN["Windows leg - native API / in-process config"]
  EX --> MAC["macOS leg - native API / in-process config"]
  EX --> LIN["Linux leg - native API / in-process config"]
  WIN & MAC & LIN --> ROWS["key|value rows, UNDECLARED status"] --> RS[("ResponseStore")] --> API["REST /api/responses, MCP"]

OS capability

ActionWindowsmacOSLinux
config✅ supported · rung 1 · in-process agent config (agent.*)✅ supported · rung 1 · in-process agent config (agent.*)✅ supported · rung 1 · in-process agent config (agent.*)
connection✅ supported · rung 1 · in-process agent config (agent.server_address/tls_enabled/*)✅ supported · rung 1 · in-process agent config (agent.server_address/tls_enabled/*)✅ supported · rung 1 · in-process agent config (agent.server_address/tls_enabled/*)
health✅ supported · rung 1 · K32GetProcessMemoryInfo + steady_clock✅ supported · rung 1 · task_info(MACH_TASK_BASIC_INFO) + steady_clock✅ supported · rung 1 · /proc/self/status VmRSS + steady_clock
info✅ supported · rung 1 · GetNativeSystemInfo + GetComputerNameA✅ supported · rung 1 · uname(2) + gethostname(3)✅ supported · rung 1 · uname(2) + gethostname(3)
modules✅ supported · rung 1 · in-process agent config (agent.modules.*)✅ supported · rung 1 · in-process agent config (agent.modules.*)✅ supported · rung 1 · in-process agent config (agent.modules.*)
plugins✅ supported · rung 1 · in-process agent config (agent.plugins.*)✅ supported · rung 1 · in-process agent config (agent.plugins.*)✅ supported · rung 1 · in-process agent config (agent.plugins.*)
switch✅ supported · rung 1 · in-process agent config (agent.server_address/session_id/*)✅ supported · rung 1 · in-process agent config (agent.server_address/session_id/*)✅ supported · rung 1 · in-process agent config (agent.server_address/session_id/*)
version✅ supported · rung 1 · in-process (compiled version constants)✅ supported · rung 1 · in-process (compiled version constants)✅ supported · rung 1 · in-process (compiled version constants)

Privileges and prerequisites

OSRuns asExtra grant neededMeasuredIf the read is refused
Windowsagent service account (LocalSystem today, #1442)None — every call (GetNativeSystemInfo, GetComputerNameA, K32GetProcessMemoryInfo) works for an unprivileged process on its own memory/host info.2026-09-07 on the-rig as SYSTEMNo typed denial path exists; a failed native call is simply not written (see health in Caveats)
macOSagent daemon, unprivilegedNone — uname, gethostname, and task_info(MACH_TASK_BASIC_INFO) on the calling process require no entitlement.2026-09-07 at euid 501 (jsmith)Same — no typed denial path
Linuxagent daemon, root todayNone — uname, gethostname, and reading the process’s own /proc/self/status require no capability.2026-09-06 in a container at euid 0Same — no typed denial path

No external binaries, no subprocesses, no network access. Every call in status_plugin.cpp is either an in-process constant, a config-map lookup, or a single native syscall.

Data contract

Inputs

No action takes parameters.

Outputs

Every field is written as its own pipe-delimited key|value row via write_output() — not one row per entity. plugins and modules are the two exceptions: after their own <action>_count|<n> row, each lists one plugin|name|version|description or module|name|version|status row per item, and modules additionally emits a separate module_description|name|description row only when a description is non-empty. The YAML declares bool/int types for several columns (tls_enabled, encrypted, debug_mode, verbose_logging, reconnect_count, …) purely for consumer convenience — every value actually travels as raw text from the agent’s config map, and an unset or not-yet-synced key comes through as an empty string, never a typed false/0.

device.status.config — agent_id|agent_version|build_number|git_commit|server_address|tls_enabled|heartbeat_interval|plugin_dir|data_dir|log_level|debug_mode|verbose_logging

FieldTypeValuesAvailableExampleDescription
agent_idstring-Windows, Linux, macOS-Agent’s assigned id, from agent.id. Values: free text.
agent_versionstring-Windows, Linux, macOS-Full agent version string with build suffix, from agent.version (set from kFullVersionString). Values: free text.
build_numberstring-Windows, Linux, macOS-Build number as text, from agent.build_number. Values: free text (integer as string).
git_commitstring-Windows, Linux, macOS-Short git commit hash, from agent.git_commit. Values: free text.
server_addressstring-Windows, Linux, macOS-Configured server address, from agent.server_address. Values: free text (host:port), or empty if unset.
tls_enabledbool-Windows, Linux, macOS-Raw config value of agent.tls_enabled as text. Values: “true”, “false”, or empty if unset.
heartbeat_intervalstring-Windows, Linux, macOS-Configured heartbeat interval in seconds, as text, from agent.heartbeat_interval. Values: free text (integer seconds as string).
plugin_dirstring-Windows, Linux, macOS-Configured plugin directory path, from agent.plugin_dir. Values: free text (filesystem path).
data_dirstring-Windows, Linux, macOS-Configured data directory path, from agent.data_dir. Values: free text (filesystem path).
log_levelstring-Windows, Linux, macOS-Configured log level, from agent.log_level. Values: free text (e.g. “info”, “debug”).
debug_modebool-Windows, Linux, macOS-Raw config value of agent.debug_mode as text. Values: “true”, “false”, or empty if unset.
verbose_loggingbool-Windows, Linux, macOS-Raw config value of agent.verbose_logging as text. Values: “true”, “false”, or empty if unset.

device.status.connection — server_address|tls_enabled|encrypted|debug_mode|verbose_logging|log_level

FieldTypeValuesAvailableExampleDescription
server_addressstring-Windows, Linux, macOS-Configured server address the agent connects to, from agent.server_address. Values: free text (host:port), or empty if unset.
tls_enabledbool-Windows, Linux, macOS-Raw config value of agent.tls_enabled as text; not validated or cast to bool at read time. Values: “true”, “false”, or empty if unset.
encryptedbool-Windows, Linux, macOStrueDerived field — “false” only when tls_enabled is literally “false”; “true” in every other case, including when tls_enabled is empty. Values: “true”, “false”.
debug_modebool-Windows, Linux, macOS-Raw config value of agent.debug_mode as text. Values: “true”, “false”, or empty if unset.
verbose_loggingbool-Windows, Linux, macOS-Raw config value of agent.verbose_logging as text. Values: “true”, “false”, or empty if unset.
log_levelstring-Windows, Linux, macOS-Configured log level string, from agent.log_level. Values: free text (e.g. “info”, “debug”), or empty if unset.

device.status.health — uptime_seconds|timestamp_epoch_ms|memory_rss_kb

FieldTypeValuesAvailableExampleDescription
uptime_secondsint64-Windows, Linux, macOS49012Seconds since the plugin’s init() ran, measured with steady_clock; only meaningful once init() has actually been called by the host. Values: non-negative integer (seconds).
timestamp_epoch_msint64-Windows, Linux, macOS1788774965076Wall-clock time the action ran, in epoch milliseconds (system_clock::now()). Values: integer (Unix epoch milliseconds).
memory_rss_kbint64-Windows, Linux, macOS31056Process resident set size in kilobytes; the row is omitted entirely (not zeroed) if the platform read fails. Values: non-negative integer (kilobytes), or the row is absent.

device.status.info — os|arch|hostname

FieldTypeValuesAvailableExampleDescription
osstring-Windows, Linux, macOSDarwinOS family name. “Darwin”/“Linux” from uname(2) on macOS/Linux, or the literal “Windows” on Windows. Values: “Darwin”, “Linux”, “Windows”.
archstring-Windows, Linux, macOSarm64CPU architecture. uname(2)‘s machine field on Linux/macOS; mapped from GetNativeSystemInfo on Windows. Values: free text on Linux/macOS (whatever uname reports); on Windows one of “x86_64”, “aarch64”, “x86”, “arm”, “unknown”.
hostnamestring-Windows, Linux, macOSworkstation1.localAgent host’s configured hostname (gethostname(3) on Linux/macOS, GetComputerNameA on Windows); the row is simply not emitted if the call fails. Values: free text.

device.status.modules — modules_count|module_name|module_version|module_status|module_description

FieldTypeValuesAvailableExampleDescription
modules_countint32-Windows, Linux, macOS0Number of modules recorded in the agent’s module roster (agent.modules.count), including both successful loads and rejected loads. Values: non-negative integer.
module_namestring-Windows, Linux, macOS-Module’s file stem name; one “module|name|version|status” row is emitted per module. Values: free text.
module_versionstring-Windows, Linux, macOS-Module’s declared version; empty for a rejected load. Values: free text or empty.
module_statusstring-Windows, Linux, macOS-Load outcome for the module, as recorded by the agent’s loader. Values: “loaded”, “init_failed”, “load_failed”.
module_descriptionstring-Windows, Linux, macOS-Human-readable description, or the rejection reason for a failed load; emitted as a separate “module_description|name|description” row, and only when non-empty. Values: free text, or the row is absent.

device.status.plugins — plugins_count|plugin_name|plugin_version|plugin_description

FieldTypeValuesAvailableExampleDescription
plugins_countint32-Windows, Linux, macOS0Number of plugins currently loaded by the agent, from agent.plugins.count in the in-process config; 0 if the config context isn’t yet populated. Values: non-negative integer.
plugin_namestring-Windows, Linux, macOS-Loaded plugin’s name; one “plugin|name|version|description” row is emitted per loaded plugin. Values: free text.
plugin_versionstring-Windows, Linux, macOS-Loaded plugin’s declared version string. Values: free text.
plugin_descriptionstring-Windows, Linux, macOS-Loaded plugin’s declared description. Values: free text.

device.status.switch — switch_address|session_id|connected_since|reconnect_count

FieldTypeValuesAvailableExampleDescription
switch_addressstring-Windows, Linux, macOS-Same value as connection.server_address, from agent.server_address. Values: free text (host:port), or empty if unset.
session_idstring-Windows, Linux, macOS-The agent’s live session id, the same value Register/Heartbeat use server-side to resolve identity; classified as a plugin secret, not plain inventory. Values: free text (opaque token), or empty.
connected_sincestring-Windows, Linux, macOS-Epoch milliseconds the current session connected, from agent.connected_since. Values: integer-as-string (Unix epoch milliseconds), or empty.
reconnect_countint32-Windows, Linux, macOS-Number of reconnect attempts recorded by the register/reconnect loop, from agent.reconnect_count. Values: non-negative integer, or empty string when the config key is unset (despite the declared int32 type).

device.status.version — version|build_number|git_commit

FieldTypeValuesAvailableExampleDescription
versionstring-Windows, Linux, macOS0.13.1+5871Full agent version string, ”+<build_number>” (yuzu::kFullVersionString). Values: free text (semver + build suffix).
build_numberstring-Windows, Linux, macOS5871The build’s numeric build number, formatted as text (yuzu::kBuildNumber). Values: free text (integer as string).
git_commitstring-Windows, Linux, macOS4c377398eShort git commit hash of the build (yuzu::kGitCommitHash), or “unknown” when the build did not set one. Values: free text (hex hash or “unknown”).

Result status

This plugin does not set a typed result status; the agent records UNDECLARED and every sample shows UNDECLARED / UNKNOWN / for every action.

Where the data goes

Sample output

Windows — captured: windows Microsoft Windows NT 10.0.26200.0 x64 · bare-metal · 2026-09-07 · SYSTEM · leg-hash 0e82a6f385ea

== action=version
version|0.13.1+7854
build_number|7854
git_commit|4c377398e
[result_status] UNDECLARED / UNKNOWN

== action=info
os|Windows
arch|x86_64
hostname|DESKTOP-04DNSIG
[result_status] UNDECLARED / UNKNOWN

== action=health
uptime_seconds|69196
timestamp_epoch_ms|1788775738117
memory_rss_kb|9772
[result_status] UNDECLARED / UNKNOWN

== action=plugins
plugins_count|0
[result_status] UNDECLARED / UNKNOWN

== action=modules
modules_count|0
[result_status] UNDECLARED / UNKNOWN

== action=connection
server_address|
tls_enabled|
encrypted|true
debug_mode|
verbose_logging|
log_level|
[result_status] UNDECLARED / UNKNOWN

== action=switch
switch_address|
session_id|
connected_since|
reconnect_count|
[result_status] UNDECLARED / UNKNOWN

== action=config
agent_id|
agent_version|
build_number|
git_commit|
server_address|
tls_enabled|
heartbeat_interval|
plugin_dir|
data_dir|
log_level|
debug_mode|
verbose_logging|
[result_status] UNDECLARED / UNKNOWN

macOS — captured: macos macOS 26.6.2 arm64 · bare-metal · 2026-09-07 · euid 501 (jsmith) · leg-hash 0e82a6f385ea

== action=version
version|0.13.1+5871
build_number|5871
git_commit|4c377398e
[result_status] UNDECLARED / UNKNOWN

== action=info
os|Darwin
arch|arm64
hostname|workstation1.local
[result_status] UNDECLARED / UNKNOWN

== action=health
uptime_seconds|49012
timestamp_epoch_ms|1788774965076
memory_rss_kb|31056
[result_status] UNDECLARED / UNKNOWN

== action=plugins
plugins_count|0
[result_status] UNDECLARED / UNKNOWN

== action=modules
modules_count|0
[result_status] UNDECLARED / UNKNOWN

== action=connection
server_address|
tls_enabled|
encrypted|true
debug_mode|
verbose_logging|
log_level|
[result_status] UNDECLARED / UNKNOWN

== action=switch
switch_address|
session_id|
connected_since|
reconnect_count|
[result_status] UNDECLARED / UNKNOWN

== action=config
agent_id|
agent_version|
build_number|
git_commit|
server_address|
tls_enabled|
heartbeat_interval|
plugin_dir|
data_dir|
log_level|
debug_mode|
verbose_logging|
[result_status] UNDECLARED / UNKNOWN

Linux — captured: linux Debian GNU/Linux 13 (trixie) aarch64 · container · 2026-09-06 · euid 0 · leg-hash 0e82a6f385ea

== action=version
version|0.13.1+0
build_number|0
git_commit|unknown
[result_status] UNDECLARED / UNKNOWN

== action=info
os|Linux
arch|aarch64
hostname|988e0b888baf
[result_status] UNDECLARED / UNKNOWN

== action=health
uptime_seconds|184122
timestamp_epoch_ms|1788722304837
memory_rss_kb|15020
[result_status] UNDECLARED / UNKNOWN

== action=plugins
plugins_count|0
[result_status] UNDECLARED / UNKNOWN

== action=modules
modules_count|0
[result_status] UNDECLARED / UNKNOWN

== action=connection
server_address|
tls_enabled|
encrypted|true
debug_mode|
verbose_logging|
log_level|
[result_status] UNDECLARED / UNKNOWN

== action=switch
switch_address|
session_id|
connected_since|
reconnect_count|
[result_status] UNDECLARED / UNKNOWN

== action=config
agent_id|
agent_version|
build_number|
git_commit|
server_address|
tls_enabled|
heartbeat_interval|
plugin_dir|
data_dir|
log_level|
debug_mode|
verbose_logging|
[result_status] UNDECLARED / UNKNOWN

Caveats and known gaps

  1. The capture driver never calls init(), so five of eight actions read an empty config. plugins, modules, connection, switch, and config all read through cfg() (status_plugin.cpp:305-310), which returns empty unconditionally until init() sets raw_plugin_ctx_ (status_plugin.cpp:264-273) — every sample above shows this: plugins_count|0, modules_count|0, and every connection/switch/config field blank. On a running agent init() runs at plugin load, before any action executes.
  2. switch’s session_id, connected_since, and reconnect_count never populate on a live agent either. The post-load config sync (agents/core/src/agent.cpp:1017, mechanism documented in plugin_config_sync.hpp:24-29) is one-shot and runs before Register sets agent.session_id/agent.connected_since (agent.cpp:1896-1897) or the reconnect loop updates agent.reconnect_count past its startup value of "0" (agent.cpp:787, updated at agent.cpp:1630) — so this action reports the live session id and reconnect count as empty/0 for the whole life of the agent process, independent of this capture. switch_address (from agent.server_address, set at agent.cpp:770, before the sync) is the one field here that does reflect reality.
  3. switch’s session_id is classified as a live session credential, not plain inventory. server/core/src/capability_decls/plugin_action_catalogue_b.hpp:296-303 deliberately gates it under PluginSecret/Medium risk because Heartbeat/ReportInventory resolve the agent’s identity from that same session id — do not reclassify it to Inventory/Low to match the other seven actions.
  4. health.memory_rss_kb is silently omitted, not placeholdered, on a failed read. get_memory_rss_kb() returns -1 on failure and do_health only calls write_output when the result is >= 0 (status_plugin.cpp:418-421) — unlike the empty-string convention used by the config-backed actions, a failed read here drops the row entirely.
  5. connection.encrypted defaults to "true" whenever tls_enabled isn’t the literal string "false" (status_plugin.cpp:343) — including when the config value is unset, as in every capture above. A misconfigured or not-yet-synced agent reports itself encrypted by default on this field, never unencrypted.

Source and tests