From 1e6bc81cfdfc2ec5b6d13195ee239c0bf3a7b17c Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Wed, 25 Mar 2026 10:31:44 +0800 Subject: [PATCH] refactor(config): replace `auto-update-panel` with `disable-auto-update-panel` for clarity --- config.example.yaml | 6 +-- internal/config/config.go | 6 +-- internal/managementasset/updater.go | 8 ++-- internal/watcher/diff/config_diff.go | 3 ++ internal/watcher/diff/config_diff_test.go | 46 +++++++++++++---------- 5 files changed, 40 insertions(+), 29 deletions(-) diff --git a/config.example.yaml b/config.example.yaml index 9ef875af..42867ecb 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -25,9 +25,9 @@ remote-management: # Disable the bundled management control panel asset download and HTTP route when true. disable-control-panel: false - # Enable automatic periodic background updates of the management panel from GitHub (default: false). - # When disabled, the panel is only downloaded on first access if missing, and never auto-updated afterward. - # auto-update-panel: false + # Disable automatic periodic background updates of the management panel from GitHub (default: false). + # When enabled, the panel is only downloaded on first access if missing, and never auto-updated afterward. + # disable-auto-update-panel: false # GitHub repository for the management control panel. Accepts a repository URL or releases API URL. panel-github-repository: "https://github.com/router-for-me/Cli-Proxy-API-Management-Center" diff --git a/internal/config/config.go b/internal/config/config.go index 1b06392b..c4156e97 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -178,9 +178,9 @@ type RemoteManagement struct { SecretKey string `yaml:"secret-key"` // DisableControlPanel skips serving and syncing the bundled management UI when true. DisableControlPanel bool `yaml:"disable-control-panel"` - // AutoUpdatePanel enables automatic periodic background updates of the management panel asset from GitHub. - // When false (the default), the panel is only downloaded on first access if missing, and never auto-updated. - AutoUpdatePanel bool `yaml:"auto-update-panel"` + // DisableAutoUpdatePanel disables automatic periodic background updates of the management panel asset from GitHub. + // When false (the default), the background updater remains enabled; when true, the panel is only downloaded on first access if missing. + DisableAutoUpdatePanel bool `yaml:"disable-auto-update-panel"` // PanelGitHubRepository overrides the GitHub repository used to fetch the management panel asset. // Accepts either a repository URL (https://github.com/org/repo) or an API releases endpoint. PanelGitHubRepository string `yaml:"panel-github-repository"` diff --git a/internal/managementasset/updater.go b/internal/managementasset/updater.go index 473c1a91..ae2bc819 100644 --- a/internal/managementasset/updater.go +++ b/internal/managementasset/updater.go @@ -31,7 +31,7 @@ const ( httpUserAgent = "CLIProxyAPI-management-updater" managementSyncMinInterval = 30 * time.Second updateCheckInterval = 3 * time.Hour - maxAssetDownloadSize = 10 << 20 // 10 MB safety limit for management asset downloads + maxAssetDownloadSize = 50 << 20 // 10 MB safety limit for management asset downloads ) // ManagementFileName exposes the control panel asset filename. @@ -89,8 +89,8 @@ func runAutoUpdater(ctx context.Context) { log.Debug("management asset auto-updater skipped: control panel disabled") return } - if !cfg.RemoteManagement.AutoUpdatePanel { - log.Debug("management asset auto-updater skipped: auto-update-panel is disabled") + if cfg.RemoteManagement.DisableAutoUpdatePanel { + log.Debug("management asset auto-updater skipped: disable-auto-update-panel is enabled") return } @@ -289,7 +289,7 @@ func ensureFallbackManagementHTML(ctx context.Context, client *http.Client, loca } log.Warnf("management asset downloaded from fallback URL without digest verification (hash=%s) — "+ - "consider setting auto-update-panel: true to receive verified updates from GitHub", downloadedHash) + "enable verified GitHub updates by keeping disable-auto-update-panel set to false", downloadedHash) if err = atomicWriteFile(localPath, data); err != nil { log.WithError(err).Warn("failed to persist fallback management control panel page") diff --git a/internal/watcher/diff/config_diff.go b/internal/watcher/diff/config_diff.go index 7997f04e..fccdaf8d 100644 --- a/internal/watcher/diff/config_diff.go +++ b/internal/watcher/diff/config_diff.go @@ -256,6 +256,9 @@ func BuildConfigChangeDetails(oldCfg, newCfg *config.Config) []string { if oldCfg.RemoteManagement.DisableControlPanel != newCfg.RemoteManagement.DisableControlPanel { changes = append(changes, fmt.Sprintf("remote-management.disable-control-panel: %t -> %t", oldCfg.RemoteManagement.DisableControlPanel, newCfg.RemoteManagement.DisableControlPanel)) } + if oldCfg.RemoteManagement.DisableAutoUpdatePanel != newCfg.RemoteManagement.DisableAutoUpdatePanel { + changes = append(changes, fmt.Sprintf("remote-management.disable-auto-update-panel: %t -> %t", oldCfg.RemoteManagement.DisableAutoUpdatePanel, newCfg.RemoteManagement.DisableAutoUpdatePanel)) + } oldPanelRepo := strings.TrimSpace(oldCfg.RemoteManagement.PanelGitHubRepository) newPanelRepo := strings.TrimSpace(newCfg.RemoteManagement.PanelGitHubRepository) if oldPanelRepo != newPanelRepo { diff --git a/internal/watcher/diff/config_diff_test.go b/internal/watcher/diff/config_diff_test.go index f35ceeea..c7b73f11 100644 --- a/internal/watcher/diff/config_diff_test.go +++ b/internal/watcher/diff/config_diff_test.go @@ -20,10 +20,11 @@ func TestBuildConfigChangeDetails(t *testing.T) { RestrictManagementToLocalhost: false, }, RemoteManagement: config.RemoteManagement{ - AllowRemote: false, - SecretKey: "old", - DisableControlPanel: false, - PanelGitHubRepository: "repo-old", + AllowRemote: false, + SecretKey: "old", + DisableControlPanel: false, + DisableAutoUpdatePanel: false, + PanelGitHubRepository: "repo-old", }, OAuthExcludedModels: map[string][]string{ "providerA": {"m1"}, @@ -54,10 +55,11 @@ func TestBuildConfigChangeDetails(t *testing.T) { }, }, RemoteManagement: config.RemoteManagement{ - AllowRemote: true, - SecretKey: "new", - DisableControlPanel: true, - PanelGitHubRepository: "repo-new", + AllowRemote: true, + SecretKey: "new", + DisableControlPanel: true, + DisableAutoUpdatePanel: true, + PanelGitHubRepository: "repo-new", }, OAuthExcludedModels: map[string][]string{ "providerA": {"m1", "m2"}, @@ -88,6 +90,7 @@ func TestBuildConfigChangeDetails(t *testing.T) { expectContains(t, details, "ampcode.upstream-url: http://old-upstream -> http://new-upstream") expectContains(t, details, "ampcode.model-mappings: updated (1 -> 2 entries)") expectContains(t, details, "remote-management.allow-remote: false -> true") + expectContains(t, details, "remote-management.disable-auto-update-panel: false -> true") expectContains(t, details, "remote-management.secret-key: updated") expectContains(t, details, "oauth-excluded-models[providera]: updated (1 -> 2 entries)") expectContains(t, details, "oauth-excluded-models[providerb]: added (1 entries)") @@ -265,9 +268,10 @@ func TestBuildConfigChangeDetails_FlagsAndKeys(t *testing.T) { ModelMappings: []config.AmpModelMapping{{From: "a", To: "b"}}, }, RemoteManagement: config.RemoteManagement{ - DisableControlPanel: true, - PanelGitHubRepository: "new/repo", - SecretKey: "", + DisableControlPanel: true, + DisableAutoUpdatePanel: true, + PanelGitHubRepository: "new/repo", + SecretKey: "", }, SDKConfig: sdkconfig.SDKConfig{ RequestLog: true, @@ -299,6 +303,7 @@ func TestBuildConfigChangeDetails_FlagsAndKeys(t *testing.T) { expectContains(t, details, "ampcode.restrict-management-to-localhost: false -> true") expectContains(t, details, "ampcode.upstream-api-key: removed") expectContains(t, details, "remote-management.disable-control-panel: false -> true") + expectContains(t, details, "remote-management.disable-auto-update-panel: false -> true") expectContains(t, details, "remote-management.panel-github-repository: old/repo -> new/repo") expectContains(t, details, "remote-management.secret-key: deleted") } @@ -336,10 +341,11 @@ func TestBuildConfigChangeDetails_AllBranches(t *testing.T) { ForceModelMappings: false, }, RemoteManagement: config.RemoteManagement{ - AllowRemote: false, - DisableControlPanel: false, - PanelGitHubRepository: "old/repo", - SecretKey: "old", + AllowRemote: false, + DisableControlPanel: false, + DisableAutoUpdatePanel: false, + PanelGitHubRepository: "old/repo", + SecretKey: "old", }, SDKConfig: sdkconfig.SDKConfig{ RequestLog: false, @@ -389,10 +395,11 @@ func TestBuildConfigChangeDetails_AllBranches(t *testing.T) { ForceModelMappings: true, }, RemoteManagement: config.RemoteManagement{ - AllowRemote: true, - DisableControlPanel: true, - PanelGitHubRepository: "new/repo", - SecretKey: "", + AllowRemote: true, + DisableControlPanel: true, + DisableAutoUpdatePanel: true, + PanelGitHubRepository: "new/repo", + SecretKey: "", }, SDKConfig: sdkconfig.SDKConfig{ RequestLog: true, @@ -460,6 +467,7 @@ func TestBuildConfigChangeDetails_AllBranches(t *testing.T) { expectContains(t, changes, "oauth-excluded-models[p2]: added (1 entries)") expectContains(t, changes, "remote-management.allow-remote: false -> true") expectContains(t, changes, "remote-management.disable-control-panel: false -> true") + expectContains(t, changes, "remote-management.disable-auto-update-panel: false -> true") expectContains(t, changes, "remote-management.panel-github-repository: old/repo -> new/repo") expectContains(t, changes, "remote-management.secret-key: deleted") expectContains(t, changes, "openai-compatibility:")