Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 130 additions & 37 deletions cmd/lk/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"context"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"regexp"
Expand All @@ -26,6 +27,9 @@
"time"

"github.com/charmbracelet/huh"
"github.com/google/go-containerregistry/pkg/authn"
"github.com/google/go-containerregistry/pkg/crane"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/twitchtv/twirp"
"github.com/urfave/cli/v3"

Expand Down Expand Up @@ -97,6 +101,16 @@
Required: false,
}

agentPrebuiltImageFlag = &cli.StringFlag{
Name: "image",
Usage: "Pre-built image from the local Docker daemon (e.g. myimage:latest). Requires Docker.",
}

agentPrebuiltImageTarFlag = &cli.StringFlag{
Name: "image-tar",
Usage: "Pre-built image from an OCI tar file (e.g. ./image.tar). No Docker daemon required.",
}

skipSDKCheckFlag = &cli.BoolFlag{
Name: "skip-sdk-check",
Required: false,
Expand Down Expand Up @@ -167,6 +181,8 @@
silentFlag,
regionFlag,
skipSDKCheckFlag,
agentPrebuiltImageFlag,
agentPrebuiltImageTarFlag,
},
// NOTE: since secrets may contain commas, or indeed any special character we might want to treat as a flag separator,
// we disable it entirely here and require multiple --secrets flags to be used.
Expand Down Expand Up @@ -212,6 +228,8 @@
regionFlag,
ignoreEmptySecretsFlag,
skipSDKCheckFlag,
agentPrebuiltImageFlag,
agentPrebuiltImageTarFlag,
},
// NOTE: since secrets may contain commas, or indeed any special character we might want to treat as a flag separator,
// we disable it entirely here and require multiple --secrets flags to be used.
Expand Down Expand Up @@ -468,7 +486,6 @@
fmt.Println("Creating sandbox app...")
fmt.Printf("Created sandbox app [%s]\n", util.Accented(sandboxID))
}

}

// Run template bootstrap
Expand Down Expand Up @@ -559,24 +576,6 @@
return err
}

projectType, err := agentfs.DetectProjectType(os.DirFS(workingDir))
if err != nil {
return fmt.Errorf("unable to determine agent language: %w, please navigate to a directory containing an agent written in a supported language", err)
}
fmt.Printf("Detected agent language [%s]\n", util.Accented(string(projectType)))

if err := requireDockerfile(ctx, cmd, workingDir, projectType, settingsMap); err != nil {
return err
}

if err := agentfs.CheckSDKVersion(workingDir, projectType, settingsMap); err != nil {
if cmd.Bool("skip-sdk-check") {
fmt.Printf("Error checking SDK version: %v, skipping...\n", err)
} else {
return err
}
}

region := cmd.String("region")
if region == "" {
availableRegionsStr, ok := settingsMap["available_regions"]
Expand Down Expand Up @@ -608,6 +607,44 @@
buildContext, cancel := context.WithTimeout(ctx, buildTimeout)
defer cancel()
regions := []string{region}

// --image or --image-tar: register the agent record then push the prebuilt image
imageRef := cmd.String("image")
imageTar := cmd.String("image-tar")
if imageRef != "" || imageTar != "" {
agentID, err := agentsClient.RegisterAgent(buildContext, secrets, regions)

Check failure on line 615 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (macos-latest)

agentsClient.RegisterAgent undefined (type *cloudagents.Client has no field or method RegisterAgent)

Check failure on line 615 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (macos-latest)

agentsClient.RegisterAgent undefined (type *cloudagents.Client has no field or method RegisterAgent)

Check failure on line 615 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

agentsClient.RegisterAgent undefined (type *cloudagents.Client has no field or method RegisterAgent)

Check failure on line 615 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

agentsClient.RegisterAgent undefined (type *cloudagents.Client has no field or method RegisterAgent)

Check failure on line 615 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / build

agentsClient.RegisterAgent undefined (type *cloudagents.Client has no field or method RegisterAgent)

Check failure on line 615 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / build

agentsClient.RegisterAgent undefined (type *cloudagents.Client has no field or method RegisterAgent)
if err != nil {
if twerr, ok := err.(twirp.Error); ok {
return fmt.Errorf("unable to create agent: %s", twerr.Msg())
}
return fmt.Errorf("unable to create agent: %w", err)
}
lkConfig.Agent.ID = agentID
if err := lkConfig.SaveTOMLFile(workingDir, tomlFilename); err != nil {
return err
}
fmt.Printf("Created agent with ID [%s]\n", util.Accented(agentID))
return deployPrebuiltImage(buildContext, agentID, imageRef, imageTar)
}

projectType, err := agentfs.DetectProjectType(os.DirFS(workingDir))
if err != nil {
return fmt.Errorf("unable to determine agent language: %w, please navigate to a directory containing an agent written in a supported language", err)
}
fmt.Printf("Detected agent language [%s]\n", util.Accented(string(projectType)))

if err := requireDockerfile(ctx, cmd, workingDir, projectType, settingsMap); err != nil {
return err
}

if err := agentfs.CheckSDKVersion(workingDir, projectType, settingsMap); err != nil {
if cmd.Bool("skip-sdk-check") {
fmt.Printf("Error checking SDK version: %v, skipping...\n", err)
} else {
return err
}
}

excludeFiles := []string{fmt.Sprintf("**/%s", config.LiveKitTOMLFile)}
resp, err := agentsClient.CreateAgent(buildContext, os.DirFS(workingDir), secrets, regions, excludeFiles, os.Stderr)
if err != nil {
Expand Down Expand Up @@ -725,22 +762,25 @@
}

func deployAgent(ctx context.Context, cmd *cli.Command) error {
// If no agent exists yet (no --id and no config with agent), do first-time create (which deploys).
if cmd.String("id") == "" {
configExists, err := requireConfig(workingDir, tomlFilename)
if err != nil && configExists {
return err
}
if !configExists || lkConfig == nil || !lkConfig.HasAgent() {
return createAgent(ctx, cmd)
}
}

agentId, err := getAgentID(ctx, cmd, workingDir, tomlFilename, false)
if err != nil {
return err
}

buildContext, cancel := context.WithTimeout(ctx, buildTimeout)
defer cancel()

// --image or --image-tar: skip source build and push a prebuilt image via the OCI proxy.
imageRef := cmd.String("image")
imageTar := cmd.String("image-tar")
if imageRef != "" || imageTar != "" {
if err := deployPrebuiltImage(buildContext, agentId, imageRef, imageTar); err != nil {
return fmt.Errorf("unable to deploy prebuilt image: %w", err)
}
fmt.Println("Deployed agent")
return nil
}

secrets, err := requireSecrets(ctx, cmd, false, true)
if err != nil {
return err
Expand All @@ -765,8 +805,6 @@
}
}

buildContext, cancel := context.WithTimeout(ctx, buildTimeout)
defer cancel()
excludeFiles := []string{fmt.Sprintf("**/%s", config.LiveKitTOMLFile)}
if err := agentsClient.DeployAgent(buildContext, agentId, os.DirFS(workingDir), secrets, excludeFiles, os.Stderr); err != nil {
if twerr, ok := err.(twirp.Error); ok {
Expand All @@ -779,6 +817,45 @@
return nil
}

// deployPrebuiltImage pushes a locally-built image through the cloud-agents OCI proxy.
// Exactly one of imageRef (Docker daemon via the Docker API) or imageTar must be non-empty.
func deployPrebuiltImage(ctx context.Context, agentID, imageRef, imageTar string) error {
target, err := agentsClient.GetPushTarget(ctx, agentID)

Check failure on line 823 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (macos-latest)

agentsClient.GetPushTarget undefined (type *cloudagents.Client has no field or method GetPushTarget)

Check failure on line 823 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (macos-latest)

agentsClient.GetPushTarget undefined (type *cloudagents.Client has no field or method GetPushTarget)

Check failure on line 823 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

agentsClient.GetPushTarget undefined (type *cloudagents.Client has no field or method GetPushTarget)

Check failure on line 823 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

agentsClient.GetPushTarget undefined (type *cloudagents.Client has no field or method GetPushTarget)

Check failure on line 823 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / build

agentsClient.GetPushTarget undefined (type *cloudagents.Client has no field or method GetPushTarget)

Check failure on line 823 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / build

agentsClient.GetPushTarget undefined (type *cloudagents.Client has no field or method GetPushTarget)
if err != nil {
return fmt.Errorf("failed to get push target: %w", err)
}

var img v1.Image
if imageRef != "" {
imageRef = strings.TrimSpace(imageRef)
fmt.Printf("Loading image from Docker daemon [%s]\n", util.Accented(imageRef))
var dockerCloser io.Closer
img, dockerCloser, err = agentfs.LoadDockerDaemonImage(ctx, imageRef)
if err != nil {
return err
}
defer dockerCloser.Close()
} else {
fmt.Printf("Loading image from [%s]\n", util.Accented(imageTar))
img, err = crane.Load(imageTar)
if err != nil {
return fmt.Errorf("failed to load image: %w", err)
}
}

proxyRef := fmt.Sprintf("%s/%s:%s", target.ProxyHost, target.Name, target.Tag)
fmt.Printf("Pushing image [%s]\n", util.Accented(proxyRef))

rt := agentsClient.NewRegistryTransport()

Check failure on line 849 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (macos-latest)

agentsClient.NewRegistryTransport undefined (type *cloudagents.Client has no field or method NewRegistryTransport) (compile)

Check failure on line 849 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (macos-latest)

agentsClient.NewRegistryTransport undefined (type *cloudagents.Client has no field or method NewRegistryTransport) (compile)

Check failure on line 849 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

agentsClient.NewRegistryTransport undefined (type *cloudagents.Client has no field or method NewRegistryTransport) (compile)

Check failure on line 849 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

agentsClient.NewRegistryTransport undefined (type *cloudagents.Client has no field or method NewRegistryTransport) (compile)

Check failure on line 849 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / build

agentsClient.NewRegistryTransport undefined (type *cloudagents.Client has no field or method NewRegistryTransport) (compile)

Check failure on line 849 in cmd/lk/agent.go

View workflow job for this annotation

GitHub Actions / build

agentsClient.NewRegistryTransport undefined (type *cloudagents.Client has no field or method NewRegistryTransport) (compile)
if err := crane.Push(img, proxyRef,
crane.WithTransport(rt),
crane.WithAuth(authn.Anonymous),
); err != nil {
return fmt.Errorf("failed to push image: %w", err)
}
return nil
}

func getAgentStatus(ctx context.Context, cmd *cli.Command) error {
agentID, err := getAgentID(ctx, cmd, workingDir, tomlFilename, false)
if err != nil {
Expand Down Expand Up @@ -1028,21 +1105,37 @@
return fmt.Errorf("unable to list agent versions: %w", err)
}

table := util.CreateTable().
Headers("Version", "Current", "Status", "Created At", "Deployed At")

// Sort versions by created date descending
slices.SortFunc(versions.Versions, func(a, b *lkproto.AgentVersion) int {
return b.CreatedAt.AsTime().Compare(a.CreatedAt.AsTime())
})

showDigest := false
for _, v := range versions.Versions {
if v.Attributes["image_digest"] != "" {
showDigest = true
break
}
}

headers := []string{"Version", "Current", "Status", "Created At", "Deployed At"}
if showDigest {
headers = append(headers, "Digest")
}
table := util.CreateTable().Headers(headers...)

for _, version := range versions.Versions {
table.Row(
row := []string{
version.Version,
fmt.Sprintf("%t", version.Current),
version.Status,
version.CreatedAt.AsTime().Format(time.RFC3339),
version.DeployedAt.AsTime().Format(time.RFC3339),
)
}
if showDigest {
row = append(row, version.Attributes["image_digest"])
}
table.Row(row...)
}

fmt.Println(table)
Expand Down
11 changes: 11 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ require (
github.com/charmbracelet/huh v0.7.1-0.20250818142555-c41a69ba6443
github.com/charmbracelet/huh/spinner v0.0.0-20250818142555-c41a69ba6443
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834
github.com/docker/docker v28.2.2+incompatible
github.com/frostbyte73/core v0.1.1
github.com/go-logr/logr v1.4.3
github.com/go-task/task/v3 v3.44.1
github.com/google/go-containerregistry v0.20.6
github.com/joho/godotenv v1.5.1
github.com/livekit/protocol v1.45.2-0.20260325065350-7558ba4c26d3
github.com/livekit/server-sdk-go/v2 v2.16.1
Expand Down Expand Up @@ -69,6 +71,7 @@ require (
github.com/containerd/errdefs/pkg v0.3.0 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/containerd/platforms v1.0.0-rc.2 // indirect
github.com/containerd/stargz-snapshotter/estargz v0.17.0 // indirect
github.com/containerd/ttrpc v1.2.7 // indirect
github.com/containerd/typeurl/v2 v2.2.3 // indirect
github.com/cyphar/filepath-securejoin v0.6.0 // indirect
Expand All @@ -77,6 +80,11 @@ require (
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/docker/cli v29.0.0+incompatible // indirect
github.com/docker/distribution v2.8.3+incompatible // indirect
github.com/docker/docker-credential-helpers v0.9.3 // indirect
github.com/docker/go-connections v0.6.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/dominikbraun/graph v0.23.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/elliotchance/orderedmap/v3 v3.1.0 // indirect
Expand Down Expand Up @@ -122,8 +130,10 @@ require (
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
github.com/moby/buildkit v0.26.2 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/locker v1.0.1 // indirect
github.com/moby/sys/signal v0.7.1 // indirect
github.com/morikuni/aec v1.0.0 // indirect
Expand Down Expand Up @@ -172,6 +182,7 @@ require (
github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect
github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab // indirect
github.com/vbatts/tar-split v0.12.2 // indirect
github.com/wlynxg/anet v0.0.5 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
Expand Down
17 changes: 16 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY=
github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chainguard-dev/git-urls v1.0.2 h1:pSpT7ifrpc5X55n4aTTm7FFUE+ZQHKiqpiwNkJrVcKQ=
Expand Down Expand Up @@ -129,7 +131,6 @@ github.com/containerd/platforms v1.0.0-rc.2 h1:0SPgaNZPVWGEi4grZdV8VRYQn78y+nm6a
github.com/containerd/platforms v1.0.0-rc.2/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4=
github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y=
github.com/containerd/plugin v1.0.0/go.mod h1:hQfJe5nmWfImiqT1q8Si3jLv3ynMUIBB47bQ+KexvO8=
github.com/containerd/stargz-snapshotter v0.17.0 h1:djNS4KU8ztFhLdEDZ1bsfzOiYuVHT6TgSU5qwRk+cNc=
github.com/containerd/stargz-snapshotter/estargz v0.17.0 h1:+TyQIsR/zSFI1Rm31EQBwpAA1ovYgIKHy7kctL3sLcE=
github.com/containerd/stargz-snapshotter/estargz v0.17.0/go.mod h1:s06tWAiJcXQo9/8AReBCIo/QxcXFZ2n4qfsRnpl71SM=
github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ=
Expand All @@ -154,6 +155,10 @@ github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZ
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/docker/cli v29.0.0+incompatible h1:KgsN2RUFMNM8wChxryicn4p46BdQWpXOA1XLGBGPGAw=
github.com/docker/cli v29.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v28.2.2+incompatible h1:CjwRSksz8Yo4+RmQ339Dp/D2tGO5JxwYeqtMOEe0LDw=
github.com/docker/docker v28.2.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8=
github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo=
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
Expand Down Expand Up @@ -226,6 +231,8 @@ github.com/google/cel-go v0.27.0/go.mod h1:tTJ11FWqnhw5KKpnWpvW9CJC3Y9GK4EIS0WXn
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-containerregistry v0.20.6 h1:cvWX87UxxLgaH76b4hIvya6Dzz9qHB31qAwjAohdSTU=
github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2FAkwCDf9/HZgsFJ02E2Y=
github.com/google/jsonschema-go v0.4.2 h1:tmrUohrwoLZZS/P3x7ex0WAVknEkBZM46iALbcqoRA8=
github.com/google/jsonschema-go v0.4.2/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
Expand Down Expand Up @@ -291,6 +298,8 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4=
github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE=
github.com/moby/buildkit v0.26.2 h1:EIh5j0gzRsCZmQzvgNNWzSDbuKqwUIiBH7ssqLv8RU8=
Expand All @@ -305,6 +314,8 @@ github.com/moby/moby/client v0.1.0 h1:nt+hn6O9cyJQqq5UWnFGqsZRTS/JirUqzPjEl0Bdc/
github.com/moby/moby/client v0.1.0/go.mod h1:O+/tw5d4a1Ha/ZA/tPxIZJapJRUS6LNZ1wiVRxYHyUE=
github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=
github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs=
github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg=
github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
Expand Down Expand Up @@ -500,6 +511,8 @@ go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho=
go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU=
go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4=
go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI=
go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8=
Expand Down Expand Up @@ -632,6 +645,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4=
k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
mvdan.cc/sh/v3 v3.12.0 h1:ejKUR7ONP5bb+UGHGEG/k9V5+pRVIyD+LsZz7o8KHrI=
Expand Down
Loading
Loading