Remove AI config approval flow

This commit is contained in:
npc0-hue
2026-09-22 15:33:32 +08:00
parent 20008b4043
commit a8b5d483a3
54 changed files with 364 additions and 875 deletions
+22 -10
View File
@@ -3,7 +3,6 @@ package service
import (
"errors"
"strings"
"time"
"browser.local/platform/domain"
"browser.local/platform/repo"
@@ -24,7 +23,7 @@ func (MockAIProviderClient) Invoke(provider domain.AIProvider, request domain.AI
if model == "" && len(provider.Models) > 0 {
model = provider.Models[0]
}
recommendation := "Mock AI recommendation for " + request.Purpose + ": review the proposed change before dispatch."
recommendation := "Mock AI recommendation for " + request.Purpose + ": configuration changes are dispatched automatically."
result := domain.AIProviderInvocationResult{
Recommendation: recommendation,
Usage: domain.AIInvocationUsage{
@@ -46,10 +45,12 @@ func (svc *CoreService) InvokeAIForSession(sessionID string, request domain.AIIn
if err := validator.ValidateAIInvocationRequest(request); err != nil {
return domain.AIInvocationResponse{}, err
}
user, err := svc.GetCurrentUser(sessionID)
if err != nil {
if _, err := svc.GetCurrentUser(sessionID); err != nil {
return domain.AIInvocationResponse{}, err
}
var currentConfig domain.ServerConfig
var hasCurrentConfig bool
var err error
if request.ServerInstanceID != "" {
instance, err := svc.GetServerInstanceForSession(sessionID, request.ServerInstanceID)
if err != nil {
@@ -63,6 +64,8 @@ func (svc *CoreService) InvokeAIForSession(sessionID string, request domain.AIIn
if err != nil {
return domain.AIInvocationResponse{}, err
}
currentConfig = config
hasCurrentConfig = true
request.CurrentConfig = config.Content
}
}
@@ -111,16 +114,25 @@ func (svc *CoreService) InvokeAIForSession(sessionID string, request domain.AIIn
Usage: result.Usage,
}
if result.SuggestedConfig != "" {
if request.ServerInstanceID == "" {
if request.ServerInstanceID == "" || !hasCurrentConfig {
return domain.AIInvocationResponse{}, validationError("serverInstanceId is required for AI config recommendations")
}
idempotencyKey := aiConfigWriteIdempotencyKey(request.RequestID, request.ServerInstanceID)
svc.pluginOperationsMu.Lock()
preview, persistErr := svc.persistAIConfigDiff(user.ID, provider, request, result)
dispatch, dispatchErr := svc.ApproveServerConfigWriteForSession(sessionID, domain.ServerConfigWriteApproval{
ServerInstanceID: request.ServerInstanceID,
ExpectedConfigVersion: currentConfig.ConfigVersion,
ExpectedChecksum: currentConfig.Checksum,
Key: currentConfig.Key,
ProposedContent: result.SuggestedConfig,
IdempotencyKey: idempotencyKey,
})
svc.pluginOperationsMu.Unlock()
if persistErr != nil {
return domain.AIInvocationResponse{}, persistErr
if dispatchErr != nil {
return domain.AIInvocationResponse{}, dispatchErr
}
response.ConfigRecommendation = &domain.AIConfigRecommendation{Key: preview.Key, SuggestedConfig: preview.ProposedConfig, DiffSummary: preview.DiffSummary, DiffID: preview.ID, ExpiresAt: preview.ExpiresAt.Format(time.RFC3339)}
response.ConfigRecommendation = &domain.AIConfigRecommendation{Key: currentConfig.Key, SuggestedConfig: result.SuggestedConfig, DiffSummary: "AI 配置建议已直接派发 config.write 任务"}
response.ConfigExecution = &domain.AIConfigExecution{Status: dispatch.Status, Job: dispatch.Job}
}
if err := validator.ValidateAIInvocationResponse(response); err != nil {
return domain.AIInvocationResponse{}, err
@@ -179,7 +191,7 @@ func buildSuggestedConfig(currentConfig string, prompt string) string {
if strings.Contains(strings.ToLower(prompt), "pvp") && !strings.Contains(base, "pvp=") {
base += "\npvp=false"
}
return base + "\n# ai.recommendation=review-required\n"
return base + "\n# ai.recommendation=auto-applied\n"
}
func boundedTokenEstimate(value string) int {