diff --git a/public/sitemap.xml b/public/sitemap.xml
index a17d7a01..f5bf2a95 100644
--- a/public/sitemap.xml
+++ b/public/sitemap.xml
@@ -2,819 +2,826 @@
https://kagent.dev/agents
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/blog
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/community
- 2026-05-07
+ 2026-05-26
weekly
0.8
- https://kagent.dev/docs/kagent/channels
- 2026-05-07
- weekly
- 0.8
-
-
-
- https://kagent.dev/docs/kagent/channels/whatsapp
- 2026-05-07
+ https://kagent.dev/docs/kagent/concepts/agent-harness
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/concepts/agent-memory
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/concepts/agents
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/concepts/architecture
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/concepts
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/concepts/tools
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/a2a-agents
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/a2a-byo
- 2026-05-07
+ 2026-05-26
+ weekly
+ 0.8
+
+
+
+ https://kagent.dev/docs/kagent/examples/agent-harness
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/agent-sandbox
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/agents-mcp
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/crewai-byo
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/discord-a2a
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/documentation
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/human-in-the-loop
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/langchain-byo
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/skills
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/slack-a2a
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/examples/telegram-bot
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/getting-started/first-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/getting-started/first-mcp-tool
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/getting-started/local-development
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/getting-started
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/getting-started/quickstart
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/getting-started/system-prompts
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/introduction/features
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/introduction/installation
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/introduction
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/introduction/what-is-kagent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/observability/audit-prompts
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/observability/launch-ui
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/observability
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/observability/tracing
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/operations/debug
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/operations/operational-considerations
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/operations
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/operations/uninstall
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/operations/upgrade
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/api-ref
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-add-mcp
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-bug-report
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-build
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-completion
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-dashboard
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-deploy
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-get
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-help
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-init
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-install
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-invoke
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-mcp
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-run
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-uninstall
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli/kagent-version
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/cli
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/faq
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/helm
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/release-notes
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/resources/tools-ecosystem
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/amazon-bedrock
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/anthropic
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/azure-openai
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/byo-openai
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/gemini
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/google-vertexai
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/ollama
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/openai
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers
- 2026-05-07
+ 2026-05-26
+ weekly
+ 0.8
+
+
+
+ https://kagent.dev/docs/kagent/supported-providers/sap-ai-core
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kagent/supported-providers/xai
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/deploy/install-controller
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/deploy
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/deploy/server
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/develop/fastmcp-python
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/develop/mcp-go
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/develop
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/introduction
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/quickstart
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/api-ref
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-add-tool
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-build
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-completion
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-deploy
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-help
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-init
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-install
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-run
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference/kmcp-secrets
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/reference
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs/kmcp/secrets
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/docs
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/enterprise
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/page.tsx
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/argo-rollouts-conversion-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/cilium-crd-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/helm-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/istio-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/k8s-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/kgateway-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/observability-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/agents/promql-agent
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/istio
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/kubernetes
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/prometheus
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/documentation
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/helm
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/argo
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/grafana
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/other
- 2026-05-07
+ 2026-05-26
weekly
0.8
https://kagent.dev/tools/cilium
- 2026-05-07
+ 2026-05-26
weekly
0.8
diff --git a/src/app/docs/kagent/channels/page.mdx b/src/app/docs/kagent/channels/page.mdx
deleted file mode 100644
index da95dd7a..00000000
--- a/src/app/docs/kagent/channels/page.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Channels"
-sectionOrder: 3
-description: "Connect kagent agents to the messaging platforms your team already uses."
----
-
-export const metadata = {
- title: "Channels",
- description: "Connect kagent agents to the messaging platforms your team already uses.",
- author: "kagent.dev"
-};
-
-# Channels
-
-Channels connect your kagent agents to the messaging platforms your team already uses. Instead of switching to a separate UI, your team interacts with agents directly inside Slack threads, Telegram chats, Discord servers, or any MCP-compatible client.
-
-Every channel uses the [A2A (Agent-to-Agent) protocol](/docs/kagent/examples/a2a-agents) under the hood. This means any agent you build works on any channel — no per-platform agent code required.
diff --git a/src/app/docs/kagent/channels/whatsapp/page.mdx b/src/app/docs/kagent/channels/whatsapp/page.mdx
deleted file mode 100644
index f932dd3c..00000000
--- a/src/app/docs/kagent/channels/whatsapp/page.mdx
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: "WhatsApp"
-pageOrder: 4
-description: "Connect WhatsApp to your kagent agents for mobile-first cluster operations."
----
-
-export const metadata = {
- title: "WhatsApp Channel for kagent",
- description: "Connect WhatsApp to your kagent agents for mobile-first cluster operations.",
- author: "kagent.dev"
-};
-
-# WhatsApp
-
-Connect WhatsApp to your kagent agents for mobile-first cluster operations. Manage your Kubernetes resources, ask questions, and receive alerts directly in WhatsApp conversations.
-
-## Status
-
-WhatsApp channel support is currently in development. The integration will use the WhatsApp Business API to connect your agents to WhatsApp conversations via the A2A protocol.
-
-## Planned features
-
-- **Business API integration** — authenticate using the WhatsApp Business API for reliable message delivery
-- **Quick replies** — Human-in-the-Loop approval via WhatsApp quick reply buttons
-- **Media support** — send and receive images, documents, and other media types
-- **Group chats** — route group messages to the appropriate agent
-- **Mobile-first UX** — optimized for on-the-go cluster operations from your phone
-
-## Get involved
-
-Want to help build the WhatsApp channel? Check out the [contributing guide](https://github.com/kagent-dev/kagent/blob/main/CONTRIBUTING.md) or open an issue on [GitHub](https://github.com/kagent-dev/kagent/issues).
diff --git a/src/app/docs/kagent/concepts/agent-harness/page.mdx b/src/app/docs/kagent/concepts/agent-harness/page.mdx
new file mode 100644
index 00000000..78380fde
--- /dev/null
+++ b/src/app/docs/kagent/concepts/agent-harness/page.mdx
@@ -0,0 +1,73 @@
+---
+title: "Agent Harness"
+pageOrder: 4
+description: "Understand AgentHarness resources, OpenShell-backed execution environments, and backend-specific channel configuration."
+---
+
+export const metadata = {
+ title: "Agent Harness",
+ description: "Understand AgentHarness resources, OpenShell-backed execution environments, and backend-specific channel configuration.",
+ author: "kagent.dev"
+};
+
+# Agent Harness
+
+An `AgentHarness` is a Kubernetes resource that asks kagent to provision a long-running remote execution environment through an OpenShell gateway. It is useful when you want a managed sandbox that can be attached to, bootstrapped, and connected to messaging channels, but you do not want kagent to package and run a full agent runtime inside the workload.
+
+`AgentHarness` resources appear alongside agents in kagent APIs and status views, but they are not the same thing as `Agent` or `SandboxAgent`.
+
+## How it differs from agents
+
+- `Agent` runs a kagent-managed agent runtime, such as a declarative agent or a bring-your-own container.
+- `SandboxAgent` runs an agent runtime inside a restricted sandboxed workload.
+- `AgentHarness` provisions the execution environment itself. The selected backend decides what is installed and how the environment is bootstrapped.
+
+Think of `AgentHarness` as lifecycle management for a remote shell or VM-like sandbox. It gives kagent a Kubernetes-native handle for creating, tracking, deleting, and surfacing that environment.
+
+## Backend model
+
+The `spec.backend` field selects the backend implementation.
+
+| Backend | Purpose |
+| --- | --- |
+| `openclaw` | Provisions an OpenClaw-compatible sandbox and writes OpenClaw configuration when a `ModelConfig` is referenced. |
+| `nemoclaw` | Uses the OpenClaw/NemoClaw backend path while preserving a distinct backend value for NemoClaw-oriented environments. |
+| `hermes` | Provisions a Hermes sandbox and writes Hermes configuration plus environment files for supported messaging channels. |
+
+All backends use the same top-level `AgentHarness` shape: `backend`, `description`, `image`, `env`, `network`, `modelConfigRef`, and `channels`.
+
+## Lifecycle and status
+
+When the controller reconciles an `AgentHarness`, it translates the Kubernetes spec into an OpenShell sandbox request. If the sandbox already exists, reconciliation is idempotent and kagent reuses it.
+
+The resource reports two primary conditions:
+
+- `Accepted` tells you whether kagent accepted the spec and could hand it to the selected backend.
+- `Ready` tells you whether the backend sandbox is available.
+
+Once the sandbox exists, `.status.backendRef` records the backend and sandbox ID, and `.status.connection.endpoint` contains the connection hint returned by kagent.
+
+## Models and images
+
+`spec.modelConfigRef` points at a kagent `ModelConfig`. OpenClaw-compatible backends translate that model configuration into OpenClaw bootstrap config. Hermes uses the referenced model while building its Hermes configuration.
+
+If `spec.image` is omitted, kagent uses the default base image for the selected backend. Set `spec.image` only when you have a backend-compatible custom image.
+
+## Network access
+
+`spec.network.allowedDomains` limits outbound access from the harness when the backend supports network policy. Keep this list focused on the APIs the harness needs, such as model provider endpoints or messaging-provider APIs.
+
+## Channels
+
+`spec.channels` declares messaging integrations inside the harness environment. Each channel has a stable `name`, a `type`, and exactly one matching channel spec.
+
+Slack has backend-specific settings because OpenClaw/NemoClaw and Hermes use Slack differently:
+
+- OpenClaw and NemoClaw settings live under `slack.openclaw` and configure channel access, allowlisted Slack channels, and interactive replies.
+- Hermes settings live under `slack.hermes` and configure allowed Slack users plus the home channel used for scheduled messages.
+
+The API uses CEL validation to ensure Slack settings match the selected backend. A Hermes harness must use `slack.hermes`; an OpenClaw or NemoClaw harness must use `slack.openclaw`.
+
+## Next steps
+
+For OpenShell installation and kagent Helm values, see [Enable AgentHarness support](/docs/kagent/introduction/installation#enable-agentharness-support). For complete YAML examples, including Slack token references and backend-specific Slack settings, see the [Agent Harness example](/docs/kagent/examples/agent-harness). For the generated schema, see the [API reference](/docs/kagent/resources/api-ref#agentharness).
diff --git a/src/app/docs/kagent/concepts/page.mdx b/src/app/docs/kagent/concepts/page.mdx
index f2e326fb..70c7ed1c 100644
--- a/src/app/docs/kagent/concepts/page.mdx
+++ b/src/app/docs/kagent/concepts/page.mdx
@@ -24,6 +24,7 @@ import QuickLink from '@/components/quick-link';
+
diff --git a/src/app/docs/kagent/examples/agent-harness/page.mdx b/src/app/docs/kagent/examples/agent-harness/page.mdx
new file mode 100644
index 00000000..ff190efe
--- /dev/null
+++ b/src/app/docs/kagent/examples/agent-harness/page.mdx
@@ -0,0 +1,217 @@
+---
+title: "Agent Harness"
+pageOrder: 8
+description: "Provision OpenClaw, NemoClaw, and Hermes sandboxes with the AgentHarness API."
+---
+
+import { VERSIONS } from "../../../_constants";
+
+export const metadata = {
+ title: "Agent Harness",
+ description: "Provision OpenClaw, NemoClaw, and Hermes sandboxes with the AgentHarness API.",
+ author: "kagent.dev"
+};
+
+# Agent Harness
+
+`AgentHarness` creates a long-running remote execution environment through an OpenShell gateway. Unlike an `Agent` or `SandboxAgent`, it does not package a kagent runtime into the workload. The backend provisions a sandbox that operators, tools, or chat integrations can attach to.
+
+Use `AgentHarness` when you want kagent to manage the lifecycle of an OpenClaw, NemoClaw, or Hermes sandbox and surface it in the kagent API/UI alongside regular agents.
+
+## Before you begin
+
+1. Install kagent v{VERSIONS.kagent} or later by following the [quick start](/docs/kagent/getting-started/quickstart) guide.
+2. Install and expose an OpenShell gateway that the kagent controller can reach over gRPC. For Helm-based setup instructions, see [Enable AgentHarness support](/docs/kagent/introduction/installation#enable-agentharness-support).
+3. Configure the kagent controller with the gateway address. For example, set the controller environment variable `OPENSHELL_GATEWAY_URL` to a gRPC target such as `dns:///openshell.openshell.svc:443`.
+
+When `OPENSHELL_GATEWAY_URL` is empty, the AgentHarness backends are not registered by the controller.
+
+## Choose a backend
+
+`spec.backend` selects the sandbox backend.
+
+- `openclaw` provisions an OpenClaw-compatible sandbox. When `modelConfigRef` is set, kagent translates the referenced `ModelConfig` and writes OpenClaw configuration into the sandbox.
+- `nemoclaw` uses the same kagent backend path as `openclaw`, but lets you label the resource for NemoClaw-oriented usage.
+- `hermes` provisions a Hermes sandbox. kagent writes Hermes configuration and environment files into the sandbox and wires supported messaging channels into Hermes environment variables.
+
+All three backends share the same top-level `AgentHarness` shape: `backend`, optional `description`, optional `image`, optional `env`, optional `network`, optional `modelConfigRef`, and optional `channels`.
+
+## Create an OpenClaw harness
+
+The following resource creates an OpenClaw harness and lets it reach the OpenAI and Slack APIs.
+
+```yaml
+apiVersion: kagent.dev/v1alpha2
+kind: AgentHarness
+metadata:
+ name: openclaw-shell
+ namespace: kagent
+spec:
+ backend: openclaw
+ description: "OpenClaw shell for platform experiments"
+ modelConfigRef: default-model-config
+ network:
+ allowedDomains:
+ - api.openai.com
+ - slack.com
+ - api.slack.com
+ - hooks.slack.com
+ - wss-primary.slack.com
+ - wss-backup.slack.com
+```
+
+Apply the resource and wait for it to become ready.
+
+```bash
+kubectl apply -f openclaw-shell.yaml
+kubectl -n kagent get agentharness openclaw-shell
+```
+
+Example output:
+
+```txt
+NAME BACKEND READY ID AGE
+openclaw-shell openclaw True kagent-openclaw-shell 30s
+```
+
+## Create a Hermes harness
+
+Hermes uses the same `AgentHarness` API with `spec.backend: hermes`.
+
+```yaml
+apiVersion: kagent.dev/v1alpha2
+kind: AgentHarness
+metadata:
+ name: hermes-shell
+ namespace: kagent
+spec:
+ backend: hermes
+ description: "Hermes shell for scheduled and chat-driven workflows"
+ modelConfigRef: default-model-config
+ network:
+ allowedDomains:
+ - api.openai.com
+ - slack.com
+ - api.slack.com
+ - wss-primary.slack.com
+ - wss-backup.slack.com
+```
+
+If `spec.image` is omitted, kagent uses the backend's default sandbox base image. Set `spec.image` only when you need a custom image that is compatible with the selected backend.
+
+## Configure Slack
+
+Slack channels require a bot token and an app-level token. Store them in a Kubernetes `Secret` and reference them from the harness.
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: slack-tokens
+ namespace: kagent
+type: Opaque
+stringData:
+ bot-token: xoxb-your-bot-token
+ app-token: xapp-your-app-token
+```
+
+Backend-specific Slack settings are nested under the backend name. The API validates this with CEL:
+
+- `backend: hermes` requires `slack.hermes` and rejects `slack.openclaw`.
+- `backend: openclaw` and `backend: nemoclaw` require `slack.openclaw` and reject `slack.hermes`.
+
+### OpenClaw Slack
+
+OpenClaw and NemoClaw Slack settings control channel access and interactive replies.
+
+```yaml
+apiVersion: kagent.dev/v1alpha2
+kind: AgentHarness
+metadata:
+ name: openclaw-slack
+ namespace: kagent
+spec:
+ backend: openclaw
+ modelConfigRef: default-model-config
+ channels:
+ - name: platform
+ type: slack
+ slack:
+ botToken:
+ valueFrom:
+ type: Secret
+ name: slack-tokens
+ key: bot-token
+ appToken:
+ valueFrom:
+ type: Secret
+ name: slack-tokens
+ key: app-token
+ openclaw:
+ channelAccess: allowlist
+ allowlistChannels:
+ - C0123456789
+ interactiveReplies: true
+```
+
+Set `channelAccess` to `open`, `allowlist`, or `disabled`. When `channelAccess` is `allowlist`, `allowlistChannels` must include at least one Slack channel ID.
+
+### Hermes Slack
+
+Hermes Slack settings control allowed users and the home channel used for scheduled messages.
+
+```yaml
+apiVersion: kagent.dev/v1alpha2
+kind: AgentHarness
+metadata:
+ name: hermes-slack
+ namespace: kagent
+spec:
+ backend: hermes
+ modelConfigRef: default-model-config
+ channels:
+ - name: platform
+ type: slack
+ slack:
+ botToken:
+ valueFrom:
+ type: Secret
+ name: slack-tokens
+ key: bot-token
+ appToken:
+ valueFrom:
+ type: Secret
+ name: slack-tokens
+ key: app-token
+ hermes:
+ allowedUserIDs:
+ - U01234567
+ - U89ABCDEF
+ homeChannel: C0123456789
+ homeChannelName: platform-alerts
+```
+
+Use `allowedUserIDsFrom` instead of `allowedUserIDs` when you want to load the Slack member allowlist from a Secret or ConfigMap key. The two fields are mutually exclusive.
+
+## Check status
+
+Use `kubectl` to confirm the harness was accepted and is ready.
+
+```bash
+kubectl -n kagent get agentharnesses
+kubectl -n kagent describe agentharness hermes-slack
+```
+
+The `Accepted` condition reports whether kagent accepted the spec. The `Ready` condition reports whether the backend sandbox is ready. Once ready, `.status.backendRef` identifies the sandbox in the OpenShell control plane and `.status.connection.endpoint` shows the connection hint returned by kagent.
+
+## Troubleshooting
+
+If the harness is not accepted or ready, check these common causes.
+
+- The kagent controller was not configured with `OPENSHELL_GATEWAY_URL`, so AgentHarness backends were not registered.
+- The OpenShell gateway address is not reachable from the controller pod.
+- `modelConfigRef` points to a missing or unsupported `ModelConfig`.
+- A Slack channel has the wrong backend settings, such as `slack.hermes` on an OpenClaw harness or `slack.openclaw` on a Hermes harness.
+- A Slack credential uses neither `value` nor `valueFrom`, or sets both.
+
+For the complete generated schema, see the [API reference](/docs/kagent/resources/api-ref#agentharness).
diff --git a/src/app/docs/kagent/examples/page.mdx b/src/app/docs/kagent/examples/page.mdx
index 1234910e..3d7b93ba 100644
--- a/src/app/docs/kagent/examples/page.mdx
+++ b/src/app/docs/kagent/examples/page.mdx
@@ -31,5 +31,6 @@ import QuickLink from '@/components/quick-link';
+
diff --git a/src/app/docs/kagent/introduction/installation/page.mdx b/src/app/docs/kagent/introduction/installation/page.mdx
index 011a1f3e..7484fc25 100644
--- a/src/app/docs/kagent/introduction/installation/page.mdx
+++ b/src/app/docs/kagent/introduction/installation/page.mdx
@@ -197,6 +197,66 @@ Another way to install kagent is using Helm.
Review the following advanced configuration options that you might want to set up for your kagent installation.
+### Enable AgentHarness support
+
+`AgentHarness` resources require an OpenShell gateway that the kagent controller can reach. To enable the AgentHarness backends, install OpenShell and set `OPENSHELL_GATEWAY_URL` on the kagent controller deployment.
+
+1. Install OpenShell in your cluster.
+
+ ```bash
+ kubectl create namespace openshell
+ kubectl -n openshell create secret generic openshell-ssh-handshake \
+ --from-literal=secret="$(openssl rand -hex 32)"
+
+ kubectl apply -f https://raw.githubusercontent.com/NVIDIA/OpenShell/refs/heads/main/deploy/kube/manifests/agent-sandbox.yaml
+
+ helm upgrade --install openshell oci://ghcr.io/nvidia/openshell/helm-chart \
+ --version 0.0.49 \
+ --namespace openshell \
+ --create-namespace \
+ --values - <<'EOF'
+ server:
+ disableTls: true
+ auth:
+ allowUnauthenticatedUsers: true
+ service:
+ metricsPort: 0
+ EOF
+
+ This example disables TLS and authentication. For production environments, configure TLS and authentication according to your OpenShell requirements.
+
+2. Configure the kagent controller with the OpenShell gateway URL.
+
+ **Helm values file:**
+
+ ```yaml
+ controller:
+ openshell:
+ enabled: "true"
+ env:
+ - name: OPENSHELL_GATEWAY_URL
+ value: dns:///openshell.openshell.svc:8080
+ - name: OPENSHELL_INSECURE
+ value: "true"
+ ```
+
+ **Helm `--set` flags:**
+
+ ```bash
+ helm upgrade --install kagent oci://ghcr.io/kagent-dev/kagent/helm/kagent \
+ --namespace kagent \
+ --set controller.openshell.enabled=true \
+ --set 'controller.env[0].name=OPENSHELL_GATEWAY_URL' \
+ --set-string 'controller.env[0].value=dns:///openshell.openshell.svc:8080' \
+ --set 'controller.env[1].name=OPENSHELL_INSECURE' \
+ --set-string 'controller.env[1].value=true'
+
+ ```
+
+ If you already configure `controller.env`, merge the `OPENSHELL_GATEWAY_URL` entry into your existing values. When `OPENSHELL_GATEWAY_URL` is empty, the controller does not register AgentHarness backends.
+
+For more information about creating harness resources, see [Agent Harness](/docs/kagent/examples/agent-harness).
+
### Database configuration
For production environments, set up kagent with an external PostgreSQL instance. For more information, see the [Database configuration guide](/operations/operational-considerations/#database-configuration).
diff --git a/src/config/navigation.json b/src/config/navigation.json
index 1a721689..e2a0fd09 100644
--- a/src/config/navigation.json
+++ b/src/config/navigation.json
@@ -69,18 +69,6 @@
}
]
},
- {
- "title": "Channels",
- "href": "/docs/kagent/channels",
- "description": "Connect kagent agents to the messaging platforms your team already uses.",
- "items": [
- {
- "title": "WhatsApp",
- "href": "/docs/kagent/channels/whatsapp",
- "description": "Connect WhatsApp to your kagent agents for mobile-first cluster operations."
- }
- ]
- },
{
"title": "Core Concepts",
"href": "/docs/kagent/concepts",
@@ -101,6 +89,11 @@
"href": "/docs/kagent/concepts/tools",
"description": "Understand the different types of tools kagent can use, including built-in, MCP, and HTTP tools, and how tool discovery works."
},
+ {
+ "title": "Agent Harness",
+ "href": "/docs/kagent/concepts/agent-harness",
+ "description": "Understand AgentHarness resources, OpenShell-backed execution environments, and backend-specific channel configuration."
+ },
{
"title": "Agent Memory",
"href": "/docs/kagent/concepts/agent-memory",
@@ -157,6 +150,11 @@
"title": "xAI (Grok)",
"href": "/docs/kagent/supported-providers/xai",
"description": "Learn how to configure xAI Grok models for kagent."
+ },
+ {
+ "title": "SAP AI Core",
+ "href": "/docs/kagent/supported-providers/sap-ai-core",
+ "description": "Learn how to configure SAP AI Core models for kagent."
}
]
},
@@ -224,6 +222,11 @@
"title": "Human-in-the-Loop",
"href": "/docs/kagent/examples/human-in-the-loop",
"description": "Build a Kubernetes-native AI agent that pauses and asks for your approval before taking destructive actions."
+ },
+ {
+ "title": "Agent Harness",
+ "href": "/docs/kagent/examples/agent-harness",
+ "description": "Provision OpenClaw, NemoClaw, and Hermes sandboxes with the AgentHarness API."
}
]
},