@@ -3,6 +3,7 @@ package tools
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "errors"
6
7
"os"
7
8
"strconv"
8
9
@@ -14,6 +15,7 @@ import (
14
15
"github.com/DefangLabs/defang/src/pkg/term"
15
16
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
16
17
"github.com/mark3labs/mcp-go/mcp"
18
+ "github.com/pkg/browser"
17
19
)
18
20
19
21
// DefaultToolCLI implements all tool interfaces as passthroughs to the real CLI logic
@@ -22,72 +24,62 @@ import (
22
24
23
25
type DefaultToolCLI struct {}
24
26
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
28
28
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 {
30
30
// If there is a real implementation, call it; otherwise, return nil or a stub error
31
31
return nil
32
32
}
33
33
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 {
35
35
return cli .ConfigSet (ctx , projectName , provider , name , value )
36
36
}
37
37
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 ) {
39
39
return cli .RunEstimate (ctx , project , client , provider , providerId , region , mode )
40
40
}
41
- func (c * DefaultToolCLI ) PrintEstimate (mode defangv1.DeploymentMode , estimate * defangv1.EstimateResponse ) {
41
+ func (DefaultToolCLI ) PrintEstimate (mode defangv1.DeploymentMode , estimate * defangv1.EstimateResponse ) {
42
42
cli .PrintEstimate (mode , estimate )
43
43
}
44
44
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 ) {
46
46
req := & defangv1.ListConfigsRequest {Project : projectName }
47
47
return provider .ListConfig (ctx , req )
48
48
}
49
49
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 ) {
51
51
return cli .Connect (ctx , cluster )
52
52
}
53
53
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 ) {
63
55
return cli .ComposeUp (ctx , project , client , provider , uploadMode , mode )
64
56
}
65
57
66
- func (c * DefaultToolCLI ) ConfigureLoader (request mcp.CallToolRequest ) cliClient.Loader {
58
+ func (DefaultToolCLI ) ConfigureLoader (request mcp.CallToolRequest ) cliClient.Loader {
67
59
return configureLoader (request )
68
60
}
69
61
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 ) {
71
63
return cli .ComposeDown (ctx , projectName , client , provider )
72
64
}
73
65
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 ) {
75
67
return cliClient .LoadProjectNameWithFallback (ctx , loader , provider )
76
68
}
77
69
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 {
79
71
return cli .ConfigDelete (ctx , projectName , provider , name )
80
72
}
81
73
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 ) {
83
75
return deployment_info .GetServices (ctx , projectName , provider )
84
76
}
85
77
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 ) {
87
79
return CheckProviderConfigured (ctx , client , providerId , projectName , serviceCount )
88
80
}
89
81
90
- func (c * DefaultToolCLI ) CaptureTermOutput (mode defangv1.DeploymentMode , estimate * defangv1.EstimateResponse ) string {
82
+ func (DefaultToolCLI ) CaptureTermOutput (mode defangv1.DeploymentMode , estimate * defangv1.EstimateResponse ) string {
91
83
// Use the same logic as DefaultEstimateCLI
92
84
oldTerm := term .DefaultTerm
93
85
stdout := new (bytes.Buffer )
@@ -103,28 +95,31 @@ func (c *DefaultToolCLI) CaptureTermOutput(mode defangv1.DeploymentMode, estimat
103
95
return stdout .String ()
104
96
}
105
97
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 ) {
107
99
return loader .LoadProject (ctx )
108
100
}
109
101
110
- func (c * DefaultToolCLI ) CreatePlaygroundProvider (client * cliClient.GrpcClient ) cliClient.Provider {
102
+ func (DefaultToolCLI ) CreatePlaygroundProvider (client * cliClient.GrpcClient ) cliClient.Provider {
111
103
return & cliClient.PlaygroundProvider {FabricClient : client }
112
104
}
113
105
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 )
116
108
}
117
109
118
- func (c * DefaultToolCLI ) GetRegion (providerId cliClient.ProviderID ) string {
110
+ func (DefaultToolCLI ) GetRegion (providerId cliClient.ProviderID ) string {
119
111
return cliClient .GetRegion (providerId )
120
112
}
121
113
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" )
125
120
}
126
121
127
- func (c * DefaultToolCLI ) SetProviderID (providerId * cliClient.ProviderID , providerString string ) error {
122
+ func (DefaultToolCLI ) SetProviderID (providerId * cliClient.ProviderID , providerString string ) error {
128
123
return providerId .Set (providerString )
129
124
}
130
125
@@ -138,17 +133,14 @@ type ListConfigCLIAdapter struct{ *DefaultToolCLI }
138
133
type LoginCLIAdapter struct { * DefaultToolCLI }
139
134
140
135
// --- 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 ) {
142
137
return cliClient .LoadProjectNameWithFallback (ctx , loader , provider )
143
138
}
144
- func (a * DestroyCLIAdapter ) ConfigureLoader (request mcp.CallToolRequest ) cliClient.Loader {
139
+ func (DestroyCLIAdapter ) ConfigureLoader (request mcp.CallToolRequest ) cliClient.Loader {
145
140
return configureLoader (request )
146
141
}
147
142
148
143
// --- 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
- }
152
144
func (a * SetConfigCLIAdapter ) ConfigSet (ctx context.Context , projectName string , provider cliClient.Provider , name , value string ) error {
153
145
return a .DefaultToolCLI .ConfigSet (ctx , projectName , provider , name , value )
154
146
}
@@ -160,13 +152,13 @@ func (a *SetConfigCLIAdapter) ConfigureLoader(request mcp.CallToolRequest) cliCl
160
152
}
161
153
162
154
// --- RemoveConfigCLIInterface ---
163
- func (a * RemoveConfigCLIAdapter ) ConfigureLoader (request mcp.CallToolRequest ) cliClient.Loader {
155
+ func (RemoveConfigCLIAdapter ) ConfigureLoader (request mcp.CallToolRequest ) cliClient.Loader {
164
156
return configureLoader (request )
165
157
}
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 ) {
167
159
return cliClient .LoadProjectNameWithFallback (ctx , loader , provider )
168
160
}
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 {
170
162
return cli .ConfigDelete (ctx , projectName , provider , name )
171
163
}
172
164
@@ -176,11 +168,12 @@ func (a *ListConfigCLIAdapter) ListConfig(ctx context.Context, provider cliClien
176
168
}
177
169
178
170
// --- 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 {
180
172
// Delegate to login.InteractiveLoginMCP from the login package
181
173
return login .InteractiveLoginMCP (ctx , client , cluster )
182
174
}
183
- func (a * LoginCLIAdapter ) GenerateAuthURL (authPort int ) string {
175
+
176
+ func (LoginCLIAdapter ) GenerateAuthURL (authPort int ) string {
184
177
// Use the same logic as the old DefaultLoginCLI
185
178
return "Please open this URL in your browser: http://127.0.0.1:" + strconv .Itoa (authPort ) + " to login"
186
179
}
0 commit comments