ed81d13782
task_shell_start delegates to ExecShellTool, providing the same shell execution capability as exec_shell. Previously, task_shell_start was registered unconditionally in with_runtime_task_tools while exec_shell was gated behind allow_shell, creating an inconsistent security gate. This caused the model to try exec_shell first, fail, then fall back to task_shell_start — wasting tokens and bypassing the intended security boundary. Split TaskShellStartTool and TaskShellWaitTool out of with_runtime_task_tools into a new with_runtime_task_shell_tools method, and gate both behind the allow_shell check in with_agent_tools. Closes #2303