fix(plugins): return unavailable when steering provider without prompt.steer capability (#7270)

Co-authored-by: Simone Primarosa <simone.primarosa@gmail.com>
Co-authored-by: paseo-bot[bot] <266920839+paseo-bot[bot]@users.noreply.github.com>
This commit is contained in:
paseo-bot[bot]
2026-10-18 06:06:08 +02:00
committed by GitHub
co-authored by Simone Primarosa
parent 1a6a9fa8d0
commit efd6d95f91
2 changed files with 69 additions and 0 deletions
@@ -761,6 +761,72 @@ describe("PluginAgentClientRegistry", () => {
await expect.poll(harness.closeCount).toBe(1);
expect(harness.inputs.map((input) => input.type)).toContain("session.close");
});
test("delivers a supported steer to the active turn", async () => {
const harness = createProviderHarness({
capabilities: [...CAPABILITIES, "prompt.steer"],
handleInput: async (input, emit) => {
if (input.type !== "session.prompt") return false;
emit({
type: "session.prompt_result",
sessionId: input.sessionId,
clientMessageId: input.prompt.clientMessageId,
result: { type: "steer", turnId: "turn-1" },
});
return true;
},
});
const registry = new PluginAgentClientRegistry(createTestLogger());
registry.replace([harness.registration]);
const client = registry.clients()[harness.registration.id]!;
const session = await client.createSession({ provider: harness.registration.id, cwd: "/tmp" });
try {
await expect(
session.steerActiveTurn!("follow up", {
expectedTurnId: "turn-1",
clientMessageId: "steer-1",
clearPendingPermissions: true,
}),
).resolves.toEqual({ status: "accepted" });
expect(harness.inputs.find((input) => input.type === "session.prompt")).toMatchObject({
prompt: {
delivery: "steer",
clientMessageId: "steer-1",
input: { type: "message", content: [{ type: "text", text: "follow up" }] },
clearPendingPermissions: true,
},
});
} finally {
await session.close();
registry.replace([]);
}
});
test("returns unavailable when steering a provider without prompt.steer capability", async () => {
const harness = createProviderHarness({
capabilities: [
"prompt.message",
"session.configure",
"session.persistence",
"session.subsession",
"permission",
],
});
const registry = new PluginAgentClientRegistry(createTestLogger());
registry.replace([harness.registration]);
const session = await registry.clients()[harness.registration.id]!.createSession({
provider: harness.registration.id,
cwd: "/workspace",
});
try {
const result = await session.steerActiveTurn!("hello", { expectedTurnId: "turn-1" });
expect(result).toEqual({ status: "unavailable" });
expect(harness.inputs.filter((input) => input.type === "session.prompt")).toHaveLength(0);
} finally {
await session.close();
registry.replace([]);
}
});
});
type RequestKind = "session.open" | "catalog" | "session.configure" | "session.prompt";
@@ -1175,6 +1175,9 @@ class PluginAgentSession implements AgentSession {
prompt: AgentPromptInput,
options: SteerActiveTurnOptions,
): Promise<SteerResult> {
if (!this.bridge.negotiatedCapabilities.includes("prompt.steer")) {
return { status: "unavailable" };
}
const result = await this.bridge.prompt({
clientMessageId: options.clientMessageId ?? randomUUID(),
delivery: "steer",