Package v1 contains API Schema definitions for the hermes v1 API group.
AutoUpdateRollbackSpec configures the rollback path.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
true | Optional: {} |
|
probeFailureThreshold integer |
3 | Maximum: 100 Minimum: 1 Optional: {} |
AutoUpdateSourceSpec is the OCI registry source for the channel.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
registry string |
Optional: {} |
||
channel string |
Optional: {} |
AutoUpdateSpec controls opt-in OCI-registry polling for newer agent images.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
source AutoUpdateSourceSpec |
Optional: {} |
||
pollInterval string |
1h | Optional: {} |
|
backupBeforeUpdate boolean |
true | Optional: {} |
|
rollback AutoUpdateRollbackSpec |
Optional: {} |
AvailabilitySpec bundles PDB, HPA, and topology-spread.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
podDisruptionBudget PDBSpec |
Optional: {} |
||
horizontalPodAutoscaler HPASpec |
Optional: {} |
||
topologySpreadConstraints TopologySpreadConstraint array |
Optional: {} |
BackupS3Spec configures the S3-compatible remote target.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
bucket string |
|||
endpoint string |
|||
region string |
Optional: {} |
||
pathPrefix string |
Optional: {} |
||
credentialsSecretRef LocalObjectReference |
BackupSpec controls S3-compatible PVC snapshots for this instance.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
s3 BackupS3Spec |
Optional: {} |
||
schedule string |
Optional: {} |
||
onDelete boolean |
false | Optional: {} |
|
preUpdate boolean |
true | Optional: {} |
|
historyLimit integer |
30 | Maximum: 10000 Minimum: 1 Optional: {} |
|
failedHistoryLimit integer |
3 | Maximum: 1000 Minimum: 0 Optional: {} |
|
image string |
Optional: {} |
CABundleSpec optionally mounts a CA bundle into the agent container. Exactly one of ConfigMapName / SecretName SHOULD be set.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
configMapName string |
ConfigMapName references a ConfigMap in the same namespace. | Optional: {} |
|
secretName string |
SecretName references a Secret in the same namespace. | Optional: {} |
|
key string |
Key is the data-map key holding the PEM bundle. Default "ca.crt". | ca.crt | Optional: {} |
Underlying type: string
ConfigMergeMode controls how Raw and ConfigMapRef are combined.
Validation:
- Enum: [replace merge]
Appears in:
| Field | Description |
|---|---|
replace |
ConfigMergeModeReplace: Raw replaces ConfigMapRef entirely when both are set. This is the default to avoid surprising merges. |
merge |
ConfigMergeModeMerge: YAML deep-merge Raw onto ConfigMapRef. Raw wins on conflict. |
ConfigSpec holds the agent's ~/.hermes/config.yaml. Exactly one of Raw or ConfigMapRef SHOULD be set; the validating webhook rejects both unset and emits a warning if both are set with MergeMode unset.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
raw RawConfig |
Raw is the inline YAML body of config.yaml. Stored as a RawExtension so users may write structured YAML in the manifest without escaping. |
Optional: {} |
|
configMapRef LocalObjectReference |
ConfigMapRef references a ConfigMap in the same namespace whose "config.yaml" key holds the body. |
Optional: {} |
|
mergeMode ConfigMergeMode |
MergeMode controls combination when both Raw and ConfigMapRef are set. | replace | Enum: [replace merge] Optional: {} |
DiscordGatewaySpec binds the agent to a Discord bot application.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
botTokenSecretRef SecretKeySelector |
Optional: {} |
||
applicationID string |
ApplicationID is the Discord application's snowflake. | Optional: {} |
|
guildIDs string array |
GuildIDs scopes slash-command registration to specific guilds. | Optional: {} |
FFmpegSpec controls the FFmpeg dependency check.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
true | Optional: {} |
GatewaysSpec is the union of all supported messaging-platform bindings.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
telegram TelegramGatewaySpec |
Optional: {} |
||
discord DiscordGatewaySpec |
Optional: {} |
||
slack SlackGatewaySpec |
Optional: {} |
||
whatsapp WhatsAppGatewaySpec |
Optional: {} |
||
signal SignalGatewaySpec |
Optional: {} |
GrafanaDashboardSpec configures auto-provisioned Grafana dashboard ConfigMaps.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Enabled enables Grafana dashboard ConfigMap creation. | false | Optional: {} |
labels object (keys:string, values:string) |
Labels to add to the dashboard ConfigMaps (in addition to grafana_dashboard: "1"). | Optional: {} |
|
folder string |
Folder is the Grafana folder to place the dashboards in. | Hermes | Optional: {} |
HPASpec controls HorizontalPodAutoscaler emission.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
minReplicas integer |
MinReplicas: default 1. | 1 | Minimum: 1 Optional: {} |
maxReplicas integer |
MaxReplicas: default 5. | 5 | Minimum: 1 Optional: {} |
targetCPUUtilization integer |
TargetCPUUtilization: default 80 (percent). | 80 | Maximum: 100 Minimum: 1 Optional: {} |
targetMemoryUtilization integer |
TargetMemoryUtilization: optional, when set adds a memory metric. | Maximum: 100 Minimum: 1 Optional: {} |
|
behavior HorizontalPodAutoscalerBehavior |
Behavior is forwarded onto HPA's autoscaling/v2 behavior field. Plan 6 conformance suite asserts the field is exposed; v1 forwards it raw. |
Optional: {} |
HTTPRouteParentRef references a parent (typically a Gateway) the route attaches to.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
name string |
Name of the parent resource (e.g. the Gateway name). | MinLength: 1 |
|
namespace string |
Namespace of the parent. Defaults to the HermesInstance namespace when empty. | Optional: {} |
|
sectionName string |
SectionName is the name of a section within the parent (e.g. a Gateway listener). | Optional: {} |
HTTPRouteSpec controls optional Gateway API HTTPRoute creation. It mirrors the IngressSpec shape for consistency: a single prefix rule routing to the agent Service. The route is only created when Enabled is true.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Enabled: when true, the operator creates an HTTPRoute for the agent. Default false. |
false | Optional: {} |
parentRefs HTTPRouteParentRef array |
ParentRefs are the Gateways (or other parents) this route attaches to. At least one is required for the route to take effect. |
Optional: {} |
|
hostnames string array |
Hostnames are the hostnames matched by this route. | Optional: {} |
|
path string |
Path is the path prefix routed to the agent Service. Default "/". | / | Optional: {} |
servicePortName string |
ServicePortName: name of the Service port the route should target. Default "gateway". |
gateway | Optional: {} |
annotations object (keys:string, values:string) |
Annotations are applied verbatim onto the HTTPRoute. | Optional: {} |
HermesClusterDefaults is the Schema for the hermesclusterdefaults API
| Field | Description | Default | Validation |
|---|---|---|---|
apiVersion string |
hermes.agent/v1 |
||
kind string |
HermesClusterDefaults |
||
metadata ObjectMeta |
Refer to Kubernetes API documentation for fields of metadata. |
Optional: {} |
|
spec HermesClusterDefaultsSpec |
spec defines the desired state of HermesClusterDefaults | Required: {} |
HermesClusterDefaultsSpec is the cluster-wide default set applied by the defaulting webhook when a HermesInstance leaves a field nil. ClusterDefaults only fills nil fields; an explicit value on the instance always wins.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
image ImageSpec |
Image defaults the instance's spec.image. | Optional: {} |
|
registry RegistryDefaults |
Registry defaults image-pull plumbing. | Optional: {} |
|
storage StorageSpec |
Storage defaults the instance's spec.storage. | Optional: {} |
|
security SecurityDefaults |
Security defaults SA annotations + NetworkPolicy on/off + container-level defaults (read-only rootfs etc. are operator-baked, not defaultable). |
Optional: {} |
|
observability ObservabilityDefaults |
Observability defaults metrics / ServiceMonitor / PrometheusRule. | Optional: {} |
|
networking NetworkingDefaults |
Networking defaults Service kind + NetworkPolicy enablement. | Optional: {} |
|
resources ResourcesSpec |
Resources defaults requests + limits when the instance leaves them nil. | Optional: {} |
HermesInstance is the Schema for the hermesinstances API
| Field | Description | Default | Validation |
|---|---|---|---|
apiVersion string |
hermes.agent/v1 |
||
kind string |
HermesInstance |
||
metadata ObjectMeta |
Refer to Kubernetes API documentation for fields of metadata. |
Optional: {} |
|
spec HermesInstanceSpec |
spec defines the desired state of HermesInstance | Required: {} |
HermesInstanceSpec defines the desired state of HermesInstance. Field order follows design §4.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
image ImageSpec |
Image selects the hermes-agent container image. | Optional: {} |
|
config ConfigSpec |
Config is the YAML content of ~/.hermes/config.yaml, supplied inline, from a referenced ConfigMap, or merged from both. |
Optional: {} |
|
workspace WorkspaceSpec |
Workspace seeds initial files and directories into ~/.hermes on first start. | Optional: {} |
|
resources ResourcesSpec |
Resources sets the agent container's CPU/memory requests + limits. | Optional: {} |
|
security SecuritySpec |
Security configures pod/container security contexts, RBAC, NetworkPolicy, and the optional cluster CA bundle injection. |
Optional: {} |
|
storage StorageSpec |
Storage controls the PVC backing ~/.hermes for this instance. | Optional: {} |
|
networking NetworkingSpec |
Networking exposes the agent via Service / Ingress. | Optional: {} |
|
observability ObservabilitySpec |
Observability turns on metrics, ServiceMonitor, PrometheusRule, and logging. | Optional: {} |
|
availability AvailabilitySpec |
Availability sets PDB, HPA, and topology-spread constraints. | Optional: {} |
|
probes ProbesSpec |
Probes lets users override the built-in liveness/readiness/startup probes. | Optional: {} |
|
scheduling SchedulingSpec |
Scheduling targets the agent pod at specific nodes. | Optional: {} |
|
shareProcessNamespace boolean |
ShareProcessNamespace enables PID namespace sharing between all containers in the pod. Defaults to false: the upstream hermes-agent image runs under s6-overlay, whose /init must be PID 1 (s6-overlay-suexec aborts otherwise), and s6 already reaps zombies non-blocking on SIGCHLD — so sharing the process namespace (which makes the pause container PID 1) is both incompatible and unnecessary. Security note: enabling this lets every container in the pod see and signal every other container's processes. A compromised sidecar could send signals to the agent and vice versa. Leave false to keep per-container PID isolation. |
false | Optional: {} |
initContainers Container array |
InitContainers is a user-supplied list of init containers appended after any operator-managed init containers (e.g. runtime-init from Plan 3). |
Optional: {} |
|
sidecars Container array |
Sidecars is a user-supplied list of sidecars appended after operator-managed sidecars (e.g. ollama / web-terminal / tailscale from Plan 3). |
Optional: {} |
|
extraVolumes Volume array |
ExtraVolumes is a user-supplied list of additional pod volumes. | Optional: {} |
|
extraVolumeMounts VolumeMount array |
ExtraVolumeMounts is a user-supplied list of additional volume mounts applied to the agent container. |
Optional: {} |
|
envFrom EnvFromSource array |
EnvFrom is a list of EnvFrom sources (ConfigMap/Secret refs) injected into the agent container. |
Optional: {} |
|
env EnvVar array |
Env is a list of explicit environment variables for the agent container. SSA list-map key is "name" so HermesSelfConfig can merge entries without replacing the whole list. |
Optional: {} |
|
skills InstanceSkill array |
Skills is the declarative list of uv-installable skill sources. Plan 3 wires the runtime; the field is declared here so SSA from HermesSelfConfig (Plan 4) can target it without a CRD schema change. |
Optional: {} |
|
selfConfigure SelfConfigureSpec |
SelfConfigure is the allowlist policy for HermesSelfConfig mutations. | Optional: {} |
|
suspended boolean |
Suspended scales the StatefulSet to zero replicas without deleting state. | Optional: {} |
|
backup BackupSpec |
Backup controls scheduled and on-delete PVC snapshot behaviour. | Optional: {} |
|
restoreFrom string |
RestoreFrom names a backup snapshot to restore from on next boot. | Optional: {} |
|
autoUpdate AutoUpdateSpec |
AutoUpdate controls opt-in OCI-registry polling for newer agent images. | Optional: {} |
|
migration MigrationSpec |
Migration is a one-shot migration source (set on initial create only). | Optional: {} |
|
runtime RuntimeSpec |
Runtime configured the agent's Python toolchain and OS-level dependencies for the old hand-rolled agent image. It is now IGNORED: the published agent image is the upstream NousResearch/hermes-agent s6 runtime, which ships its own Python env, browser, node, and dependencies (see docs/runtime.md), so the operator no longer builds a runtime via init containers. Setting this has no effect. Deprecated: ignored since the upstream-image runtime (v0.1.19); scheduled for removal no earlier than v0.3.0 and 2027-01-01. See docs/deprecations.md. |
Optional: {} |
|
gateways GatewaysSpec |
Gateways configures the platform-side messaging bindings (Telegram, Discord, Slack, WhatsApp, Signal). Each gateway is opt-in and references its own Secret(s) so tokens are rotatable independently. |
Optional: {} |
|
profileStore ProfileStoreSpec |
ProfileStore configures the optional Honcho profile-store companion. | Optional: {} |
|
tailscale TailscaleSpec |
Tailscale exposes the gateway over a Tailscale tailnet. | Optional: {} |
HermesSelfConfig is the Schema for the hermesselfconfigs API
| Field | Description | Default | Validation |
|---|---|---|---|
apiVersion string |
hermes.agent/v1 |
||
kind string |
HermesSelfConfig |
||
metadata ObjectMeta |
Refer to Kubernetes API documentation for fields of metadata. |
Optional: {} |
|
spec HermesSelfConfigSpec |
spec defines the desired state of HermesSelfConfig | Required: {} |
HermesSelfConfigSpec is an agent-driven, audited request to mutate the parent HermesInstance. The operator validates against the parent's .spec.selfConfigure policy, then applies via Server-Side Apply with field manager "hermes.agent/selfconfig".
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
instanceRef string |
InstanceRef is the name of the parent HermesInstance in the same namespace. | MaxLength: 253 MinLength: 1 |
|
addSkills SelfConfigSkill array |
AddSkills appends skills to the parent's .spec.skills. | MaxItems: 20 Optional: {} |
|
patchConfig JSON |
PatchConfig is a JSON merge patch (RFC 7396) applied to the agent's runtime config at ~/.hermes/config.yaml. |
Optional: {} |
|
addEnvVars SelfConfigEnvVar array |
AddEnvVars appends environment variables to the parent's .spec.env. | MaxItems: 20 Optional: {} |
|
addWorkspaceFiles SelfConfigWorkspaceFile array |
AddWorkspaceFiles writes files into the workspace ConfigMap. | MaxItems: 50 Optional: {} |
|
addProfileSnapshot SelfConfigProfileSnapshot |
AddProfileSnapshot writes an opaque Honcho profile snapshot via a one-shot Job. | Optional: {} |
HonchoImageSpec selects the Honcho image.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
repository string |
ghcr.io/plastic-labs/honcho | Optional: {} |
|
tag string |
0.1.0 | Optional: {} |
|
pullPolicy string |
IfNotPresent | Enum: [Always IfNotPresent Never] Optional: {} |
HonchoPersistenceSpec controls the Honcho-side PVC.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
true | Optional: {} |
|
size string |
5Gi | Optional: {} |
|
storageClassName string |
Optional: {} |
HonchoSpec controls the Honcho companion Deployment.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
image HonchoImageSpec |
Optional: {} |
||
persistence HonchoPersistenceSpec |
Optional: {} |
||
resources ResourceRequirements |
Optional: {} |
||
apiKeySecretRef SecretKeySelector |
APIKeySecretRef points at the Secret holding the Honcho API key. | Optional: {} |
ImageSpec selects an OCI image.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
repository string |
ghcr.io/paperclipinc/hermes-agent | Optional: {} |
|
tag string |
Tag is the container image tag. Either tag or digest must be set; there is no default, because pinning to a mutable tag like :latest can silently pull a broken upstream build. |
Optional: {} |
|
digest string |
Digest overrides the tag with an image digest (e.g. sha256:abc...). When set it takes precedence over the tag for the resolved image reference. |
Optional: {} |
|
pullPolicy string |
IfNotPresent | Enum: [Always IfNotPresent Never] Optional: {} |
IngressSpec controls optional Ingress creation.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Enabled: when true, the operator creates an Ingress for the agent. Default false. |
false | Optional: {} |
host string |
Host is the primary hostname. | Optional: {} |
|
className string |
ClassName is the IngressClass (nginx, traefik, ...). |
Optional: {} |
|
tls IngressTLSSpec array |
TLS is the list of TLS settings. | Optional: {} |
|
annotations object (keys:string, values:string) |
Annotations are applied to the Ingress. The operator merges provider-specific defaults (force-https, etc.) on top of these. |
Optional: {} |
|
pathType PathType |
PathType: default Prefix. | Prefix | Enum: [Exact Prefix ImplementationSpecific] Optional: {} |
path string |
Path: default "/". | / | Optional: {} |
servicePortName string |
ServicePortName: name of the Service port the Ingress should route to. Default "gateway". |
gateway | Optional: {} |
IngressTLSSpec is a single TLS section on the Ingress.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
secretName string |
MinLength: 1 |
||
hosts string array |
InstanceSkill: Plan 3 fills the runtime semantics. The field exists here so SSA from HermesSelfConfig (Plan 4) can patch the slice with listMapKey=source.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
source string |
Source is the uv/pip-compatible install source. | MinLength: 1 |
|
version string |
Version optionally pins the install version. Mirrors SelfConfigSkill.Version so HermesSelfConfig can carry the field through SSA without truncation. |
Optional: {} |
LocalObjectReference is a same-namespace reference by name.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
name string |
Underlying type: string
LogFormat is the agent's log output format.
Validation:
- Enum: [text json]
Appears in:
| Field | Description |
|---|---|
text |
|
json |
LoggingSpec controls the agent's logger configuration via env vars.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
format LogFormat |
text | Enum: [text json] Optional: {} |
|
level string |
Level: Plan 3 wires HERMES_LOG_LEVEL on the agent container. | info | Enum: [trace debug info warn error] Optional: {} |
MetricsSpec controls the agent's Prometheus metrics endpoint.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
true | Optional: {} |
|
port integer |
Port for the /metrics endpoint. | 9090 | Maximum: 65535 Minimum: 1 Optional: {} |
secure boolean |
Secure: when true, /metrics requires bearer-token auth and uses HTTPS. The ServiceMonitor scheme/scrape settings must agree (lesson #435/#440). |
false | Optional: {} |
grafanaDashboard GrafanaDashboardSpec |
GrafanaDashboard configures auto-provisioned Grafana dashboard ConfigMaps (operator overview + per-instance). When enabled, the operator emits ConfigMaps labeled grafana_dashboard="1" so the Grafana sidecar provisioner picks them up automatically. |
Optional: {} |
MigrationBackupRef points at an OpenClaw backup snapshot in S3.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
s3 MigrationBackupS3 |
MigrationBackupS3 mirrors BackupS3Spec but adds an explicit Key.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
bucket string |
|||
endpoint string |
|||
region string |
Optional: {} |
||
key string |
|||
credentialsSecretRef LocalObjectReference |
MigrationFromOpenClawSource is exactly-one-of (validated by webhook).
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
openclawInstanceRef NamespacedObjectReference |
Optional: {} |
||
backupRef MigrationBackupRef |
Optional: {} |
MigrationFromOpenClawSpec describes an OpenClaw source.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
source MigrationFromOpenClawSource |
|||
mode string |
copy | Enum: [copy move] Optional: {} |
|
image string |
Optional: {} |
MigrationSpec is a one-shot migration source (immutable once status.migration.completed is true).
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
fromOpenClaw MigrationFromOpenClawSpec |
Optional: {} |
NamedServicePort is a single Service port. The TargetPort is optional and defaults to Port when nil.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
name string |
MaxLength: 63 MinLength: 1 |
||
port integer |
Maximum: 65535 Minimum: 1 |
||
targetPort integer |
Optional: {} |
||
protocol Protocol |
TCP | Enum: [TCP UDP SCTP] Optional: {} |
|
nodePort integer |
NodePort is honored only when the Service is NodePort or LoadBalancer. | Optional: {} |
NamespacedObjectReference is a name+namespace pointer.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
name string |
|||
namespace string |
NetworkPolicyDefaults defaults whether per-instance NetworkPolicies are created.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Optional: {} |
||
allowDNS boolean |
Optional: {} |
NetworkPolicySpec controls per-instance NetworkPolicy creation.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Enabled: when true (the default), the operator creates a deny-all NetworkPolicy plus selective allow rules (DNS + 443 egress + Service ingress from the same namespace). |
true | Optional: {} |
allowDNS boolean |
AllowDNS: emit the standard DNS egress rule (UDP+TCP 53 to any peer). Default true. Disable only when CoreDNS is reachable via a different transport (e.g. node-local DNS via hostNetwork). |
true | Optional: {} |
allowedIngressNamespaces string array |
AllowedIngressNamespaces is the set of additional namespaces (beyond the instance's own) whose pods may connect to the agent's exposed ports. |
Optional: {} |
|
allowedIngressCIDRs string array |
AllowedIngressCIDRs is the set of CIDRs that may connect to the agent's exposed ports. |
Optional: {} |
|
allowedEgressCIDRs string array |
AllowedEgressCIDRs is the set of CIDRs the agent may connect to in addition to the operator-built defaults (DNS + 443). |
Optional: {} |
|
additionalEgress NetworkPolicyEgressRule array |
AdditionalEgress is a list of user-supplied egress rules appended verbatim to the generated NetworkPolicy. |
Optional: {} |
NetworkingDefaults mirrors the defaultable subset of NetworkingSpec.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
service ServiceDefaults |
Optional: {} |
||
networkPolicy NetworkPolicyDefaults |
Optional: {} |
NetworkingSpec exposes the agent via Service + (optionally) Ingress.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
service ServiceSpec |
Service controls the Service kind and ports. | Optional: {} |
|
ingress IngressSpec |
Ingress controls optional Ingress creation. | Optional: {} |
|
httpRoute HTTPRouteSpec |
HTTPRoute controls optional Gateway API HTTPRoute creation. The operator emits an unstructured gateway.networking.k8s.io/v1 HTTPRoute; the Gateway API CRDs must be installed in the cluster for this to take effect. |
Optional: {} |
ObservabilityDefaults mirrors the defaultable subset of ObservabilitySpec.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
metrics MetricsSpec |
Optional: {} |
||
serviceMonitor ServiceMonitorSpec |
Optional: {} |
||
prometheusRule PrometheusRuleSpec |
Optional: {} |
||
logging LoggingSpec |
Optional: {} |
ObservabilitySpec controls metrics, scraping, alerting, logging.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
metrics MetricsSpec |
Optional: {} |
||
serviceMonitor ServiceMonitorSpec |
Optional: {} |
||
prometheusRule PrometheusRuleSpec |
Optional: {} |
||
logging LoggingSpec |
Optional: {} |
PDBSpec controls PodDisruptionBudget emission.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
minAvailable IntOrString |
MinAvailable: optional, mutually exclusive with MaxUnavailable. | Optional: {} |
|
maxUnavailable IntOrString |
MaxUnavailable: optional, mutually exclusive with MinAvailable. Default 1 when neither is set and PDB is enabled. |
Optional: {} |
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
true | Optional: {} |
|
size string |
1Gi | Optional: {} |
|
storageClassName string |
Optional: {} |
ProbesSpec overrides the operator's built-in probes. Each field is a complete probe: set every value you want non-default because we apply it verbatim.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
liveness Probe |
Optional: {} |
||
readiness Probe |
Optional: {} |
||
startup Probe |
Optional: {} |
ProfileStoreSpec is the union of supported profile-store backends. Only
honcho is supported in v1.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
honcho HonchoSpec |
Optional: {} |
PrometheusRule is a minimal copy of monitoringv1.Rule so we don't depend on the Prometheus-Operator Go types at compile time. The runtime emits unstructured objects.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
alert string |
MinLength: 1 |
||
expr string |
MinLength: 1 |
||
for string |
Optional: {} |
||
labels object (keys:string, values:string) |
Optional: {} |
||
annotations object (keys:string, values:string) |
Optional: {} |
PrometheusRuleSpec controls emission of a default PrometheusRule with hermes-agent alerts (HighRestartRate, MetricsDown, etc.).
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
additionalRules PrometheusRule array |
AdditionalRules is a list of user-supplied rules merged onto the operator default ruleset. |
Optional: {} |
RBACSpec controls per-instance ServiceAccount + Role + RoleBinding creation.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
createServiceAccount boolean |
CreateServiceAccount: when true (the default), the operator creates and owns a ServiceAccount named after the instance. |
true | Optional: {} |
serviceAccountName string |
ServiceAccountName: when CreateServiceAccount is false, the agent uses this externally-managed ServiceAccount. Must exist in the same namespace. |
Optional: {} |
|
annotations object (keys:string, values:string) |
Annotations are applied to the operator-created ServiceAccount. Use this for IRSA ( eks.amazonaws.com/role-arn), GKE Workload Identity( iam.gke.io/gcp-service-account), Azure Workload Identity, etc. |
Optional: {} |
RawConfig wraps runtime.RawExtension so deepcopy is generated cleanly.
Appears in:
RegistryDefaults groups image-pull secret hints.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
pullSecretName string |
PullSecretName, if non-empty, is added to every instance's pod.spec.imagePullSecrets when the instance doesn't override. |
Optional: {} |
ResourcesSpec sets CPU/memory requests + limits on the agent container. Defaults intentionally omitted: the defaulting webhook fills from HermesClusterDefaults if available, otherwise the field is left empty (meaning the agent inherits whatever Pod-level defaults the namespace's LimitRange applies).
Appears in:
RipgrepSpec controls the ripgrep dependency check.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
true | Optional: {} |
RuntimeSpec controlled Python/uv runtime concerns for the old hand-rolled agent image's init-container build.
Deprecated: ignored since the upstream-image runtime (v0.1.19); the upstream agent image is self-contained. Scheduled for removal no earlier than v0.3.0 and 2027-01-01. See docs/deprecations.md.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
python string |
Python is informational only: the agent image's Python version is fixed at build time. Setting this does NOT pull a different interpreter; it exists so downstream tooling can assert the runtime it expects. |
3.11 | Optional: {} |
uv UVSpec |
UV controls the initial uv sync against the lockfile bundled in theagent image. Enabled by default. |
Optional: {} |
|
ffmpeg FFmpegSpec |
FFmpeg toggles the FFmpeg dependency check. The agent image always ships FFmpeg; disabling here only skips the readiness assertion. |
Optional: {} |
|
ripgrep RipgrepSpec |
Ripgrep toggles the ripgrep dependency check. See FFmpeg. | Optional: {} |
|
extraAptPackages string array |
ExtraAptPackages adds additional Debian packages installed by a root-privileged init container BEFORE the main agent container starts. Use sparingly: the init container runs as root and breaks the otherwise hardened security posture for one container only. |
Optional: {} |
|
extraPipPackages string array |
ExtraPipPackages adds additional Python packages installed viauv pip install into a persistent venv on the data PVC. |
Optional: {} |
SchedulingSpec targets the agent pod at specific nodes.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
nodeSelector object (keys:string, values:string) |
Optional: {} |
||
tolerations Toleration array |
Optional: {} |
||
affinity Affinity |
Optional: {} |
||
priorityClassName string |
Optional: {} |
SecurityDefaults mirrors the defaultable subset of SecuritySpec.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
serviceAccount ServiceAccountDefaults |
Optional: {} |
||
networkPolicy NetworkPolicyDefaults |
Optional: {} |
||
caBundle CABundleSpec |
Optional: {} |
SecuritySpec bundles pod/container security, per-instance RBAC, NetworkPolicy, and the optional CA-bundle mount.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
podSecurityContext PodSecurityContext |
PodSecurityContext overrides the operator's default hardened pod context. Operator default is enforced when nil: runAsNonRoot=true, runAsUser=1000, fsGroup=1000, seccompProfile=RuntimeDefault. |
Optional: {} |
|
containerSecurityContext SecurityContext |
ContainerSecurityContext overrides the operator's default hardened container context. Operator default: readOnlyRootFilesystem=true, allowPrivilegeEscalation=false, drop ALL capabilities. |
Optional: {} |
|
rbac RBACSpec |
RBAC controls per-instance ServiceAccount + Role + RoleBinding creation. | Optional: {} |
|
networkPolicy NetworkPolicySpec |
NetworkPolicy controls per-instance NetworkPolicy creation (default-deny baseline). | Optional: {} |
|
caBundle CABundleSpec |
CABundle optionally mounts a ConfigMap- or Secret-sourced CA bundle into /etc/ssl/certs/hermes-ca-bundle.crt and sets SSL_CERT_FILE in the agent env. |
Optional: {} |
Underlying type: string
SelfConfigAction names a category of mutation. Used by HermesInstance.spec.selfConfigure.allowedActions to gate what the agent may request via HermesSelfConfig.
Validation:
- Enum: [skills config envVars workspaceFiles profiles]
Appears in:
| Field | Description |
|---|---|
skills |
|
config |
|
envVars |
|
workspaceFiles |
|
profiles |
SelfConfigEnvVar is an environment variable entry.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
name string |
Name of the environment variable. Must be a C_IDENTIFIER. | MinLength: 1 Pattern: ^[A-Za-z_][A-Za-z0-9_]*$ |
|
value string |
Value is the literal value. Mutually exclusive with ValueFrom. | Optional: {} |
|
valueFrom SelfConfigEnvVarSource |
ValueFrom selects a value from a Secret or ConfigMap key. | Optional: {} |
SelfConfigEnvVarSource selects a Secret or ConfigMap key. Exactly one ref must be set.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
secretKeyRef SelfConfigKeySelector |
Optional: {} |
||
configMapKeyRef SelfConfigKeySelector |
Optional: {} |
SelfConfigKeySelector selects a key from a Secret or ConfigMap.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
name string |
MinLength: 1 |
||
key string |
MinLength: 1 |
SelfConfigProfileSnapshot writes one Honcho profile snapshot via a Job.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
profileID string |
MaxLength: 253 MinLength: 1 |
||
data string |
Data is the opaque snapshot payload. | MinLength: 1 |
SelfConfigSkill names one skill to install.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
source string |
Source is a uv-compatible package specifier. Required. | MaxLength: 512 MinLength: 1 |
|
version string |
Version optionally pins a version. | Optional: {} |
SelfConfigWorkspaceFile is a single file to materialise into the workspace.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
path string |
Path is the relative path under ~/.hermes/workspace/. | MaxLength: 512 MinLength: 1 Pattern: ^[A-Za-z0-9._/-]+$ |
|
content string |
Content is the literal file body. | Optional: {} |
|
contentFrom SelfConfigKeySelector |
ContentFrom reads the file body from a Secret key. | Optional: {} |
SelfConfigureSpec is the allowlist policy for HermesSelfConfig mutations. Plan 4 wires the controller; the field exists here so Plan 4 doesn't need a CRD change. The validator rejects Enabled=true with ProtectedKeys empty.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Enabled: explicit *bool so the defaulter can distinguish "user said false" from "user did not set it" (Plan 4 relies on this). |
Optional: {} |
|
allowedActions SelfConfigAction array |
AllowedActions is the set of permitted action categories Plan 4 will enforce: skills, config, envVars, workspaceFiles, profiles. |
Enum: [skills config envVars workspaceFiles profiles] Optional: {} |
|
protectedKeys string array |
ProtectedKeys is the list of glob expressions over JSON paths that may not be mutated by HermesSelfConfig. Required (non-empty) when Enabled=true. |
Optional: {} |
ServiceAccountDefaults defaults the per-instance SA annotations (IRSA / WI).
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
annotations object (keys:string, values:string) |
Optional: {} |
ServiceDefaults defaults the Service kind cluster-wide.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
type ServiceType |
Enum: [ClusterIP NodePort LoadBalancer] Optional: {} |
ServiceMonitorSpec controls Prometheus-Operator ServiceMonitor emission. When Enabled is true, the operator emits an unstructured ServiceMonitor; it does not require the Prometheus-Operator CRDs to be installed at compile time.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
labels object (keys:string, values:string) |
Labels are extra labels applied onto the ServiceMonitor for Prometheus label-selector matching (e.g. release: kube-prometheus-stack). |
Optional: {} |
|
interval string |
Interval: default "30s". | 30s | Pattern: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$ Optional: {} |
scrapeTimeout string |
ScrapeTimeout: default "10s". | 10s | Pattern: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$ Optional: {} |
ServiceSpec controls the agent's Service.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
type ServiceType |
Type is the Service kind. Default ClusterIP (headed): Plan 1 emitted a headless Service; v1 keeps ClusterIP as the default and lets users opt into Headless via Type=ClusterIP with ClusterIP="None" through the spec. |
ClusterIP | Enum: [ClusterIP NodePort LoadBalancer] Optional: {} |
clusterIP string |
ClusterIP: set to "None" for a headless Service. Default empty (api-server allocates). | Optional: {} |
|
ports NamedServicePort array |
Ports is the list of Service ports. If empty, the operator emits a default "gateway" port on 8443 (matches the StatefulSet's container port). |
Optional: {} |
|
annotations object (keys:string, values:string) |
Annotations are applied verbatim onto the Service (LoadBalancer hints, etc.). | Optional: {} |
|
loadBalancerClass string |
LoadBalancerClass is propagated when Type=LoadBalancer. | Optional: {} |
|
externalTrafficPolicy ServiceExternalTrafficPolicyType |
ExternalTrafficPolicy is propagated when Type=LoadBalancer or NodePort. | Enum: [Cluster Local] Optional: {} |
SignalGatewaySpec binds the agent to signal-cli-rest-api running as a sidecar or external service.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
phoneNumberSecretRef SecretKeySelector |
Optional: {} |
||
authTokenSecretRef SecretKeySelector |
Optional: {} |
SlackGatewaySpec binds the agent to a Slack workspace via the bolt SDK.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
botTokenSecretRef SecretKeySelector |
Optional: {} |
||
appTokenSecretRef SecretKeySelector |
Optional: {} |
||
signingSecretRef SecretKeySelector |
Optional: {} |
StorageSpec controls the PVC backing the agent's data directory.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
persistence PersistenceSpec |
TailscaleAuthKey points at the Secret key holding the Tailscale auth key.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
secretRef SecretKeySelector |
Optional: {} |
TailscaleImageSpec pins the tailscale sidecar image.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
repository string |
tailscale/tailscale | Optional: {} |
|
tag string |
v1.86.2 | Optional: {} |
|
pullPolicy string |
IfNotPresent | Enum: [Always IfNotPresent Never] Optional: {} |
TailscaleSpec configures exposing the hermes gateway over a Tailscale tailnet.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Enabled turns on the operator-managed Tailscale sidecar. | false | Optional: {} |
mode string |
Mode selects how the gateway is exposed over the tailnet. Only "serve" is implemented today (private tailnet exposure with a Tailscale TLS cert). |
serve | Enum: [serve] Optional: {} |
authKey TailscaleAuthKey |
AuthKey references the Secret holding a reusable, ephemeral Tailscale auth key, exposed to the sidecar as TS_AUTHKEY. Required when Enabled is true. |
Optional: {} |
|
hostname string |
Hostname overrides the tailnet/MagicDNS hostname. Defaults to metadata.name. | MaxLength: 63 Pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$ Optional: {} |
|
image TailscaleImageSpec |
Image overrides the tailscale sidecar image. | Optional: {} |
|
resources ResourceRequirements |
Resources sets the sidecar resource requirements. | Optional: {} |
TelegramGatewaySpec binds the agent to a Telegram Bot API token.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
botTokenSecretRef SecretKeySelector |
BotTokenSecretRef points at the Secret holding the Bot API token. Required when Enabled. |
Optional: {} |
|
allowedUserIDs integer array |
AllowedUserIDs is an optional allow-list of Telegram user IDs. | Optional: {} |
|
webhookURL string |
WebhookURL is the public HTTPS URL to register with Telegram. When empty the agent runs in long-poll mode. |
Optional: {} |
UVCacheVolumeSpec mirrors a stripped-down VolumeSource union. Exactly one of EmptyDir or PersistentVolumeClaim may be set; the defaulter fills EmptyDir when both are nil.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
emptyDir EmptyDirVolumeSource |
Optional: {} |
||
persistentVolumeClaim PersistentVolumeClaimVolumeSource |
Optional: {} |
UVSpec controls the uv sync init container.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
true | Optional: {} |
|
extraIndexURL string |
ExtraIndexURL is appended to uv's index list. Useful for private PyPI mirrors. Empty by default. |
Optional: {} |
|
cacheVolume UVCacheVolumeSpec |
CacheVolume controls the volume mounted at /home/hermes/.cache/uv. Defaults to an emptyDir with a 1Gi sizeLimit: fast and ephemeral. |
Optional: {} |
WhatsAppGatewaySpec binds the agent to a WhatsApp provider (Twilio, Meta Cloud API, etc.).
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
false | Optional: {} |
|
providerSecretRef SecretKeySelector |
Optional: {} |
WorkspaceBootstrap toggles the first-start bootstrap script.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
enabled boolean |
Enabled: default false. Plan 3 wires the actual init-container. | false | Optional: {} |
WorkspaceFile is a single seeded file. Nested paths are allowed; the workspace ConfigMap encodes them with "__" separators (decoded by runtime-init).
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
path string |
Path is the relative path under ~/.hermes (e.g. "notes/finance/2026.md"). | MaxLength: 4096 MinLength: 1 Pattern: ^[^/].*[^/]$|^[^/]$ |
|
content string |
Content is the UTF-8 body. Binary content must be base64-encoded by the caller and decoded by the bootstrap step (out of scope of v1 schema). |
MaxLength: 1048576 |
WorkspaceSpec seeds initial files and directories into ~/.hermes on first start. Path values support arbitrary nested directories ("a/b/c.md" is fine); the workspace ConfigMap encodes nested paths using "__" as the separator so a single-level ConfigMap data map can express them: Plan 3's runtime-init container decodes the keys back to filesystem paths before invoking the agent.
Lesson from openclaw #482: do not constrain Path to a single segment; that caused users to flatten their notes into hash-separated filenames.
Appears in:
| Field | Description | Default | Validation |
|---|---|---|---|
initialFiles WorkspaceFile array |
InitialFiles is the list of files to seed. SSA list-map key is "path" so HermesSelfConfig (Plan 4) can patch entries in place without replacing the whole slice. |
Optional: {} |
|
initialDirs string array |
InitialDirs is the list of directories to mkdir -p on first start. | Optional: {} |
|
configMapRef LocalObjectReference |
ConfigMapRef references a user-owned ConfigMap whose entries are merged onto InitialFiles (operator-managed entries win on conflict). |
Optional: {} |
|
bootstrap WorkspaceBootstrap |
Bootstrap controls the optional one-shot bootstrap script that hermes-agent runs on first start (e.g. hermes onboard). Default disabled. |
Optional: {} |