summaryrefslogtreecommitdiff
path: root/src/Agent.Core/Tools/TaskGraphToolHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Agent.Core/Tools/TaskGraphToolHandler.cs')
-rw-r--r--src/Agent.Core/Tools/TaskGraphToolHandler.cs25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/Agent.Core/Tools/TaskGraphToolHandler.cs b/src/Agent.Core/Tools/TaskGraphToolHandler.cs
index 10094d3..26d5a27 100644
--- a/src/Agent.Core/Tools/TaskGraphToolHandler.cs
+++ b/src/Agent.Core/Tools/TaskGraphToolHandler.cs
@@ -56,15 +56,15 @@ public sealed class TaskGraphToolHandler(int maxTasks = 32, SessionStore? sessio
break;
case "add_dependency":
Guid taskIdValue = RequiredId(arguments, "task_id");
+ DemandStructuralMutation(graph, taskIdValue);
Guid[] dependencies = Ids(arguments, "depends_on");
if (dependencies.Length == 0) throw new ToolValidationException("depends_on must contain at least one task id.");
foreach (Guid dependency in dependencies) graph.AddDependency(taskIdValue, dependency);
break;
- case "set_state":
- graph.SetState(RequiredId(arguments, "task_id"), ParseState(RequiredString(arguments, "state")));
- break;
case "set_estimate":
- graph.SetEstimate(RequiredId(arguments, "task_id"), Budget(arguments), Estimate(arguments));
+ Guid estimateTaskId = RequiredId(arguments, "task_id");
+ DemandStructuralMutation(graph, estimateTaskId);
+ graph.SetEstimate(estimateTaskId, Budget(arguments), Estimate(arguments));
break;
default:
throw new ToolValidationException($"Unsupported task_update operation '{operation}'.");
@@ -114,6 +114,13 @@ public sealed class TaskGraphToolHandler(int maxTasks = 32, SessionStore? sessio
return value.ValueKind == JsonValueKind.True;
}
+ private static void DemandStructuralMutation(TaskGraph graph, Guid taskId)
+ {
+ PlannerTaskState state = graph.Get(taskId).State;
+ if (state is not (PlannerTaskState.Queued or PlannerTaskState.Planning))
+ throw new PlannerValidationException($"TaskGraph structure or estimate cannot be changed while Task '{taskId}' is {state}.");
+ }
+
private static TokenBudgetClass Budget(JsonElement arguments) =>
TokenBudgetClassExtensions.Parse(RequiredString(arguments, "budget_class"));
@@ -152,14 +159,4 @@ public sealed class TaskGraphToolHandler(int maxTasks = 32, SessionStore? sessio
return [.. ids];
}
- private static PlannerTaskState ParseState(string state) => state switch
- {
- "queued" => PlannerTaskState.Queued,
- "planning" => PlannerTaskState.Planning,
- "running" => PlannerTaskState.Running,
- "completed" => PlannerTaskState.Completed,
- "failed" => PlannerTaskState.Failed,
- "cancelled" => PlannerTaskState.Cancelled,
- _ => throw new ToolValidationException($"Unknown task state '{state}'.")
- };
}