diff options
| author | tanaka takashi <isazaka@gmail.com> | 2026-08-11 05:54:22 +0900 |
|---|---|---|
| committer | tanaka takashi <isazaka@gmail.com> | 2026-08-11 05:54:22 +0900 |
| commit | 7aa4ff5d8403e4c1480faafce0af8d3549276c9f (patch) | |
| tree | 6fe55142e9e8ede756ca5253031473ec4ab7515b /src/Agent.Core/Runtime | |
| parent | 35719799e62a18850efc52d380fb53bf3baa8022 (diff) | |
Fix PlanAsync fallback and BeginTask TaskGraph conflict
Two runtime bugs discovered during MCP integration testing:
1. PlannerService.BuildTaskGraph fallback: If the LLM-generated plan
contains invalid tasks (bad estimates, cycles, etc.), graph.AddTask
throws PlannerValidationException. Previously this propagated up and
caused "No tasks were executed." or "Planning failed" errors.
Fix: wrap BuildTaskGraph in try/catch, fall back to single-task
graph. Also handle graph.Count == 0 after filtering.
2. TaskGraphToolHandler.BeginTask conflict: PlanAsync stores the
planned TaskGraph in session.TaskGraphs[taskId] before RunAsync
calls BeginTaskAsync. BeginTask then tried TryAdd which failed
because the key already existed, throwing
"TaskGraph for '...' already exists in session".
Fix: use TryAdd without throwing on conflict — if PlanAsync already
created the graph, keep it; otherwise add a new empty one.
Test results: Core 61/61, Planner 10/10, Windows 41/41 (elevated).
MCP integration: agent_run/agent_status verified via HTTP transport.
ACL boundary: C:\Windows\System32 access correctly denied by sandbox.
ToolUseGuard: "Required external effect was not completed" fires
correctly when LLM does not produce verifiable external effect.
Diffstat (limited to 'src/Agent.Core/Runtime')
| -rw-r--r-- | src/Agent.Core/Runtime/PlannerService.cs | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/Agent.Core/Runtime/PlannerService.cs b/src/Agent.Core/Runtime/PlannerService.cs index 7a450d0..110e476 100644 --- a/src/Agent.Core/Runtime/PlannerService.cs +++ b/src/Agent.Core/Runtime/PlannerService.cs @@ -55,7 +55,15 @@ public sealed class PlannerService(IOllamaClient ollama, AgentRuntimeSettings se if (plan is null || plan.Tasks.Count == 0) return CreateFallbackGraph(request); - TaskGraph graph = BuildTaskGraph(plan, request); + TaskGraph graph; + try + { + graph = BuildTaskGraph(plan, request); + } + catch + { + return CreateFallbackGraph(request); + } session.TaskGraphs[taskId] = graph; return graph; } @@ -116,10 +124,21 @@ public sealed class PlannerService(IOllamaClient ollama, AgentRuntimeSettings se } string description = string.IsNullOrWhiteSpace(pt.Description) ? originalRequest : pt.Description; - PlannerTask task = graph.AddTask(description, budgetClass, estimate, dependencies, pt.RequiresExternalEffect); - idMap.Add(task.Id); + try + { + PlannerTask task = graph.AddTask(description, budgetClass, estimate, dependencies, pt.RequiresExternalEffect); + idMap.Add(task.Id); + } + catch (PlannerValidationException) + { + // If a task fails validation (e.g., bad estimate, cycle), fall back to single-task graph. + return CreateFallbackGraph(originalRequest); + } } + // If all tasks were filtered out, fall back. + if (graph.Count == 0) return CreateFallbackGraph(originalRequest); + return graph; } |
