summaryrefslogtreecommitdiff
path: root/src/Agent.Core/Runtime/AgentRuntime.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Agent.Core/Runtime/AgentRuntime.cs')
-rw-r--r--src/Agent.Core/Runtime/AgentRuntime.cs22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/Agent.Core/Runtime/AgentRuntime.cs b/src/Agent.Core/Runtime/AgentRuntime.cs
index 676fe0d..602460f 100644
--- a/src/Agent.Core/Runtime/AgentRuntime.cs
+++ b/src/Agent.Core/Runtime/AgentRuntime.cs
@@ -299,6 +299,13 @@ public sealed class AgentRuntime(TaskRegistry registry, IOllamaClient ollama, Ag
session.AppendExecutionResult(new ExecutionResult(taskId, call.Function.Name, toolResult.Success, toolResult.Output));
_observer.ToolResult(callContext, call.Function.Name, toolResult);
+ if (!toolResult.Success && !toolResult.RetryAllowed && toolResult.ErrorCategory == "platform" && !isMetadataTool)
+ {
+ string platformMessage = LocalizePlatformFailure(toolResult);
+ registry.UpdateDiagnostics(taskId, counters.Iterations, counters.Replans,
+ toolResult.ErrorCode ?? "sandbox.elevation_failed", platformMessage);
+ throw new InvalidOperationException(platformMessage);
+ }
if (!toolResult.Success && !toolResult.RetryAllowed && !isMetadataTool)
throw new PolicyDeniedException(toolResult.FailureFingerprint ?? $"policy:{call.Function.Name}:{toolResult.Output}", toolResult.Output,
toolResult.ErrorCode ?? "policy_denied", toolResult.ErrorCategory, toolResult.TargetPath,
@@ -531,6 +538,7 @@ public sealed class AgentRuntime(TaskRegistry registry, IOllamaClient ollama, Ag
string resolutionKey = error.ErrorCategory switch
{
"filesystem" => "runtime.policy_resolution.filesystem",
+ "acl" => "runtime.policy_resolution.acl",
"process" => "runtime.policy_resolution.process",
"network" => "runtime.policy_resolution.network",
_ => "runtime.policy_resolution.default"
@@ -544,6 +552,20 @@ public sealed class AgentRuntime(TaskRegistry registry, IOllamaClient ollama, Ag
});
}
+ private string LocalizePlatformFailure(ToolExecutionResult result)
+ {
+ if (locale is null) return result.Output;
+ string key = result.ErrorCode switch
+ {
+ "sandbox.elevation_cancelled" => "runtime.platform.elevation_cancelled",
+ "sandbox.helper_incompatible" => "runtime.platform.helper_incompatible",
+ "sandbox.ipc_rejected" => "runtime.platform.ipc_rejected",
+ "sandbox.network_apply_failed" => "runtime.platform.network_apply_failed",
+ _ => "runtime.platform.elevation_failed"
+ };
+ return locale.Format(key, new Dictionary<string, object?> { ["message"] = result.Output });
+ }
+
private bool TryParseSelectedSkills(string content, out IReadOnlyList<AgentSkill> selected)
{
selected = [];