201b599472
Some local models write the tool call as a JSON blob in `content` instead of the native tool_calls array (toolCalls arrives empty). The orchestrator then treated the blob as a failing artifact and retry-looped to exhaustion. salvageToolCalls parses content as a ToolCallRequest (object or array) when tool_calls is empty; real artifact JSON lacks a `function` field so it's left untouched.