Skip to content

Cursor ACP in Zed: Composer 2.5 Fast Mode Issue #57571

Description

@niallobrien

Reproduction steps

Cursor ACP in Zed: Composer 2.5 Fast Mode Issue

Date: 2026-05-23

Summary

When using Cursor as an external ACP agent inside Zed, selecting Composer 2.5 still produced Cursor dashboard usage entries marked as fast. The local Cursor config also repeatedly reverted to:

{
  "selectedModel": {
    "modelId": "composer-2.5",
    "parameters": [{ "id": "fast", "value": "true" }]
  }
}

The working fix was to run Cursor through a local wrapper that patches the ACP initialize request so Cursor exposes parameterized model options to Zed. With that enabled, Zed can set:

{
  "model": "composer-2.5",
  "fast": "false"
}

Symptoms

  • Zed launched Cursor ACP successfully.
  • ~/.cursor/cli-config.json kept being rewritten to Composer 2.5 Fast.
  • Cursor dashboard usage at https://cursor.com/dashboard/usage reported fast after new Zed agent requests.
  • Passing --model composer-2.5[fast=false] acp to cursor-agent was not enough once Zed connected to the ACP server.

Attempts That Did Not Work

Launch arg only

Zed settings:

{
  "agent_servers": {
    "cursor": {
      "type": "custom",
      "command": "/path/to/cursor-agent",
      "args": ["--model", "composer-2.5[fast=false]", "acp"]
    }
  }
}

Result: the process argv was correct, but after the ACP session was created Cursor rewrote its selected model to fast=true.

Zed default model as base model

"default_config_options": {
  "model": "composer-2.5",
  "fast": "false"
}

Zed log:

WARN [agent_servers::acp] `composer-2.5` is not a valid value for config option `model` in cursor

Zed default model as variant string

"default_config_options": {
  "model": "composer-2.5[fast=false]"
}

Zed log:

WARN [agent_servers::acp] `composer-2.5[fast=false]` is not a valid value for config option `model` in cursor

Root Cause

Cursor ACP has two model-picker modes.

Without parameterized model picker

When the ACP client does not advertise:

{
  "_meta": {
    "parameterizedModelPicker": true
  }
}

Cursor returns a single model config option whose valid values are exploded variant strings. In this mode, the Composer 2.5 entry advertised by Cursor was:

{
  "value": "composer-2.5[fast=true]",
  "name": "composer-2.5"
}

There was no advertised composer-2.5[fast=false] entry for Composer 2.5 in this list. That explains both Zed validation failures:

  • composer-2.5 is invalid in variant-list mode.
  • composer-2.5[fast=false] is also invalid because Cursor does not advertise it in that mode.

With parameterized model picker

When the client advertises:

{
  "_meta": {
    "parameterizedModelPicker": true
  }
}

Cursor returns:

{
  "id": "model",
  "currentValue": "composer-2.5",
  "options": [{ "value": "composer-2.5", "name": "Composer 2.5" }]
}

and separately:

{
  "id": "fast",
  "currentValue": "false",
  "options": [
    { "value": "false", "name": "Off" },
    { "value": "true", "name": "Fast" }
  ]
}

In this mode, model=composer-2.5 plus fast=false is valid and works.

Local Workaround

Created this wrapper:

~/.local/bin/cursor-agent-zed-nonfast

The wrapper:

  1. Starts the real Cursor agent with --model composer-2.5[fast=false] acp.
  2. Proxies newline-delimited ACP JSON between Zed and Cursor.
  3. Patches the client-to-agent initialize request to add:
{
  "clientCapabilities": {
    "_meta": {
      "parameterizedModelPicker": true
    }
  }
}
  1. Forces ~/.cursor/cli-config.json back to composer-2.5 with fast=false before start and after exit.

Zed settings now point at the wrapper:

{
  "agent_servers": {
    "cursor": {
      "type": "custom",
      "command": "/Users/johndoe/.local/bin/cursor-agent-zed-nonfast",
      "args": [],
      "default_config_options": {
        "model": "composer-2.5",
        "fast": "false"
      }
    }
  }
}

Verification

Direct ACP probe against the wrapper returned:

{
  "models": {
    "currentModelId": "composer-2.5"
  },
  "configOptions": [
    {
      "id": "model",
      "currentValue": "composer-2.5"
    },
    {
      "id": "fast",
      "currentValue": "false"
    }
  ]
}

After using Zed, the wrapper log showed Zed invoking the wrapper and the wrapper patching the initialize capabilities:

{
  "event": "initialize.patched",
  "payload": {
    "fs": { "readTextFile": true, "writeTextFile": true },
    "terminal": true,
    "auth": { "terminal": true },
    "_meta": {
      "terminal_output": true,
      "terminal-auth": true,
      "parameterizedModelPicker": true
    }
  }
}

Cursor dashboard usage then stopped reporting Composer 2.5 requests as fast.

Suggested Fix For Zed

For ACP agents, Zed should consider advertising parameterized model picker support in clientCapabilities._meta when initializing the agent:

{
  "clientCapabilities": {
    "_meta": {
      "parameterizedModelPicker": true
    }
  }
}

At least for Cursor ACP, this is required for model parameters such as Composer's fast flag to be represented as separate config options. Without it, Cursor falls back to an exploded variant list where composer-2.5[fast=false] is not advertised, so Zed cannot select the non-fast Composer 2.5 configuration.

Files Changed Locally

  • /Users/johndoe/.config/zed/settings.json
  • /Users/johndoe/.local/bin/cursor-agent-zed-nonfast
  • ~/.cursor/cli-config.json
  • ~/.cursor/acp-config.json

Current vs. Expected behavior

Set to off instead of fast
Image

Zed version and system specs

Zed: v1.3.6
OS: Mac 26.5
Memory: 36GB

Attach Zed log file

Zed.log

Relevant Zed settings

settings.json

Relevant Keymap

keymap.json

(for AI issues) Model provider details

No response

If you are using WSL on Windows, what flavor of Linux are you using?

None

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:ai/cursorCursor via ACPstate:needs reproNeeds reproduction steps and/or someone to reproduce

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions