@@ -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,28 +19,13 @@ 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 }
32- windowsHelpers = []string {WincredCredHelper , FileCredHelper }
33- linuxHelpers = []string {SecretserviceCredHelper , PassCredHelper , FileCredHelper , SqliteCredHelper , PostgresCredHelper }
25+ // Helpers is a list of all supported credential helpers from github.com/gptscript-ai/gptscript-credential-helpers
26+ Helpers = []string {WincredCredHelper , OsxkeychainCredHelper , SecretserviceCredHelper , PassCredHelper }
3427)
3528
36- func listAsString (helpers []string ) string {
37- if len (helpers ) == 0 {
38- return ""
39- } else if len (helpers ) == 1 {
40- return helpers [0 ]
41- }
42-
43- return strings .Join (helpers [:len (helpers )- 1 ], ", " ) + " or " + helpers [len (helpers )- 1 ]
44- }
45-
4629type AuthConfig types.AuthConfig
4730
4831func (a AuthConfig ) MarshalJSON () ([]byte , error ) {
@@ -74,8 +57,8 @@ func (a *AuthConfig) UnmarshalJSON(data []byte) error {
7457type CLIConfig struct {
7558 Auths map [string ]AuthConfig `json:"auths,omitempty"`
7659 CredentialsStore string `json:"credsStore,omitempty"`
77- Integrations map [string ]string `json:"integrations,omitempty"`
7860
61+ raw []byte
7962 auths map [string ]types.AuthConfig
8063 authsLock * sync.Mutex
8164 location string
@@ -108,7 +91,19 @@ func (c *CLIConfig) Save() error {
10891 }
10992 c .auths = nil
11093 }
111- data , err := json .Marshal (c )
94+
95+ // This is to not overwrite additional fields that might be the config file
96+ out := map [string ]any {}
97+ if len (c .raw ) > 0 {
98+ err := json .Unmarshal (c .raw , & out )
99+ if err != nil {
100+ return err
101+ }
102+ }
103+ out ["auths" ] = c .Auths
104+ out ["credsStore" ] = c .CredentialsStore
105+
106+ data , err := json .Marshal (out )
112107 if err != nil {
113108 return err
114109 }
@@ -154,34 +149,22 @@ func ReadCLIConfig(gptscriptConfigFile string) (*CLIConfig, error) {
154149 result := & CLIConfig {
155150 authsLock : & sync.Mutex {},
156151 location : gptscriptConfigFile ,
152+ raw : data ,
157153 }
158154 if err := json .Unmarshal (data , result ); err != nil {
159155 return nil , fmt .Errorf ("failed to unmarshal %s: %v" , gptscriptConfigFile , err )
160156 }
161157
158+ if store := os .Getenv ("GPTSCRIPT_CREDENTIAL_STORE" ); store != "" {
159+ result .CredentialsStore = store
160+ }
161+
162162 if result .CredentialsStore == "" {
163163 if err := result .setDefaultCredentialsStore (); err != nil {
164164 return nil , err
165165 }
166166 }
167167
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-
185168 return result , nil
186169}
187170
@@ -197,19 +180,6 @@ func (c *CLIConfig) setDefaultCredentialsStore() error {
197180 return c .Save ()
198181}
199182
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-
213183func readFile (path string ) ([]byte , error ) {
214184 data , err := os .ReadFile (path )
215185 if os .IsNotExist (err ) {
0 commit comments