Skip to content

Commit 253deb8

Browse files
committed
fix: resolve merge conflicts with main branch
2 parents 83ca364 + 47f594f commit 253deb8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+785
-468
lines changed

.roo/commands/release.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,19 @@ argument-hint: patch | minor | major
2626
- Without issue: "- Add support for Gemini 2.5 Pro caching (thanks @contributor!)"
2727
- CRITICAL: Include EVERY SINGLE PR in the changeset - don't assume you know which ones are important. Count the total PRs to verify completeness and cross-reference the list to ensure nothing is missed.
2828

29-
6. If a major or minor release:
29+
6. If the generate_image tool is available, create a release image at `releases/[version]-release.png`
30+
- The image should feature a realistic-looking kangaroo doing something human-like that relates to the main highlight of the release
31+
- Pass `releases/template.png` as the reference image for aspect ratio and kangaroo style
32+
- Add the generated image to .changeset/v[version].md before the list of changes with format: `![X.Y.Z Release - Description](releases/X.Y.Z-release.png)`
33+
7. If a major or minor release:
3034
- Ask the user what the three most important areas to highlight are in the release
3135
- Update the English version relevant announcement files and documentation (webview-ui/src/components/chat/Announcement.tsx, README.md, and the `latestAnnouncementId` in src/core/webview/ClineProvider.ts)
3236
- Ask the user to confirm that the English version looks good to them before proceeding
3337
- Use the new_task tool to create a subtask in `translate` mode with detailed instructions of which content needs to be translated into all supported languages (The READMEs as well as the translation strings)
34-
7. Create a new branch for the release preparation: `git checkout -b release/v[version]`
35-
8. Commit and push the changeset file and any documentation updates to the repository: `git add . && git commit -m "chore: add changeset for v[version]" && git push origin release/v[version]`
36-
9. Create a pull request for the release: `gh pr create --title "Release v[version]" --body "Release preparation for v[version]. This PR includes the changeset and any necessary documentation updates." --base main --head release/v[version]`
37-
10. The GitHub Actions workflow will automatically:
38+
8. Create a new branch for the release preparation: `git checkout -b release/v[version]`
39+
9. Commit and push the changeset file and any documentation updates to the repository: `git add . && git commit -m "chore: add changeset for v[version]" && git push origin release/v[version]`
40+
10. Create a pull request for the release: `gh pr create --title "Release v[version]" --body "Release preparation for v[version]. This PR includes the changeset and any necessary documentation updates." --base main --head release/v[version]`
41+
11. The GitHub Actions workflow will automatically:
3842
- Create a version bump PR when changesets are merged to main
3943
- Update the CHANGELOG.md with proper formatting
4044
- Publish the release when the version bump PR is merged

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
# Roo Code Changelog
22

3+
## [3.26.3] - 2025-08-29
4+
5+
![3.26.3 Release - Kangaroo Photo Editor](releases/3.26.3-release.png)
6+
7+
- Add optional input image parameter to image generation tool (thanks @roomote!)
8+
- Refactor: Flatten image generation settings structure (thanks @daniel-lxs!)
9+
- Show console logging in vitests when the --no-silent flag is set (thanks @hassoncs!)
10+
311
## [3.26.2] - 2025-08-28
412

13+
![3.26.2 Release - Kangaroo Digital Artist](releases/3.26.2-release.png)
14+
515
- feat: Add experimental image generation tool with OpenRouter integration (thanks @daniel-lxs!)
616
- Fix: Resolve GPT-5 Responses API issues with condensing and image support (#7334 by @nlbuescher, PR by @daniel-lxs)
717
- Fix: Hide .rooignore'd files from environment details by default (#7368 by @AlexBlack772, PR by @app/roomote)
818
- Fix: Exclude browser scroll actions from repetition detection (#7470 by @cgrierson-smartsheet, PR by @app/roomote)
919

1020
## [3.26.1] - 2025-08-27
1121

22+
![3.26.1 Release - Kangaroo Network Engineer](releases/3.26.1-release.png)
23+
1224
- Add Vercel AI Gateway provider integration (thanks @joshualipman123!)
1325
- Add support for Vercel embeddings (thanks @mrubens!)
1426
- Enable on-disk storage for Qdrant vectors and HNSW index (thanks @daniel-lxs!)
@@ -19,6 +31,8 @@
1931

2032
## [3.26.0] - 2025-08-26
2133

34+
![3.26.0 Release - Kangaroo Speed Racer](releases/3.26.0-release.png)
35+
2236
- Sonic -> Grok Code Fast
2337
- feat: Add Qwen Code CLI API Support with OAuth Authentication (thanks @evinelias and Cline!)
2438
- feat: Add Deepseek v3.1 to Fireworks AI provider (#7374 by @dmarkey, PR by @app/roomote)

packages/cloud/src/bridge/BaseChannel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export abstract class BaseChannel<TCommand = unknown, TEventName extends string
8383
/**
8484
* Handle incoming commands - must be implemented by subclasses.
8585
*/
86-
public abstract handleCommand(command: TCommand): void
86+
public abstract handleCommand(command: TCommand): Promise<void>
8787

8888
/**
8989
* Handle connection-specific logic.

packages/cloud/src/bridge/ExtensionChannel.ts

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,7 @@ export class ExtensionChannel extends BaseChannel<
5353
this.setupListeners()
5454
}
5555

56-
/**
57-
* Handle extension-specific commands from the web app
58-
*/
59-
public handleCommand(command: ExtensionBridgeCommand): void {
56+
public async handleCommand(command: ExtensionBridgeCommand): Promise<void> {
6057
if (command.instanceId !== this.instanceId) {
6158
console.log(`[ExtensionChannel] command -> instance id mismatch | ${this.instanceId}`, {
6259
messageInstanceId: command.instanceId,
@@ -69,13 +66,22 @@ export class ExtensionChannel extends BaseChannel<
6966
console.log(`[ExtensionChannel] command -> createTask() | ${command.instanceId}`, {
7067
text: command.payload.text?.substring(0, 100) + "...",
7168
hasImages: !!command.payload.images,
69+
mode: command.payload.mode,
70+
providerProfile: command.payload.providerProfile,
7271
})
7372

74-
this.provider.createTask(command.payload.text, command.payload.images)
73+
this.provider.createTask(
74+
command.payload.text,
75+
command.payload.images,
76+
undefined, // parentTask
77+
undefined, // options
78+
{ mode: command.payload.mode, currentApiConfigName: command.payload.providerProfile },
79+
)
80+
7581
break
7682
}
7783
case ExtensionBridgeCommandName.StopTask: {
78-
const instance = this.updateInstance()
84+
const instance = await this.updateInstance()
7985

8086
if (instance.task.taskStatus === TaskStatus.Running) {
8187
console.log(`[ExtensionChannel] command -> cancelTask() | ${command.instanceId}`)
@@ -86,14 +92,14 @@ export class ExtensionChannel extends BaseChannel<
8692
this.provider.clearTask()
8793
this.provider.postStateToWebview()
8894
}
95+
8996
break
9097
}
9198
case ExtensionBridgeCommandName.ResumeTask: {
9299
console.log(`[ExtensionChannel] command -> resumeTask() | ${command.instanceId}`, {
93100
taskId: command.payload.taskId,
94101
})
95102

96-
// Resume the task from history by taskId
97103
this.provider.resumeTask(command.payload.taskId)
98104
this.provider.postStateToWebview()
99105
break
@@ -122,20 +128,20 @@ export class ExtensionChannel extends BaseChannel<
122128
}
123129

124130
private async registerInstance(_socket: Socket): Promise<void> {
125-
const instance = this.updateInstance()
131+
const instance = await this.updateInstance()
126132
await this.publish(ExtensionSocketEvents.REGISTER, instance)
127133
}
128134

129135
private async unregisterInstance(_socket: Socket): Promise<void> {
130-
const instance = this.updateInstance()
136+
const instance = await this.updateInstance()
131137
await this.publish(ExtensionSocketEvents.UNREGISTER, instance)
132138
}
133139

134140
private startHeartbeat(socket: Socket): void {
135141
this.stopHeartbeat()
136142

137143
this.heartbeatInterval = setInterval(async () => {
138-
const instance = this.updateInstance()
144+
const instance = await this.updateInstance()
139145

140146
try {
141147
socket.emit(ExtensionSocketEvents.HEARTBEAT, instance)
@@ -172,11 +178,11 @@ export class ExtensionChannel extends BaseChannel<
172178
] as const
173179

174180
eventMapping.forEach(({ from, to }) => {
175-
// Create and store the listener function for cleanup/
176-
const listener = (..._args: unknown[]) => {
181+
// Create and store the listener function for cleanup.
182+
const listener = async (..._args: unknown[]) => {
177183
this.publish(ExtensionSocketEvents.EVENT, {
178184
type: to,
179-
instance: this.updateInstance(),
185+
instance: await this.updateInstance(),
180186
timestamp: Date.now(),
181187
})
182188
}
@@ -195,10 +201,16 @@ export class ExtensionChannel extends BaseChannel<
195201
this.eventListeners.clear()
196202
}
197203

198-
private updateInstance(): ExtensionInstance {
204+
private async updateInstance(): Promise<ExtensionInstance> {
199205
const task = this.provider?.getCurrentTask()
200206
const taskHistory = this.provider?.getRecentTasks() ?? []
201207

208+
const mode = await this.provider?.getMode()
209+
const modes = (await this.provider?.getModes()) ?? []
210+
211+
const providerProfile = await this.provider?.getProviderProfile()
212+
const providerProfiles = (await this.provider?.getProviderProfiles()) ?? []
213+
202214
this.extensionInstance = {
203215
...this.extensionInstance,
204216
appProperties: this.extensionInstance.appProperties ?? this.provider.appProperties,
@@ -213,6 +225,10 @@ export class ExtensionChannel extends BaseChannel<
213225
: { taskId: "", taskStatus: TaskStatus.None },
214226
taskAsk: task?.taskAsk,
215227
taskHistory,
228+
mode,
229+
providerProfile,
230+
modes,
231+
providerProfiles,
216232
}
217233

218234
return this.extensionInstance

packages/cloud/src/bridge/TaskChannel.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class TaskChannel extends BaseChannel<
7373
super(instanceId)
7474
}
7575

76-
public handleCommand(command: TaskBridgeCommand): void {
76+
public async handleCommand(command: TaskBridgeCommand): Promise<void> {
7777
const task = this.subscribedTasks.get(command.taskId)
7878

7979
if (!task) {
@@ -87,14 +87,22 @@ export class TaskChannel extends BaseChannel<
8787
`[TaskChannel] ${TaskBridgeCommandName.Message} ${command.taskId} -> submitUserMessage()`,
8888
command,
8989
)
90-
task.submitUserMessage(command.payload.text, command.payload.images)
90+
91+
await task.submitUserMessage(
92+
command.payload.text,
93+
command.payload.images,
94+
command.payload.mode,
95+
command.payload.providerProfile,
96+
)
97+
9198
break
9299

93100
case TaskBridgeCommandName.ApproveAsk:
94101
console.log(
95102
`[TaskChannel] ${TaskBridgeCommandName.ApproveAsk} ${command.taskId} -> approveAsk()`,
96103
command,
97104
)
105+
98106
task.approveAsk(command.payload)
99107
break
100108

packages/cloud/src/bridge/__tests__/ExtensionChannel.test.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ describe("ExtensionChannel", () => {
5353
postStateToWebview: vi.fn(),
5454
postMessageToWebview: vi.fn(),
5555
getTelemetryProperties: vi.fn(),
56+
getMode: vi.fn().mockResolvedValue("code"),
57+
getModes: vi.fn().mockResolvedValue([
58+
{ slug: "code", name: "Code", description: "Code mode" },
59+
{ slug: "architect", name: "Architect", description: "Architect mode" },
60+
]),
61+
getProviderProfile: vi.fn().mockResolvedValue("default"),
62+
getProviderProfiles: vi.fn().mockResolvedValue([{ name: "default", description: "Default profile" }]),
5663
on: vi.fn((event: keyof TaskProviderEvents, listener: (...args: unknown[]) => unknown) => {
5764
if (!eventListeners.has(event)) {
5865
eventListeners.set(event, new Set())
@@ -184,6 +191,9 @@ describe("ExtensionChannel", () => {
184191
// Connect the socket to enable publishing
185192
await extensionChannel.onConnect(mockSocket)
186193

194+
// Clear the mock calls from the connection (which emits a register event)
195+
;(mockSocket.emit as any).mockClear()
196+
187197
// Get a listener that was registered for TaskStarted
188198
const taskStartedListeners = eventListeners.get(RooCodeEventName.TaskStarted)
189199
expect(taskStartedListeners).toBeDefined()
@@ -192,7 +202,7 @@ describe("ExtensionChannel", () => {
192202
// Trigger the listener
193203
const listener = Array.from(taskStartedListeners!)[0]
194204
if (listener) {
195-
listener("test-task-id")
205+
await listener("test-task-id")
196206
}
197207

198208
// Verify the event was published to the socket

packages/cloud/src/bridge/__tests__/TaskChannel.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,12 @@ describe("TaskChannel", () => {
333333

334334
taskChannel.handleCommand(command)
335335

336-
expect(mockTask.submitUserMessage).toHaveBeenCalledWith(command.payload.text, command.payload.images)
336+
expect(mockTask.submitUserMessage).toHaveBeenCalledWith(
337+
command.payload.text,
338+
command.payload.images,
339+
undefined,
340+
undefined,
341+
)
337342
})
338343

339344
it("should handle ApproveAsk command", () => {

packages/evals/Dockerfile.runner

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ RUN mkdir -p \
9090
packages/ipc \
9191
packages/telemetry \
9292
packages/types \
93+
packages/cloud \
9394
src \
9495
webview-ui
9596

@@ -104,6 +105,7 @@ COPY ./packages/evals/package.json ./packages/evals/
104105
COPY ./packages/ipc/package.json ./packages/ipc/
105106
COPY ./packages/telemetry/package.json ./packages/telemetry/
106107
COPY ./packages/types/package.json ./packages/types/
108+
COPY ./packages/cloud/package.json ./packages/cloud/
107109
COPY ./src/package.json ./src/
108110
COPY ./webview-ui/package.json ./webview-ui/
109111

packages/evals/Dockerfile.web

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ RUN mkdir -p \
3131
packages/config-typescript \
3232
packages/evals \
3333
packages/ipc \
34-
packages/types
34+
packages/types \
35+
packages/cloud
3536

3637
COPY ./package.json ./
3738
COPY ./pnpm-lock.yaml ./
@@ -43,6 +44,7 @@ COPY ./packages/config-typescript/package.json ./packages/config-typescript/
4344
COPY ./packages/evals/package.json ./packages/evals/
4445
COPY ./packages/ipc/package.json ./packages/ipc/
4546
COPY ./packages/types/package.json ./packages/types/
47+
COPY ./packages/cloud/package.json ./packages/cloud/
4648

4749
RUN pnpm install
4850

packages/types/npm/package.metadata.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@roo-code/types",
3-
"version": "1.65.0",
3+
"version": "1.66.0",
44
"description": "TypeScript type definitions for Roo Code.",
55
"publishConfig": {
66
"access": "public",

0 commit comments

Comments
 (0)