Wait for Cursor ACP slash commands before listing. (#1099)
cursor-agent publishes commands asynchronously via available_commands_update, so listCommands() returned an empty cache when called right after session/new. Enable waitForInitialCommands only on CursorACPAgentClient with a 10s timeout; other ACP providers keep the immediate-return default. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1416,7 +1416,27 @@ describe("transformPiModels", () => {
|
|||||||
|
|
||||||
describe("ACPAgentSession slash commands", () => {
|
describe("ACPAgentSession slash commands", () => {
|
||||||
test("returns immediately for ACP sessions that do not wait for async command discovery", async () => {
|
test("returns immediately for ACP sessions that do not wait for async command discovery", async () => {
|
||||||
const session = createSession();
|
const session = new ACPAgentSession(
|
||||||
|
{
|
||||||
|
provider: "claude-acp",
|
||||||
|
cwd: "/tmp/paseo-acp-test",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
provider: "claude-acp",
|
||||||
|
logger: createTestLogger(),
|
||||||
|
defaultCommand: ["claude", "--acp"],
|
||||||
|
defaultModes: [],
|
||||||
|
capabilities: {
|
||||||
|
supportsStreaming: true,
|
||||||
|
supportsSessionPersistence: true,
|
||||||
|
supportsDynamicModes: true,
|
||||||
|
supportsMcpServers: true,
|
||||||
|
supportsReasoningStream: true,
|
||||||
|
supportsToolInvocations: true,
|
||||||
|
},
|
||||||
|
waitForInitialCommands: false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
await expect(session.listCommands()).resolves.toEqual([]);
|
await expect(session.listCommands()).resolves.toEqual([]);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ interface CursorACPAgentClientOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const CURSOR_MODELS_TIMEOUT_MS = 10_000;
|
const CURSOR_MODELS_TIMEOUT_MS = 10_000;
|
||||||
|
const CURSOR_INITIAL_COMMANDS_WAIT_TIMEOUT_MS = 10_000;
|
||||||
const CURSOR_MODEL_MARKER_PATTERN = /\s+\((?:default|current)\)$/;
|
const CURSOR_MODEL_MARKER_PATTERN = /\s+\((?:default|current)\)$/;
|
||||||
|
|
||||||
export class CursorACPAgentClient extends GenericACPAgentClient {
|
export class CursorACPAgentClient extends GenericACPAgentClient {
|
||||||
@@ -21,7 +22,16 @@ export class CursorACPAgentClient extends GenericACPAgentClient {
|
|||||||
private readonly env?: Record<string, string>;
|
private readonly env?: Record<string, string>;
|
||||||
|
|
||||||
constructor(options: CursorACPAgentClientOptions) {
|
constructor(options: CursorACPAgentClientOptions) {
|
||||||
super(options);
|
super({
|
||||||
|
logger: options.logger,
|
||||||
|
command: options.command,
|
||||||
|
env: options.env,
|
||||||
|
providerId: options.providerId,
|
||||||
|
label: options.label,
|
||||||
|
// cursor-agent publishes slash commands asynchronously via available_commands_update.
|
||||||
|
waitForInitialCommands: true,
|
||||||
|
initialCommandsWaitTimeoutMs: CURSOR_INITIAL_COMMANDS_WAIT_TIMEOUT_MS,
|
||||||
|
});
|
||||||
this.cursorCommand = options.command;
|
this.cursorCommand = options.command;
|
||||||
this.env = options.env;
|
this.env = options.env;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ interface GenericACPAgentClientOptions {
|
|||||||
env?: Record<string, string>;
|
env?: Record<string, string>;
|
||||||
providerId?: string;
|
providerId?: string;
|
||||||
label?: string;
|
label?: string;
|
||||||
|
waitForInitialCommands?: boolean;
|
||||||
|
initialCommandsWaitTimeoutMs?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class GenericACPAgentClient extends ACPAgentClient {
|
export class GenericACPAgentClient extends ACPAgentClient {
|
||||||
@@ -42,6 +44,8 @@ export class GenericACPAgentClient extends ACPAgentClient {
|
|||||||
env: options.env,
|
env: options.env,
|
||||||
},
|
},
|
||||||
defaultCommand: options.command,
|
defaultCommand: options.command,
|
||||||
|
waitForInitialCommands: options.waitForInitialCommands,
|
||||||
|
initialCommandsWaitTimeoutMs: options.initialCommandsWaitTimeoutMs,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.command = options.command;
|
this.command = options.command;
|
||||||
|
|||||||
Reference in New Issue
Block a user