Skip to content

Commit 2269b5c

Browse files
authored
clean by removing duplicate code. (#1478)
1 parent d8d1eb4 commit 2269b5c

13 files changed

+85
-249
lines changed

src/pkg/mcp/tests/client_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616

1717
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
1818
"github.com/DefangLabs/defang/src/pkg/mcp"
19-
defangtools "github.com/DefangLabs/defang/src/pkg/mcp/tools"
19+
"github.com/DefangLabs/defang/src/pkg/mcp/tools"
2020
typepb "github.com/DefangLabs/defang/src/protos/google/type"
2121
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
2222
"github.com/DefangLabs/defang/src/protos/io/defang/v1/defangv1connect"
@@ -524,15 +524,17 @@ func TestInProcessMCPServer(t *testing.T) {
524524
}
525525

526526
TestInProcessMCPServer_DeployAndDestroy := func(t *testing.T) {
527-
const dummyToken = "Testing.Token.1234"
528-
t.Setenv("DEFANG_ACCESS_TOKEN", dummyToken)
529-
530-
// Mock openURLFunc
531-
originalOpenURL := defangtools.OpenURLFunc
532-
defangtools.OpenURLFunc = func(url string) error {
527+
var origBrowser = tools.OpenBrowserFunc
528+
t.Cleanup(func() {
529+
tools.OpenBrowserFunc = origBrowser
530+
})
531+
tools.OpenBrowserFunc = func(url string) error {
532+
// no-op to avoid opening a browser during tests
533533
return nil
534534
}
535-
defer func() { defangtools.OpenURLFunc = originalOpenURL }()
535+
536+
const dummyToken = "Testing.Token.1234"
537+
t.Setenv("DEFANG_ACCESS_TOKEN", dummyToken)
536538

537539
result, err := mcpClient.CallTool(t.Context(), m3mcp.CallToolRequest{
538540
Params: m3mcp.CallToolParams{
@@ -547,8 +549,6 @@ func TestInProcessMCPServer(t *testing.T) {
547549
assertCalled(t, err == nil, "Deploy tool error")
548550
assertCalled(t, !result.IsError, "Deploy tool IsError")
549551
assertCalled(t, MockFabric.deployCalled, "deploy (Deploy)")
550-
// openURLFunc is call within another thread which we do not wait for, so we cannot reliably check if it was called
551-
//assertCalled(t, openURLFuncCalled, "openURLFunc should be called during deploy")
552552

553553
_, err = mcpClient.CallTool(t.Context(), m3mcp.CallToolRequest{
554554
Params: m3mcp.CallToolParams{

src/pkg/mcp/tools/default_tool_cli.go

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package tools
33
import (
44
"bytes"
55
"context"
6+
"errors"
67
"os"
78
"strconv"
89

@@ -14,6 +15,7 @@ import (
1415
"github.com/DefangLabs/defang/src/pkg/term"
1516
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
1617
"github.com/mark3labs/mcp-go/mcp"
18+
"github.com/pkg/browser"
1719
)
1820

1921
// DefaultToolCLI implements all tool interfaces as passthroughs to the real CLI logic
@@ -22,72 +24,62 @@ import (
2224

2325
type DefaultToolCLI struct{}
2426

25-
// --- DefaultToolCLI: Core tool passthrough methods ---
26-
// All methods for DefaultToolCLI are grouped here for clarity and maintainability.
27-
// These implement the various tool interfaces as passthroughs to the real CLI logic
27+
var OpenBrowserFunc = browser.OpenURL
2828

29-
func (c *DefaultToolCLI) CanIUseProvider(ctx context.Context, client *cliClient.GrpcClient, providerId cliClient.ProviderID, projectName string, provider cliClient.Provider, serviceCount int) error {
29+
func (DefaultToolCLI) CanIUseProvider(ctx context.Context, client *cliClient.GrpcClient, providerId cliClient.ProviderID, projectName string, provider cliClient.Provider, serviceCount int) error {
3030
// If there is a real implementation, call it; otherwise, return nil or a stub error
3131
return nil
3232
}
3333

34-
func (c *DefaultToolCLI) ConfigSet(ctx context.Context, projectName string, provider cliClient.Provider, name, value string) error {
34+
func (DefaultToolCLI) ConfigSet(ctx context.Context, projectName string, provider cliClient.Provider, name, value string) error {
3535
return cli.ConfigSet(ctx, projectName, provider, name, value)
3636
}
3737

38-
func (c *DefaultToolCLI) RunEstimate(ctx context.Context, project *compose.Project, client *cliClient.GrpcClient, provider cliClient.Provider, providerId cliClient.ProviderID, region string, mode defangv1.DeploymentMode) (*defangv1.EstimateResponse, error) {
38+
func (DefaultToolCLI) RunEstimate(ctx context.Context, project *compose.Project, client *cliClient.GrpcClient, provider cliClient.Provider, providerId cliClient.ProviderID, region string, mode defangv1.DeploymentMode) (*defangv1.EstimateResponse, error) {
3939
return cli.RunEstimate(ctx, project, client, provider, providerId, region, mode)
4040
}
41-
func (c *DefaultToolCLI) PrintEstimate(mode defangv1.DeploymentMode, estimate *defangv1.EstimateResponse) {
41+
func (DefaultToolCLI) PrintEstimate(mode defangv1.DeploymentMode, estimate *defangv1.EstimateResponse) {
4242
cli.PrintEstimate(mode, estimate)
4343
}
4444

45-
func (c *DefaultToolCLI) ListConfig(ctx context.Context, provider cliClient.Provider, projectName string) (*defangv1.Secrets, error) {
45+
func (DefaultToolCLI) ListConfig(ctx context.Context, provider cliClient.Provider, projectName string) (*defangv1.Secrets, error) {
4646
req := &defangv1.ListConfigsRequest{Project: projectName}
4747
return provider.ListConfig(ctx, req)
4848
}
4949

50-
func (c *DefaultToolCLI) Connect(ctx context.Context, cluster string) (*cliClient.GrpcClient, error) {
50+
func (DefaultToolCLI) Connect(ctx context.Context, cluster string) (*cliClient.GrpcClient, error) {
5151
return cli.Connect(ctx, cluster)
5252
}
5353

54-
func (c *DefaultToolCLI) NewProviderGrpc(ctx context.Context, providerId cliClient.ProviderID, client *cliClient.GrpcClient) (cliClient.Provider, error) {
55-
return cli.NewProvider(ctx, providerId, client)
56-
}
57-
58-
func (c *DefaultToolCLI) NewProviderFabric(ctx context.Context, providerId cliClient.ProviderID, client cliClient.FabricClient) (cliClient.Provider, error) {
59-
return cli.NewProvider(ctx, providerId, client)
60-
}
61-
62-
func (c *DefaultToolCLI) ComposeUp(ctx context.Context, project *compose.Project, client *cliClient.GrpcClient, provider cliClient.Provider, uploadMode compose.UploadMode, mode defangv1.DeploymentMode) (*defangv1.DeployResponse, *compose.Project, error) {
54+
func (DefaultToolCLI) ComposeUp(ctx context.Context, project *compose.Project, client *cliClient.GrpcClient, provider cliClient.Provider, uploadMode compose.UploadMode, mode defangv1.DeploymentMode) (*defangv1.DeployResponse, *compose.Project, error) {
6355
return cli.ComposeUp(ctx, project, client, provider, uploadMode, mode)
6456
}
6557

66-
func (c *DefaultToolCLI) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
58+
func (DefaultToolCLI) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
6759
return configureLoader(request)
6860
}
6961

70-
func (c *DefaultToolCLI) ComposeDown(ctx context.Context, projectName string, client *cliClient.GrpcClient, provider cliClient.Provider) (string, error) {
62+
func (DefaultToolCLI) ComposeDown(ctx context.Context, projectName string, client *cliClient.GrpcClient, provider cliClient.Provider) (string, error) {
7163
return cli.ComposeDown(ctx, projectName, client, provider)
7264
}
7365

74-
func (c *DefaultToolCLI) LoadProjectNameWithFallback(ctx context.Context, loader cliClient.Loader, provider cliClient.Provider) (string, error) {
66+
func (DefaultToolCLI) LoadProjectNameWithFallback(ctx context.Context, loader cliClient.Loader, provider cliClient.Provider) (string, error) {
7567
return cliClient.LoadProjectNameWithFallback(ctx, loader, provider)
7668
}
7769

78-
func (c *DefaultToolCLI) ConfigDelete(ctx context.Context, projectName string, provider cliClient.Provider, name string) error {
70+
func (DefaultToolCLI) ConfigDelete(ctx context.Context, projectName string, provider cliClient.Provider, name string) error {
7971
return cli.ConfigDelete(ctx, projectName, provider, name)
8072
}
8173

82-
func (c *DefaultToolCLI) GetServices(ctx context.Context, projectName string, provider cliClient.Provider) ([]deployment_info.Service, error) {
74+
func (DefaultToolCLI) GetServices(ctx context.Context, projectName string, provider cliClient.Provider) ([]deployment_info.Service, error) {
8375
return deployment_info.GetServices(ctx, projectName, provider)
8476
}
8577

86-
func (c *DefaultToolCLI) CheckProviderConfigured(ctx context.Context, client *cliClient.GrpcClient, providerId cliClient.ProviderID, projectName string, serviceCount int) (cliClient.Provider, error) {
78+
func (DefaultToolCLI) CheckProviderConfigured(ctx context.Context, client *cliClient.GrpcClient, providerId cliClient.ProviderID, projectName string, serviceCount int) (cliClient.Provider, error) {
8779
return CheckProviderConfigured(ctx, client, providerId, projectName, serviceCount)
8880
}
8981

90-
func (c *DefaultToolCLI) CaptureTermOutput(mode defangv1.DeploymentMode, estimate *defangv1.EstimateResponse) string {
82+
func (DefaultToolCLI) CaptureTermOutput(mode defangv1.DeploymentMode, estimate *defangv1.EstimateResponse) string {
9183
// Use the same logic as DefaultEstimateCLI
9284
oldTerm := term.DefaultTerm
9385
stdout := new(bytes.Buffer)
@@ -103,28 +95,31 @@ func (c *DefaultToolCLI) CaptureTermOutput(mode defangv1.DeploymentMode, estimat
10395
return stdout.String()
10496
}
10597

106-
func (c *DefaultToolCLI) LoadProject(ctx context.Context, loader cliClient.Loader) (*compose.Project, error) {
98+
func (DefaultToolCLI) LoadProject(ctx context.Context, loader cliClient.Loader) (*compose.Project, error) {
10799
return loader.LoadProject(ctx)
108100
}
109101

110-
func (c *DefaultToolCLI) CreatePlaygroundProvider(client *cliClient.GrpcClient) cliClient.Provider {
102+
func (DefaultToolCLI) CreatePlaygroundProvider(client *cliClient.GrpcClient) cliClient.Provider {
111103
return &cliClient.PlaygroundProvider{FabricClient: client}
112104
}
113105

114-
func (c *DefaultToolCLI) NewProvider(ctx context.Context, providerId cliClient.ProviderID, client *cliClient.GrpcClient) (cliClient.Provider, error) {
115-
return c.NewProviderGrpc(ctx, providerId, client)
106+
func (DefaultToolCLI) NewProvider(ctx context.Context, providerId cliClient.ProviderID, client cliClient.FabricClient) (cliClient.Provider, error) {
107+
return cli.NewProvider(ctx, providerId, client)
116108
}
117109

118-
func (c *DefaultToolCLI) GetRegion(providerId cliClient.ProviderID) string {
110+
func (DefaultToolCLI) GetRegion(providerId cliClient.ProviderID) string {
119111
return cliClient.GetRegion(providerId)
120112
}
121113

122-
func (c *DefaultToolCLI) OpenBrowser(url string) error {
123-
// No-op stub implementation
124-
return nil
114+
func (DefaultToolCLI) OpenBrowser(url string) error {
115+
if OpenBrowserFunc != nil {
116+
return OpenBrowserFunc(url)
117+
}
118+
119+
return errors.New("no browser function defined")
125120
}
126121

127-
func (c *DefaultToolCLI) SetProviderID(providerId *cliClient.ProviderID, providerString string) error {
122+
func (DefaultToolCLI) SetProviderID(providerId *cliClient.ProviderID, providerString string) error {
128123
return providerId.Set(providerString)
129124
}
130125

@@ -138,17 +133,14 @@ type ListConfigCLIAdapter struct{ *DefaultToolCLI }
138133
type LoginCLIAdapter struct{ *DefaultToolCLI }
139134

140135
// --- DestroyCLIInterface ---
141-
func (a *DestroyCLIAdapter) LoadProjectNameWithFallback(ctx context.Context, loader cliClient.Loader, provider cliClient.Provider) (string, error) {
136+
func (DestroyCLIAdapter) LoadProjectNameWithFallback(ctx context.Context, loader cliClient.Loader, provider cliClient.Provider) (string, error) {
142137
return cliClient.LoadProjectNameWithFallback(ctx, loader, provider)
143138
}
144-
func (a *DestroyCLIAdapter) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
139+
func (DestroyCLIAdapter) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
145140
return configureLoader(request)
146141
}
147142

148143
// --- SetConfigCLIInterface ---
149-
func (a *SetConfigCLIAdapter) NewProvider(ctx context.Context, providerId cliClient.ProviderID, client cliClient.FabricClient) (cliClient.Provider, error) {
150-
return a.DefaultToolCLI.NewProviderFabric(ctx, providerId, client)
151-
}
152144
func (a *SetConfigCLIAdapter) ConfigSet(ctx context.Context, projectName string, provider cliClient.Provider, name, value string) error {
153145
return a.DefaultToolCLI.ConfigSet(ctx, projectName, provider, name, value)
154146
}
@@ -160,13 +152,13 @@ func (a *SetConfigCLIAdapter) ConfigureLoader(request mcp.CallToolRequest) cliCl
160152
}
161153

162154
// --- RemoveConfigCLIInterface ---
163-
func (a *RemoveConfigCLIAdapter) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
155+
func (RemoveConfigCLIAdapter) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
164156
return configureLoader(request)
165157
}
166-
func (a *RemoveConfigCLIAdapter) LoadProjectNameWithFallback(ctx context.Context, loader cliClient.Loader, provider cliClient.Provider) (string, error) {
158+
func (RemoveConfigCLIAdapter) LoadProjectNameWithFallback(ctx context.Context, loader cliClient.Loader, provider cliClient.Provider) (string, error) {
167159
return cliClient.LoadProjectNameWithFallback(ctx, loader, provider)
168160
}
169-
func (a *RemoveConfigCLIAdapter) ConfigDelete(ctx context.Context, projectName string, provider cliClient.Provider, name string) error {
161+
func (RemoveConfigCLIAdapter) ConfigDelete(ctx context.Context, projectName string, provider cliClient.Provider, name string) error {
170162
return cli.ConfigDelete(ctx, projectName, provider, name)
171163
}
172164

@@ -176,11 +168,12 @@ func (a *ListConfigCLIAdapter) ListConfig(ctx context.Context, provider cliClien
176168
}
177169

178170
// --- LoginCLIInterface ---
179-
func (a *LoginCLIAdapter) InteractiveLoginMCP(ctx context.Context, client *cliClient.GrpcClient, cluster string) error {
171+
func (LoginCLIAdapter) InteractiveLoginMCP(ctx context.Context, client *cliClient.GrpcClient, cluster string) error {
180172
// Delegate to login.InteractiveLoginMCP from the login package
181173
return login.InteractiveLoginMCP(ctx, client, cluster)
182174
}
183-
func (a *LoginCLIAdapter) GenerateAuthURL(authPort int) string {
175+
176+
func (LoginCLIAdapter) GenerateAuthURL(authPort int) string {
184177
// Use the same logic as the old DefaultLoginCLI
185178
return "Please open this URL in your browser: http://127.0.0.1:" + strconv.Itoa(authPort) + " to login"
186179
}

src/pkg/mcp/tools/deploy.go

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,13 @@ import (
77
"os"
88
"strings"
99

10-
"github.com/pkg/browser"
11-
12-
"github.com/DefangLabs/defang/src/pkg/cli"
1310
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
1411
"github.com/DefangLabs/defang/src/pkg/cli/compose"
1512
"github.com/DefangLabs/defang/src/pkg/term"
1613
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
1714
"github.com/mark3labs/mcp-go/mcp"
1815
)
1916

20-
// OpenURLFunc allows browser.OpenURL to be overridden in tests
21-
var OpenURLFunc = browser.OpenURL
22-
23-
// DefaultDeployCLI implements DeployCLIInterface using actual CLI functions
24-
type DefaultDeployCLI struct{}
25-
26-
func (c *DefaultDeployCLI) Connect(ctx context.Context, cluster string) (*cliClient.GrpcClient, error) {
27-
return cli.Connect(ctx, cluster)
28-
}
29-
30-
func (c *DefaultDeployCLI) NewProvider(ctx context.Context, providerId cliClient.ProviderID, client *cliClient.GrpcClient) (cliClient.Provider, error) {
31-
return cli.NewProvider(ctx, providerId, client)
32-
}
33-
34-
func (c *DefaultDeployCLI) ComposeUp(ctx context.Context, project *compose.Project, client *cliClient.GrpcClient, provider cliClient.Provider, uploadMode compose.UploadMode, mode defangv1.DeploymentMode) (*defangv1.DeployResponse, *compose.Project, error) {
35-
return cli.ComposeUp(ctx, project, client, provider, uploadMode, mode)
36-
}
37-
38-
func (c *DefaultDeployCLI) CheckProviderConfigured(ctx context.Context, client *cliClient.GrpcClient, providerId cliClient.ProviderID, projectName string, serviceCount int) (cliClient.Provider, error) {
39-
return CheckProviderConfigured(ctx, client, providerId, projectName, serviceCount)
40-
}
41-
42-
func (c *DefaultDeployCLI) LoadProject(ctx context.Context, loader cliClient.Loader) (*compose.Project, error) {
43-
return loader.LoadProject(ctx)
44-
}
45-
46-
func (c *DefaultDeployCLI) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
47-
return configureLoader(request)
48-
}
49-
50-
func (c *DefaultDeployCLI) OpenBrowser(url string) error {
51-
return browser.OpenURL(url)
52-
}
53-
5417
func handleDeployTool(ctx context.Context, request mcp.CallToolRequest, providerId *cliClient.ProviderID, cluster string, cli DeployCLIInterface) (*mcp.CallToolResult, error) {
5518
err := providerNotConfiguredError(*providerId)
5619
if err != nil {

src/pkg/mcp/tools/deploy_test.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (m *MockDeployCLI) Connect(ctx context.Context, cluster string) (*client.Gr
4545
return &client.GrpcClient{}, nil
4646
}
4747

48-
func (m *MockDeployCLI) NewProvider(ctx context.Context, providerId client.ProviderID, client *client.GrpcClient) (client.Provider, error) {
48+
func (m *MockDeployCLI) NewProvider(ctx context.Context, providerId client.ProviderID, client client.FabricClient) (client.Provider, error) {
4949
m.CallLog = append(m.CallLog, fmt.Sprintf("NewProvider(%s)", providerId))
5050
return nil, m.NewProviderError
5151
}
@@ -219,13 +219,6 @@ func TestHandleDeployTool(t *testing.T) {
219219

220220
for _, tt := range tests {
221221
t.Run(tt.name, func(t *testing.T) {
222-
var originalOpenURLFunc = OpenURLFunc
223-
OpenURLFunc = func(url string) error {
224-
// Mock implementation that doesn't actually open a browser
225-
return nil
226-
}
227-
defer func() { OpenURLFunc = originalOpenURLFunc }()
228-
229222
// Create mock and configure it
230223
mockCLI := &MockDeployCLI{
231224
CallLog: []string{},

src/pkg/mcp/tools/destroy_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func (m *MockDestroyCLI) Connect(ctx context.Context, cluster string) (*client.G
3232
return &client.GrpcClient{}, nil
3333
}
3434

35-
func (m *MockDestroyCLI) NewProvider(ctx context.Context, providerId client.ProviderID, grpcClient *client.GrpcClient) (client.Provider, error) {
35+
func (m *MockDestroyCLI) NewProvider(ctx context.Context, providerId client.ProviderID, grpcClient client.FabricClient) (client.Provider, error) {
3636
m.CallLog = append(m.CallLog, fmt.Sprintf("NewProvider(%s)", providerId))
3737
return nil, m.NewProviderError
3838
}

src/pkg/mcp/tools/estimate.go

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,18 @@
11
package tools
22

33
import (
4-
"bytes"
54
"context"
65
"errors"
76
"fmt"
87
"os"
98
"strings"
109

11-
"github.com/DefangLabs/defang/src/pkg/cli"
1210
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
13-
"github.com/DefangLabs/defang/src/pkg/cli/compose"
1411
"github.com/DefangLabs/defang/src/pkg/term"
1512
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
1613
"github.com/mark3labs/mcp-go/mcp"
1714
)
1815

19-
// DefaultEstimateCLI implements EstimateCLIInterface using actual CLI functions
20-
type DefaultEstimateCLI struct{}
21-
22-
func (c *DefaultEstimateCLI) Connect(ctx context.Context, cluster string) (*cliClient.GrpcClient, error) {
23-
return cli.Connect(ctx, cluster)
24-
}
25-
26-
func (c *DefaultEstimateCLI) LoadProject(ctx context.Context, loader cliClient.Loader) (*compose.Project, error) {
27-
return loader.LoadProject(ctx)
28-
}
29-
30-
func (c *DefaultEstimateCLI) RunEstimate(ctx context.Context, project *compose.Project, client *cliClient.GrpcClient, provider cliClient.Provider, providerId cliClient.ProviderID, region string, mode defangv1.DeploymentMode) (*defangv1.EstimateResponse, error) {
31-
return cli.RunEstimate(ctx, project, client, provider, providerId, region, mode)
32-
}
33-
34-
func (c *DefaultEstimateCLI) PrintEstimate(mode defangv1.DeploymentMode, estimate *defangv1.EstimateResponse) {
35-
cli.PrintEstimate(mode, estimate)
36-
}
37-
38-
func (c *DefaultEstimateCLI) ConfigureLoader(request mcp.CallToolRequest) cliClient.Loader {
39-
return configureLoader(request)
40-
}
41-
42-
func (c *DefaultEstimateCLI) GetRegion(providerId cliClient.ProviderID) string {
43-
return cliClient.GetRegion(providerId)
44-
}
45-
46-
func (c *DefaultEstimateCLI) CreatePlaygroundProvider(client *cliClient.GrpcClient) cliClient.Provider {
47-
return &cliClient.PlaygroundProvider{FabricClient: client}
48-
}
49-
50-
func (c *DefaultEstimateCLI) SetProviderID(providerId *cliClient.ProviderID, providerString string) error {
51-
return providerId.Set(providerString)
52-
}
53-
54-
func (c *DefaultEstimateCLI) CaptureTermOutput(mode defangv1.DeploymentMode, estimate *defangv1.EstimateResponse) string {
55-
oldTerm := term.DefaultTerm
56-
stdout := new(bytes.Buffer)
57-
term.DefaultTerm = term.NewTerm(
58-
os.Stdin,
59-
stdout,
60-
new(bytes.Buffer),
61-
)
62-
63-
cli.PrintEstimate(mode, estimate)
64-
65-
term.DefaultTerm = oldTerm
66-
return stdout.String()
67-
}
68-
6916
func handleEstimateTool(ctx context.Context, request mcp.CallToolRequest, providerId *cliClient.ProviderID, cluster string, cli EstimateCLIInterface) (*mcp.CallToolResult, error) {
7017
term.Debug("Estimate tool called")
7118

0 commit comments

Comments
 (0)