plugin-tunnel
| Version | 2026.182.1200 |
| Repo | superproject |
| Plugin | yes — see the plugin reference |
OUT-OF-TREE charly plugin serving the tunnel VERB (verb:tunnel) — the
externalized tailscale/cloudflare TUNNEL EXECUTION LEG (core-externalization
cutover C16b). It is DUAL-PLACEMENT: its importable provider package
(NewProvider/NewMeta, serving verb:tunnel + its self-contained CUE schema over
the SDK Describe channel) is COMPILED INTO charly when listed in charly.yml
compiled_plugins: (the default — registered in-process via
registerCompiledPlugin), and the SAME provider is served OUT-OF-PROCESS over
go-plugin gRPC by the cmd/serve shim (host-built + connected via LocalTransport)
when it is not. Placement is invisible above the provider registry.
The RESOLUTION half of the tunnel subsystem lives in sdk/deploykit/tunnel_resolve.go (ResolveTunnelConfig / TunnelConfigFromMetadata + the tunnelConfigPath the systemd unit references; the pure schemeTarget/ tailscaleFlag/isTCPFamily helpers the quadlet emitter shares, FLOOR-SLIM mechanical batch — charly/tunnel.go, the former core home, carried nothing but dead aliases and was deleted). Only the EXECUTION leg lives HERE: the pod-lifecycle plugins that resolve a TunnelConfig via the pod-config-container-tunnel / pod-config-tunnel-resolve host-build seams (candy/plugin-deploy-pod for start/stop, candy/plugin-pod for remove — Cutover B unit 2) drive this verb’s start/stop/setup methods directly over InvokeProvider, wrapped in the {method, config} Invoke envelope; the plugin runs the actual tailscale serve/funnel and cloudflared lifecycle, stopping at the exec/auth boundary. There is no remaining core-side tunnel EXECUTION dispatch — every caller reaches this verb directly.
verb:tunnel ALSO carries a benign plan (dry-run) method: given a TunnelConfig
it returns the EXACT tailscale/cloudflared argv it WOULD run WITHOUT exec, so a
disposable bed proves the registry dispatch + the TunnelConfig wire round-trip +
the moved command-building logic with ZERO tailscale/cloudflare credentials. The
R10 consumer is box/fedora’s check-tunnel-pod bed (a plugin: tunnel
method:plan step asserting the built argv).
Acceptance plan
Section titled “Acceptance plan”This candy’s plan: — the runnable spec charly check executes against a live deployment. check: steps are idempotent probes; run: steps change state.
| Intent | Step |
|---|---|
check |
the out-of-tree plugin ships a buildable Go module providing verb:tunnel (the externalized tailscale/cloudflare execution leg) the host can build, compile in, and serve over gRPC; the full dispatch + argv round-trip is exercised by tunnel-plan-argv + the check-tunnel-pod bed |
check |
verb:tunnel plan builds the exact tailscale serve/funnel argv from a wire TunnelConfig (registry dispatch + config round-trip + moved argv logic), creds-free |