mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
policy.resolve() / TelemetryDecision was a read-only projection used only by
`hermes telemetry status` for display. The actual behavior gates already read
telemetry.* straight from config: the emitter (whether to write) and the plugin
loader (whether to auto-load) each call .get("local", True) on the loaded config,
never through policy.
Make config the single chokepoint the status command reads too: it now resolves
local/allow_aggregate/consent_state inline from the loaded config, the same way
the other gates do. policy.py keeps only what config can't express on its own —
the consent constants, ensure_install_id(), and may_upload_aggregate(config) as a
pure function (the gate a future uploader must consult). resolve() and the
TelemetryDecision dataclass are removed; policy.py drops 107 -> 70 lines.
No behavior change: status renders identically, and the default-on local plane is
still defaulted in DEFAULT_CONFIG plus a fail-safe .get(..., True) at each gate.
30 lines
1,010 B
Python
30 lines
1,010 B
Python
"""Hermes telemetry & observability.
|
|
|
|
Local-first observability, on by default. The ``telemetry`` plugin registers Hermes
|
|
lifecycle hooks and hands typed events to the fire-and-forget ``emitter`` (queue ->
|
|
background writer -> JSONL + state.db ``tel_*`` index). The emitter never blocks or
|
|
raises into a model/tool call (the hot-path invariant).
|
|
|
|
Events record the observed model ids, provider names, and tool names. ``metrics``
|
|
derives rollups for /usage and /insights; ``rollup`` builds the per-run summaries shown
|
|
by ``hermes telemetry preview``. ``redaction`` + ``exporter_bulk`` + ``otlp_exporter``
|
|
handle export to an operator-chosen destination. ``policy`` holds the consent
|
|
constants and the aggregate upload gate (no uploader ships).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from . import emitter, events, metrics, policy, spans
|
|
|
|
emit = emitter.emit
|
|
get_emitter = emitter.get_emitter
|
|
|
|
__all__ = [
|
|
"emitter",
|
|
"events",
|
|
"metrics",
|
|
"policy",
|
|
"spans",
|
|
"emit",
|
|
"get_emitter",
|
|
]
|