Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
26121dc
rough agent loop
jordanstephens Oct 3, 2025
91a1487
setup tool translation from genkit to mcp-go
jordanstephens Oct 7, 2025
3a42ee3
clean up login tool placeholder
jordanstephens Oct 14, 2025
bb2c0d3
skip in-process mcp tests for now
jordanstephens Oct 14, 2025
5ac22bb
move common tool interfaces to agent package
jordanstephens Oct 14, 2025
d4330dd
move mcp tool handlers to agent tools
jordanstephens Oct 14, 2025
ccfebbb
expose login tool to cli agent
jordanstephens Oct 14, 2025
f3797a0
expose services tool to cli agent
jordanstephens Oct 14, 2025
459d366
expose deploy tool to cli agent
jordanstephens Oct 14, 2025
53239eb
expose destroy tool to cli agent
jordanstephens Oct 14, 2025
d663e93
expose logs tool to cli agent
jordanstephens Oct 14, 2025
ac15dda
expose estimate tool to cli agent
jordanstephens Oct 14, 2025
9d2b666
expose set_config tool to cli agent
jordanstephens Oct 14, 2025
4389fe0
expose remove_config tool to cli agent
jordanstephens Oct 14, 2025
35dadbe
expose set provider tools to cli agent
jordanstephens Oct 14, 2025
8970537
factor out input reader to handle sigterm
jordanstephens Oct 14, 2025
bfa5057
avoid reprinting user messages
jordanstephens Oct 14, 2025
725b03c
refactor estimate tool params to use simple strings
jordanstephens Oct 14, 2025
1197cb8
configure oai_compat gateway plugin
jordanstephens Oct 16, 2025
d9766ee
require auth before using agent
jordanstephens Oct 16, 2025
17c5cd9
update vendor hash
jordanstephens Oct 16, 2025
e2e2c26
refactor tool call handling
jordanstephens Oct 17, 2025
02cbc63
pass access token as openai api key
jordanstephens Oct 21, 2025
fb94e61
refactor ComposeUp params
jordanstephens Oct 21, 2025
9fd2ed0
configure fabric genkit provider
jordanstephens Oct 22, 2025
898b660
fix term
jordanstephens Oct 22, 2025
2279c73
tweak system prompt
jordanstephens Oct 22, 2025
64d54a3
pritn with term, use /exit, add welcome screen
jordanstephens Oct 22, 2025
1db5039
style prompt
jordanstephens Oct 22, 2025
101265f
optional project_name, default working_directory
jordanstephens Oct 22, 2025
c20b3c6
factor out timeutils
jordanstephens Oct 23, 2025
67b90b9
add current working directory to system instructions
jordanstephens Oct 23, 2025
04a6508
add LoaderParams descriptions
jordanstephens Oct 23, 2025
32cad3a
add LogsParams descriptions
jordanstephens Oct 23, 2025
a9d74f4
avoid returning an error when projects are not deployed
jordanstephens Oct 23, 2025
4aab454
remove cwd from output
jordanstephens Oct 23, 2025
34108c7
clean up "provider not configured" errors
jordanstephens Oct 24, 2025
f9c1711
handle tool calls ourselves so we can log them
jordanstephens Oct 24, 2025
279edbd
cleanup
jordanstephens Nov 4, 2025
24cab73
update nix vendor hash
jordanstephens Nov 4, 2025
d7eb83c
remove mcp deploy tool
jordanstephens Nov 5, 2025
7fc108d
capture term output for agent
jordanstephens Nov 5, 2025
0e83d88
remove unused project var
jordanstephens Nov 5, 2025
c03c359
simplify deployment tool output
jordanstephens Nov 5, 2025
f834f3f
limit logs tool to 100
jordanstephens Nov 5, 2025
10232d5
dont return "EOF" from logs tool
jordanstephens Nov 5, 2025
e695eb6
factor out ServiceMonitor
jordanstephens Nov 5, 2025
43c7d53
factor out PrintServiceInfos
jordanstephens Nov 5, 2025
8aaa23f
check service health when fetching status
jordanstephens Nov 5, 2025
7b52f1f
update getServices expectations
jordanstephens Nov 7, 2025
31aea0b
configure model temperature and max tokens
jordanstephens Nov 5, 2025
9e0ac05
update deploy tool description
jordanstephens Nov 5, 2025
3b9c279
skip inputs that are all whitespace
jordanstephens Nov 7, 2025
9f83827
agent should avoid term--print directly to stdout
jordanstephens Nov 7, 2025
11ee4f8
monitor deployments in the background
jordanstephens Nov 6, 2025
66c3756
send simple notification after startup
jordanstephens Nov 7, 2025
58a94c3
Revert "send simple notification after startup"
jordanstephens Nov 7, 2025
0a08d68
block during deployment
jordanstephens Nov 7, 2025
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
2 changes: 1 addition & 1 deletion pkgs/defang/cli.nix
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ buildGo124Module {
pname = "defang-cli";
version = "git";
src = lib.cleanSource ../../src;
vendorHash = "sha256-VYJjG99g66S8V6GzqdZngnHESaVkQ4C6Tl2VsFMVCLA="; # TODO: use fetchFromGitHub
vendorHash = "sha256-VKC3eh2cx7gTNymUTsaJxLgjpvt+TFhZW4HpRRoZdtg="; # TODO: use fetchFromGitHub

subPackages = [ "cmd/cli" ];

Expand Down
20 changes: 18 additions & 2 deletions src/cmd/cli/command/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (

"github.com/AlecAivazis/survey/v2"
"github.com/DefangLabs/defang/src/pkg"
"github.com/DefangLabs/defang/src/pkg/agent"
"github.com/DefangLabs/defang/src/pkg/cli"
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
"github.com/DefangLabs/defang/src/pkg/cli/client/byoc"
Expand All @@ -32,6 +33,7 @@ import (
"github.com/DefangLabs/defang/src/pkg/setup"
"github.com/DefangLabs/defang/src/pkg/surveyor"
"github.com/DefangLabs/defang/src/pkg/term"
"github.com/DefangLabs/defang/src/pkg/timeutils"
"github.com/DefangLabs/defang/src/pkg/track"
"github.com/DefangLabs/defang/src/pkg/types"
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
Expand Down Expand Up @@ -390,6 +392,20 @@ var RootCmd = &cobra.Command{

return err
},

RunE: func(cmd *cobra.Command, args []string) error {
if nonInteractive {
return nil
}

ctx := cmd.Context()
err := login.InteractiveRequireLoginAndToS(ctx, client, getCluster())
if err != nil {
return err
}

return agent.New(ctx, getCluster(), &providerID, agent.DefaultSystemPrompt).Start()
},
}

var loginCmd = &cobra.Command{
Expand Down Expand Up @@ -857,11 +873,11 @@ var debugCmd = &cobra.Command{
}

now := time.Now()
sinceTs, err := cli.ParseTimeOrDuration(since, now)
sinceTs, err := timeutils.ParseTimeOrDuration(since, now)
if err != nil {
return fmt.Errorf("invalid 'since' time: %w", err)
}
untilTs, err := cli.ParseTimeOrDuration(until, now)
untilTs, err := timeutils.ParseTimeOrDuration(until, now)
if err != nil {
return fmt.Errorf("invalid 'until' time: %w", err)
}
Expand Down
9 changes: 5 additions & 4 deletions src/cmd/cli/command/compose.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/DefangLabs/defang/src/pkg/logs"
"github.com/DefangLabs/defang/src/pkg/modes"
"github.com/DefangLabs/defang/src/pkg/term"
"github.com/DefangLabs/defang/src/pkg/timeutils"
"github.com/DefangLabs/defang/src/pkg/track"
"github.com/DefangLabs/defang/src/pkg/types"
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
Expand Down Expand Up @@ -129,7 +130,7 @@ func makeComposeUpCmd() *cobra.Command {
term.Warnf("Defang cannot monitor status of the following managed service(s): %v.\n To check if the managed service is up, check the status of the service which depends on it.", managedServices)
}

deploy, project, err := cli.ComposeUp(ctx, project, client, provider, upload, mode)
deploy, project, err := cli.ComposeUp(ctx, client, provider, cli.ComposeUpParams{Project: project, UploadMode: upload, Mode: mode})
if err != nil {
return handleComposeUpErr(ctx, err, project, provider)
}
Expand Down Expand Up @@ -452,7 +453,7 @@ func makeComposeConfigCmd() *cobra.Command {
return err
}

_, _, err = cli.ComposeUp(ctx, project, client, provider, compose.UploadModeIgnore, modes.ModeUnspecified)
_, _, err = cli.ComposeUp(ctx, client, provider, cli.ComposeUpParams{Project: project, UploadMode: compose.UploadModeIgnore, Mode: modes.ModeUnspecified})
if !errors.Is(err, dryrun.ErrDryRun) {
return err
}
Expand Down Expand Up @@ -569,12 +570,12 @@ func handleLogsCmd(cmd *cobra.Command, args []string) error {
}

now := time.Now()
sinceTs, err := cli.ParseTimeOrDuration(since, now)
sinceTs, err := timeutils.ParseTimeOrDuration(since, now)
if err != nil {
return fmt.Errorf("invalid 'since' duration or time: %w", err)
}
sinceTs = sinceTs.UTC()
untilTs, err := cli.ParseTimeOrDuration(until, now)
untilTs, err := timeutils.ParseTimeOrDuration(until, now)
if err != nil {
return fmt.Errorf("invalid 'until' duration or time: %w", err)
}
Expand Down
4 changes: 2 additions & 2 deletions src/cmd/cli/command/mcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import (
"os"
"path/filepath"

agentTools "github.com/DefangLabs/defang/src/pkg/agent/tools"
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
"github.com/DefangLabs/defang/src/pkg/mcp"
"github.com/DefangLabs/defang/src/pkg/mcp/tools"
"github.com/DefangLabs/defang/src/pkg/term"
"github.com/mark3labs/mcp-go/server"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -50,7 +50,7 @@ var mcpServerCmd = &cobra.Command{

// Create a new MCP server
term.Debug("Creating MCP server")
s, err := mcp.NewDefangMCPServer(RootCmd.Version, cluster, &providerID, mcpClient, tools.DefaultToolCLI{})
s, err := mcp.NewDefangMCPServer(RootCmd.Version, cluster, &providerID, mcpClient, agentTools.DefaultToolCLI{})
if err != nil {
return fmt.Errorf("failed to create MCP server: %w", err)
}
Expand Down
100 changes: 57 additions & 43 deletions src/go.mod
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
module github.com/DefangLabs/defang/src

go 1.24
go 1.24.1

toolchain go1.24.5

replace github.com/spf13/cobra v1.8.0 => github.com/DefangLabs/cobra v1.8.0-defang

require (
cloud.google.com/go/artifactregistry v1.16.1
cloud.google.com/go/artifactregistry v1.17.1
cloud.google.com/go/cloudbuild v1.22.2
cloud.google.com/go/iam v1.5.0
cloud.google.com/go/iam v1.5.2
cloud.google.com/go/logging v1.13.0
cloud.google.com/go/resourcemanager v1.10.3
cloud.google.com/go/run v1.9.0
cloud.google.com/go/secretmanager v1.14.5
cloud.google.com/go/resourcemanager v1.10.6
cloud.google.com/go/run v1.9.3
cloud.google.com/go/secretmanager v1.14.7
cloud.google.com/go/storage v1.50.0
github.com/AlecAivazis/survey/v2 v2.3.7
github.com/DefangLabs/secret-detector v0.0.0-20250811234530-d4b4214cd679
Expand All @@ -35,17 +35,19 @@ require (
github.com/compose-spec/compose-go/v2 v2.7.2-0.20250715094302-8da9902241f9
github.com/digitalocean/godo v1.131.1
github.com/docker/docker v25.0.6+incompatible
github.com/firebase/genkit/go v1.0.5
github.com/golang-jwt/jwt/v5 v5.2.2
github.com/google/uuid v1.6.0
github.com/googleapis/gax-go/v2 v2.14.1
github.com/gorilla/websocket v1.5.0
github.com/googleapis/gax-go/v2 v2.14.2
github.com/gorilla/websocket v1.5.3
github.com/hashicorp/go-retryablehttp v0.7.7
github.com/hexops/gotextdiff v1.0.3
github.com/joho/godotenv v1.5.1
github.com/mark3labs/mcp-go v0.38.0
github.com/miekg/dns v1.1.59
github.com/moby/patternmatcher v0.6.0
github.com/muesli/termenv v0.15.2
github.com/openai/openai-go v1.12.0
github.com/opencontainers/image-spec v1.1.0-rc3
github.com/pelletier/go-toml/v2 v2.2.2
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c
Expand All @@ -55,40 +57,43 @@ require (
github.com/spf13/pflag v1.0.6
github.com/stretchr/testify v1.10.0
go.yaml.in/yaml/v3 v3.0.4
golang.org/x/mod v0.18.0
golang.org/x/oauth2 v0.29.0
golang.org/x/sys v0.32.0
golang.org/x/term v0.31.0
google.golang.org/api v0.229.0
google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb
google.golang.org/grpc v1.72.0
golang.org/x/mod v0.25.0
golang.org/x/oauth2 v0.30.0
golang.org/x/sys v0.34.0
golang.org/x/term v0.33.0
google.golang.org/api v0.236.0
google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2
google.golang.org/grpc v1.73.0
google.golang.org/protobuf v1.36.6
gopkg.in/yaml.v3 v3.0.1
)

require (
cel.dev/expr v0.20.0 // indirect
cel.dev/expr v0.23.0 // indirect
cloud.google.com/go v0.120.0 // indirect
cloud.google.com/go/auth v0.16.0 // indirect
cloud.google.com/go/auth v0.16.2 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/compute/metadata v0.6.0 // indirect
cloud.google.com/go/longrunning v0.6.6 // indirect
cloud.google.com/go/monitoring v1.24.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 // indirect
cloud.google.com/go/compute/metadata v0.7.0 // indirect
cloud.google.com/go/longrunning v0.6.7 // indirect
cloud.google.com/go/monitoring v1.24.2 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.52.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.52.0 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect
github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/creack/pty v1.1.21 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect
github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
github.com/go-jose/go-jose/v4 v4.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/goccy/go-yaml v1.17.1 // indirect
github.com/google/dotprompt/go v0.0.0-20250923103342-a8a91d1dff59 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
Expand All @@ -98,8 +103,9 @@ require (
github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf // indirect
github.com/invopop/jsonschema v0.13.0 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/mbleigh/raymond v0.0.0-20250414171441-6b3a58ab9e0a // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
Expand All @@ -110,18 +116,26 @@ require (
github.com/spf13/cast v1.7.1 // indirect
github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/tidwall/gjson v1.18.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/tidwall/sjson v1.2.5 // indirect
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
github.com/zeebo/errs v1.4.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect
golang.org/x/crypto v0.37.0 // indirect
golang.org/x/net v0.39.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250422160041-2d3770c4ea7f // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/net v0.41.0 // indirect
google.golang.org/genai v1.24.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
gopkg.in/ini.v1 v1.66.2 // indirect
)

Expand All @@ -145,7 +159,7 @@ require (
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
Expand All @@ -158,14 +172,14 @@ require (
github.com/moby/term v0.5.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
go.opentelemetry.io/otel v1.36.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/sdk v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
golang.org/x/sync v0.13.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/time v0.11.0 // indirect
golang.org/x/tools v0.22.0 // indirect
go.opentelemetry.io/otel/metric v1.36.0 // indirect
go.opentelemetry.io/otel/sdk v1.36.0 // indirect
go.opentelemetry.io/otel/trace v1.36.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
)
Loading
Loading