Thread plan_env and project_env through the tool execution chain so
the ExecutionEnvironmentResolver receives project-level execution
environment values stored in ContextConfig.execution_environment.
The resolver's precedence logic (tool > plan > project > default) was
already correct, but callers never passed project_env — tools always
fell through to the global HOST default, ignoring project-level
overrides entirely.
Changes:
- PlanExecutionContext: add plan_env and project_env fields + properties
- ToolCallRouter: accept plan_env/project_env in constructor, pass to
runner.execute() in route() and route_streaming()
- ToolCallingRuntime: accept plan_env/project_env, pass to
runner.execute() in the direct-runner fallback path
- Update monkey-patched execute stubs in tool_router_steps.py to accept
explicit plan_env/project_env keyword arguments
- Add 4 BDD scenarios proving plan_env/project_env reach the resolver
via ToolCallRouter (project-only, plan-only, both, neither)
Dependency: requires PR #1135 to be merged first (adds CLI flag and
persistence for project-level execution-env-priority).
Closes#1080
ISSUES CLOSED: #1080