@@ -3,11 +3,9 @@ package config
33import (
44 "encoding/base64"
55 "encoding/json"
6- "errors"
76 "fmt"
87 "os"
98 "runtime"
10- "slices"
119 "strings"
1210 "sync"
1311
@@ -21,27 +19,16 @@ const (
2119 SecretserviceCredHelper = "secretservice"
2220 PassCredHelper = "pass"
2321 FileCredHelper = "file"
24- SqliteCredHelper = "sqlite"
25- PostgresCredHelper = "postgres"
26-
27- GPTScriptHelperPrefix = "gptscript-credential-"
2822)
2923
3024var (
31- darwinHelpers = []string {OsxkeychainCredHelper , FileCredHelper , SqliteCredHelper , PostgresCredHelper }
25+ darwinHelpers = []string {OsxkeychainCredHelper , FileCredHelper }
3226 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 }
4228
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+ )
4532
4633type AuthConfig types.AuthConfig
4734
@@ -74,8 +61,8 @@ func (a *AuthConfig) UnmarshalJSON(data []byte) error {
7461type CLIConfig struct {
7562 Auths map [string ]AuthConfig `json:"auths,omitempty"`
7663 CredentialsStore string `json:"credsStore,omitempty"`
77- Integrations map [string ]string `json:"integrations,omitempty"`
7864
65+ raw []byte
7966 auths map [string ]types.AuthConfig
8067 authsLock * sync.Mutex
8168 location string
@@ -108,7 +95,19 @@ func (c *CLIConfig) Save() error {
10895 }
10996 c .auths = nil
11097 }
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 )
112111 if err != nil {
113112 return err
114113 }
@@ -154,34 +153,22 @@ func ReadCLIConfig(gptscriptConfigFile string) (*CLIConfig, error) {
154153 result := & CLIConfig {
155154 authsLock : & sync.Mutex {},
156155 location : gptscriptConfigFile ,
156+ raw : data ,
157157 }
158158 if err := json .Unmarshal (data , result ); err != nil {
159159 return nil , fmt .Errorf ("failed to unmarshal %s: %v" , gptscriptConfigFile , err )
160160 }
161161
162+ if store := os .Getenv ("GPTSCRIPT_CREDENTIAL_STORE" ); store != "" {
163+ result .CredentialsStore = store
164+ }
165+
162166 if result .CredentialsStore == "" {
163167 if err := result .setDefaultCredentialsStore (); err != nil {
164168 return nil , err
165169 }
166170 }
167171
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-
185172 return result , nil
186173}
187174
@@ -197,19 +184,6 @@ func (c *CLIConfig) setDefaultCredentialsStore() error {
197184 return c .Save ()
198185}
199186
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-
213187func readFile (path string ) ([]byte , error ) {
214188 data , err := os .ReadFile (path )
215189 if os .IsNotExist (err ) {
0 commit comments