1
0

feat: Implement a modular skill system with hotword detection, streaming text output, and enhanced logging.

This commit is contained in:
2026-02-27 00:39:32 +01:00
parent 4ee4bc5457
commit a365448399
18 changed files with 451 additions and 23 deletions

13
Core/Skills/ISkill.cs Normal file
View File

@@ -0,0 +1,13 @@
namespace Toak.Core.Skills;
public interface ISkill
{
string Name { get; }
string Description { get; }
string[] Hotwords { get; }
bool HandlesExecution { get; }
string GetSystemPrompt(string rawTranscript);
void Execute(string llmResult);
}

View File

@@ -0,0 +1,29 @@
namespace Toak.Core.Skills;
public static class SkillRegistry
{
public static readonly ISkill[] AllSkills = new ISkill[]
{
new TerminalSkill(),
new TranslateSkill()
};
public static ISkill? DetectSkill(string transcript, IEnumerable<string> activeSkillNames)
{
var activeSkills = AllSkills.Where(s => activeSkillNames.Contains(s.Name, StringComparer.OrdinalIgnoreCase)).ToList();
string normalizedTranscript = transcript.Trim();
foreach (var skill in activeSkills)
{
foreach (var hotword in skill.Hotwords)
{
if (normalizedTranscript.StartsWith(hotword, StringComparison.OrdinalIgnoreCase))
{
return skill;
}
}
}
return null;
}
}

View File

@@ -0,0 +1,41 @@
using System.Diagnostics;
namespace Toak.Core.Skills;
public class TerminalSkill : ISkill
{
public string Name => "Terminal";
public string Description => "Translates an intent into a bash command and runs it in the background.";
public string[] Hotwords => new[] { "System terminal", "System command" };
public bool HandlesExecution => true;
public string GetSystemPrompt(string rawTranscript)
{
return @"You are a command-line assistant. The user will ask you to perform a task.
Translate the request into a single bash command.
Output ONLY the raw bash command to achieve this task. Do not include markdown formatting, backticks, or explanations.";
}
public void Execute(string llmResult)
{
try
{
Console.WriteLine($"[TerminalSkill] Executing: {llmResult}");
var escapedCmd = llmResult.Replace("\"", "\\\"");
var pInfo = new ProcessStartInfo
{
FileName = "bash",
Arguments = $"-c \"{escapedCmd}\"",
UseShellExecute = false,
CreateNoWindow = true
};
Process.Start(pInfo);
IO.Notifications.Notify("Toak Terminal Executed", llmResult);
}
catch (Exception ex)
{
Console.WriteLine($"[TerminalSkill Error] {ex.Message}");
}
}
}

View File

@@ -0,0 +1,23 @@
namespace Toak.Core.Skills;
public class TranslateSkill : ISkill
{
public string Name => "Translate";
public string Description => "Translates the spoken text into another language on the fly.";
public string[] Hotwords => new[] { "System translate to", "System translate into" };
public bool HandlesExecution => false;
public string GetSystemPrompt(string rawTranscript)
{
return @"You are an expert translator. The user wants to translate the following text.
The first few words identify the target language (e.g. 'Translate to Spanish:', 'Translate into Hungarian:').
Translate the REST of the transcript into that target language.
Output ONLY the final translated text. Do not include markdown, explanations, or quotes.";
}
public void Execute(string llmResult)
{
// Not used since HandlesExecution is false
}
}