Skip to content

plugin-openclaw

Placement runtime (out-of-process over gRPC)
Source github.com/opencharly/plugin-openclaw/candy/plugin-openclaw
Version 2026.246.0100
Candy plugin-openclaw

This plugin is not listed in charly/charly.yml’s compiled_plugins:. It is not part of the shipped binary: charly builds and loads it out-of-process over gRPC when a plan references one of its words (the coexist path).

The reserved words this plugin serves:

  • openclaw — verb class

OUT-OF-TREE charly plugin serving the openclaw check verb — a standalone Go module (go.mod + main.go) that probes a running OpenClaw 2.0 gateway, served OUT-OF-PROCESS over go-plugin gRPC via the charly plugin SDK (github.com/opencharly/sdk). charly’s loader fetches this candy’s repo, go-builds the provider binary on the HOST, and serves it via LocalTransport — so an authored openclaw: step dispatches through the provider registry exactly like a built-in.

The verb PROBES the gateway two ways. HTTP probe methods (health/ready/startup) hit the /healthz /readyz /startupz endpoints — the container-probe surface OpenClaw 2.0 added for orchestrators — from the charly host against the resolved gateway endpoint (cc.ResolveEndpoint + cc.HTTPDo, so one authored step works unchanged against a pod’s published port and a VM’s forwarded one). CLI methods (status/models/channels/version) run the openclaw binary INSIDE the venue over the reverse channel (cc.Exec), where the gateway CLI connects to the loopback gateway over WebSocket. All methods are read-only; there are no mutating methods in this first cut.

It is NOT a re-skin of the generic http: verb. http: already covers URL + status + body/header matchers, and this plugin exists for the two things it structurally cannot do: ENDPOINT RESOLUTION (cc.ResolveEndpoint means one authored step works unchanged against a pod’s published port and a VM’s forwarded one) and DOMAIN SEMANTICS (methods map to the gateway’s real probe surface and return real verdicts, with json_path: to assert one field instead of pattern-matching a JSON blob; the CLI methods run in-venue where the gateway CLI lives, which http: cannot reach at all).

The R10 consumer is an openclaw-bearing bed (pod) whose check composes this plugin alongside the openclaw candy from opencharly/pod-openclaw.

The CUE schema below is the authoritative grammar for this plugin’s input. It is the same single source that generates the plugin’s Go parameter types and answers the runtime Describe RPC, so this page cannot disagree with either.

// The `openclaw` plugin's OWN CUE schema — the typed plugin_input for the
// `openclaw` check verb, which probes a running OpenClaw 2.0 gateway: liveness /
// readiness / startup via the /healthz /readyz /startupz HTTP probe endpoints, and
// gateway state (status, models, channels, version) via the in-venue `openclaw` CLI.
//
// SELF-CONTAINED by contract: it references NO base def, so it compiles standalone
// (both `cue exp gengotypes` and the host's load-gate compile) AND splices onto the
// base as `base ++ plugin`.
//
// Single source, used two ways:
// 1. GENERATE ../params/cue_types_gen.go via `cue exp gengotypes`, so the provider
// decodes plugin_input into a TYPED struct rather than a hand-parsed map.
// 2. VALIDATE authored input AT RUNTIME — served over Describe, spliced by the host,
// and every authored `openclaw:` step's plugin_input checked against #OpenclawInput.
#OpenclawInput: {
// method — the operation (also the scalar-sugar primary, so `openclaw: health`
// desugars to {method: "health"}).
//
// HTTP probe methods (health/ready/startup) are issued from the charly HOST against
// the resolved gateway endpoint; CLI methods (status/models/channels/version) run
// inside the venue where the `openclaw` binary is installed. All are read-only —
// there are no mutating methods in this first cut.
method: "health" | "ready" | "startup" | "status" | "models" | "channels" | "version"
// port — the gateway port to probe. Default 18789 (the openclaw candy's published
// port, relayed from the loopback-bound gateway by socat).
port?: int & >0 & <65536
// timeout — the HTTP probe timeout. Default 10s.
timeout?: string & =~"^[0-9]+s$"
// json_path — a dotted path into the JSON response; when set, the verb's stdout is
// the value at that path rather than the whole document, so a `stdout:` matcher can
// assert one field without pattern-matching a blob.
json_path?: string @go(JSONPath)
}

See also the candy reference for this candy’s install surface.