What makes a plugin “operator-style”
A standard plugin renders a UI and responds to user interactions through its iframe runtime. An operator plugin does all of that, and also needs to execute system tools, read live state from a cluster or cloud provider, and sometimes mutate external resources. The SDK models this through host-mediated privileged contracts: every sensitive action (process execution, filesystem mutation, hosts-file updates) is routed through the FDO host rather than executed directly from plugin code. The host enforces an allowlist policy and audits each request with plugin identity and a correlation ID. Typical operator plugin use cases:Container runtimes
Docker Desktop-like dashboards, Podman consoles, image browsers, and compose orchestration panels.
Kubernetes
Cluster dashboards, resource inspection, namespace operations, and rollout management.
Infrastructure as Code
Terraform plan/apply consoles, Helm release managers, and Kustomize overlay inspectors.
Cloud CLIs
AWS CLI, gcloud, and Azure CLI operational runbooks and resource inventory panels.
Architectural model
Operator plugins use three distinct layers:- Iframe UI runtime — renders the plugin UI and handles user interaction
- Plugin backend/runtime — holds orchestration logic, registers handlers, manages state
- Host-mediated privileged actions — executes sensitive operations through the FDO host under a scoped policy
Capability model
The FDO host grants capabilities to a plugin before it initializes. Operator plugins typically need:| Capability | Purpose |
|---|---|
system.process.exec | Broad grant: allows host-mediated process execution |
system.process.scope.<scope-id> | Narrow grant: permits execution within a specific tool scope |
system.hosts.write | Allows host-mediated hosts-file writes |
system.fs.scope.<scope-id> | Allows scoped filesystem mutations |
kubectl, you need both system.process.exec and system.process.scope.kubectl.
Declaring capabilities with declareCapabilities()
ImplementdeclareCapabilities() in your plugin class so the host can run preflight checks and compare declared capabilities against granted ones before rare action paths are triggered:
Supported tool scopes
The SDK ships curated presets for the following tool families. Each preset bundles the correct capability pair and scope ID:| Preset ID | Tool | Typical use cases |
|---|---|---|
docker-cli | Docker CLI | Container dashboards, compose orchestration, image inspection |
kubectl | kubectl | Cluster dashboards, resource inspection, namespace operations |
helm | Helm | Release dashboards, chart upgrade flows, Helm diff workflows |
terraform | Terraform | Plan review, apply orchestration, workspace management |
ansible | Ansible | Playbook runners, inventory inspection, ops automation |
aws-cli | AWS CLI | Cloud inventory, operational runbooks, SSM/EKS workflows |
gcloud | Google Cloud CLI | GKE workflows, project inspection, operational tooling |
azure-cli | Azure CLI | AKS workflows, resource group inspection, operational runbooks |
podman | Podman | Rootless container dashboards, image inspection, local runtime |
kustomize | Kustomize | Manifest preview, overlay inspection, GitOps helpers |
gh | GitHub CLI | PR dashboards, workflow triage, repository automation |
git | Git | Diff dashboards, status inspection, repository automation |
vault | Vault | Secret inspection, lease operations, auth troubleshooting |
nomad | Nomad | Job dashboards, allocation inspection, cluster operations |
requestScopedProcessExec() helper with a host-defined scope ID.
Recommended authoring pattern
Choose your authoring path in this order:Start from a fixture
Copy the closest operator fixture from
examples/fixtures/ as your starting point:operator-kubernetes-plugin.fixture.tsoperator-terraform-plugin.fixture.tsoperator-custom-tool-plugin.fixture.ts
Use curated presets for known tools
Call
createOperatorToolCapabilityPreset(presetId) to declare capabilities and requestOperatorTool(presetId, ...) to execute commands. This keeps request code short and handles scope wiring automatically.Use requestScopedWorkflow for multi-step flows
When a user action requires an inspect → preview → apply sequence, use
requestScopedWorkflow() instead of plugin-private orchestration. The host mediates every step, provides typed result data, and enforces confirmation gates.Example: operator plugin using requestOperatorTool
The following is adapted fromexamples/09-operator-plugin.ts:
The
renderOnLoad() return value runs in the iframe UI runtime, not the plugin backend. Call requestOperatorTool by inlining it with toString() or use window.createBackendReq to delegate the call to a registered backend handler.Further reading
Tool Presets
Curated preset definitions, capability bundles, and request helpers for each supported tool.
Workflows
Multi-step inspect/preview/apply flows with typed result data and confirmation gates.
Privileged Actions
Low-level contracts for hosts-file writes, filesystem mutations, and process execution.