From aaaa71a99bee9e6004aae01be3f7ef305be9aefe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 5 Jul 2026 00:21:20 +0000 Subject: [PATCH 1/2] chore(deps): update dependency @copilotkit/aimock to v1.35.0 --- apps/vscode-e2e/package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/vscode-e2e/package.json b/apps/vscode-e2e/package.json index 71a25f22ed..8092640de0 100644 --- a/apps/vscode-e2e/package.json +++ b/apps/vscode-e2e/package.json @@ -15,7 +15,7 @@ "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", "@roo-code/types": "workspace:^", - "@copilotkit/aimock": "1.15.1", + "@copilotkit/aimock": "1.35.0", "@types/mocha": "10.0.10", "@types/node": "20.19.43", "@types/vscode": "1.100.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd950c2178..0f09d80f4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,8 +153,8 @@ importers: apps/vscode-e2e: devDependencies: '@copilotkit/aimock': - specifier: 1.15.1 - version: 1.15.1(vitest@4.1.9) + specifier: 1.35.0 + version: 1.35.0(vitest@4.1.9) '@roo-code/config-eslint': specifier: workspace:^ version: link:../../packages/config-eslint @@ -1317,9 +1317,9 @@ packages: '@chevrotain/types@11.1.2': resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} - '@copilotkit/aimock@1.15.1': - resolution: {integrity: sha512-DG9p6fKdYmuTW0zaUe9iDbgB/CM3SWhpdhVBrszQ6+L2UW4+DZB0gvICFQXRWhVXMpqxEkI9Pqhm/MtMb8li9A==} - engines: {node: '>=24.0.0'} + '@copilotkit/aimock@1.35.0': + resolution: {integrity: sha512-dWtNUeaWD4jaC3Kv9oBiCoIczENM6u8pWBCmybn0/hSFEY57yqCtOGPsVNIG/YlmwbH8p5sgtL6xZzo1FnPi8g==} + engines: {node: '>=20.15.0'} hasBin: true peerDependencies: jest: '>=29' @@ -9058,7 +9058,7 @@ snapshots: '@chevrotain/types@11.1.2': {} - '@copilotkit/aimock@1.15.1(vitest@4.1.9)': + '@copilotkit/aimock@1.35.0(vitest@4.1.9)': optionalDependencies: vitest: 4.1.9(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/coverage-v8@4.1.9)(@vitest/ui@4.1.9)(jsdom@26.1.0)(vite@8.1.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) From 6f62f8282f851142e4c578295cf6c26c17193db0 Mon Sep 17 00:00:00 2001 From: Elliott de Launay Date: Wed, 15 Jul 2026 23:31:52 +0000 Subject: [PATCH 2/2] fix(e2e): update fixtures for aimock v1.35.0 toolCallId breaking change --- apps/vscode-e2e/fixtures/deepseek-v4.json | 60 ------------------- apps/vscode-e2e/src/fixtures/apply-diff.ts | 1 - .../src/fixtures/cold-shell-init.ts | 15 +++-- apps/vscode-e2e/src/fixtures/deepseek-v4.ts | 56 +++++++++++++++++ .../src/fixtures/execute-command.ts | 10 +++- .../src/fixtures/fast-exit-shell-race.ts | 1 - apps/vscode-e2e/src/fixtures/list-files.ts | 1 - .../fixtures/long-running-silent-command.ts | 1 - apps/vscode-e2e/src/fixtures/read-file.ts | 1 - apps/vscode-e2e/src/fixtures/search-files.ts | 1 - .../src/fixtures/terminal-profile.ts | 1 - .../src/fixtures/terminal-reuse-shell-race.ts | 2 - apps/vscode-e2e/src/fixtures/use-mcp-tool.ts | 4 +- apps/vscode-e2e/src/fixtures/write-to-file.ts | 1 - .../src/fixtures/zero-chunk-shell-race.ts | 1 - apps/vscode-e2e/src/runTest.ts | 2 + 16 files changed, 80 insertions(+), 78 deletions(-) create mode 100644 apps/vscode-e2e/src/fixtures/deepseek-v4.ts diff --git a/apps/vscode-e2e/fixtures/deepseek-v4.json b/apps/vscode-e2e/fixtures/deepseek-v4.json index a4710207e2..597803a323 100644 --- a/apps/vscode-e2e/fixtures/deepseek-v4.json +++ b/apps/vscode-e2e/fixtures/deepseek-v4.json @@ -18,21 +18,6 @@ ] } }, - { - "match": { - "model": "deepseek-v4-flash", - "toolCallId": "call_dsv4_flash_on_read" - }, - "response": { - "toolCalls": [ - { - "name": "attempt_completion", - "arguments": "{\"result\":\"DEEPSEEK_V4_MARKER_deepseek_v4_flash_reasoning_on\"}", - "id": "call_dsv4_flash_on_done" - } - ] - } - }, { "match": { "model": "deepseek-v4-flash", @@ -49,21 +34,6 @@ ] } }, - { - "match": { - "model": "deepseek-v4-flash", - "toolCallId": "call_dsv4_flash_off_read" - }, - "response": { - "toolCalls": [ - { - "name": "attempt_completion", - "arguments": "{\"result\":\"DEEPSEEK_V4_MARKER_deepseek_v4_flash_reasoning_off\"}", - "id": "call_dsv4_flash_off_done" - } - ] - } - }, { "match": { "model": "deepseek-v4-pro", @@ -82,21 +52,6 @@ ] } }, - { - "match": { - "model": "deepseek-v4-pro", - "toolCallId": "call_dsv4_pro_on_read" - }, - "response": { - "toolCalls": [ - { - "name": "attempt_completion", - "arguments": "{\"result\":\"DEEPSEEK_V4_MARKER_deepseek_v4_pro_reasoning_on\"}", - "id": "call_dsv4_pro_on_done" - } - ] - } - }, { "match": { "model": "deepseek-v4-pro", @@ -112,21 +67,6 @@ } ] } - }, - { - "match": { - "model": "deepseek-v4-pro", - "toolCallId": "call_dsv4_pro_off_read" - }, - "response": { - "toolCalls": [ - { - "name": "attempt_completion", - "arguments": "{\"result\":\"DEEPSEEK_V4_MARKER_deepseek_v4_pro_reasoning_off\"}", - "id": "call_dsv4_pro_off_done" - } - ] - } } ] } diff --git a/apps/vscode-e2e/src/fixtures/apply-diff.ts b/apps/vscode-e2e/src/fixtures/apply-diff.ts index 59114af238..adc604391b 100644 --- a/apps/vscode-e2e/src/fixtures/apply-diff.ts +++ b/apps/vscode-e2e/src/fixtures/apply-diff.ts @@ -46,7 +46,6 @@ export function addApplyDiffResultFixtures(mock: InstanceType) { for (const fixture of fixtures) { mock.addFixture({ match: { - toolCallId: fixture.toolCallId, predicate: (req) => toolResultContains(req, fixture.toolCallId, fixture.expected), }, response: { diff --git a/apps/vscode-e2e/src/fixtures/cold-shell-init.ts b/apps/vscode-e2e/src/fixtures/cold-shell-init.ts index d5d25c6cdb..ce618b3422 100644 --- a/apps/vscode-e2e/src/fixtures/cold-shell-init.ts +++ b/apps/vscode-e2e/src/fixtures/cold-shell-init.ts @@ -19,10 +19,17 @@ export function addColdShellInitFixtures(mock: InstanceType) { // second attempt (on the now-warm terminal) captures real output. mock.addFixture({ match: { - toolCallId: "call_cold_shell_init_001", - predicate: (req: ChatCompletionRequest) => - // First attempt returned empty — retry the command - !anyToolResultContains(req, "cold-init-ok"), + // Only retry when the FIRST call (call_cold_shell_init_001) produced an empty result. + // If the retry call (call_cold_shell_init_003) also came back empty, don't loop — + // the tool result message says "Do not run the command again automatically." + predicate: (req: ChatCompletionRequest) => { + const messages: ChatMessage[] = Array.isArray(req?.messages) ? req.messages : [] + const lastToolMsg = messages.filter((m) => m?.role === "tool").at(-1) + return ( + lastToolMsg?.tool_call_id === "call_cold_shell_init_001" && + !anyToolResultContains(req, "cold-init-ok") + ) + }, }, response: { toolCalls: [ diff --git a/apps/vscode-e2e/src/fixtures/deepseek-v4.ts b/apps/vscode-e2e/src/fixtures/deepseek-v4.ts new file mode 100644 index 0000000000..61d22b5ae0 --- /dev/null +++ b/apps/vscode-e2e/src/fixtures/deepseek-v4.ts @@ -0,0 +1,56 @@ +import type { ChatCompletionRequest } from "@copilotkit/aimock" +import { LLMock } from "@copilotkit/aimock" + +// Turn-2 completion fixtures for DeepSeek V4 tests. +// Uses lastToolMsg.tool_call_id to scope each fixture — aimock v1.16.4+ changed +// toolCallId matching to require the very last message to be the tool message, +// but Roo Code appends as a user message after tool results. +const turn2Fixtures = [ + { + toolCallId: "call_dsv4_flash_on_read", + model: "deepseek-v4-flash", + result: "DEEPSEEK_V4_MARKER_deepseek_v4_flash_reasoning_on", + doneId: "call_dsv4_flash_on_done", + }, + { + toolCallId: "call_dsv4_flash_off_read", + model: "deepseek-v4-flash", + result: "DEEPSEEK_V4_MARKER_deepseek_v4_flash_reasoning_off", + doneId: "call_dsv4_flash_off_done", + }, + { + toolCallId: "call_dsv4_pro_on_read", + model: "deepseek-v4-pro", + result: "DEEPSEEK_V4_MARKER_deepseek_v4_pro_reasoning_on", + doneId: "call_dsv4_pro_on_done", + }, + { + toolCallId: "call_dsv4_pro_off_read", + model: "deepseek-v4-pro", + result: "DEEPSEEK_V4_MARKER_deepseek_v4_pro_reasoning_off", + doneId: "call_dsv4_pro_off_done", + }, +] + +export function addDeepSeekV4Fixtures(mock: InstanceType) { + for (const fixture of turn2Fixtures) { + mock.addFixture({ + match: { + predicate: (req: ChatCompletionRequest) => { + const messages = Array.isArray(req?.messages) ? req.messages : [] + const lastToolMsg = messages.filter((m) => m?.role === "tool").at(-1) + return req?.model === fixture.model && lastToolMsg?.tool_call_id === fixture.toolCallId + }, + }, + response: { + toolCalls: [ + { + name: "attempt_completion", + arguments: JSON.stringify({ result: fixture.result }), + id: fixture.doneId, + }, + ], + }, + }) + } +} diff --git a/apps/vscode-e2e/src/fixtures/execute-command.ts b/apps/vscode-e2e/src/fixtures/execute-command.ts index dc0e44669a..3adbe7a236 100644 --- a/apps/vscode-e2e/src/fixtures/execute-command.ts +++ b/apps/vscode-e2e/src/fixtures/execute-command.ts @@ -86,8 +86,14 @@ export function addExecuteCommandResultFixtures(mock: InstanceType toolResultContains(req, fixture.toolCallId, fixture.expected), + predicate: (req) => { + const messages = Array.isArray(req?.messages) ? req.messages : [] + const lastToolMsg = messages.filter((m) => m?.role === "tool").at(-1) + return ( + lastToolMsg?.tool_call_id === fixture.toolCallId && + toolResultContains(req, fixture.toolCallId, fixture.expected) + ) + }, }, response: { toolCalls: fixture.toolCalls.map((toolCall) => ({ diff --git a/apps/vscode-e2e/src/fixtures/fast-exit-shell-race.ts b/apps/vscode-e2e/src/fixtures/fast-exit-shell-race.ts index a5a92d427b..4b0659a372 100644 --- a/apps/vscode-e2e/src/fixtures/fast-exit-shell-race.ts +++ b/apps/vscode-e2e/src/fixtures/fast-exit-shell-race.ts @@ -5,7 +5,6 @@ import { toolResultContains } from "./tool-result" export function addFastExitShellRaceResultFixtures(mock: InstanceType) { mock.addFixture({ match: { - toolCallId: "call_fast_exit_shell_race_001", // VSCode drops onDidEndTerminalShellExecution for this command (the race under // test), so TerminalProcess.run() only has the D marker itself as proof of // completion, never a real exit code (see ExecuteCommandTool.ts's diff --git a/apps/vscode-e2e/src/fixtures/list-files.ts b/apps/vscode-e2e/src/fixtures/list-files.ts index 9c89147276..d942116ce2 100644 --- a/apps/vscode-e2e/src/fixtures/list-files.ts +++ b/apps/vscode-e2e/src/fixtures/list-files.ts @@ -70,7 +70,6 @@ export function addListFilesResultFixtures(mock: InstanceType) { mock.addFixture({ match: { - toolCallId: fixture.toolCallId, predicate: (req) => toolResultContains(req, fixture.toolCallId, fixture.expected), }, response: { diff --git a/apps/vscode-e2e/src/fixtures/long-running-silent-command.ts b/apps/vscode-e2e/src/fixtures/long-running-silent-command.ts index af9a757c09..7f1e3011a4 100644 --- a/apps/vscode-e2e/src/fixtures/long-running-silent-command.ts +++ b/apps/vscode-e2e/src/fixtures/long-running-silent-command.ts @@ -12,7 +12,6 @@ export function addLongRuningSilentCommandFixtures(mock: InstanceType toolResultContains(req, "call_long_running_silent_001", [ // sleep exits with code 0 — the normal exit status path diff --git a/apps/vscode-e2e/src/fixtures/read-file.ts b/apps/vscode-e2e/src/fixtures/read-file.ts index dd9bb1c10b..18af12d306 100644 --- a/apps/vscode-e2e/src/fixtures/read-file.ts +++ b/apps/vscode-e2e/src/fixtures/read-file.ts @@ -76,7 +76,6 @@ export function addReadFileResultFixtures(mock: InstanceType) { for (const fixture of fixtures) { mock.addFixture({ match: { - toolCallId: fixture.toolCallId, predicate: (req) => isToolResultExpectation(fixture.expected[0]) ? toolResultsContain(req, fixture.expected as ToolResultExpectation[]) diff --git a/apps/vscode-e2e/src/fixtures/search-files.ts b/apps/vscode-e2e/src/fixtures/search-files.ts index 6df43aec58..3c1318c299 100644 --- a/apps/vscode-e2e/src/fixtures/search-files.ts +++ b/apps/vscode-e2e/src/fixtures/search-files.ts @@ -127,7 +127,6 @@ export function addSearchFilesResultFixtures(mock: InstanceType) mock.addFixture({ match: { - toolCallId: fixture.toolCallId, predicate: (req) => toolResultContains(req, fixture.toolCallId, fixture.expected), }, response: { diff --git a/apps/vscode-e2e/src/fixtures/terminal-profile.ts b/apps/vscode-e2e/src/fixtures/terminal-profile.ts index d71f4a572c..79d052a345 100644 --- a/apps/vscode-e2e/src/fixtures/terminal-profile.ts +++ b/apps/vscode-e2e/src/fixtures/terminal-profile.ts @@ -43,7 +43,6 @@ export function addTerminalProfileResultFixtures(mock: InstanceType toolResultContains(req, fixture.toolCallId, fixture.expected), }, response: { diff --git a/apps/vscode-e2e/src/fixtures/terminal-reuse-shell-race.ts b/apps/vscode-e2e/src/fixtures/terminal-reuse-shell-race.ts index 01cae1c9f9..2fa9fc25b6 100644 --- a/apps/vscode-e2e/src/fixtures/terminal-reuse-shell-race.ts +++ b/apps/vscode-e2e/src/fixtures/terminal-reuse-shell-race.ts @@ -7,7 +7,6 @@ export function addTerminalReuseShellRaceFixtures(mock: InstanceType toolResultContains(req, "call_terminal_reuse_001", ["first", "Exit code: 0"]), }, response: { @@ -26,7 +25,6 @@ export function addTerminalReuseShellRaceFixtures(mock: InstanceType toolResultContains(req, "call_terminal_reuse_002", ["second", "Exit code: 0"]), }, response: { diff --git a/apps/vscode-e2e/src/fixtures/use-mcp-tool.ts b/apps/vscode-e2e/src/fixtures/use-mcp-tool.ts index 3ce5d0a71c..583e8bdbb3 100644 --- a/apps/vscode-e2e/src/fixtures/use-mcp-tool.ts +++ b/apps/vscode-e2e/src/fixtures/use-mcp-tool.ts @@ -1,5 +1,7 @@ import { LLMock } from "@copilotkit/aimock" +import { toolResultContains } from "./tool-result" + const TEST_DIR_NAME = "use-mcp-tool-fixture" const FILESYSTEM_SERVER_NAME = "filesystem" const READ_FILE_RELATIVE_PATH = `${TEST_DIR_NAME}/mcp-read-target.txt` @@ -99,7 +101,7 @@ export function addUseMcpToolResultFixtures(mock: InstanceType) { mock.addFixture({ match: { - toolCallId: fixture.toolCallId, + predicate: (req) => toolResultContains(req, fixture.toolCallId, []), }, response: { toolCalls: [ diff --git a/apps/vscode-e2e/src/fixtures/write-to-file.ts b/apps/vscode-e2e/src/fixtures/write-to-file.ts index d0a31c4db7..457c4ca327 100644 --- a/apps/vscode-e2e/src/fixtures/write-to-file.ts +++ b/apps/vscode-e2e/src/fixtures/write-to-file.ts @@ -31,7 +31,6 @@ export function addWriteToFileResultFixtures(mock: InstanceType) for (const fixture of fixtures) { mock.addFixture({ match: { - toolCallId: fixture.toolCallId, predicate: (req) => toolResultContains(req, fixture.toolCallId, fixture.expected), }, response: { diff --git a/apps/vscode-e2e/src/fixtures/zero-chunk-shell-race.ts b/apps/vscode-e2e/src/fixtures/zero-chunk-shell-race.ts index 0cb0c591cf..3af8119e5b 100644 --- a/apps/vscode-e2e/src/fixtures/zero-chunk-shell-race.ts +++ b/apps/vscode-e2e/src/fixtures/zero-chunk-shell-race.ts @@ -5,7 +5,6 @@ import { toolResultContains } from "./tool-result" export function addZeroChunkShellRaceResultFixtures(mock: InstanceType) { mock.addFixture({ match: { - toolCallId: "call_zero_chunk_shell_race_001", // The multiline command is now written to a temp script file and executed // via `sh /tmp/roo-cmd-*.sh` to avoid the VSCode { ... }-wrapping bug that // caused the stream to be closed before read() arrived (zero chunks). diff --git a/apps/vscode-e2e/src/runTest.ts b/apps/vscode-e2e/src/runTest.ts index 92d772e5ad..482e73e945 100644 --- a/apps/vscode-e2e/src/runTest.ts +++ b/apps/vscode-e2e/src/runTest.ts @@ -7,6 +7,7 @@ import { runTests } from "@vscode/test-electron" import { LLMock } from "@copilotkit/aimock" import { addApplyDiffResultFixtures } from "./fixtures/apply-diff" +import { addDeepSeekV4Fixtures } from "./fixtures/deepseek-v4" import { addExecuteCommandResultFixtures } from "./fixtures/execute-command" import { addFastExitShellRaceResultFixtures } from "./fixtures/fast-exit-shell-race" import { addZeroChunkShellRaceResultFixtures } from "./fixtures/zero-chunk-shell-race" @@ -127,6 +128,7 @@ async function main() { addSubtaskFixtures(mock) addUseMcpToolResultFixtures(mock) addWriteToFileResultFixtures(mock) + addDeepSeekV4Fixtures(mock) // The modes test (switch_mode → ask) triggers a second API call whose last // user message starts with directly — no