From 7aa4ff5d8403e4c1480faafce0af8d3549276c9f Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Tue, 11 Aug 2026 05:54:22 +0900 Subject: Fix PlanAsync fallback and BeginTask TaskGraph conflict MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- src/Agent.Core/Tools/TaskGraphToolHandler.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/Agent.Core/Tools') diff --git a/src/Agent.Core/Tools/TaskGraphToolHandler.cs b/src/Agent.Core/Tools/TaskGraphToolHandler.cs index edc1cc5..10094d3 100644 --- a/src/Agent.Core/Tools/TaskGraphToolHandler.cs +++ b/src/Agent.Core/Tools/TaskGraphToolHandler.cs @@ -21,13 +21,13 @@ public sealed class TaskGraphToolHandler(int maxTasks = 32, SessionStore? sessio TaskGraph graph = new(maxTasks); if (sessions is not null && sessions.TryGet(sessionId, out AgentSession? session) && session is not null) { - if (!session.TaskGraphs.TryAdd(taskId, graph)) - throw new InvalidOperationException($"TaskGraph for '{taskId}' already exists in session '{sessionId}'."); + // PlanAsync may have already created a TaskGraph for this taskId. + // If so, keep the planned graph; otherwise add a new empty one. + session.TaskGraphs.TryAdd(taskId, graph); } else { - if (!_fallbackGraphs.TryAdd(taskId, graph)) - throw new InvalidOperationException($"TaskGraph for '{taskId}' already exists."); + _fallbackGraphs.TryAdd(taskId, graph); } } -- cgit v1.2.3