← All source files

V16 / 6df58cd3ed86

WorkspaceTool.cs

Lilith/Core/Workspace/WorkspaceTool.cs

Unchanged from the preceding version
CS
using System.Text.Json;
using Lilith.Core.Tools;

namespace Lilith.Core.Workspace;

internal sealed class WorkspaceTool(WorkspaceSession session, string operation, IReadOnlyDictionary<string, string> inputs, Action<WorkspaceResult> completed) : ITurnResultTool
{
    public string Name => "workspace_" + operation + "_operation";
    public string Description => "Perform the scenario's " + operation + " operation. Use the declared scenario inputs exactly. Returns a verified storage result. Never invent completion.";
    public TimeSpan ExecutionTimeout => TimeSpan.FromSeconds(30);
    public JsonElement Parameters => JsonSerializer.SerializeToElement(new { type = "object", properties = new { }, additionalProperties = false });
    public async Task<string> ExecuteAsync(JsonElement arguments, CancellationToken cancellationToken = default) =>
        (await ExecuteResultAsync(arguments, cancellationToken)).Content;
    public async Task<ToolExecutionResult> ExecuteResultAsync(JsonElement arguments, CancellationToken cancellationToken)
    {
        if (arguments.ValueKind != JsonValueKind.Object || arguments.EnumerateObject().Any()) throw new ArgumentException("Workspace tools take no arguments; values are bound to the scenario inputs.");
        string Get(string name) => inputs.GetValueOrDefault(name, "");
        if (!int.TryParse(Get("offset").Length == 0 ? "0" : Get("offset"), out int offset)) throw new ArgumentException("Invalid offset.");
        var request = new WorkspaceRequest(operation, Get("path"), Get("content"), Get("destination"), Get("query"), Get("bin_id"), offset);
        var result = await session.ExecuteAsync(request, cancellationToken);
        completed(result);
        string json = JsonSerializer.Serialize(result);
        return new(json, json);
    }
    internal static readonly string[] Operations = ["save", "mkdir", "move", "bin", "restore", "search", "read", "list", "bin_list", "pending", "approve"];
    internal static string? Operation(string name) => Operations.FirstOrDefault(op => name == "workspace_" + op + "_operation");
}