Part of #391
Problem
ToolExecutor::execute() takes response: &str and parses tool invocations from text. This is a legacy path from before chat_with_tools(). Both string-based and structured dispatch paths must be maintained.
File: crates/zeph-tools/src/executor.rs line 92
Proposed Solution
After all providers support chat_with_tools(), deprecate the string-based execute() method.
Priority: P3 | Effort: Medium