Acquire and cache opt-in executor capability inventories via V2 (#53736)

## What changed

- Add the disabled-by-default `executor_capability_discovery_v2` feature to acquire `capabilities/discoverV2` inventories from supporting remote executors using each selected environment's working directory and sandbox.
- Share snapshots with MCP and world-state contributors and skill providers without activating discovered plugins or publishing discovered skills to the model.
- Cache inventories by environment instance, executor session, working directory, and sandbox. Coalesce concurrent requests, refresh the cache at turn start, retry transient failures, and refresh MCP projections after recovery.
- Resolve the system skills root in the executor and pass it explicitly to capability location discovery.

## Testing

Add coverage for feature gating, unsupported executors, inert inventories, cache reuse and eviction, turn refreshes, failure recovery, executor replacement, and system skill locations.

GitOrigin-RevId: 1bdca28fa7f17622b27e2713ab3dcc0c13426889
This commit is contained in:
Anthony Tafoya
2026-10-13 18:15:50 +00:00
committed by copyberry
parent 4d82d36ccf
commit cf0ed4c600
39 changed files with 1027 additions and 12 deletions
+13
View File
@@ -9,6 +9,7 @@ use std::time::Duration;
use std::time::Instant;
use codex_diagnostics::Gauge;
use codex_exec_server::ExecutorCapabilityDiscoveryV2Cache;
use codex_extension_api::ThreadIdleCause;
use futures::future::BoxFuture;
use tokio::select;
@@ -290,6 +291,18 @@ impl Session {
input: Vec<TurnInput>,
task: T,
) {
// Replace the cache; in-flight acquisitions retain their previous Arc.
self.services
.thread_extension_data
.insert(ExecutorCapabilityDiscoveryV2Cache::default());
if turn_context
.config
.features
.enabled(Feature::ExecutorCapabilityDiscoveryV2)
{
// MCP contributors must project the new inventory even if their other inputs match.
self.request_mcp_runtime_reprojection();
}
self.activate_plugin_selection(&turn_context).await;
// Inherited or recovered roots are applied before task start. Otherwise this
// task owns its turn, including background work. Later mail cannot change it.