Solo Enterprise for kagent

solo enterprise · kagent demo suite

Deploy a framework agent, then govern who can reach it.

This page is the standalone kagent demo suite: build and publish an ADK (framework) agent through arctl and AgentRegistry, run it live via kagent, then layer Entra identity on top — first a simple platform-vs-sales access split, then per-agent CEL authorization at the gateway. Entry point: ./scripts/kagent-menu.sh (guided pitch path included).

arctl init · build · publish · deploy AgentRegistry runtime maniak-goose-kagent Entra ID groups · roles AgentGateway CEL authz

#Deploy a framework agent

An ADK agent scaffolded, built, and published with arctl, then deployed into the cluster as a live kagent Agent behind AgentRegistry — no hand-written manifests.

1 · arctl → AgentRegistry → kagent runtime

deploy
What this proves

arctl scaffolds and builds an agent image, publishes it to AgentRegistry, and deploys it onto the connected kagent runtime (maniak-goose-kagent) as a live Agent — reachable over A2A.

flowchart · arctl to a running agent
flowchart LR
  A[arctl init agent] --> B[arctl build image]
  B --> C[(AgentRegistry)]
  C --> D[runtime maniak-goose-kagent]
  D --> E[kagent Agent goosehello]
  E --> F([A2A :8080 — live hello])
run
./scripts/kagent-menu.sh deploy
# or directly:
./scripts/kagent-deploy-adk-agent.sh deploy

#Simple access policy — platform vs sales

A first cut at governance: the Entra persona decides whether you can create/run agents or only read them — no per-agent distinctions yet.

2 · Entra groups → kagent roleMapper → global role

authorization
What this proves

kagent's roleMapper CEL reads the Entra groups claim. platform lands as global.Admin (create/run agents); sales lands as global.Reader (read-only).

flowchart · persona to global role
flowchart LR
  P[Entra persona] --> G[groups claim]
  G --> R{roleMapper CEL}
  R -->|platform| A[global.Admin — create/run]
  R -->|sales| V[global.Reader — read-only]
run
./scripts/kagent-menu.sh rbac

#Advanced access policy — per-agent authorization

The finer-grained story: the gateway itself decides, per agent, whether a persona may call it at all — enforced with CEL on the JWT's roles/groups, in front of A2A.

3 · AgentGateway CEL — per-agent allow/deny

authorization
What this proves

platform reaches every agent (hello, k8s, github). sales reaches only github — hello and k8s return 403. Same JWT, same gateway, different CEL outcome per agent path.

flowchart · CEL gate in front of A2A
flowchart LR
  J[Entra JWT] --> GW[AgentGateway /agents/*]
  GW --> Z{CEL on roles/groups}
  Z -->|platform| ALL[hello + k8s + github ✓]
  Z -->|sales| ONE[github ✓ · hello/k8s 403]
  ALL --> API([Agent A2A])
  ONE --> API
run
./scripts/kagent-menu.sh authz