Hmbown/CodeWhale · error

--set is not supported by the legacy app-server transport…

Error message

--set is not supported by the legacy app-server transport; use app-server --http or a saved config

What it means

The dispatcher rejects `--set` overrides for the legacy (non-HTTP, non-mobile) app-server transport: that transport predates runtime overrides and does not consume them. Bail occurs when `cli.overrides` is non-empty and the command is `Commands::AppServer(args)` with `!args.http && !args.mobile`. The message directs users to the `--http` transport or a saved config.

Solutions

  1. Switch to the current transport: `codewhale app-server --http` and keep your `--set` flags.
  2. Keep the legacy transport but drop `--set` and bake the settings into a saved config via `codewhale config set`.
  3. Use `--mobile` transport instead if that matches your client, also compatible with `--set`.

Example fix

// before
codewhale --set model=gpt-x app-server
// error: --set is not supported by the legacy app-server transport

// after
codewhale --set model=gpt-x app-server --http
Defensive patterns

Strategy: validation

Validate before calling

# ensure app-server uses the http transport when overrides are present
if [ -n "$OVERRIDES" ]; then
  set -- "$@" --http
fi
codewhale $OVERRIDES app-server --http

Try / catch

match run(args) {
    Err(e) if e.to_string().contains("legacy app-server transport") => {
        eprintln!("add --http (or drop --set)");
    }
    r => r?,
}

Prevention

When it happens

Trigger: Running `codewhale app-server` (without `--http` or `--mobile`) together with any `--set key=value` override.

Common situations: Older launch scripts that pair the legacy app-server with new-style `--set` overrides after a version upgrade, or following outdated documentation.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/ff15fbb26aa3e285. Report an issue: GitHub.

Appendix: source

Thrown at crates/cli/src/lib.rs:1956

    let matches = Cli::command().get_matches();
    let project_bundle_scope = config_command_targets_project(&matches);
    let mut cli = Cli::from_arg_matches(&matches).unwrap_or_else(|error| error.exit());

    // The detached log proxy must not depend on user config parsing: its job
    // is to frame child output and publish a terminal receipt even when the
    // delegated command's own config is malformed.
    let (proxy, command) = split_lane_log_proxy_command(cli.command.take());
    if let Some(args) = proxy {
        return run_lane_log_proxy_command(args);
    }

    if !cli.overrides.is_empty() && matches!(command, Some(Commands::Auth(_))) {
        bail!("--set is not supported by auth commands; use a saved config");
    }
    if !cli.overrides.is_empty()
        && matches!(&command, Some(Commands::AppServer(args)) if !args.http && !args.mobile)
    {
        bail!(
            "--set is not supported by the legacy app-server transport; use app-server --http or a saved config"
        );
    }
    if !matches!(command, Some(Commands::Config(_))) {
        apply_runtime_set_overrides(&mut cli)?;
    }

    let pipe_api_key_handoff = matches!(
        &command,
        Some(Commands::Auth(AuthArgs {
            command: AuthCommand::PrintApiKey { .. }
        }))
    );
    if pipe_api_key_handoff {
        credential_handoff::prepare_stdout(io::stdout().is_terminal())?;
    }
    let runtime_provider = top_level_provider_override(cli.provider.as_deref(), command.as_ref())?;
    let uses_raw_tui_provider = cli.provider.is_some() && runtime_provider.is_none();

View on GitHub (pinned to 73e0f67d83)