AI Agents

  • Fixed

    • klausGateway.a2a.saToken and klausGateway.upstream: set additionalProperties: true in the values schema so the klaus-gateway subchart’s own pass-through keys (a2a.saToken.{expirationSeconds,mountPath}, upstream.url) validate. These nested objects were still additionalProperties: false after the 1.1.27 a2a fix, leaving the agentic-platform HelmRelease stuck UpgradeFailed on management clusters whose rendered config supplies them.
  • Changed

    • Bump klaus-gateway subchart from 0.1.1 to 0.1.2.
  • Fixed

    • klausGateway.a2a: set additionalProperties: true in the values schema so the klaus-gateway subchart’s own a2a keys (url, saToken, …) pass through validation. This was missed when klausGateway.routing/lifecycle were widened, leaving the agentic-platform HelmRelease stuck UpgradeFailed on management clusters whose rendered config supplies klausGateway.a2a.{url,saToken}.
    • kagent.controllerRoute: add outer public HTTPRoute (kagent-controller-public) on the Envoy Gateway so the kagent A2A endpoint is reachable at https://<hostname>/kagent/.... The inner kagent-controller route (agentgateway data plane) was already present, but the missing outer route caused Envoy to return 404 for all requests to the hostname before they reached the agentgateway pod. Configurable via kagent.controllerRoute.parentRef (defaults to giantswarm-default / envoy-gateway-system).
    • AgentgatewayBackend/kagent: add spec.policies.auth.passthrough: {} so the validated muster JWT is forwarded to kagent-controller. The agentgateway JWT filter strips the Authorization header after validation; without passthrough the controller’s AUTH_MODE=trusted-proxy receives no header and returns 401 for every authenticated request.
    • helm.sh/chart label: truncating long dev-build versions at 63 characters could leave a trailing ., producing an invalid label value and failing the Helm install/upgrade. The chart helper now trims trailing . as well as -.
    • templates/kagent/agents/remotemcpservers.yaml: headersFrom[].valueFrom used a secretKeyRef block, but the kagent v1alpha2 ValueSource schema is flat (type/name/key with type: Secret). The CRs failed admission with valueFrom.key: Required value.
    • templates/kagent/agents/muster-token-job.yaml: mint the muster token via the TokenRequest API (kubectl create token, duration agents.muster.tokenDuration, default 8760h) instead of a legacy kubernetes.io/service-account-token Secret. Legacy Secret tokens carry iss: kubernetes/serviceaccount and no exp, so muster’s trustedIssuers JWT validation (cluster OIDC issuer + required expiry) can never accept them; every RemoteMCPServer call failed with Unauthorized. The legacy token Secret is removed; the token now rotates on every install/upgrade.
    • templates/kagent/agents/muster-sa.yaml: the token-init Role granted create on Secrets restricted by resourceNames, which Kubernetes RBAC never matches for create requests (the object name is not part of the authorization attributes). The hook Job failed with secrets is forbidden on first install. create is now an unrestricted (namespace-scoped) rule; get/patch stay name-restricted.
    • templates/kagent/declarative-agent-pod-security.yaml: remove seccompProfile: RuntimeDefault from the injected pod and container security contexts. RuntimeDefault blocks clone(CLONE_NEWUSER) which bwrap (used by srt internally) requires for user-namespace isolation, causing every shell/bash tool invocation to fail with bwrap: No permissions to create a new namespace.
    • templates/kagent/policy-exception.yaml (new): PolicyException in the policy-exceptions namespace exempting pods and deployments labelled app: kagent in the kagent namespace from the cluster-wide restrict-seccomp-strict Kyverno policy. Required because the cluster enforces seccomp profiles and we cannot simply omit seccompProfile without an exception.
    • templates/kagent/declarative-agent-srt-settings.yaml (new): Kyverno policy that patches the srt-settings.json key in agent config Secrets (labelled app: kagent) on admission to include "enableWeakerNestedSandbox": true. Without this flag, bwrap attempts to bind-mount /proc into its new PID namespace, which fails inside unprivileged containers with bwrap: Can't mount proc on /newroot/proc: Operation not permitted. The flag is the documented srt workaround for container environments (sandbox/linux-sandbox-utils.ts); the kagent controller does not expose it through any CR field.
    • templates/kagent/declarative-agent-pod-security.yaml: extend the security context mutation to SandboxAgent CRs. SandboxAgent is a distinct kind from Agent and was not covered by the existing rule; pods created via the agents.x-k8s.io Sandbox backend were blocked by disallow-capabilities-strict, disallow-privilege-escalation, and require-run-as-nonroot Kyverno policies.
  • Fixed

    Full Changelog: https://github.com/giantswarm/klausctl/compare/v0.2.2...v0.2.3

  • Fixed

    Full Changelog: https://github.com/giantswarm/klaus-oci/compare/v0.0.48...v0.0.49

  • Changed

    Full Changelog: https://github.com/giantswarm/muster/compare/v0.5.4...v0.5.5

  • Fixed

    • After an idle period, getIDTokenForForwarding now attempts an in-process upstream provider refresh (Server.RefreshSession) when the proxy store has no valid ID token. On success the store is repopulated by TokenRefreshHandler and the fresh token is forwarded, avoiding 401 Unauthorized errors without requiring re-authentication. Closes #549.
  • Fixed

    Full Changelog: https://github.com/giantswarm/muster/compare/v0.5.2...v0.5.3

  • Added

    • GET /health now responds 200 on the aggregator port regardless of OAuth configuration, so Kubernetes liveness/readiness probes work without patching the chart.
    • RegisterServer and DeregisterServer aggregator events and MCPServer reconcile entry are now logged at Info level, making freshly-restarted pod lifecycle visible without --debug.
    • oauth.server.allowedOrigins (comma-separated) is now wired into the mcp-oauth CORS AllowedOrigins list. Previously declared but never read; empty value keeps CORS disabled (default).

    Removed

    • MCPServer.status.consecutiveFailures, .lastAttempt, and .nextRetryAfter are no longer updated by the reconciler; the retry state machine that drove them was removed in a prior release. The fields remain on the CRD for forward compatibility.
    • oauth.server.enableHSTS, oauth.server.tlsCertFile, and oauth.server.tlsKeyFile config fields removed; they were declared and YAML-parsed but never read anywhere in the codebase.
  • Fixed

    • ssoPoolMissNeedingInit now detects pool misses for token-forwarding servers in addition to token-exchange servers, so warm sessions (authAlive=true after pod restart) trigger initSSOForSession for forwarding servers with empty connection pools. Previously, forwarding servers registered during a restart were inaccessible until the user manually re-authenticated to muster.
    • establishSSOConnection now treats a pool miss as stale state for token-forwarding servers (clearing the Valkey auth entry and re-establishing the connection), matching the existing behaviour for token-exchange servers.