diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 63af55b13..b3c6ddcfc 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -11032,6 +11032,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SECURITY::PROMPTINJECTIONSOURCEKINDEXTENSIONS: -- File content UI_TEXT_CONTENT["AISTUDIO::TOOLS::SECURITY::PROMPTINJECTIONSOURCEKINDEXTENSIONS::T3788064862"] = "File content" +-- The revised assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1002777578"] = "The revised assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again." + -- The Assistant Builder context could not be loaded. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T108292972"] = "The Assistant Builder context could not be loaded." @@ -11047,9 +11050,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1 -- The revision model did not return a usable answer. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1411545143"] = "The revision model did not return a usable answer." --- The revised assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1427741438"] = "The revised assistant plugin asks for tools this AI Studio does not have: \\\"{0}\\\". Please try again." - -- Description UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1725856265"] = "Description" @@ -11092,9 +11092,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T2 -- UI Components UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3053707933"] = "UI Components" --- The generated assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3058747041"] = "The generated assistant plugin asks for tools this AI Studio does not have: \\\"{0}\\\". Please try again." - -- The generated assistant plugin must be a form assistant, not a chat launcher. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3203271639"] = "The generated assistant plugin must be a form assistant, not a chat launcher." @@ -11125,6 +11122,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3 -- Only locally managed assistant plugins can be revised with AI. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3633992223"] = "Only locally managed assistant plugins can be revised with AI." +-- The generated assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T368041941"] = "The generated assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again." + -- The revised assistant plugin must remain locally managed. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3791030033"] = "The revised assistant plugin must remain locally managed." diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index 15b44bbbc..176c36ff1 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -11034,6 +11034,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SECURITY::PROMPTINJECTIONSOURCEKINDEXTENSIONS: -- File content UI_TEXT_CONTENT["AISTUDIO::TOOLS::SECURITY::PROMPTINJECTIONSOURCEKINDEXTENSIONS::T3788064862"] = "Dateiinhalt" +-- The revised assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1002777578"] = "Das überarbeitete Assistenten-Plugin fordert Werkzeuge an, die dieses AI Studio nicht hat: „{0}“. Bitte versuchen Sie es erneut." + -- The Assistant Builder context could not be loaded. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T108292972"] = "Der Kontext des Assistenten-Builders konnte nicht geladen werden." @@ -11049,9 +11052,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1 -- The revision model did not return a usable answer. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1411545143"] = "Das Überarbeitungsmodell hat keine brauchbare Antwort zurückgegeben." --- The revised assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1427741438"] = "Das überarbeitete Assistenten-Plugin fordert Werkzeuge an, über die dieses AI Studio nicht verfügt: „{0}“. Bitte versuchen Sie es erneut." - -- Description UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1725856265"] = "Beschreibung" @@ -11094,9 +11094,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T2 -- UI Components UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3053707933"] = "UI-Komponenten" --- The generated assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3058747041"] = "Das generierte Assistenten-Plugin fordert Werkzeuge an, über die dieses AI Studio nicht verfügt: „{0}“. Bitte versuche es erneut." - -- The generated assistant plugin must be a form assistant, not a chat launcher. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3203271639"] = "Das generierte Assistenten-Plugin muss ein Formularassistent und darf kein Chat-Schnellstart sein." @@ -11127,6 +11124,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3 -- Only locally managed assistant plugins can be revised with AI. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3633992223"] = "Nur lokal verwaltete Assistenten-Plugins können mit KI überarbeitet werden." +-- The generated assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T368041941"] = "Das generierte Assistenten-Plugin fordert Werkzeuge an, die dieses AI Studio nicht hat: „{0}“. Bitte versuchen Sie es erneut." + -- The revised assistant plugin must remain locally managed. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3791030033"] = "Das überarbeitete Assistenten-Plugin muss weiterhin lokal verwaltet werden." diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index ee4ef8234..8b6fdb030 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -11034,6 +11034,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SECURITY::PROMPTINJECTIONSOURCEKINDEXTENSIONS: -- File content UI_TEXT_CONTENT["AISTUDIO::TOOLS::SECURITY::PROMPTINJECTIONSOURCEKINDEXTENSIONS::T3788064862"] = "File content" +-- The revised assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1002777578"] = "The revised assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again." + -- The Assistant Builder context could not be loaded. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T108292972"] = "The Assistant Builder context could not be loaded." @@ -11049,9 +11052,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1 -- The revision model did not return a usable answer. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1411545143"] = "The revision model did not return a usable answer." --- The revised assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1427741438"] = "The revised assistant plugin asks for tools this AI Studio does not have: \\\"{0}\\\". Please try again." - -- Description UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T1725856265"] = "Description" @@ -11094,9 +11094,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T2 -- UI Components UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3053707933"] = "UI Components" --- The generated assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3058747041"] = "The generated assistant plugin asks for tools this AI Studio does not have: \\\"{0}\\\". Please try again." - -- The generated assistant plugin must be a form assistant, not a chat launcher. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3203271639"] = "The generated assistant plugin must be a form assistant, not a chat launcher." @@ -11127,6 +11124,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3 -- Only locally managed assistant plugins can be revised with AI. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3633992223"] = "Only locally managed assistant plugins can be revised with AI." +-- The generated assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T368041941"] = "The generated assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again." + -- The revised assistant plugin must remain locally managed. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGINGENERATIONSERVICE::T3791030033"] = "The revised assistant plugin must remain locally managed." diff --git a/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs b/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs index 5daa79a26..85b7767e0 100644 --- a/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs +++ b/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs @@ -116,7 +116,7 @@ public async Task GenerateInitialLuaAsync(Assist return InitialFailure(TB("The generated assistant metadata does not match the generated plugin.")); if (this.FindUnknownToolIds(generatedAssistant) is { Count: > 0 } unknownToolIds) - return InitialFailure(string.Format(TB("The generated assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again."), string.Join(", ", unknownToolIds))); + return InitialFailure(string.Format(TB("The generated assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again."), string.Join(", ", unknownToolIds))); return new(true, fullLua, parsedResponse.Plugin?.Name ?? string.Empty, string.Empty); } @@ -235,7 +235,7 @@ public async Task GenerateRevisionAsync(PluginAssi return RevisionFailure(TB("The revised assistant metadata does not match the revised plugin.")); if (this.FindUnknownToolIds(revisedAssistant, plugin) is { Count: > 0 } unknownToolIds) - return RevisionFailure(string.Format(TB("The revised assistant plugin asks for tools this AI Studio does not have: \"{0}\". Please try again."), string.Join(", ", unknownToolIds))); + return RevisionFailure(string.Format(TB("The revised assistant plugin asks for tools this AI Studio does not have: '{0}'. Please try again."), string.Join(", ", unknownToolIds))); return new(true, revisedLua, parsedResponse.Plugin?.Name ?? plugin.Name, string.Empty); } diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs b/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs index ce29ecd22..bc44d46cd 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs @@ -107,7 +107,9 @@ private async Task GetSecretByKey(string secretKey, bool isTryi var result = await this.http.PostAsJsonAsync("/secrets/get", secretRequest, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { - if(!isTrying) + if(isTrying) + this.logger!.LogWarning($"Failed to get the secret data for '{secretKey}' due to an API issue (try mode): '{result.StatusCode}'"); + else this.logger!.LogError($"Failed to get the secret data for '{secretKey}' due to an API issue: '{result.StatusCode}'"); return new RequestedSecret(false, new EncryptedText(string.Empty), TB("Failed to get the secret data due to an API issue.")); } @@ -115,8 +117,17 @@ private async Task GetSecretByKey(string secretKey, bool isTryi var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); if (!state.Success) { + // + // A missing entry is what try mode is for: the absent keyring entry is how the app + // recognizes an unconfigured secret in the first place, so it is not worth a line + // in the log. Anything else — a locked keychain, an unavailable secret service, a + // dismissed prompt — is a real problem that used to hide on debug level: + // if (isTrying) - this.logger!.LogDebug($"No secret data configured for '{secretKey}' (try mode): '{state.Issue}'"); + { + if (state.IssueCode is not SecretStoreIssueCode.SECRET_NOT_FOUND) + this.logger!.LogWarning($"Failed to get the secret data for '{secretKey}' (try mode): '{state.Issue}'"); + } else this.logger!.LogError($"Failed to get the secret data for '{secretKey}': '{state.Issue}'"); } diff --git a/runtime/src/secret.rs b/runtime/src/secret.rs index 4e02ad65e..a6eaab86d 100644 --- a/runtime/src/secret.rs +++ b/runtime/src/secret.rs @@ -1,6 +1,6 @@ use axum::Json; use keyring_core::{Entry, Error as KeyringError}; -use log::{error, info, warn}; +use log::{debug, error, info, warn}; use serde::{Deserialize, Serialize}; use crate::api_token::APIToken; use crate::encryption::{EncryptedText, ENCRYPTION}; @@ -165,7 +165,11 @@ pub async fn get_secret(_token: APIToken, request: Json) -> Json< let secret = entry.get_password(); match secret { Ok(s) => { - info!(Source = "Secret Store"; "Secret for '{service}' and user '{user_name}' was retrieved successfully."); + // Reading a secret is routine: it happens for every secret field of every tool + // the model calls, so an info line per read only crowds the release log. Storing + // and deleting a secret stay at info and warn, because those are rare and the + // user asked for them: + debug!(Source = "Secret Store"; "Secret for '{service}' and user '{user_name}' was retrieved successfully."); // Encrypt the secret: let encrypted_secret = match ENCRYPTION.encrypt(s.as_str()) {