@@ -3,11 +3,9 @@ package config
3
3
import (
4
4
"encoding/base64"
5
5
"encoding/json"
6
- "errors"
7
6
"fmt"
8
7
"os"
9
8
"runtime"
10
- "slices"
11
9
"strings"
12
10
"sync"
13
11
@@ -21,27 +19,16 @@ const (
21
19
SecretserviceCredHelper = "secretservice"
22
20
PassCredHelper = "pass"
23
21
FileCredHelper = "file"
24
- SqliteCredHelper = "sqlite"
25
- PostgresCredHelper = "postgres"
26
-
27
- GPTScriptHelperPrefix = "gptscript-credential-"
28
22
)
29
23
30
24
var (
31
- darwinHelpers = []string {OsxkeychainCredHelper , FileCredHelper , SqliteCredHelper , PostgresCredHelper }
25
+ darwinHelpers = []string {OsxkeychainCredHelper , FileCredHelper }
32
26
windowsHelpers = []string {WincredCredHelper , FileCredHelper }
33
- linuxHelpers = []string {SecretserviceCredHelper , PassCredHelper , FileCredHelper , SqliteCredHelper , PostgresCredHelper }
34
- )
35
-
36
- func listAsString (helpers []string ) string {
37
- if len (helpers ) == 0 {
38
- return ""
39
- } else if len (helpers ) == 1 {
40
- return helpers [0 ]
41
- }
27
+ linuxHelpers = []string {SecretserviceCredHelper , PassCredHelper , FileCredHelper }
42
28
43
- return strings .Join (helpers [:len (helpers )- 1 ], ", " ) + " or " + helpers [len (helpers )- 1 ]
44
- }
29
+ // Helpers is a list of all supported credential helpers from github.com/gptscript-ai/gptscript-credential-helpers
30
+ Helpers = []string {WincredCredHelper , OsxkeychainCredHelper , SecretserviceCredHelper , PassCredHelper }
31
+ )
45
32
46
33
type AuthConfig types.AuthConfig
47
34
@@ -74,8 +61,8 @@ func (a *AuthConfig) UnmarshalJSON(data []byte) error {
74
61
type CLIConfig struct {
75
62
Auths map [string ]AuthConfig `json:"auths,omitempty"`
76
63
CredentialsStore string `json:"credsStore,omitempty"`
77
- Integrations map [string ]string `json:"integrations,omitempty"`
78
64
65
+ raw []byte
79
66
auths map [string ]types.AuthConfig
80
67
authsLock * sync.Mutex
81
68
location string
@@ -108,7 +95,19 @@ func (c *CLIConfig) Save() error {
108
95
}
109
96
c .auths = nil
110
97
}
111
- data , err := json .Marshal (c )
98
+
99
+ // This is to not overwrite additional fields that might be the config file
100
+ out := map [string ]any {}
101
+ if len (c .raw ) > 0 {
102
+ err := json .Unmarshal (c .raw , & out )
103
+ if err != nil {
104
+ return err
105
+ }
106
+ }
107
+ out ["auths" ] = c .Auths
108
+ out ["credsStore" ] = c .CredentialsStore
109
+
110
+ data , err := json .Marshal (out )
112
111
if err != nil {
113
112
return err
114
113
}
@@ -154,34 +153,22 @@ func ReadCLIConfig(gptscriptConfigFile string) (*CLIConfig, error) {
154
153
result := & CLIConfig {
155
154
authsLock : & sync.Mutex {},
156
155
location : gptscriptConfigFile ,
156
+ raw : data ,
157
157
}
158
158
if err := json .Unmarshal (data , result ); err != nil {
159
159
return nil , fmt .Errorf ("failed to unmarshal %s: %v" , gptscriptConfigFile , err )
160
160
}
161
161
162
+ if store := os .Getenv ("GPTSCRIPT_CREDENTIAL_STORE" ); store != "" {
163
+ result .CredentialsStore = store
164
+ }
165
+
162
166
if result .CredentialsStore == "" {
163
167
if err := result .setDefaultCredentialsStore (); err != nil {
164
168
return nil , err
165
169
}
166
170
}
167
171
168
- if ! isValidCredentialHelper (result .CredentialsStore ) {
169
- errMsg := fmt .Sprintf ("invalid credential store '%s'" , result .CredentialsStore )
170
- switch runtime .GOOS {
171
- case "darwin" :
172
- errMsg += fmt .Sprintf (" (use %s)" , listAsString (darwinHelpers ))
173
- case "windows" :
174
- errMsg += fmt .Sprintf (" (use %s)" , listAsString (windowsHelpers ))
175
- case "linux" :
176
- errMsg += fmt .Sprintf (" (use %s)" , listAsString (linuxHelpers ))
177
- default :
178
- errMsg += " (use file)"
179
- }
180
- errMsg += fmt .Sprintf ("\n Please edit your config file at %s to fix this." , result .location )
181
-
182
- return nil , errors .New (errMsg )
183
- }
184
-
185
172
return result , nil
186
173
}
187
174
@@ -197,19 +184,6 @@ func (c *CLIConfig) setDefaultCredentialsStore() error {
197
184
return c .Save ()
198
185
}
199
186
200
- func isValidCredentialHelper (helper string ) bool {
201
- switch runtime .GOOS {
202
- case "darwin" :
203
- return slices .Contains (darwinHelpers , helper )
204
- case "windows" :
205
- return slices .Contains (windowsHelpers , helper )
206
- case "linux" :
207
- return slices .Contains (linuxHelpers , helper )
208
- default :
209
- return helper == FileCredHelper
210
- }
211
- }
212
-
213
187
func readFile (path string ) ([]byte , error ) {
214
188
data , err := os .ReadFile (path )
215
189
if os .IsNotExist (err ) {
0 commit comments