using System.Linq;
using UnityEngine;
using LLM.Editor.Data;
using LLM.Editor.Core;
using LLM.Editor.Helper;
using Newtonsoft.Json.Linq;
using JetBrains.Annotations;
namespace LLM.Editor.Commands
{
///
/// A command that allows the LLM to write to, update, or clear its own
/// short-term memory for the current session.
///
[UsedImplicitly]
public class UpdateWorkingContextCommand : ICommand
{
[System.Serializable]
private class UpdateWorkingContextParams
{
public JObject updates;
public string[] keysToRemove;
public bool clearAll;
}
private readonly UpdateWorkingContextParams _params;
public UpdateWorkingContextCommand(string jsonParams)
{
_params = jsonParams?.FromJson();
}
public CommandOutcome Execute(CommandContext context)
{
if (_params == null)
{
context.ErrorMessage = "Invalid parameters for UpdateWorkingContextCommand.";
return CommandOutcome.Error;
}
var workingContext = SessionManager.LoadWorkingContext();
if (_params.clearAll)
{
workingContext = new JObject();
context.Plan = null;
}
if (_params.keysToRemove != null)
{
foreach (var key in _params.keysToRemove)
{
workingContext.Remove(key);
if (key == "plan") context.Plan = null;
}
}
if (_params.updates != null)
{
if (_params.updates.TryGetValue("plan", out var planToken) && planToken is JArray planArray)
{
context.Plan = planArray.Select(step => step.ToString()).ToList();
Debug.Log($"[UpdateWorkingContextCommand] Extracted plan with {context.Plan.Count} steps.");
}
foreach (var property in _params.updates.Properties())
{
workingContext[property.Name] = property.Value;
}
}
SessionManager.SaveWorkingContext(workingContext);
Debug.Log($"[UpdateWorkingContextCommand] Working context updated.");
return CommandOutcome.Success;
}
}
}