Skip to content

Commit 5d77ac2

Browse files
Merge branch 'main' into copilot/aw-failures-degrade-unreachable-server
2 parents 2ad15f7 + cb03b8c commit 5d77ac2

27 files changed

Lines changed: 654 additions & 43 deletions
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#!/usr/bin/env bash
2+
set +o histexpand
3+
4+
# cloud_hypervisor_host_preflight.sh - Validate runner eligibility for AWF's
5+
# preview cloud-hypervisor runtime.
6+
#
7+
# Supported scope is intentionally narrow:
8+
# - GitHub-hosted runners only
9+
# - Ubuntu Linux x86_64 only
10+
# - /dev/kvm must be present
11+
12+
set -euo pipefail
13+
14+
echo "::group::cloud-hypervisor host preflight"
15+
16+
if [[ "${RUNNER_ENVIRONMENT:-}" != "github-hosted" ]]; then
17+
echo "::error::cloud-hypervisor preview is supported only on GitHub-hosted runners."
18+
exit 1
19+
fi
20+
21+
if [[ "${RUNNER_OS:-}" != "Linux" ]]; then
22+
echo "::error::cloud-hypervisor preview requires Linux runners."
23+
exit 1
24+
fi
25+
26+
if [[ "${RUNNER_ARCH:-}" != "X64" ]]; then
27+
echo "::error::cloud-hypervisor preview requires x86_64 (RUNNER_ARCH=X64) runners."
28+
exit 1
29+
fi
30+
31+
if [[ "${ImageOS:-}" != ubuntu* ]]; then
32+
echo "::error::cloud-hypervisor preview requires GitHub-hosted Ubuntu images (ImageOS starts with 'ubuntu')."
33+
exit 1
34+
fi
35+
36+
if ! test -e /dev/kvm; then
37+
echo "::error::/dev/kvm is missing. cloud-hypervisor preview requires KVM-capable GitHub-hosted Ubuntu x86_64 runners."
38+
exit 1
39+
fi
40+
41+
echo "runner is eligible for cloud-hypervisor preview"
42+
echo "::endgroup::"
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
#!/usr/bin/env bash
2+
set +o histexpand
3+
4+
# cloud_hypervisor_setup_bundle.sh - Download, verify, and unpack AWF's
5+
# cloud-hypervisor guest bundle for the requested AWF version.
6+
#
7+
# Outputs (GITHUB_OUTPUT):
8+
# binary_path, kernel_path, rootfs_path, supervisor_path
9+
# binary_sha256, kernel_sha256, rootfs_sha256, supervisor_sha256
10+
11+
set -euo pipefail
12+
13+
if [[ -z "${GH_AW_AWF_VERSION:-}" ]]; then
14+
echo "::error::GH_AW_AWF_VERSION is required"
15+
exit 1
16+
fi
17+
18+
version="${GH_AW_AWF_VERSION}"
19+
if [[ "${version}" != v* ]]; then
20+
version="v${version}"
21+
fi
22+
23+
asset_base_url="https://github.com/github/gh-aw-firewall/releases/download/${version}"
24+
asset_name="cloud-hypervisor-test-x86_64.tar.gz"
25+
checksums_name="cloud-hypervisor-test-x86_64.SHA256SUMS"
26+
manifest_name="cloud-hypervisor-test-x86_64.manifest.json"
27+
28+
bundle_root="${RUNNER_TEMP}/gh-aw/cloud-hypervisor/${version}"
29+
extract_dir="${bundle_root}/bundle"
30+
mkdir -p "${bundle_root}" "${extract_dir}"
31+
32+
echo "::group::Download cloud-hypervisor bundle (${version})"
33+
curl -fsSL -o "${bundle_root}/${asset_name}" "${asset_base_url}/${asset_name}"
34+
curl -fsSL -o "${bundle_root}/${checksums_name}" "${asset_base_url}/${checksums_name}"
35+
curl -fsSL -o "${bundle_root}/${manifest_name}" "${asset_base_url}/${manifest_name}"
36+
echo "downloaded release assets"
37+
echo "::endgroup::"
38+
39+
echo "::group::Extract cloud-hypervisor bundle"
40+
tar -xzf "${bundle_root}/${asset_name}" -C "${extract_dir}"
41+
echo "bundle extracted to ${extract_dir}"
42+
echo "::endgroup::"
43+
44+
sha_file="${bundle_root}/${checksums_name}"
45+
46+
resolve_path() {
47+
local rel="$1"
48+
if [[ -z "${rel}" ]]; then
49+
return 1
50+
fi
51+
52+
local cleaned="${rel#./}"
53+
local candidate
54+
for candidate in \
55+
"${extract_dir}/${cleaned}" \
56+
"${bundle_root}/${cleaned}"; do
57+
if [[ -f "${candidate}" ]]; then
58+
realpath "${candidate}"
59+
return 0
60+
fi
61+
done
62+
63+
local found
64+
found="$(find "${extract_dir}" -type f -name "$(basename "${cleaned}")" | head -n1 || true)"
65+
if [[ -n "${found}" ]]; then
66+
realpath "${found}"
67+
return 0
68+
fi
69+
70+
return 1
71+
}
72+
73+
lookup_sha256() {
74+
local rel="$1"
75+
local full="$2"
76+
local candidate
77+
for candidate in "${rel#./}" "$(basename "${rel#./}")" "${full#${bundle_root}/}" "${full#${extract_dir}/}"; do
78+
local sum
79+
sum="$(awk -v target="${candidate}" '{sub(/^\.\//, "", $2); if ($2==target) {print $1; exit}}' "${sha_file}")"
80+
if [[ -n "${sum}" ]]; then
81+
echo "${sum}"
82+
return 0
83+
fi
84+
done
85+
return 1
86+
}
87+
88+
verify_sha256() {
89+
local expected="$1"
90+
local file="$2"
91+
local actual
92+
actual="$(sha256sum "${file}" | awk '{print $1}')"
93+
if [[ "${actual}" != "${expected}" ]]; then
94+
echo "::error::checksum verification failed for ${file}"
95+
exit 1
96+
fi
97+
}
98+
99+
# Artifact names are fixed by the gh-aw-firewall cloud-hypervisor release contract.
100+
binary_rel="cloud-hypervisor"
101+
kernel_rel="vmlinux.bin"
102+
rootfs_rel="rootfs.ext4"
103+
supervisor_rel="awf-supervisor"
104+
105+
binary_path="$(resolve_path "${binary_rel}" || true)"
106+
kernel_path="$(resolve_path "${kernel_rel}" || true)"
107+
rootfs_path="$(resolve_path "${rootfs_rel}" || true)"
108+
supervisor_path="$(resolve_path "${supervisor_rel}" || true)"
109+
110+
if [[ -z "${binary_path}" || -z "${kernel_path}" || -z "${rootfs_path}" || -z "${supervisor_path}" ]]; then
111+
echo "::error::failed to resolve one or more cloud-hypervisor artifact files after extraction"
112+
exit 1
113+
fi
114+
115+
binary_sha256="$(lookup_sha256 "${binary_rel}" "${binary_path}" || true)"
116+
kernel_sha256="$(lookup_sha256 "${kernel_rel}" "${kernel_path}" || true)"
117+
rootfs_sha256="$(lookup_sha256 "${rootfs_rel}" "${rootfs_path}" || true)"
118+
supervisor_sha256="$(lookup_sha256 "${supervisor_rel}" "${supervisor_path}" || true)"
119+
120+
if [[ -z "${binary_sha256}" || -z "${kernel_sha256}" || -z "${rootfs_sha256}" || -z "${supervisor_sha256}" ]]; then
121+
echo "::error::failed to resolve one or more cloud-hypervisor SHA256 digests from ${checksums_name}"
122+
exit 1
123+
fi
124+
125+
echo "::group::Verify cloud-hypervisor bundle checksums"
126+
verify_sha256 "${binary_sha256}" "${binary_path}"
127+
verify_sha256 "${kernel_sha256}" "${kernel_path}"
128+
verify_sha256 "${rootfs_sha256}" "${rootfs_path}"
129+
verify_sha256 "${supervisor_sha256}" "${supervisor_path}"
130+
echo "bundle checksums verified"
131+
echo "::endgroup::"
132+
133+
if [[ -n "${GITHUB_OUTPUT:-}" ]]; then
134+
{
135+
echo "binary_path=${binary_path}"
136+
echo "kernel_path=${kernel_path}"
137+
echo "rootfs_path=${rootfs_path}"
138+
echo "supervisor_path=${supervisor_path}"
139+
echo "binary_sha256=${binary_sha256}"
140+
echo "kernel_sha256=${kernel_sha256}"
141+
echo "rootfs_sha256=${rootfs_sha256}"
142+
echo "supervisor_sha256=${supervisor_sha256}"
143+
} >> "${GITHUB_OUTPUT}"
144+
fi
145+
if [[ -n "${GITHUB_ENV:-}" ]]; then
146+
{
147+
echo "GH_AW_CLOUD_HYPERVISOR_BINARY=${binary_path}"
148+
echo "GH_AW_CLOUD_HYPERVISOR_KERNEL=${kernel_path}"
149+
echo "GH_AW_CLOUD_HYPERVISOR_ROOTFS=${rootfs_path}"
150+
echo "GH_AW_CLOUD_HYPERVISOR_SUPERVISOR=${supervisor_path}"
151+
echo "GH_AW_CLOUD_HYPERVISOR_BINARY_SHA256=${binary_sha256}"
152+
echo "GH_AW_CLOUD_HYPERVISOR_KERNEL_SHA256=${kernel_sha256}"
153+
echo "GH_AW_CLOUD_HYPERVISOR_ROOTFS_SHA256=${rootfs_sha256}"
154+
echo "GH_AW_CLOUD_HYPERVISOR_SUPERVISOR_SHA256=${supervisor_sha256}"
155+
} >> "${GITHUB_ENV}"
156+
fi
157+
158+
echo "cloud-hypervisor bundle prepared"

docs/public/editor/autocomplete-data.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -800,8 +800,8 @@
800800
},
801801
"runtime": {
802802
"type": "string",
803-
"desc": "Container runtime for the agent container.",
804-
"enum": ["gvisor", "docker-sbx"],
803+
"desc": "Container runtime for the agent container. cloud-hypervisor is preview-only and limited to GitHub-hosted Ubuntu x86_64 runners with /dev/kvm.",
804+
"enum": ["gvisor", "docker-sbx", "cloud-hypervisor"],
805805
"leaf": true
806806
},
807807
"config": {

docs/src/content/docs/introduction/architecture.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ Runner topology determines where the Docker daemon and workspace live. Agent run
189189
| ARC or another split-daemon DinD runner | Docker (default) | `runner.topology: arc-dind` stages the sysroot and workspace for the sidecar daemon. The privileged DinD sidecar creates the isolated network; the runner container remains unprivileged and does not need `NET_ADMIN`. |
190190
| Compatible Linux runner | gVisor (`sandbox.agent.runtime: gvisor`) | The agent container runs under `runsc`, which interposes a user-space kernel between the agent and the host kernel. |
191191
| KVM-capable Linux runner | Docker sbx (`sandbox.agent.runtime: docker-sbx`) | The agent runs inside a hardware-virtualized microVM while the firewall, API proxy, MCP Gateway, and MCP servers remain in host-side containers. |
192+
| GitHub-hosted Ubuntu x86_64 KVM runner | Cloud Hypervisor (preview) (`sandbox.agent.runtime: cloud-hypervisor`) | The agent runs inside AWF's preview Cloud Hypervisor microVM runtime with release-asset checksum verification and digest-pinned runtime flags. |
192193

193194
> [!IMPORTANT]
194195
> gVisor and Docker sbx are incompatible with `runner.topology: arc-dind`. Installing gVisor invokes `sudo` to register `runsc`, but the agent remains in the default rootless AWF mode with `sandbox.agent.sudo: false`. Docker sbx requires `sandbox.agent.sudo: true`, KVM access, and the `DOCKER_USERNAME` and `DOCKER_PAT` secrets. The compiler rejects incompatible runtime, topology, sudo, and AWF-version combinations; generated Docker sbx workflows fail fast at run time when KVM access or required secrets are unavailable.

docs/src/content/docs/reference/agent-runtimes.md

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
title: Agent Runtime Selection
3-
description: Choose and configure Docker, gVisor, Docker sbx, or ARC DinD for an agentic workflow, with runner requirements and troubleshooting guidance.
3+
description: Choose and configure Docker, gVisor, Docker sbx, Cloud Hypervisor, or ARC DinD for an agentic workflow, with runner requirements and troubleshooting guidance.
44
sidebar:
55
order: 1340
66
---
77

8-
Agentic workflows use AWF (Agent Workflow Firewall) to run the agent in an isolated environment. The environment can use the runner's standard Docker runtime, gVisor, or Docker sbx. ARC DinD is a runner topology that changes how the standard Docker environment is reached; it is not another value of `sandbox.agent.runtime`.
8+
Agentic workflows use AWF (Agent Workflow Firewall) to run the agent in an isolated environment. The environment can use the runner's standard Docker runtime, gVisor, Docker sbx, or preview Cloud Hypervisor mode. ARC DinD is a runner topology that changes how the standard Docker environment is reached; it is not another value of `sandbox.agent.runtime`.
99

1010
Use this page when selecting a runtime, writing workflow frontmatter, provisioning a runner, or diagnosing a runtime setup failure.
1111

@@ -15,7 +15,7 @@ These similarly named fields control different layers:
1515

1616
| Field | Purpose | Values covered here |
1717
| --- | --- | --- |
18-
| `sandbox.agent.runtime` | Selects the isolation backend for the main agent | `gvisor`, `docker-sbx`, or omitted for Docker |
18+
| `sandbox.agent.runtime` | Selects the isolation backend for the main agent | `gvisor`, `docker-sbx`, `cloud-hypervisor`, or omitted for Docker |
1919
| `sandbox.agent.runtime-install` | Controls whether gh-aw installs and prepares gVisor or Docker sbx | `true` by default; `false` for a pre-provisioned runner |
2020
| `runner.topology` | Describes how the runner reaches Docker | `arc-dind`, or omitted for a local Docker daemon |
2121
| `tools.github.bounded-queries.runtime` | Selects the backend for bounded-query scripts only | `docker`, `gvisor`, `sbx` |
@@ -31,14 +31,16 @@ These similarly named fields control different layers:
3131
| Docker | Linux namespaces, cgroups, and the host kernel | Linux and a usable Docker daemon | Fastest and most compatible, but the agent shares the host kernel |
3232
| gVisor | A `runsc` user-space kernel between the agent and host kernel | Local Docker daemon, `sudo`, systemd, and access to gVisor downloads | Stronger kernel isolation with syscall compatibility and performance overhead |
3333
| Docker sbx | A KVM-backed microVM for the agent | KVM, nested virtualization, `sudo`, apt, Docker Hub credentials, and local Docker | Strongest boundary here, but has the most setup cost and platform constraints |
34+
| Cloud Hypervisor (preview) | A KVM-backed microVM for the agent | GitHub-hosted Ubuntu x86_64 runner with `/dev/kvm` and AWF release asset download access | Preview-only path with strict host requirements and release-asset provisioning |
3435
| ARC DinD | Standard Docker agent container in a DinD sidecar | ARC or equivalent Kubernetes runner with a privileged DinD sidecar and shared work volume | Supports Kubernetes runner fleets, but adds split-filesystem and daemon-connectivity complexity |
3536

3637
Apply this selection order:
3738

3839
1. Use **ARC DinD** when the runner is an ARC pod or another Kubernetes runner whose Docker daemon is a DinD sidecar. Do not combine it with gVisor or Docker sbx.
3940
2. Otherwise, use **Docker sbx** when the user requires a hardware-virtualized boundary and the runner exposes working KVM.
40-
3. Otherwise, use **gVisor** when untrusted agent code warrants a smaller host-kernel attack surface and the workload is compatible with `runsc`.
41-
4. Use the default **Docker** runtime when compatibility, startup time, or runner portability is more important than an additional kernel or VM boundary.
41+
3. Use **Cloud Hypervisor (preview)** only when the runtime must be Cloud Hypervisor and the runner is GitHub-hosted Ubuntu x86_64 with `/dev/kvm`.
42+
4. Otherwise, use **gVisor** when untrusted agent code warrants a smaller host-kernel attack surface and the workload is compatible with `runsc`.
43+
5. Use the default **Docker** runtime when compatibility, startup time, or runner portability is more important than an additional kernel or VM boundary.
4244

4345
If the user's requirement is unclear, prefer Docker. Do not select a stronger runtime until the runner prerequisites are known to be available.
4446

@@ -266,6 +268,34 @@ It has the highest cold-start cost, consumes more memory and disk, requires Dock
266268

267269
**The CLI is missing inside the microVM:** Upgrade gh-aw and recompile. Docker sbx requires engine CLIs to be staged under `${RUNNER_TEMP}/gh-aw/engine-cli`, which is visible to the microVM.
268270

271+
## Cloud Hypervisor (preview)
272+
273+
Cloud Hypervisor runs the agent in AWF's preview microVM runtime:
274+
275+
```aw wrap
276+
---
277+
on: issues
278+
sandbox:
279+
agent:
280+
id: awf
281+
runtime: cloud-hypervisor
282+
---
283+
284+
Investigate this issue.
285+
```
286+
287+
Preview scope is intentionally narrow:
288+
289+
- GitHub-hosted runners only (`RUNNER_ENVIRONMENT=github-hosted`).
290+
- Ubuntu Linux x86_64 only (`RUNNER_OS=Linux`, `RUNNER_ARCH=X64`, `ImageOS=ubuntu*`).
291+
- `/dev/kvm` must be present.
292+
- `runner.topology: arc-dind` is not supported.
293+
294+
The compiler emits host preflight and release-asset provisioning steps before AWF runs. Provisioning downloads `cloud-hypervisor-test-x86_64.tar.gz`, `SHA256SUMS`, and `manifest.json` from the pinned `gh-aw-firewall` release, verifies checksums, and feeds AWF digest-pinned flags for the Cloud Hypervisor binary, kernel, rootfs, and supervisor.
295+
296+
> [!IMPORTANT]
297+
> This runtime is preview-only. Keep expectations aligned with AWF preview support and prefer Docker sbx or gVisor when Cloud Hypervisor host constraints are not guaranteed.
298+
269299
## ARC with Docker-in-Docker
270300

271301
ARC DinD describes a split-daemon runner: the GitHub Actions runner is one container and Docker runs in a privileged sidecar. The agent still uses standard Docker, so omit `sandbox.agent.runtime`.

docs/src/content/docs/reference/frontmatter-full.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2131,7 +2131,9 @@ sandbox:
21312131
# gVisor's runsc runtime for additional kernel-level isolation. Use 'docker-sbx'
21322132
# to run the agent inside a Docker sbx microVM with KVM hypervisor-level isolation
21332133
# — requires sandbox.agent.sudo: true, DOCKER_PAT and DOCKER_USERNAME secrets, and
2134-
# a KVM-capable runner. Incompatible with runner.topology: arc-dind.
2134+
# a KVM-capable runner. Use 'cloud-hypervisor' for AWF's preview Cloud Hypervisor
2135+
# microVM runtime (GitHub-hosted Ubuntu x86_64 + /dev/kvm only). Incompatible with
2136+
# runner.topology: arc-dind.
21352137
# (optional)
21362138
runtime: "gvisor"
21372139

docs/src/content/docs/reference/glossary.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,6 +1476,7 @@ A `sandbox.agent` field that selects the container runtime used to execute the A
14761476

14771477
- `gvisor` — Runs the agent container under [gVisor](#gvisor-runsc) (`runsc`) for kernel-level isolation. Best for workflows processing untrusted input.
14781478
- `docker-sbx` — Runs the agent inside a [docker-sbx](#docker-sbx) KVM-isolated microVM while keeping infrastructure containers on the host.
1479+
- `cloud-hypervisor` — Runs the agent inside AWF's preview Cloud Hypervisor microVM runtime (GitHub-hosted Ubuntu x86_64 with `/dev/kvm` only).
14791480

14801481
When omitted, the default Docker runtime is used. See [Sandbox Configuration](/gh-aw/reference/sandbox/).
14811482

@@ -1493,6 +1494,10 @@ A container runtime from Google that interposes a user-space kernel between the
14931494

14941495
A KVM-hardware-virtualized microVM runtime. When `sandbox.agent.runtime: docker-sbx` is set, the AI agent runs inside a hardware-isolated microVM while infrastructure containers (MCP servers, gateway, etc.) remain on the host. Provides stronger isolation than gVisor for workloads that require full hardware-virtualization boundaries. gh-aw automatically refreshes Docker Hub OAuth credentials immediately before agent execution to prevent token expiry errors. See [Sandbox Configuration](/gh-aw/reference/sandbox/).
14951496

1497+
### cloud-hypervisor
1498+
1499+
A preview KVM-hardware-virtualized microVM runtime in AWF. When `sandbox.agent.runtime: cloud-hypervisor` is set, gh-aw emits host eligibility checks and digest-pinned release-asset provisioning for the Cloud Hypervisor binary, kernel, rootfs, and supervisor bundle. Support is intentionally limited to GitHub-hosted Ubuntu x86_64 runners with `/dev/kvm`. See [Sandbox Configuration](/gh-aw/reference/sandbox/).
1500+
14961501
### Strict Mode
14971502

14981503
Enhanced validation mode enforcing additional security checks and best practices. Enabled via `strict: true` in frontmatter or `--strict` flag when compiling.

pkg/cli/audit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func registerAuditCommandFlags(cmd *cobra.Command) {
115115
cmd.Flags().Bool("stdin", false, "Read workflow run IDs or URLs from stdin (one per line) instead of positional arguments")
116116
cmd.Flags().String("experiment", "", "Filter to runs that include this experiment name")
117117
cmd.Flags().String("variant", "", "Filter to runs with a specific variant value (requires --experiment)")
118-
cmd.Flags().String("runtime", "", "Filter to runs using a specific sandbox agent runtime (e.g., gvisor, docker-sbx)")
118+
cmd.Flags().String("runtime", "", "Filter to runs using a specific sandbox agent runtime (e.g., gvisor, docker-sbx, cloud-hypervisor)")
119119
cmd.Flags().Bool("evals", false, "Filter to runs containing evals results (evals.jsonl); automatically downloads the usage artifact (which includes evals) when --artifacts is narrowed")
120120
RegisterDirFlagCompletion(cmd, "output")
121121
}

pkg/cli/audit_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,10 @@ func TestAuditCommandInvalidRuntimeIsRejected(t *testing.T) {
12401240
require.ErrorContains(t, err, "invalid runtime value", "error message should explain the invalid value")
12411241
}
12421242

1243+
func TestValidateLogsRuntimeAllowsCloudHypervisor(t *testing.T) {
1244+
require.NoError(t, validateLogsRuntime(string(workflow.AgentRuntimeCloudHypervisor)))
1245+
}
1246+
12431247
// TestShouldSkipAuditRun_Runtime verifies that shouldSkipAuditRun's runtime
12441248
// filter matches the shared matchRuntimeFilter contract used by the logs
12451249
// orchestrator: matching runtime is not skipped, non-matching or missing

pkg/cli/logs_command.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ func validateLogsRuntime(runtime string) error {
319319
return nil
320320
}
321321
logsCommandLog.Printf("Validating runtime parameter: %s", runtime)
322-
validRuntimes := []string{string(workflow.AgentRuntimeGVisor), string(workflow.AgentRuntimeDockerSbx)}
322+
validRuntimes := []string{string(workflow.AgentRuntimeGVisor), string(workflow.AgentRuntimeDockerSbx), string(workflow.AgentRuntimeCloudHypervisor)}
323323
if slices.Contains(validRuntimes, runtime) {
324324
return nil
325325
}
@@ -391,7 +391,7 @@ func addLogsCommandFlags(logsCmd *cobra.Command, validArtifactSets string) {
391391
logsCmd.Flags().String("end-date", "", "Filter runs created before this date (YYYY-MM-DD or delta like -1d, -1w, -1mo)")
392392
addOutputFlag(logsCmd, defaultLogsOutputDir)
393393
addEngineFilterFlag(logsCmd)
394-
logsCmd.Flags().String("runtime", "", "Filter to runs using a specific sandbox agent runtime (e.g., gvisor, docker-sbx)")
394+
logsCmd.Flags().String("runtime", "", "Filter to runs using a specific sandbox agent runtime (e.g., gvisor, docker-sbx, cloud-hypervisor)")
395395
logsCmd.Flags().String("ref", "", "Filter runs by branch or tag name (e.g., main, v1.0.0)")
396396
logsCmd.Flags().Int64("before-run-id", 0, "Filter runs with database ID before this value (exclusive)")
397397
logsCmd.Flags().Int64("after-run-id", 0, "Filter runs with database ID after this value (exclusive)")

0 commit comments

Comments
 (0)