дȫÏîĿÉó²éÎÊÌⲢ·¢²¼ v1.1.9
¸ÄÓñ¾»ú¶ÀÁ¢ CA£¬»ָ´ CLI TLS УÑ飬±£»¤ƾ¾ÝÓëÅäÖò¢·¢±£´档 д Cursor Êý¾ݡ¢»Ự·¾¶¡¢´úÀíÉúÃüÖÜÆڡ¢ģÐÍÇëÇóÓë Skills Îļþ²Ù×÷¡£ Ϊ¶ÀÁ¢ Tab ·þÎñÔö¼ӿͻ§¶˼øȨ£¬Éý¼¶ÒÀÀµÓ빤¾ßÁ´£¬ÍêÉƷ¢²¼ԪÐÅϢͬ²½¡£ Ñé֤£ºÁ½¸ö Go ģ¿éµIJâÊÔ/vet¡¢¹ؼüģ¿é race¡¢ǰ¶˲âÊÔ/Éú²ú¹¹½¨/Éó¼ơ¢ Go ¿ɴï©¶´ɨÃèÓë macOS/Linux ¿ÉÐÐģ¿齻²æ±àÒë¾ùͨ¹ý¡£ Windows ¸ôÀëÆô¶¯ͨ¹ý£»δÍê³ɵĵã»÷ðÑ̺ÍԭÉúƽ̨Ñé֤¼ûÉó²鱨¸档
This commit is contained in:
@@ -57,7 +57,7 @@ func (manager *Manager) currentConfig() Config {
|
||||
return DefaultConfig()
|
||||
}
|
||||
if current := manager.current.Load(); current != nil {
|
||||
return *current
|
||||
return cloneConfig(*current)
|
||||
}
|
||||
return DefaultConfig()
|
||||
}
|
||||
@@ -75,7 +75,12 @@ func (manager *Manager) Save(ctx context.Context, cfg Config) (Config, error) {
|
||||
return Config{}, fmt.Errorf("config manager is not initialized")
|
||||
}
|
||||
manager.saveMu.Lock()
|
||||
defer manager.saveMu.Unlock()
|
||||
locked := true
|
||||
defer func() {
|
||||
if locked {
|
||||
manager.saveMu.Unlock()
|
||||
}
|
||||
}()
|
||||
normalized, err := manager.store.Save(ctx, cfg)
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
@@ -86,6 +91,8 @@ func (manager *Manager) Save(ctx context.Context, cfg Config) (Config, error) {
|
||||
manager.lastReload = time.Now()
|
||||
manager.reloadError = ""
|
||||
manager.reloadMu.Unlock()
|
||||
manager.saveMu.Unlock()
|
||||
locked = false
|
||||
manager.notify(normalized)
|
||||
return normalized, nil
|
||||
}
|
||||
@@ -104,13 +111,17 @@ func (manager *Manager) SaveLastAgentModelHash(ctx context.Context, value string
|
||||
normalizedValue := strings.TrimSpace(value)
|
||||
// 在 saveMu 保护下完成 read-modify-write,避免与并发 Save 互相覆盖。
|
||||
manager.saveMu.Lock()
|
||||
defer manager.saveMu.Unlock()
|
||||
locked := true
|
||||
defer func() {
|
||||
if locked {
|
||||
manager.saveMu.Unlock()
|
||||
}
|
||||
}()
|
||||
current := manager.currentConfig()
|
||||
if strings.TrimSpace(current.LastAgentModelHash) == normalizedValue {
|
||||
return nil
|
||||
}
|
||||
current.LastAgentModelHash = normalizedValue
|
||||
normalized, err := manager.store.Save(ctx, current)
|
||||
normalized, err := manager.store.updateLastAgentModelHash(normalizedValue)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -120,6 +131,8 @@ func (manager *Manager) SaveLastAgentModelHash(ctx context.Context, value string
|
||||
manager.lastReload = time.Now()
|
||||
manager.reloadError = ""
|
||||
manager.reloadMu.Unlock()
|
||||
manager.saveMu.Unlock()
|
||||
locked = false
|
||||
manager.notify(normalized)
|
||||
return nil
|
||||
}
|
||||
@@ -164,7 +177,9 @@ func (manager *Manager) LegacyRuntimeSnapshot(_ context.Context) (legacyruntime.
|
||||
adapters := make([]legacyruntime.ModelAdapterConfig, 0, len(cfg.ModelAdapters))
|
||||
for _, item := range cfg.ModelAdapters {
|
||||
adapters = append(adapters, legacyruntime.ModelAdapterConfig{
|
||||
ID: item.ID,
|
||||
ID: item.ID,
|
||||
CustomHeadersEnabled: item.CustomHeadersEnabled, CustomHeadersJSON: item.CustomHeadersJSON,
|
||||
AnthropicExtraParamsEnabled: item.AnthropicExtraParamsEnabled, AnthropicExtraParamsJSON: item.AnthropicExtraParamsJSON,
|
||||
DisplayName: item.DisplayName,
|
||||
Type: item.Type,
|
||||
BaseURL: item.BaseURL,
|
||||
@@ -204,7 +219,7 @@ func (manager *Manager) RouteMode(hasUpstreamURL bool) string {
|
||||
}
|
||||
|
||||
func (manager *Manager) setCurrent(cfg Config) {
|
||||
next := cfg
|
||||
next := cloneConfig(cfg)
|
||||
manager.current.Store(&next)
|
||||
}
|
||||
|
||||
@@ -215,6 +230,13 @@ func (manager *Manager) reloadIfChanged(ctx context.Context) {
|
||||
if ctx == nil {
|
||||
ctx = context.Background()
|
||||
}
|
||||
manager.saveMu.Lock()
|
||||
reloadSaveLocked := true
|
||||
defer func() {
|
||||
if reloadSaveLocked {
|
||||
manager.saveMu.Unlock()
|
||||
}
|
||||
}()
|
||||
now := time.Now()
|
||||
manager.reloadMu.Lock()
|
||||
if !manager.lastReload.IsZero() && now.Sub(manager.lastReload) < configHotReloadMinInterval {
|
||||
@@ -241,6 +263,8 @@ func (manager *Manager) reloadIfChanged(ctx context.Context) {
|
||||
manager.reloadError = ""
|
||||
manager.setCurrent(cfg)
|
||||
manager.reloadMu.Unlock()
|
||||
manager.saveMu.Unlock()
|
||||
reloadSaveLocked = false
|
||||
manager.notify(cfg)
|
||||
}
|
||||
|
||||
@@ -250,7 +274,7 @@ func (manager *Manager) notify(cfg Config) {
|
||||
manager.listenersMu.RUnlock()
|
||||
for _, listener := range listeners {
|
||||
if listener != nil {
|
||||
listener(cfg)
|
||||
listener(cloneConfig(cfg))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user