Skip to content

Commit 0a95e07

Browse files
committed
Merge remote-tracking branch 'origin/main' into yuval-k/auth-framework
2 parents 35f46b5 + 43b0393 commit 0a95e07

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1005
-657
lines changed

.github/workflows/ci.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ jobs:
8787
if: success()
8888
working-directory: go
8989
run: |
90-
export KAGENT_API_URL="http://$(kubectl get svc -n kagent kagent-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}'):8083/api"
91-
echo $KAGENT_API_URL
90+
export KAGENT_URL="http://$(kubectl get svc -n kagent kagent-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}'):8083"
91+
echo $KAGENT_URL
9292
9393
go test -v github.com/kagent-dev/kagent/go/test/e2e
9494
- name: fail print info

Makefile

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ TOOLS_IMAGE_BUILD_ARGS += --build-arg TOOLS_BUN_VERSION=$(TOOLS_BUN_VERSION)
6363
TOOLS_IMAGE_BUILD_ARGS += --build-arg TOOLS_PYTHON_VERSION=$(TOOLS_PYTHON_VERSION)
6464
TOOLS_IMAGE_BUILD_ARGS += --build-arg TOOLS_NODE_VERSION=$(TOOLS_NODE_VERSION)
6565

66+
# kmcp version extraction from go.mod
67+
KMCP_VERSION ?= $(shell $(AWK) '/github\.com\/kagent-dev\/kmcp/ { print substr($$2, 2) }' go/go.mod)
68+
6669
HELM_ACTION=upgrade --install
6770

6871
# Helm chart variables
@@ -76,6 +79,7 @@ print-tools-versions:
7679
@echo "Tools Node : $(TOOLS_NODE_VERSION)"
7780
@echo "Tools Istio : $(TOOLS_ISTIO_VERSION)"
7881
@echo "Tools Argo CD: $(TOOLS_ARGO_CD_VERSION)"
82+
@echo "KMCP Version : $(KMCP_VERSION)"
7983

8084
# Check if OPENAI_API_KEY is set
8185
check-openai-key:
@@ -104,8 +108,8 @@ push-test-agent: build-kagent-adk
104108

105109
.PHONY: create-kind-cluster
106110
create-kind-cluster:
107-
sh ./scripts/kind/setup-kind.sh
108-
sh ./scripts/kind/setup-metallb.sh
111+
bash ./scripts/kind/setup-kind.sh
112+
bash ./scripts/kind/setup-metallb.sh
109113

110114
.PHONY: use-kind-cluster
111115
use-kind-cluster:
@@ -248,7 +252,7 @@ helm-install-provider: helm-version check-openai-key
248252
--history-max 2 \
249253
--timeout 5m \
250254
--kube-context kind-$(KIND_CLUSTER_NAME) \
251-
--version 0.1.2 \
255+
--version $(KMCP_VERSION) \
252256
--wait
253257
helm $(HELM_ACTION) kagent-crds helm/kagent-crds \
254258
--namespace kagent \
@@ -316,7 +320,7 @@ kagent-cli-install: use-kind-cluster build-cli-local helm-version
316320
.PHONY: kagent-cli-port-forward
317321
kagent-cli-port-forward: use-kind-cluster
318322
@echo "Port forwarding to kagent CLI..."
319-
kubectl port-forward -n kagent service/kagent 8081:8081 8082:80 8084:8084
323+
kubectl port-forward -n kagent service/kagent-controller 8083:8083
320324

321325
.PHONY: kagent-addon-install
322326
kagent-addon-install: use-kind-cluster

go/Makefile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ BUILD_DATE := $(shell date -u '+%Y-%m-%d')
22
GIT_COMMIT := $(shell git rev-parse --short HEAD || echo "unknown")
33
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null | sed 's/-dirty//' | grep v || echo "v0.0.0-$(GIT_COMMIT)")
44

5+
# get kmcp version from go.mod
6+
AWK ?= $(shell command -v gawk || command -v awk)
7+
KMCP_VERSION ?= $(shell $(AWK) '/github\.com\/kagent-dev\/kmcp/ { print substr($$2, 2) }' go.mod)
8+
59
LDFLAGS := -X github.com/kagent-dev/kagent/go/internal/version.Version=$(VERSION) \
610
-X github.com/kagent-dev/kagent/go/internal/version.GitCommit=$(GIT_COMMIT) \
7-
-X github.com/kagent-dev/kagent/go/internal/version.BuildDate=$(BUILD_DATE)
11+
-X github.com/kagent-dev/kagent/go/internal/version.BuildDate=$(BUILD_DATE) \
12+
-X github.com/kagent-dev/kagent/go/internal/version.KmcpVersion=$(KMCP_VERSION)
813

914
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
1015
ifeq (,$(shell go env GOBIN))

go/cli/Makefile

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@ VERSION ?= dev
22
GIT_COMMIT := $(shell git rev-parse --short HEAD || echo "unknown")
33
BUILD_DATE := $(shell date -u '+%Y-%m-%d')
44

5-
LDFLAGS := -X github.com/kagent-dev/kagent/go/internal/version=$(VERSION) \
6-
-X github.com/kagent-dev/kagent/go/internal/version=$(GIT_COMMIT) \
7-
-X github.com/kagent-dev/kagent/go/internal/version=$(BUILD_DATE)
5+
# get kmcp version from go.mod
6+
KMCP_VERSION ?= $(shell $(AWK) '/github\.com\/kagent-dev\/kmcp/ { print substr($$2, 2) }' go/go.mod)
7+
8+
LDFLAGS := -X github.com/kagent-dev/kagent/go/internal/version.Version=$(VERSION) \
9+
-X github.com/kagent-dev/kagent/go/internal/version.GitCommit=$(GIT_COMMIT) \
10+
-X github.com/kagent-dev/kagent/go/internal/version.BuildDate=$(BUILD_DATE) \
11+
-X github.com/kagent-dev/kagent/go/internal/version.KmcpVersion=$(KMCP_VERSION)
812

913
.PHONY: build
1014
build:

go/cli/cmd/kagent/main.go

Lines changed: 81 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"os"
7-
"os/exec"
87
"strings"
98

109
"github.com/abiosoft/ishell/v2"
@@ -29,7 +28,8 @@ func main() {
2928

3029
cfg := &config.Config{}
3130

32-
rootCmd.PersistentFlags().StringVar(&cfg.APIURL, "api-url", "http://localhost:8083/api", "API URL")
31+
rootCmd.PersistentFlags().StringVar(&cfg.KAgentURL, "kagent-url", "http://localhost:8083", "KAgent URL")
32+
// rootCmd.PersistentFlags().StringVar(&cfg.UserID, "user-id", "admin@kagent.dev", "User ID")
3333
rootCmd.PersistentFlags().StringVarP(&cfg.Namespace, "namespace", "n", "kagent", "Namespace")
3434
rootCmd.PersistentFlags().StringVarP(&cfg.OutputFormat, "output-format", "o", "table", "Output format")
3535
rootCmd.PersistentFlags().BoolVarP(&cfg.Verbose, "verbose", "v", false, "Verbose output")
@@ -62,6 +62,7 @@ func main() {
6262
Run: func(cmd *cobra.Command, args []string) {
6363
cli.InvokeCmd(cmd.Context(), invokeCfg)
6464
},
65+
Example: `kagent invoke --agent "k8s-agent" --task "Get all the pods in the kagent namespace"`,
6566
}
6667

6768
invokeCmd.Flags().StringVarP(&invokeCfg.Task, "task", "t", "", "Task")
@@ -77,9 +78,13 @@ func main() {
7778
Short: "Generate a bug report",
7879
Long: `Generate a bug report`,
7980
Run: func(cmd *cobra.Command, args []string) {
80-
client := client.New(cfg.APIURL)
81+
client := client.New(cfg.KAgentURL)
8182
if err := cli.CheckServerConnection(client); err != nil {
82-
pf := cli.NewPortForward(ctx, cfg)
83+
pf, err := cli.NewPortForward(ctx, cfg)
84+
if err != nil {
85+
fmt.Fprintf(os.Stderr, "Error starting port-forward: %v\n", err)
86+
return
87+
}
8388
defer pf.Stop()
8489
}
8590
cli.BugReportCmd(cfg)
@@ -91,9 +96,13 @@ func main() {
9196
Short: "Print the kagent version",
9297
Long: `Print the kagent version`,
9398
Run: func(cmd *cobra.Command, args []string) {
94-
client := client.New(cfg.APIURL)
99+
client := client.New(cfg.KAgentURL)
95100
if err := cli.CheckServerConnection(client); err != nil {
96-
pf := cli.NewPortForward(ctx, cfg)
101+
pf, err := cli.NewPortForward(ctx, cfg)
102+
if err != nil {
103+
fmt.Fprintf(os.Stderr, "Error starting port-forward: %v\n", err)
104+
return
105+
}
97106
defer pf.Stop()
98107
}
99108
cli.VersionCmd(cfg)
@@ -125,9 +134,13 @@ func main() {
125134
Short: "Get a session or list all sessions",
126135
Long: `Get a session by ID or list all sessions`,
127136
Run: func(cmd *cobra.Command, args []string) {
128-
client := client.New(cfg.APIURL)
137+
client := client.New(cfg.KAgentURL)
129138
if err := cli.CheckServerConnection(client); err != nil {
130-
pf := cli.NewPortForward(ctx, cfg)
139+
pf, err := cli.NewPortForward(ctx, cfg)
140+
if err != nil {
141+
fmt.Fprintf(os.Stderr, "Error starting port-forward: %v\n", err)
142+
return
143+
}
131144
defer pf.Stop()
132145
}
133146
resourceName := ""
@@ -143,9 +156,12 @@ func main() {
143156
Short: "Get an agent or list all agents",
144157
Long: `Get an agent by name or list all agents`,
145158
Run: func(cmd *cobra.Command, args []string) {
146-
client := client.New(cfg.APIURL)
159+
client := client.New(cfg.KAgentURL)
147160
if err := cli.CheckServerConnection(client); err != nil {
148-
pf := cli.NewPortForward(ctx, cfg)
161+
pf, err := cli.NewPortForward(ctx, cfg)
162+
if err != nil {
163+
return
164+
}
149165
defer pf.Stop()
150166
}
151167
resourceName := ""
@@ -161,9 +177,13 @@ func main() {
161177
Short: "Get tools",
162178
Long: `List all available tools`,
163179
Run: func(cmd *cobra.Command, args []string) {
164-
client := client.New(cfg.APIURL)
180+
client := client.New(cfg.KAgentURL)
165181
if err := cli.CheckServerConnection(client); err != nil {
166-
pf := cli.NewPortForward(ctx, cfg)
182+
pf, err := cli.NewPortForward(ctx, cfg)
183+
if err != nil {
184+
fmt.Fprintf(os.Stderr, "Error starting port-forward: %v\n", err)
185+
return
186+
}
167187
defer pf.Stop()
168188
}
169189
cli.GetToolCmd(cfg)
@@ -186,34 +206,34 @@ func main() {
186206

187207
}
188208

209+
const (
210+
portForwardKey = "[port-forward]"
211+
)
212+
189213
func runInteractive() {
190214
cfg, err := config.Get()
191215
if err != nil {
192216
fmt.Fprintf(os.Stderr, "Error getting config: %v\n", err)
193217
os.Exit(1)
194218
}
195219

196-
client := client.New(cfg.APIURL, client.WithUserID("admin@kagent.dev"))
220+
client := client.New(cfg.KAgentURL, client.WithUserID("admin@kagent.dev"))
197221
ctx, cancel := context.WithCancel(context.Background())
198-
cmd := exec.CommandContext(ctx, "kubectl", "-n", "kagent", "port-forward", "service/kagent", "8081:8081")
199-
// Error connecting to server, port-forward the server
200-
go func() {
201-
if err := cmd.Start(); err != nil {
222+
defer cancel()
223+
224+
// Start port forward and ensure it is healthy.
225+
var pf *cli.PortForward
226+
hasPortForward := true
227+
if err := cli.CheckServerConnection(client); err != nil {
228+
pf, err = cli.NewPortForward(ctx, cfg)
229+
if err != nil {
230+
// For interactive mode, we don't want to exit the program if the port-forward fails.
231+
// It is possible to open the interactive shell while kagent is not installed, which would mean that we can't port-forward.
232+
202233
fmt.Fprintf(os.Stderr, "Error starting port-forward: %v\n", err)
203-
os.Exit(1)
234+
hasPortForward = false
204235
}
205-
}()
206-
// Ensure the context is cancelled when the shell is closed
207-
defer func() {
208-
cancel()
209-
// cmd.Wait()
210-
if err := cmd.Wait(); err != nil {
211-
// These 2 errors are expected
212-
if !strings.Contains(err.Error(), "signal: killed") && !strings.Contains(err.Error(), "exec: not started") {
213-
fmt.Fprintf(os.Stderr, "Error waiting for port-forward to exit: %v\n", err)
214-
}
215-
}
216-
}()
236+
}
217237

218238
homeDir, err := os.UserHomeDir()
219239
if err != nil {
@@ -224,10 +244,18 @@ func runInteractive() {
224244
// create new shell.
225245
// by default, new shell includes 'exit', 'help' and 'clear' commands.
226246
shell := ishell.New()
247+
if pf != nil {
248+
shell.Set(portForwardKey, pf)
249+
}
250+
227251
config.SetHistoryPath(homeDir, shell)
228252
if err := shell.ClearScreen(); err != nil {
229253
fmt.Fprintf(os.Stderr, "Error clearing screen: %v\n", err)
230254
}
255+
256+
if !hasPortForward {
257+
shell.Println(cli.ErrServerConnection)
258+
}
231259
shell.Println("Welcome to kagent CLI. Type 'help' to see available commands.", strings.Repeat(" ", 10))
232260

233261
config.SetCfg(shell, cfg)
@@ -244,7 +272,7 @@ The available run types are:
244272
- chat: Start a chat with a kagent agent.
245273
246274
Examples:
247-
- run chat [team_name] -s [session_name]
275+
- run chat [agent_name] -s [session_name]
248276
- run chat
249277
`,
250278
}
@@ -255,12 +283,12 @@ Examples:
255283
Help: "Start a chat with a kagent agent.",
256284
LongHelp: `Start a chat with a kagent agent.
257285
258-
If no team name is provided, then a list of available teams will be provided to select from.
286+
If no agent name is provided, then a list of available agents will be provided to select from.
259287
If no session name is provided, then a new session will be created and the chat will be associated with it.
260288
261289
Examples:
262-
- chat [team_name] -s [session_name]
263-
- chat [team_name]
290+
- chat [agent_name] -s [session_name]
291+
- chat [agent_name]
264292
- chat
265293
`,
266294
Func: func(c *ishell.Context) {
@@ -393,6 +421,10 @@ Example:
393421
Aliases: []string{"v"},
394422
Help: "Print the kagent version.",
395423
Func: func(c *ishell.Context) {
424+
if err := cli.CheckServerConnection(client); err != nil {
425+
c.Println(err)
426+
return
427+
}
396428
cli.VersionCmd(cfg)
397429
c.SetPrompt(config.BoldBlue("kagent >> "))
398430
},
@@ -404,7 +436,10 @@ Example:
404436
Help: "Install kagent.",
405437
Func: func(c *ishell.Context) {
406438
cfg := config.GetCfg(c)
407-
cli.InstallCmd(ctx, cfg)
439+
if pf := cli.InstallCmd(ctx, cfg); pf != nil {
440+
// Set the port-forward to the shell.
441+
shell.Set(portForwardKey, pf)
442+
}
408443
},
409444
})
410445

@@ -419,6 +454,11 @@ Example:
419454
}
420455
cfg := config.GetCfg(c)
421456
cli.UninstallCmd(ctx, cfg)
457+
// Safely stop the port-forward if it is running.
458+
if pf := shell.Get(portForwardKey); pf != nil {
459+
pf.(*cli.PortForward).Stop()
460+
shell.Del(portForwardKey)
461+
}
422462
},
423463
})
424464

@@ -436,5 +476,11 @@ Example:
436476
},
437477
})
438478

479+
defer func() {
480+
if pf := shell.Get(portForwardKey); pf != nil {
481+
pf.(*cli.PortForward).Stop()
482+
shell.Del(portForwardKey)
483+
}
484+
}()
439485
shell.Run()
440486
}

go/cli/internal/cli/bug_report.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func BugReportCmd(cfg *config.Config) {
2323
fmt.Println("Gathering bug report information...")
2424

2525
// Get Agent, ModelConfig, and ToolServers YAMLs
26-
resources := []string{"agent", "modelconfig", "toolserver"}
26+
resources := []string{"agent", "modelconfig", "toolserver", "mcpserver", "remotemcpserver"}
2727
for _, resource := range resources {
2828
cmd := exec.Command("kubectl", "get", resource, "-n", cfg.Namespace, "-o", "yaml")
2929
output, err := cmd.CombinedOutput()

0 commit comments

Comments
 (0)