using System.Text.Json;
using System.Text.Json.Serialization;
namespace Agent.Core.Runtime;
///
/// LLM-generated plan parsed from structured output.
/// Each planned task contains a description, dependency references (by index),
/// token budget class, PERT estimates, and the requires_external_effect attribute.
///
public sealed class PlanResult
{
[JsonPropertyName("tasks")]
public List Tasks { get; init; } = [];
}
public sealed class PlannedTask
{
[JsonPropertyName("description")]
public string Description { get; init; } = string.Empty;
[JsonPropertyName("dependencies")]
public List Dependencies { get; init; } = [];
[JsonPropertyName("budget_class")]
public string BudgetClass { get; init; } = "4K";
[JsonPropertyName("optimistic_tokens")]
public long OptimisticTokens { get; init; }
[JsonPropertyName("most_likely_tokens")]
public long MostLikelyTokens { get; init; }
[JsonPropertyName("pessimistic_tokens")]
public long PessimisticTokens { get; init; }
[JsonPropertyName("requires_external_effect")]
public bool RequiresExternalEffect { get; init; }
[JsonPropertyName("required_effect_tools")]
public List RequiredEffectTools { get; init; } = [];
}
///
/// JSON Schema for Ollama structured output during Planning.
///
public static class PlanSchema
{
public static string Json => """{"type":"object","properties":{"tasks":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"dependencies":{"type":"array","items":{"type":"integer"}},"budget_class":{"type":"string","enum":["1K","2K","4K","8K","16K","32K","64K","128K"]},"optimistic_tokens":{"type":"integer","minimum":1},"most_likely_tokens":{"type":"integer","minimum":1},"pessimistic_tokens":{"type":"integer","minimum":1},"requires_external_effect":{"type":"boolean"},"required_effect_tools":{"type":"array","items":{"type":"string","enum":["file_edit","process_run","dir"]}}},"required":["description","dependencies","budget_class","optimistic_tokens","most_likely_tokens","pessimistic_tokens","requires_external_effect","required_effect_tools"]}}},"required":["tasks"]}""";
private static readonly JsonElement _element = JsonDocument.Parse(Json).RootElement.Clone();
public static JsonElement Element => _element;
}