diff --git a/packages/coding-agent/docs/rpc.md b/packages/coding-agent/docs/rpc.md index 1493f2d5..8074ceb9 100644 --- a/packages/coding-agent/docs/rpc.md +++ b/packages/coding-agent/docs/rpc.md @@ -313,6 +313,26 @@ Response: } ``` +#### get_available_thinking_levels + +List the thinking levels supported by the current model. Returns `["off"]` for a model without reasoning support. + +```json +{"type": "get_available_thinking_levels"} +``` + +Response: +```json +{ + "type": "response", + "command": "get_available_thinking_levels", + "success": true, + "data": { + "levels": ["off", "minimal", "low", "medium", "high"] + } +} +``` + ### Queue Modes #### set_steering_mode diff --git a/packages/coding-agent/src/modes/rpc/rpc-client.ts b/packages/coding-agent/src/modes/rpc/rpc-client.ts index 934c6f1f..79cd7f2f 100644 --- a/packages/coding-agent/src/modes/rpc/rpc-client.ts +++ b/packages/coding-agent/src/modes/rpc/rpc-client.ts @@ -280,6 +280,14 @@ export class RpcClient { return this.getData(response); } + /** + * Get list of available thinking levels for the current model. + */ + async getAvailableThinkingLevels(): Promise { + const response = await this.send({ type: "get_available_thinking_levels" }); + return this.getData<{ levels: ThinkingLevel[] }>(response).levels; + } + /** * Set steering mode. */ diff --git a/packages/coding-agent/src/modes/rpc/rpc-mode.ts b/packages/coding-agent/src/modes/rpc/rpc-mode.ts index 58b64531..06eadccb 100644 --- a/packages/coding-agent/src/modes/rpc/rpc-mode.ts +++ b/packages/coding-agent/src/modes/rpc/rpc-mode.ts @@ -504,6 +504,11 @@ export async function runRpcMode(runtimeHost: AgentSessionRuntime): Promise { + await client.start(); + + const levels = await client.getAvailableThinkingLevels(); + expect(levels.length).toBeGreaterThan(0); + + // The current level reported by get_state must be in the available list + const state = await client.getState(); + expect(levels).toContain(state.thinkingLevel); + + // cycle_thinking_level must only ever land on levels from get_available_thinking_levels + const initialLevel = state.thinkingLevel; + const cycled = await client.cycleThinkingLevel(); + if (cycled) { + expect(levels).toContain(cycled.level); + // distinct cycle step (unless only one level) + if (levels.length > 1) { + expect(cycled.level).not.toBe(initialLevel); + } + } + }, 30000); + test("should get available models", async () => { await client.start();