// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later package app import ( "context" "errors" "strings" "time" "git.stormux.org/storm/cthulhu/internal/preferences" "git.stormux.org/storm/cthulhu/internal/tentacle" ) func (worker *preferencesWorker) manage_tentacle(ctx context.Context, request preferences.Request) preferences.Response { response := preferences.Response{} if worker.choosingApplication || worker.editApp != "" || request.Application != "" { response.Message = "Tentacles can only be managed in global preferences." return response } if request.Save || request.Close || request.Cancel || request.Preview || request.Tentacle == nil { response.Message = "Tentacle management must be a separate request." return response } if request.Tentacle.Action == "settings" { if request.Tentacle.Entry != nil || request.Tentacle.URL != "" { response.Message = "Invalid tentacle settings request." } else if err := worker.tentacles.OpenSettings(ctx, request.Tentacle.ID); err != nil { response.Message = err.Error() } else { response.Accepted = true } return response } timeout := 6 * time.Second if strings.HasPrefix(request.Tentacle.Action, "repository-") || strings.HasPrefix(request.Tentacle.Action, "install") { timeout = 50 * time.Second } ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() if err := worker.tentacles.Manage(ctx, *request.Tentacle); err != nil { response.Message = "Tentacle operation was not accepted: " + err.Error() if errors.Is(err, tentacle.ErrRegistrySync) { response.Accepted = true response.Message = "Tentacle configuration applied and saved, but durability could not be confirmed." } } else { response.Accepted = true response.Message = "Tentacle configuration saved; runtime status is shown separately." if request.Tentacle.Action == "list" { response.Message = "Tentacle status." } if request.Tentacle.Action == "retry" { response.Message = "Tentacle is active." } switch request.Tentacle.Action { case "install": response.Message = "Tentacle installed and saved. Enable it when you are ready." case "install-enable": response.Message = "Tentacle installed and active." case "repository-add": response.Message = "Repository added. Its tentacles are listed in the table." case "repository-refresh": response.Message = "Repository catalog refreshed." case "repository-remove": response.Message = "Repository removed. Installed tentacles and settings were retained." } } snapshot := worker.tentacles.Snapshot() response.Tentacles = &snapshot return response }