Add frozen cloud skill snapshots to the app server (#55631)

## What changed

- Add `--cloud-skills-snapshot PATH` to load a cloud skill catalog and resource contents from JSON once at app-server startup, without contacting a live skill service.
- Expose snapshot skills through the native `skills.list` and `skills.read` interface, preserving aliases and prompt visibility. Reads remain available after the snapshot file is removed.
- Validate package boundaries, required resources, duplicate packages, and size limits; fail startup for missing or invalid snapshots.
- Keep frozen cloud catalog and read caches independent of live MCP resource changes.

## Testing

Add provider, cache, app-server, and core scenario tests covering validation, exact resource contents, authority boundaries, startup failures, and listing and reading frozen skills alongside a named executor.

GitOrigin-RevId: d438a5d678121db3e17515fc5edcd00d4e20b900
This commit is contained in:
Francis Chalissery
2026-10-20 17:01:52 +00:00
committed by copyberry
parent 48b6a9d8e0
commit e776b27eb0
22 changed files with 785 additions and 3 deletions
+5
View File
@@ -573,6 +573,9 @@ struct AppServerCommand {
#[command(flatten)]
startup_config: codex_app_server::StartupConfigArgs,
/// Load frozen cloud skills from a JSON snapshot instead of a live skill service.
#[arg(long, value_name = "PATH")]
cloud_skills_snapshot: Option<PathBuf>,
/// Omit to run the app server; specify a subcommand for tooling.
#[command(subcommand)]
subcommand: Option<AppServerSubcommand>,
@@ -1241,6 +1244,7 @@ async fn cli_main(
Some(Subcommand::AppServer(app_server_cli)) => {
let AppServerCommand {
startup_config,
cloud_skills_snapshot,
subcommand,
code_mode_host,
strict_config: app_server_strict_config,
@@ -1282,6 +1286,7 @@ async fn cli_main(
};
let auth = auth.try_into_settings()?;
let runtime_options = codex_app_server::AppServerRuntimeOptions {
cloud_skills_snapshot,
code_mode_host_transport: code_mode_host.into(),
managed_daemon,
remote_control_startup_mode: match (remote_control, remote_control_disabled)