From 536ac0976c8301ce6ad4055943c4b847ddebde53 Mon Sep 17 00:00:00 2001 From: n9te9 Date: Mon, 23 Mar 2026 11:18:33 +0900 Subject: [PATCH 1/5] feat: experimental agent tui --- go/core/cli/cmd/kagent/main.go | 14 ++- go/core/cli/internal/cli/agent/run.go | 6 ++ go/core/cli/internal/experimental_tui/app.go | 29 +++++ .../experimental_tui/component/guage.go | 27 +++++ .../experimental_tui/component/status.go | 18 ++++ .../experimental_tui/component/table.go | 96 +++++++++++++++++ go/core/cli/internal/experimental_tui/demo.go | 35 ++++++ .../internal/experimental_tui/domain/agent.go | 101 ++++++++++++++++++ .../experimental_tui/domain/provider.go | 10 ++ .../experimental_tui/screen/agent_list.go | 62 +++++++++++ .../internal/experimental_tui/screen/root.go | 59 ++++++++++ 11 files changed, 456 insertions(+), 1 deletion(-) create mode 100644 go/core/cli/internal/experimental_tui/app.go create mode 100644 go/core/cli/internal/experimental_tui/component/guage.go create mode 100644 go/core/cli/internal/experimental_tui/component/status.go create mode 100644 go/core/cli/internal/experimental_tui/component/table.go create mode 100644 go/core/cli/internal/experimental_tui/demo.go create mode 100644 go/core/cli/internal/experimental_tui/domain/agent.go create mode 100644 go/core/cli/internal/experimental_tui/domain/provider.go create mode 100644 go/core/cli/internal/experimental_tui/screen/agent_list.go create mode 100644 go/core/cli/internal/experimental_tui/screen/root.go diff --git a/go/core/cli/cmd/kagent/main.go b/go/core/cli/cmd/kagent/main.go index 8792835b0..69975ccd7 100644 --- a/go/core/cli/cmd/kagent/main.go +++ b/go/core/cli/cmd/kagent/main.go @@ -427,7 +427,19 @@ Examples: runCmd.Flags().StringVar(&runCfg.ProjectDir, "project-dir", "", "Project directory (default: current directory)") runCmd.Flags().BoolVar(&runCfg.Build, "build", false, "Rebuild the Docker image before running") - rootCmd.AddCommand(installCmd, uninstallCmd, invokeCmd, bugReportCmd, versionCmd, dashboardCmd, getCmd, initCmd, buildCmd, deployCmd, addMcpCmd, runCmd, mcp.NewMCPCmd(), envdoc.NewEnvCmd()) + experimentalTuiCmd := &cobra.Command{ + Use: "experimental-tui", + Short: "Run the experimental TUI (for development/testing)", + Long: `Run the experimental TUI (for development/testing)`, + Run: func(cmd *cobra.Command, args []string) { + if err := cli.RunExperimentalTUI(cmd.Context(), runCfg); err != nil { + fmt.Fprintf(os.Stderr, "Error running experimental TUI: %v\n", err) + os.Exit(1) + } + }, + } + + rootCmd.AddCommand(installCmd, uninstallCmd, invokeCmd, bugReportCmd, versionCmd, dashboardCmd, getCmd, initCmd, buildCmd, deployCmd, addMcpCmd, runCmd, experimentalTuiCmd, mcp.NewMCPCmd(), envdoc.NewEnvCmd()) // Initialize config if err := config.Init(); err != nil { diff --git a/go/core/cli/internal/cli/agent/run.go b/go/core/cli/internal/cli/agent/run.go index 3adb7c390..f197ac5f7 100644 --- a/go/core/cli/internal/cli/agent/run.go +++ b/go/core/cli/internal/cli/agent/run.go @@ -11,6 +11,7 @@ import ( commonexec "github.com/kagent-dev/kagent/go/core/cli/internal/common/exec" "github.com/kagent-dev/kagent/go/core/cli/internal/config" + experimentaltui "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui" "github.com/kagent-dev/kagent/go/core/cli/internal/tui" a2aclient "trpc.group/trpc-go/trpc-a2a-go/client" "trpc.group/trpc-go/trpc-a2a-go/protocol" @@ -186,3 +187,8 @@ func waitForAgent(ctx context.Context, agentURL string, timeout time.Duration) e } } } + +func RunExperimentalTUI(ctx context.Context, cfg *RunCfg) error { + experimentaltui.Run() + return nil +} diff --git a/go/core/cli/internal/experimental_tui/app.go b/go/core/cli/internal/experimental_tui/app.go new file mode 100644 index 000000000..333515627 --- /dev/null +++ b/go/core/cli/internal/experimental_tui/app.go @@ -0,0 +1,29 @@ +package experimentaltui + +import ( + "fmt" + "os" + + tea "github.com/charmbracelet/bubbletea" + "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui/domain" + "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui/screen" +) + +var demoAgents = []domain.Agent{ + {ID: "1", Name: "Agent Alpha hogehogehogehogehogehogehogehogehogehoge", Status: domain.AgentStatusRunning, Provider: NewDemoProvider()}, + {ID: "2", Name: "Agent Beta", Status: domain.AgentStatusError, Provider: NewDemoProvider()}, + {ID: "3", Name: "Agent Gamma", Status: domain.AgentStatusFinished, Provider: NewDemoProvider()}, + {ID: "4", Name: "Agent Delta", Status: domain.AgentStatusStopped, Provider: NewDemoProvider()}, +} + +func Run() error { + m := screen.NewRootModel(screen.NewAgentListModel(demoAgents)) + + p := tea.NewProgram(m) + if _, err := p.Run(); err != nil { + fmt.Printf("Error running program: %v", err) + os.Exit(1) + } + + return nil +} diff --git a/go/core/cli/internal/experimental_tui/component/guage.go b/go/core/cli/internal/experimental_tui/component/guage.go new file mode 100644 index 000000000..323825852 --- /dev/null +++ b/go/core/cli/internal/experimental_tui/component/guage.go @@ -0,0 +1,27 @@ +package component + +import ( + "fmt" + "strings" + + "github.com/charmbracelet/lipgloss" + "github.com/kagent-dev/kagent/go/core/cli/internal/tui/theme" +) + +func RenderUsageGauge(rate float64, width int) string { + if rate < 0 { + rate = 0 + } else if rate > 1 { + rate = 1 + } + + filledWidth := int(rate * float64(width)) + emptyWidth := width - filledWidth + + barColor := theme.ColorPrimary + + filled := lipgloss.NewStyle().Foreground(barColor).Render(strings.Repeat("■", filledWidth)) + empty := lipgloss.NewStyle().Foreground(theme.ColorBorder).Render(strings.Repeat("■", emptyWidth)) + + return fmt.Sprintf("[%s%s] %3.0f%%", filled, empty, rate*100) +} diff --git a/go/core/cli/internal/experimental_tui/component/status.go b/go/core/cli/internal/experimental_tui/component/status.go new file mode 100644 index 000000000..b77041014 --- /dev/null +++ b/go/core/cli/internal/experimental_tui/component/status.go @@ -0,0 +1,18 @@ +package component + +import ( + "strings" + + "github.com/charmbracelet/lipgloss" + "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui/domain" +) + +var baseStatusStyle = lipgloss.NewStyle(). + Bold(true). + Padding(0, 1) + +func RenderStatusBadge(status domain.AgentStatus) string { + text := strings.ToUpper(string(status)) + + return text +} diff --git a/go/core/cli/internal/experimental_tui/component/table.go b/go/core/cli/internal/experimental_tui/component/table.go new file mode 100644 index 000000000..3cccf28cb --- /dev/null +++ b/go/core/cli/internal/experimental_tui/component/table.go @@ -0,0 +1,96 @@ +package component + +import ( + "fmt" + "strings" + + "github.com/charmbracelet/lipgloss" + "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui/domain" +) + +var ( + colIDWidth = 8 + colNameWidth = 20 + colStatusWidth = 12 + colGaugeWidth = 20 + + headerStyle = lipgloss.NewStyle(). + Bold(true) + + selectedRowStyle = lipgloss.NewStyle(). + Bold(true) + + normalRowStyle = lipgloss.NewStyle() +) + +type tableColumnWidth struct { + ID int + Name int + Status int + Gauge int +} + +func RenderTable(agents []domain.Agent, cursor int) string { + columnWidth := tableColumnWidth{ + ID: colIDWidth, + Name: colNameWidth, + Status: colStatusWidth, + Gauge: colGaugeWidth, + } + + for _, agent := range agents { + if w := lipgloss.Width(agent.ID); w > columnWidth.ID { + columnWidth.ID = w + } + if w := lipgloss.Width(agent.Name); w > columnWidth.Name { + columnWidth.Name = w + } + statusBadge := agent.Status + if w := lipgloss.Width(string(statusBadge)); w > columnWidth.Status { + columnWidth.Status = w + } + gauge := RenderUsageGauge(agent.ContextUsageRate(), colGaugeWidth) + if w := lipgloss.Width(gauge); w > columnWidth.Gauge { + columnWidth.Gauge = w + } + } + + header := fmt.Sprintf(" %-*s %-*s %-*s %-*s ", + columnWidth.ID, "ID", + columnWidth.Name, "NAME", + columnWidth.Status, "STATUS", + columnWidth.Gauge, "CONTEXT USAGE", + ) + + var b strings.Builder + b.WriteString(headerStyle.Render(header) + "\n") + for i, agent := range agents { + b.WriteString(RenderAgentRow(agent, i == cursor, columnWidth) + "\n") + } + return b.String() +} + +func RenderAgentRow(agent domain.Agent, selected bool, columnWidth tableColumnWidth) string { + statusBadge := strings.ToUpper(string(agent.Status)) + + gauge := RenderUsageGauge(agent.ContextUsageRate(), columnWidth.Gauge) + + visibleWidth := lipgloss.Width(statusBadge) + padding := columnWidth.Status - visibleWidth + if padding < 0 { + padding = 0 + } + paddedStatus := statusBadge + strings.Repeat(" ", padding) + + rowStr := fmt.Sprintf(" %-*s %-*s %-*s %-*s ", + columnWidth.ID, agent.ID, + columnWidth.Name, agent.Name, + columnWidth.Status, paddedStatus, + columnWidth.Gauge, gauge, + ) + if selected { + return selectedRowStyle.Render(rowStr) + } + + return normalRowStyle.Render(rowStr) +} diff --git a/go/core/cli/internal/experimental_tui/demo.go b/go/core/cli/internal/experimental_tui/demo.go new file mode 100644 index 000000000..047c8cffa --- /dev/null +++ b/go/core/cli/internal/experimental_tui/demo.go @@ -0,0 +1,35 @@ +package experimentaltui + +import "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui/domain" + +type DemoProvider struct{} + +var _ domain.ModelProvider = (*DemoProvider)(nil) + +func NewDemoProvider() *DemoProvider { + return &DemoProvider{} +} + +func (a *DemoProvider) Name() string { + return "Demo Model" +} + +func (a *DemoProvider) MaxContextTokens() int { + return 4096 +} + +func (a *DemoProvider) InputTokens() int { + return 100 +} + +func (a *DemoProvider) OutputTokens() int { + return 200 +} + +func (a *DemoProvider) TokenCost(input, output int) float64 { + return float64(input+output) * 0.0001 +} + +func (a *DemoProvider) SupportsThinking() bool { + return true +} diff --git a/go/core/cli/internal/experimental_tui/domain/agent.go b/go/core/cli/internal/experimental_tui/domain/agent.go new file mode 100644 index 000000000..aba54e7b8 --- /dev/null +++ b/go/core/cli/internal/experimental_tui/domain/agent.go @@ -0,0 +1,101 @@ +package domain + +import "time" + +type AgentStatus string + +const ( + AgentStatusRunning AgentStatus = "running" + AgentStatusStopped AgentStatus = "stopped" + AgentStatusError AgentStatus = "error" + AgentStatusFinished AgentStatus = "finished" +) + +type Agent struct { + ID string + Name string + Status AgentStatus + RestartCount int + UpdatedAt time.Time + CreatedAt time.Time + + Provider ModelProvider +} + +func NewAgent(id, name string, status AgentStatus, provider ModelProvider) Agent { + now := time.Now() + + return Agent{ + ID: id, + Name: name, + Status: status, + Provider: provider, + RestartCount: 0, + UpdatedAt: now, + CreatedAt: now, + } +} + +func (a Agent) WithProvider(provider ModelProvider) Agent { + a.Provider = provider + a.UpdatedAt = time.Now() + return a +} + +func (a Agent) WithStatus(status AgentStatus) Agent { + a.Status = status + a.UpdatedAt = time.Now() + return a +} + +func (a Agent) TotalCost() float64 { + // TODO: Implement cost calculation based on the provider's token usage and cost per token. + return 0. +} + +func (a Agent) ContextUsageRate() float64 { + max := a.Provider.MaxContextTokens() + if max == 0 { + return 0 + } + + current := float64(a.Provider.InputTokens() + a.Provider.OutputTokens()) + return current / float64(max) +} + +func (a Agent) TokenRatio() (int, int) { + return a.Provider.InputTokens(), a.Provider.OutputTokens() +} + +func (a Agent) LastResponseTime() time.Duration { + // TODO: Implement logic to track the time taken for the last response from the model provider. + return 0 +} + +func (a Agent) Throughput() float64 { + // TODO: Implement logic to calculate the number of tokens processed per second. + return 0 +} + +func (a Agent) Latency() time.Duration { + // TODO: Implement logic to determine if the agent is experiencing latency issues based on response times and throughput. + return 0 +} + +func (a Agent) TotalSuccessRate() float64 { + // TODO: Implement logic to calculate the total success rate of the agent's operations. + return 0 +} + +func (a Agent) ThoughtSteps() int { + // TODO: Implement logic to count the number of thought steps taken by the agent, if supported by the provider. + return 0 +} + +func (a Agent) Model() string { + return a.Provider.Name() +} + +func (a Agent) Uptime() time.Duration { + return time.Since(a.CreatedAt) +} diff --git a/go/core/cli/internal/experimental_tui/domain/provider.go b/go/core/cli/internal/experimental_tui/domain/provider.go new file mode 100644 index 000000000..c46b357be --- /dev/null +++ b/go/core/cli/internal/experimental_tui/domain/provider.go @@ -0,0 +1,10 @@ +package domain + +type ModelProvider interface { + Name() string + MaxContextTokens() int + InputTokens() int + OutputTokens() int + TokenCost(input, output int) float64 + SupportsThinking() bool +} diff --git a/go/core/cli/internal/experimental_tui/screen/agent_list.go b/go/core/cli/internal/experimental_tui/screen/agent_list.go new file mode 100644 index 000000000..b8383040f --- /dev/null +++ b/go/core/cli/internal/experimental_tui/screen/agent_list.go @@ -0,0 +1,62 @@ +package screen + +import ( + "strings" + + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" + "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui/component" + "github.com/kagent-dev/kagent/go/core/cli/internal/experimental_tui/domain" +) + +type AgentListModel struct { + agents []domain.Agent + cursor int +} + +func NewAgentListModel(agents []domain.Agent) *AgentListModel { + return &AgentListModel{ + agents: agents, + cursor: 0, + } +} + +func (m AgentListModel) Init() tea.Cmd { + return nil +} + +func (m AgentListModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "ctrl+c", "q": + return m, tea.Quit + case "up", "k": + if m.cursor > 0 { + m.cursor-- + } + case "down", "j": + if m.cursor < len(m.agents)-1 { + m.cursor++ + } + case "enter": + // TODO: Push a new screen for the selected agent's chat interface + } + } + return m, nil +} + +func (m AgentListModel) View() string { + var b strings.Builder + titleStyle := lipgloss.NewStyle().Bold(true).Underline(true).Padding(0, 1) + b.WriteString(titleStyle.Render("Agent List") + "\n\n") + + table := component.RenderTable(m.agents, m.cursor) + b.WriteString(table) + + footerStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("#4C566A")).Padding(1, 0, 0, 1) + b.WriteString(footerStyle.Render(" Chat Quit Navigate")) + b.WriteString("\n") + + return b.String() +} diff --git a/go/core/cli/internal/experimental_tui/screen/root.go b/go/core/cli/internal/experimental_tui/screen/root.go new file mode 100644 index 000000000..67e448087 --- /dev/null +++ b/go/core/cli/internal/experimental_tui/screen/root.go @@ -0,0 +1,59 @@ +package screen + +import tea "github.com/charmbracelet/bubbletea" + +type PushScreenMessage struct { + Screen tea.Model +} + +type PopScreenMessage struct{} + +type RootModel struct { + stack []tea.Model +} + +func NewRootModel(initialScreen tea.Model) *RootModel { + return &RootModel{ + stack: []tea.Model{initialScreen}, + } +} + +func (m RootModel) Init() tea.Cmd { + if len(m.stack) == 0 { + return nil + } + + return m.stack[len(m.stack)-1].Init() +} + +func (m RootModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case PushScreenMessage: + m.stack = append(m.stack, msg.Screen) + return m, msg.Screen.Init() + case PopScreenMessage: + if len(m.stack) > 1 { + m.stack = m.stack[:len(m.stack)-1] + } + return m, nil + } + + if len(m.stack) == 0 { + return m, nil + } + + topIndex := len(m.stack) - 1 + top := m.stack[topIndex] + + updatedTop, cmd := top.Update(msg) + m.stack[topIndex] = updatedTop + + return m, cmd +} + +func (m RootModel) View() string { + if len(m.stack) == 0 { + return "" + } + return m.stack[len(m.stack)-1].View() +} From 0a4e80f155d5f85b5942ae9d821f8df3c86d4660 Mon Sep 17 00:00:00 2001 From: Jesus Munoz Date: Thu, 19 Mar 2026 15:36:07 +0100 Subject: [PATCH 2/5] feat: adding configurable ssh-hosts for git-based skills (#1525) Fixes https://github.com/kagent-dev/kagent/issues/1524 --------- Signed-off-by: Jesus Munoz Signed-off-by: n9te9 --- .../translator/agent/adk_api_translator.go | 41 ++++++++++++-- .../translator/agent/git_skills_test.go | 56 ++++++++++++++++--- .../translator/agent/skills-init.sh.tmpl | 7 +++ 3 files changed, 92 insertions(+), 12 deletions(-) diff --git a/go/core/internal/controller/translator/agent/adk_api_translator.go b/go/core/internal/controller/translator/agent/adk_api_translator.go index fb4b2ce16..d14de599c 100644 --- a/go/core/internal/controller/translator/agent/adk_api_translator.go +++ b/go/core/internal/controller/translator/agent/adk_api_translator.go @@ -1584,10 +1584,17 @@ func validateSubPath(p string) error { // skillsInitData holds the template data for the unified skills-init script. type skillsInitData struct { - AuthMountPath string // "/git-auth" or "" (for git auth) - GitRefs []gitRefData // git repos to clone - OCIRefs []ociRefData // OCI images to pull - InsecureOCI bool // --insecure flag for krane + AuthMountPath string // "/git-auth" or "" (for git auth) + GitRefs []gitRefData // git repos to clone + OCIRefs []ociRefData // OCI images to pull + InsecureOCI bool // --insecure flag for krane + SSHHosts []sshHostData // extra hosts to add to known_hosts via ssh-keyscan +} + +// sshHostData holds the host and optional port for an SSH known_hosts entry. +type sshHostData struct { + Host string // hostname or IP + Port string // port number, empty means default (22) } // gitRefData holds pre-computed fields for each git skill ref, used by the script template. @@ -1651,6 +1658,32 @@ func prepareSkillsInitData( if authSecretRef != nil { data.AuthMountPath = "/git-auth" + seenHosts := make(map[string]bool) + hostPattern := regexp.MustCompile(`^[A-Za-z0-9\.\-:]+$`) + portPattern := regexp.MustCompile(`^[0-9]+$`) + for _, ref := range gitRefs { + u, err := url.Parse(ref.URL) + if err != nil || u.Scheme != "ssh" { + continue + } + host := u.Hostname() + if host == "" || !hostPattern.MatchString(host) { + continue + } + port := u.Port() + if port == "22" { + port = "" // 22 is the SSH default; omit to avoid -p flag + } + if port != "" && !portPattern.MatchString(port) { + continue + } + key := host + ":" + port + if seenHosts[key] { + continue + } + seenHosts[key] = true + data.SSHHosts = append(data.SSHHosts, sshHostData{Host: host, Port: port}) + } } seen := make(map[string]bool) diff --git a/go/core/internal/controller/translator/agent/git_skills_test.go b/go/core/internal/controller/translator/agent/git_skills_test.go index 1d29e6c5b..a9205f87a 100644 --- a/go/core/internal/controller/translator/agent/git_skills_test.go +++ b/go/core/internal/controller/translator/agent/git_skills_test.go @@ -2,6 +2,7 @@ package agent_test import ( "context" + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -44,13 +45,14 @@ func Test_AdkApiTranslator_Skills(t *testing.T) { name string agent *v1alpha2.Agent // assertions - wantSkillsInit bool - wantSkillsVolume bool - wantContainsBranch string - wantContainsCommit string - wantContainsPath string - wantContainsKrane bool - wantAuthVolume bool + wantSkillsInit bool + wantSkillsVolume bool + wantContainsBranch string + wantContainsCommit string + wantContainsPath string + wantContainsKrane bool + wantAuthVolume bool + wantSSHKeyscanHosts []string // substrings expected in the ssh-keyscan lines }{ { name: "no skills - no init containers", @@ -215,6 +217,34 @@ func Test_AdkApiTranslator_Skills(t *testing.T) { wantSkillsVolume: true, wantAuthVolume: true, }, + { + name: "git skills with SSH URL and auth secret scans custom host", + agent: &v1alpha2.Agent{ + ObjectMeta: metav1.ObjectMeta{Name: "agent-ssh", Namespace: namespace}, + Spec: v1alpha2.AgentSpec{ + Type: v1alpha2.AgentType_Declarative, + Declarative: &v1alpha2.DeclarativeAgentSpec{ + SystemMessage: "test", + ModelConfig: modelName, + }, + Skills: &v1alpha2.SkillForAgent{ + GitAuthSecretRef: &corev1.LocalObjectReference{ + Name: "gitea-ssh-credentials", + }, + GitRefs: []v1alpha2.GitRepo{ + { + URL: "ssh://git@gitea-ssh.gitea:22/gitops/ssh-skills-repo.git", + Ref: "main", + }, + }, + }, + }, + }, + wantSkillsInit: true, + wantSkillsVolume: true, + wantAuthVolume: true, + wantSSHKeyscanHosts: []string{"gitea-ssh.gitea"}, + }, { name: "git skill with custom name", agent: &v1alpha2.Agent{ @@ -358,7 +388,7 @@ func Test_AdkApiTranslator_Skills(t *testing.T) { for _, v := range deployment.Spec.Template.Spec.Volumes { if v.Secret != nil && v.Name == "git-auth" { hasAuthVolume = true - assert.Equal(t, "github-token", v.Secret.SecretName, "auth volume should reference the correct secret") + assert.Equal(t, tt.agent.Spec.Skills.GitAuthSecretRef.Name, v.Secret.SecretName, "auth volume should reference the correct secret") } } assert.True(t, hasAuthVolume, "git-auth volume should exist") @@ -378,6 +408,16 @@ func Test_AdkApiTranslator_Skills(t *testing.T) { assert.Contains(t, script, "credential.helper") } + // Verify custom SSH hosts are scanned + if len(tt.wantSSHKeyscanHosts) > 0 { + require.NotNil(t, skillsInitContainer) + script := skillsInitContainer.Command[2] + for _, host := range tt.wantSSHKeyscanHosts { + expected := fmt.Sprintf("ssh-keyscan %s", host) + assert.Contains(t, script, expected, "script should ssh-keyscan custom host %q", host) + } + } + // Verify insecure flag for OCI skills if tt.agent.Spec.Skills != nil && tt.agent.Spec.Skills.InsecureSkipVerify { require.NotNil(t, skillsInitContainer) diff --git a/go/core/internal/controller/translator/agent/skills-init.sh.tmpl b/go/core/internal/controller/translator/agent/skills-init.sh.tmpl index 3226e1bc0..9cac78b5f 100644 --- a/go/core/internal/controller/translator/agent/skills-init.sh.tmpl +++ b/go/core/internal/controller/translator/agent/skills-init.sh.tmpl @@ -9,6 +9,13 @@ if [ -f "${_auth_mount}/ssh-privatekey" ]; then cp "${_auth_mount}/ssh-privatekey" ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan github.com gitlab.com bitbucket.org >> ~/.ssh/known_hosts +{{- range .SSHHosts }} + {{- if .Port }} + ssh-keyscan -p {{ .Port }} {{ .Host }} >> ~/.ssh/known_hosts + {{- else }} + ssh-keyscan {{ .Host }} >> ~/.ssh/known_hosts + {{- end }} +{{- end }} elif [ -f "${_auth_mount}/token" ]; then git config --global credential.helper "!f() { echo username=x-access-token; echo password=\$(cat ${_auth_mount}/token); }; f" fi From 6a315d8653f30edb291bb09d5dcf69f2752c5ce1 Mon Sep 17 00:00:00 2001 From: Eitan Yarmush Date: Thu, 19 Mar 2026 11:37:33 -0400 Subject: [PATCH 3/5] fix: bump dependency minimums to address active CVEs (#1526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - **PyJWT**: `>=2.8.0` → `>=2.12.0` — fixes CVE-2026-32597 (accepts unknown `crit` header extensions) - **pyOpenSSL**: `25.3.0` → `>=26.0.0` — fixes CVE-2026-27459 - **pyasn1**: `0.6.2` → `>=0.6.3` — fixes CVE-2026-30922 - **google.golang.org/grpc**: `v1.79.2` → `v1.79.3` — fixes CVE-2026-33186 (authorization bypass via missing leading slash in :path) - **kagent-tools** helm dep: `0.1.1` → `0.1.2` ## CVE Details | Package | CVE | Severity | Fixed In | |---------|-----|----------|----------| | google.golang.org/grpc | CVE-2026-33186 | CRITICAL | 1.79.3 | | PyJWT | CVE-2026-32597 | HIGH | 2.12.0 | | pyOpenSSL | CVE-2026-27459 | HIGH | 26.0.0 | | pyasn1 | CVE-2026-30922 | HIGH | 0.6.3 | ## Test plan - [ ] `uv sync` in Python workspace resolves without conflicts - [ ] `make -C python test` passes - [ ] `go mod tidy` succeeds with no diff - [ ] Trivy scan passes in CI 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Signed-off-by: Eitan Yarmush Co-authored-by: Claude Opus 4.6 (1M context) Signed-off-by: n9te9 --- go/go.mod | 10 +-- go/go.sum | 68 ++++---------------- helm/kagent/Chart-template.yaml | 2 +- python/packages/agentsts-adk/pyproject.toml | 2 +- python/packages/agentsts-core/pyproject.toml | 2 +- python/pyproject.toml | 2 + python/uv.lock | 31 +++++---- 7 files changed, 43 insertions(+), 74 deletions(-) diff --git a/go/go.mod b/go/go.mod index 9855348d7..d4999addb 100644 --- a/go/go.mod +++ b/go/go.mod @@ -58,6 +58,11 @@ require ( trpc.group/trpc-go/trpc-a2a-go v0.2.5 ) +require ( + github.com/testcontainers/testcontainers-go v0.41.0 + github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0 +) + require ( cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.123.0 // indirect @@ -121,7 +126,6 @@ require ( github.com/go-openapi/swag v0.23.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/goccy/go-json v0.10.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/cel-go v0.26.0 // indirect @@ -193,8 +197,6 @@ require ( github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/testcontainers/testcontainers-go v0.41.0 // indirect - github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -239,7 +241,7 @@ require ( google.golang.org/api v0.252.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/grpc v1.79.2 // indirect + google.golang.org/grpc v1.79.3 // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/apiextensions-apiserver v0.35.0 // indirect diff --git a/go/go.sum b/go/go.sum index 8bbae4ee4..d749a89d5 100644 --- a/go/go.sum +++ b/go/go.sum @@ -12,8 +12,8 @@ dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= entgo.io/ent v0.14.3 h1:wokAV/kIlH9TeklJWGGS7AYJdVckr0DloWjIcO9iIIQ= entgo.io/ent v0.14.3/go.mod h1:aDPE/OziPEu8+OWbzy4UlvWmD2/kbRuWfK2A40hcxJM= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= @@ -116,6 +116,8 @@ github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GK github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -126,20 +128,14 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -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 v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= -github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= @@ -195,8 +191,6 @@ github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9L github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -263,10 +257,6 @@ github.com/kagent-dev/kmcp v0.2.7 h1:aDPpsmJVYqigC0inZablon1ap7GDBi8R+KRqH3OFTM0 github.com/kagent-dev/kmcp v0.2.7/go.mod h1:g7wS/3m2wonRo/1DMwVoHxnilr/urPgV2hwV1DwkwrQ= github.com/kagent-dev/mockllm v0.0.5 h1:mm9Ml3NH6/E/YKVMgMwWYMNsNGkDze6I6TC0ppHZAo8= github.com/kagent-dev/mockllm v0.0.5/go.mod h1:tDLemRsTZa1NdHaDbg3sgFk9cT1QWvMPlBtLVD6I2mA= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -312,22 +302,22 @@ github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+Ei github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= 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/mdelapenya/tlscert v0.2.0 h1:7H81W6Z/4weDvZBNOfQte5GpIMo0lGYEeWbkGp5LJHI= +github.com/mdelapenya/tlscert v0.2.0/go.mod h1:O4njj3ELLnJjGdkN7M/vIVCpZ+Cf0L6muqOG4tLSl8o= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= -github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= github.com/moby/go-archive v0.2.0 h1:zg5QDUM2mi0JIM9fdQZWC7U8+2ZfixfTYoHL7rWUcP8= github.com/moby/go-archive v0.2.0/go.mod h1:mNeivT14o8xU+5q1YnNrkQVpK+dnNe/K6fHqnTg4qPU= 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/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modelcontextprotocol/go-sdk v1.4.0 h1:u0kr8lbJc1oBcawK7Df+/ajNMpIDFE41OEPxdeTLOn8= @@ -371,8 +361,6 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= @@ -402,8 +390,6 @@ github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/encoding v0.5.3 h1:OjMgICtcSFuNvQCdwqMCv9Tg7lEOXGwm1J5RPQccx6w= github.com/segmentio/encoding v0.5.3/go.mod h1:HS1ZKa3kSN32ZHVZ7ZLPLXWvOVIiZtyJnO1gPH1sKt0= -github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= -github.com/shirou/gopsutil/v4 v4.25.5/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= github.com/shirou/gopsutil/v4 v4.26.2 h1:X8i6sicvUFih4BmYIGT1m2wwgw2VG9YgrDTi7cIRGUI= github.com/shirou/gopsutil/v4 v4.26.2/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= @@ -438,8 +424,6 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/testcontainers/testcontainers-go v0.38.0 h1:d7uEapLcv2P8AvH8ahLqDMMxda2W9gQN1nRbHS28HBw= -github.com/testcontainers/testcontainers-go v0.38.0/go.mod h1:C52c9MoHpWO+C4aqmgSU+hxlR5jlEayWtgYrb8Pzz1w= github.com/testcontainers/testcontainers-go v0.41.0 h1:mfpsD0D36YgkxGj2LrIyxuwQ9i2wCKAD+ESsYM1wais= github.com/testcontainers/testcontainers-go v0.41.0/go.mod h1:pdFrEIfaPl24zmBjerWTTYaY0M6UHsqA1YSvsoU40MI= github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0 h1:AOtFXssrDlLm84A2sTTR/AhvJiYbrIuCO59d+Ro9Tb0= @@ -455,12 +439,8 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= @@ -485,8 +465,6 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= @@ -551,64 +529,40 @@ go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= @@ -623,8 +577,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1: google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= -google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -643,6 +597,8 @@ gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= k8s.io/api v0.35.1 h1:0PO/1FhlK/EQNVK5+txc4FuhQibV25VLSdLMmGpDE/Q= k8s.io/api v0.35.1/go.mod h1:28uR9xlXWml9eT0uaGo6y71xK86JBELShLy4wR1XtxM= k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= diff --git a/helm/kagent/Chart-template.yaml b/helm/kagent/Chart-template.yaml index 09e814810..edfa75f35 100644 --- a/helm/kagent/Chart-template.yaml +++ b/helm/kagent/Chart-template.yaml @@ -9,7 +9,7 @@ dependencies: repository: oci://ghcr.io/kagent-dev/kmcp/helm condition: kmcp.enabled - name: kagent-tools - version: 0.1.1 + version: 0.1.2 repository: oci://ghcr.io/kagent-dev/tools/helm condition: kagent-tools.enabled - name: grafana-mcp diff --git a/python/packages/agentsts-adk/pyproject.toml b/python/packages/agentsts-adk/pyproject.toml index 7eb2c8f54..85d8b5605 100644 --- a/python/packages/agentsts-adk/pyproject.toml +++ b/python/packages/agentsts-adk/pyproject.toml @@ -17,7 +17,7 @@ dependencies = [ "typing-extensions>=4.8.0", "aiofiles>=24.1.0", "anyio>=4.9.0", - "PyJWT>=2.8.0", + "PyJWT>=2.12.0", ] [tool.uv.sources] diff --git a/python/packages/agentsts-core/pyproject.toml b/python/packages/agentsts-core/pyproject.toml index 3e737dab5..73cd54cb4 100644 --- a/python/packages/agentsts-core/pyproject.toml +++ b/python/packages/agentsts-core/pyproject.toml @@ -12,7 +12,7 @@ dependencies = [ "pydantic>=2.5.0", "typing-extensions>=4.8.0", "cryptography>=41.0.0", # For JWT handling - "PyJWT>=2.8.0", # For JWT token parsing + "PyJWT>=2.12.0", # For JWT token parsing ] [project.optional-dependencies] diff --git a/python/pyproject.toml b/python/pyproject.toml index c54377b47..8435a0ffa 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -13,6 +13,8 @@ dev = [ constraint-dependencies = [ "cryptography>=46.0.5", "jaraco-context>=6.1.0", + "pyasn1>=0.6.3", + "pyopenssl>=26.0.0", "wheel>=0.46.2", ] diff --git a/python/uv.lock b/python/uv.lock index 3997b9ef8..63e439ded 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -27,6 +27,8 @@ members = [ constraints = [ { name = "cryptography", specifier = ">=46.0.5" }, { name = "jaraco-context", specifier = ">=6.1.0" }, + { name = "pyasn1", specifier = ">=0.6.3" }, + { name = "pyopenssl", specifier = ">=26.0.0" }, { name = "wheel", specifier = ">=0.46.2" }, ] @@ -95,7 +97,7 @@ requires-dist = [ { name = "google-genai", specifier = ">=1.21.1" }, { name = "httpx", specifier = ">=0.25.0" }, { name = "pydantic", specifier = ">=2.5.0" }, - { name = "pyjwt", specifier = ">=2.8.0" }, + { name = "pyjwt", specifier = ">=2.12.0" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.3.5" }, { name = "pytest-asyncio", marker = "extra == 'test'", specifier = ">=0.25.3" }, { name = "pytest-mock", marker = "extra == 'test'", specifier = ">=3.0.0" }, @@ -127,7 +129,7 @@ requires-dist = [ { name = "cryptography", specifier = ">=41.0.0" }, { name = "httpx", specifier = ">=0.25.0" }, { name = "pydantic", specifier = ">=2.5.0" }, - { name = "pyjwt", specifier = ">=2.8.0" }, + { name = "pyjwt", specifier = ">=2.12.0" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=7.0.0" }, { name = "pytest-asyncio", marker = "extra == 'test'", specifier = ">=0.21.0" }, { name = "pytest-mock", marker = "extra == 'test'", specifier = ">=3.0.0" }, @@ -1753,6 +1755,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/92/db/b4c12cff13ebac2786f4f217f06588bccd8b53d260453404ef22b121fc3a/greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be", size = 268977, upload-time = "2025-06-05T16:10:24.001Z" }, { url = "https://files.pythonhosted.org/packages/52/61/75b4abd8147f13f70986df2801bf93735c1bd87ea780d70e3b3ecda8c165/greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac", size = 627351, upload-time = "2025-06-05T16:38:50.685Z" }, { url = "https://files.pythonhosted.org/packages/35/aa/6894ae299d059d26254779a5088632874b80ee8cf89a88bca00b0709d22f/greenlet-3.2.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a433dbc54e4a37e4fff90ef34f25a8c00aed99b06856f0119dcf09fbafa16392", size = 638599, upload-time = "2025-06-05T16:41:34.057Z" }, + { url = "https://files.pythonhosted.org/packages/30/64/e01a8261d13c47f3c082519a5e9dbf9e143cc0498ed20c911d04e54d526c/greenlet-3.2.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:72e77ed69312bab0434d7292316d5afd6896192ac4327d44f3d613ecb85b037c", size = 634482, upload-time = "2025-06-05T16:48:16.26Z" }, { url = "https://files.pythonhosted.org/packages/47/48/ff9ca8ba9772d083a4f5221f7b4f0ebe8978131a9ae0909cf202f94cd879/greenlet-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68671180e3849b963649254a882cd544a3c75bfcd2c527346ad8bb53494444db", size = 633284, upload-time = "2025-06-05T16:13:01.599Z" }, { url = "https://files.pythonhosted.org/packages/e9/45/626e974948713bc15775b696adb3eb0bd708bec267d6d2d5c47bb47a6119/greenlet-3.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49c8cfb18fb419b3d08e011228ef8a25882397f3a859b9fe1436946140b6756b", size = 582206, upload-time = "2025-06-05T16:12:48.51Z" }, { url = "https://files.pythonhosted.org/packages/b1/8e/8b6f42c67d5df7db35b8c55c9a850ea045219741bb14416255616808c690/greenlet-3.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:efc6dc8a792243c31f2f5674b670b3a95d46fa1c6a912b8e310d6f542e7b0712", size = 1111412, upload-time = "2025-06-05T16:36:45.479Z" }, @@ -1761,6 +1764,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fc/2e/d4fcb2978f826358b673f779f78fa8a32ee37df11920dc2bb5589cbeecef/greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822", size = 270219, upload-time = "2025-06-05T16:10:10.414Z" }, { url = "https://files.pythonhosted.org/packages/16/24/929f853e0202130e4fe163bc1d05a671ce8dcd604f790e14896adac43a52/greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83", size = 630383, upload-time = "2025-06-05T16:38:51.785Z" }, { url = "https://files.pythonhosted.org/packages/d1/b2/0320715eb61ae70c25ceca2f1d5ae620477d246692d9cc284c13242ec31c/greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf", size = 642422, upload-time = "2025-06-05T16:41:35.259Z" }, + { url = "https://files.pythonhosted.org/packages/bd/49/445fd1a210f4747fedf77615d941444349c6a3a4a1135bba9701337cd966/greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b", size = 638375, upload-time = "2025-06-05T16:48:18.235Z" }, { url = "https://files.pythonhosted.org/packages/7e/c8/ca19760cf6eae75fa8dc32b487e963d863b3ee04a7637da77b616703bc37/greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147", size = 637627, upload-time = "2025-06-05T16:13:02.858Z" }, { url = "https://files.pythonhosted.org/packages/65/89/77acf9e3da38e9bcfca881e43b02ed467c1dedc387021fc4d9bd9928afb8/greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5", size = 585502, upload-time = "2025-06-05T16:12:49.642Z" }, { url = "https://files.pythonhosted.org/packages/97/c6/ae244d7c95b23b7130136e07a9cc5aadd60d59b5951180dc7dc7e8edaba7/greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc", size = 1114498, upload-time = "2025-06-05T16:36:46.598Z" }, @@ -1769,6 +1773,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992, upload-time = "2025-06-05T16:11:23.467Z" }, { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820, upload-time = "2025-06-05T16:38:52.882Z" }, { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046, upload-time = "2025-06-05T16:41:36.343Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701, upload-time = "2025-06-05T16:48:19.604Z" }, { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747, upload-time = "2025-06-05T16:13:04.628Z" }, { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461, upload-time = "2025-06-05T16:12:50.792Z" }, { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190, upload-time = "2025-06-05T16:36:48.59Z" }, @@ -1777,6 +1782,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" }, { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" }, { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" }, + { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" }, { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" }, { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" }, { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" }, @@ -4241,11 +4247,11 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.2" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, ] [[package]] @@ -4524,11 +4530,14 @@ wheels = [ [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] [package.optional-dependencies] @@ -4572,15 +4581,15 @@ wheels = [ [[package]] name = "pyopenssl" -version = "25.3.0" +version = "26.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/be/97b83a464498a79103036bc74d1038df4a7ef0e402cfaf4d5e113fb14759/pyopenssl-25.3.0.tar.gz", hash = "sha256:c981cb0a3fd84e8602d7afc209522773b94c1c2446a3c710a75b06fe1beae329", size = 184073, upload-time = "2025-09-17T00:32:21.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/11/a62e1d33b373da2b2c2cd9eb508147871c80f12b1cacde3c5d314922afdd/pyopenssl-26.0.0.tar.gz", hash = "sha256:f293934e52936f2e3413b89c6ce36df66a0b34ae1ea3a053b8c5020ff2f513fc", size = 185534, upload-time = "2026-03-15T14:28:26.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/81/ef2b1dfd1862567d573a4fdbc9f969067621764fbb74338496840a1d2977/pyopenssl-25.3.0-py3-none-any.whl", hash = "sha256:1fda6fc034d5e3d179d39e59c1895c9faeaf40a79de5fc4cbbfbe0d36f4a77b6", size = 57268, upload-time = "2025-09-17T00:32:19.474Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7d/d4f7d908fa8415571771b30669251d57c3cf313b36a856e6d7548ae01619/pyopenssl-26.0.0-py3-none-any.whl", hash = "sha256:df94d28498848b98cc1c0ffb8ef1e71e40210d3b0a8064c9d29571ed2904bf81", size = 57969, upload-time = "2026-03-15T14:28:24.864Z" }, ] [[package]] From cba11df99c6db622231ede7cb75a3b9f7035d485 Mon Sep 17 00:00:00 2001 From: Dmytro Rashko Date: Sat, 21 Mar 2026 19:24:21 +0100 Subject: [PATCH 4/5] code spaces (#1515) Signed-off-by: Dmytro Rashko Signed-off-by: Eitan Yarmush Co-authored-by: Eitan Yarmush Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: n9te9 --- .devcontainer/Dockerfile | 63 ++++++++++++++++++--------------- .devcontainer/devcontainer.json | 10 +++--- Makefile | 5 ++- 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 455e310b3..8ebfbe222 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -3,8 +3,7 @@ ARG DOCKER_REGISTRY=ghcr.io ARG TOOLS_UV_VERSION=latest ### STAGE 1: base image -FROM $DOCKER_REGISTRY/astral-sh/uv:${TOOLS_UV_VERSION}-bookworm-slim AS base-os -ARG TOOLS_NODE_VERSION +FROM $DOCKER_REGISTRY/astral-sh/uv:${TOOLS_UV_VERSION}-debian-slim AS base-os #ENVIRONMENT VARIABLES ENV DEBIAN_FRONTEND=noninteractive @@ -22,6 +21,7 @@ RUN mkdir -p /etc/apt/keyrings \ && ln -sf /usr/bin/python3 /usr/bin/python FROM base-os AS base +ARG TOOLS_NODE_VERSION # Install python RUN uv python install 3.12 @@ -40,24 +40,20 @@ RUN mkdir -p $NVM_DIR \ && nvm install $TOOLS_NODE_VERSION \ && nvm use $TOOLS_NODE_VERSION \ && which node && node --version \ - && ln -sf $NVM_DIR/versions/node/v$TOOLS_NODE_VERSION/bin/node /usr/bin/node + && ln -sf $NVM_DIR/versions/node/v$TOOLS_NODE_VERSION/bin/node /usr/bin/node \ + && ln -sf $NVM_DIR/versions/node/v$TOOLS_NODE_VERSION/bin/npm /usr/bin/npm \ + && ln -sf $NVM_DIR/versions/node/v$TOOLS_NODE_VERSION/bin/npx /usr/bin/npx -### STAGE 2: build + tools -FROM --platform=$BUILDPLATFORM base-os AS builder +### STAGE 2: build + tools (extends base to inherit Node.js and Python) +FROM --platform=$BUILDPLATFORM base AS builder ARG TARGETARCH -ARG TOOLS_ISTIO_VERSION -ARG TOOLS_ARGO_CD_VERSION RUN apt-get update && apt-get install -y --no-install-recommends \ bsdmainutils \ build-essential \ - ca-certificates \ conntrack \ - curl \ gettext-base \ - git \ - gnupg \ gnupg2 \ htop \ iperf3 \ @@ -71,13 +67,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ lsof \ net-tools \ netcat-openbsd \ - python3 \ python3-dev \ python3-pip \ python3-venv \ sshuttle \ tcpdump \ - wget \ zsh \ && curl -fsSL https://get.docker.com -o get-docker.sh \ && sh get-docker.sh \ @@ -87,30 +81,35 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ ### STAGE 3 add golang FROM builder AS node-python-golang +ARG TARGETARCH ARG TOOLS_GO_VERSION -ARG TOOLS_K9S_VERSION -ARG TOOLS_KIND_VERSION -ARG TOOLS_ISTIO_VERSION -ARG TOOLS_ARGO_CD_VERSION -ARG TOOLS_KUBECTL_VERSION ARG ARCH=${TARGETARCH:-amd64} #ENVIRONMENT VARIABLES -ENV DEBIAN_FRONTEND=noninteractive ENV GO111MODULE=on ENV GOTOOLCHAIN=local -ENV GOPROXY="http://proxy.golang.org" -ENV PATH=$PATH:/usr/local/go/bin +ENV GOPATH=/root/go +ENV GOBIN=$GOPATH/bin +ENV GOPROXY="https://proxy.golang.org,direct" +ENV PATH=$PATH:/usr/local/go/bin:$GOPATH/bin RUN --mount=type=cache,target=/cache,rw \ wget -q --show-progress -P /cache https://golang.org/dl/go${TOOLS_GO_VERSION}.linux-${ARCH}.tar.gz && \ tar -C /usr/local -xzf /cache/go${TOOLS_GO_VERSION}.linux-${ARCH}.tar.gz -### STAGE 3 add tools +### STAGE 4 add tools FROM --platform=$BUILDPLATFORM node-python-golang AS tools-node-python-golang +ARG TARGETARCH +ARG ARCH=${TARGETARCH:-amd64} +ARG TOOLS_K9S_VERSION +ARG TOOLS_KIND_VERSION +ARG TOOLS_ISTIO_VERSION +ARG TOOLS_ARGO_CD_VERSION +ARG TOOLS_KUBECTL_VERSION + # Install kubectl argo plugin -RUN curl -o /usr/local/bin/kubectl-argo-rollouts -L https://github.com/argoproj/argo-rollouts/releases/${TOOLS_ARGO_CD_VERSION}/download/kubectl-argo-rollouts-linux-${ARCH} \ +RUN curl -o /usr/local/bin/kubectl-argo-rollouts -L https://github.com/argoproj/argo-rollouts/releases/download/${TOOLS_ARGO_CD_VERSION}/kubectl-argo-rollouts-linux-${ARCH} \ && chmod +x /usr/local/bin/kubectl-argo-rollouts #Install Helm @@ -125,7 +124,7 @@ RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${TOOLS_ISTIO_VERSION && rm -rf istio-* # Install kind -RUN curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-$(uname)-${ARCH} \ +RUN curl -Lo ./kind https://kind.sigs.k8s.io/dl/v${TOOLS_KIND_VERSION}/kind-linux-${ARCH} \ && chmod +x ./kind \ && mv ./kind /usr/local/bin/ @@ -136,14 +135,20 @@ RUN curl -LO https://github.com/derailed/k9s/releases/download/v${TOOLS_K9S_VERS && chmod +x /usr/local/bin/k9s \ && rm -f k9s_Linux_${ARCH}.tar.gz -# Install kubectl \ -RUN curl -Lo /usr/local/bin/kubectl "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/${ARCH}/kubectl" \ +# Install kubectl +RUN curl -Lo /usr/local/bin/kubectl "https://dl.k8s.io/release/v${TOOLS_KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl" \ && chmod +x /usr/local/bin/kubectl -RUN sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" \ - sh -c "$(curl -fsSL https://starship.rs/install.sh)" -- --yes \ +RUN sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" \ + && STARSHIP_SUFFIX=$(case ${ARCH} in amd64) echo x86_64-unknown-linux-gnu;; arm64) echo aarch64-unknown-linux-musl;; esac) \ + && curl -Lo starship.tar.gz "https://github.com/starship/starship/releases/latest/download/starship-${STARSHIP_SUFFIX}.tar.gz" \ + && tar -xzf starship.tar.gz -C /usr/local/bin/ \ + && rm starship.tar.gz \ && mkdir -p /root/.config \ && git config --global core.excludesfile /root/.gitignore_global \ && echo "**/.idea/" > /root/.gitignore_global -ENTRYPOINT ["zsh"] \ No newline at end of file +# Install Claude +RUN curl -fsSL https://claude.ai/install.sh | bash + +ENTRYPOINT ["zsh"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b0cdc6c2e..2b83e12f6 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,17 +3,18 @@ "build": { "dockerfile": "Dockerfile", "args": { - "TOOLS_GO_VERSION": "1.25.5", + "TOOLS_GO_VERSION": "1.26.1", "TOOLS_NODE_VERSION": "24.13.0", - "TOOLS_UV_VERSION": "0.7.2", + "TOOLS_UV_VERSION": "0.10.4", "TOOLS_K9S_VERSION": "0.50.4", "TOOLS_KIND_VERSION": "0.27.0", "TOOLS_ISTIO_VERSION": "1.26.0", + "TOOLS_ARGO_CD_VERSION": "v1.8.4", "TOOLS_KUBECTL_VERSION": "1.33.4" } }, "features": { - "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}, + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": { "moby": false }, "ghcr.io/mpriscella/features/kind:1": {} }, "customizations": { @@ -35,8 +36,7 @@ "ms-vscode.vscode-typescript-next", "ms-azuretools.vscode-containers", "ms-windows-ai-studio.windows-ai-studio", - "GitHub.copilot", - "GitHub.copilot-chat", + "anthropic.claude-code", "Catppuccin.catppuccin-vsc", "Catppuccin.catppuccin-vsc-icons" ] diff --git a/Makefile b/Makefile index cdbaf690d..60710c9b2 100644 --- a/Makefile +++ b/Makefile @@ -433,9 +433,8 @@ kagent-addon-install: use-kind-cluster .PHONY: open-dev-container open-dev-container: - @echo "Opening dev container..." - devcontainer build . - @devcontainer open . + @echo "Building and starting dev container..." + devcontainer up --workspace-folder . .PHONY: otel-local otel-local: From 17e69f4ef69226523506e4432aaee2a2d48ebafc Mon Sep 17 00:00:00 2001 From: n9te9 Date: Mon, 23 Mar 2026 11:36:10 +0900 Subject: [PATCH 5/5] fix: experimentalTuiCmd is only applied in local environment Signed-off-by: n9te9 --- go/core/cli/cmd/kagent/main.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/go/core/cli/cmd/kagent/main.go b/go/core/cli/cmd/kagent/main.go index 69975ccd7..1101964b1 100644 --- a/go/core/cli/cmd/kagent/main.go +++ b/go/core/cli/cmd/kagent/main.go @@ -439,7 +439,12 @@ Examples: }, } - rootCmd.AddCommand(installCmd, uninstallCmd, invokeCmd, bugReportCmd, versionCmd, dashboardCmd, getCmd, initCmd, buildCmd, deployCmd, addMcpCmd, runCmd, experimentalTuiCmd, mcp.NewMCPCmd(), envdoc.NewEnvCmd()) + commands := []*cobra.Command{installCmd, uninstallCmd, invokeCmd, bugReportCmd, versionCmd, dashboardCmd, getCmd, initCmd, buildCmd, deployCmd, addMcpCmd, runCmd, mcp.NewMCPCmd(), envdoc.NewEnvCmd()} + if os.Getenv("ENVIRONMENT") == "local" { + commands = append(commands, experimentalTuiCmd) + } + + rootCmd.AddCommand(commands...) // Initialize config if err := config.Init(); err != nil {