Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
a03cda0
First pass at separate upsell dialog
brunobergher Sep 8, 2025
865149d
Revert PR #7188 - Restore temperature parameter to fix TabbyApi/ExLla…
daniel-lxs Sep 8, 2025
965dfc0
fix: reduce CodeBlock button z-index to prevent overlap with popovers…
daniel-lxs Sep 9, 2025
8ba47d1
Make ollama models info transport work like lmstudio (#7679)
ItsOnlyBinary Sep 9, 2025
c0c921c
feat: add click-to-edit, ESC-to-cancel, and fix padding consistency f…
roomote[bot] Sep 9, 2025
45f588d
Let people paste in the auth redirect url (#7805)
mrubens Sep 9, 2025
06bdcef
fix: resolve chat message edit/delete duplication issues (#7793)
daniel-lxs Sep 9, 2025
8d8f091
fix: add GIT_EDITOR env var to merge-resolver mode for non-interactiv…
daniel-lxs Sep 9, 2025
5ca5833
UI: Render reasoning as plain italic (match <thinking>) (#7752)
roomote[bot] Sep 9, 2025
150a7b9
Add taskSyncEnabled to userSettingsConfigSchema (#7827)
roomote[bot] Sep 9, 2025
d0b4b15
Release: v1.75.0 (#7829)
jr Sep 9, 2025
7322f51
fix: prevent negative cost values and improve label visibility in eva…
roomote[bot] Sep 9, 2025
62271c1
Fix Groq context window display (#7839)
mrubens Sep 10, 2025
740924a
feat: add DismissibleUpsell component for dismissible messages
roomote Sep 10, 2025
a48e46f
fix: Apply PR feedback for DismissibleUpsell component
roomote Sep 10, 2025
a993979
New Cloud upsell dialog in task share and cloud view, shared component
brunobergher Sep 10, 2025
50cc8f0
Properly working DismissibleUpsell
brunobergher Sep 10, 2025
cdcb768
Working upsell for long-running tasks
brunobergher Sep 10, 2025
6413a27
CTA in AutoApproveMenu
brunobergher Sep 10, 2025
effdff0
Home page CTA
brunobergher Sep 10, 2025
3b68f71
Fixes the autoapprove upsell and some tests
brunobergher Sep 10, 2025
a9f21c4
Visual and copy fixes
brunobergher Sep 10, 2025
937f8ab
Test fix
brunobergher Sep 10, 2025
ee1aba4
Translations
brunobergher Sep 10, 2025
653166a
Stray className attribute
brunobergher Sep 10, 2025
010a812
Merge conflicts
brunobergher Sep 10, 2025
67124c9
Cloud view fixes in a left-aligned layout
brunobergher Sep 10, 2025
64e0695
Removes unnecessary test
brunobergher Sep 10, 2025
1fa8129
Less flaky tests
brunobergher Sep 10, 2025
5c8085c
Fixes sharebutton behavior and updates associated tests
brunobergher Sep 10, 2025
dced5a4
Update webview-ui/src/i18n/locales/it/cloud.json
brunobergher Sep 10, 2025
1a8860e
Fix dismissed flicker
jr Sep 10, 2025
2848b26
Fix long task upsell
jr Sep 10, 2025
9610626
Resolve merge conflicts in localization files
jr Sep 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions .roo/rules-merge-resolver/1_workflow.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,13 @@
<tools>
<tool>gh pr checkout [PR_NUMBER] --force</tool>
<tool>git fetch origin main</tool>
<tool>git rebase origin/main</tool>
<tool>GIT_EDITOR=true git rebase origin/main</tool>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These changes to the merge resolver rules appear unrelated to the upsell feature. Could you remove these files from this PR to keep it focused on the dismissible upsells implementation?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no idea how they ended up here. If a reviewer has any thoughts, I'm all ears.

</tools>
<details>
Force checkout the PR branch to ensure clean state
Fetch the latest main branch
Attempt to rebase onto main to reveal conflicts
Use GIT_EDITOR=true to ensure non-interactive rebase
</details>
</step>

Expand Down Expand Up @@ -108,8 +109,8 @@
</command>

<command name="rebase_main">
<syntax>git rebase origin/main</syntax>
<purpose>Rebase current branch onto main to reveal conflicts</purpose>
<syntax>GIT_EDITOR=true git rebase origin/main</syntax>
<purpose>Rebase current branch onto main to reveal conflicts (non-interactive)</purpose>
</command>

<command name="get_blame_info">
Expand All @@ -133,6 +134,20 @@
</command>
</git_commands>

<command name="continue_rebase">
<syntax>GIT_EDITOR=true git rebase --continue</syntax>
<purpose>Continue rebase after resolving conflicts (non-interactive)</purpose>
</command>
</git_commands>

<environment_variables>
<variable name="GIT_EDITOR">
<value>true</value>
<purpose>Set to 'true' (a no-op command) to prevent interactive prompts during rebase operations</purpose>
<usage>Prefix git rebase commands with GIT_EDITOR=true to ensure non-interactive execution</usage>
</variable>
</environment_variables>

<completion_criteria>
<criterion>All merge conflicts have been resolved</criterion>
<criterion>Resolved files have been staged</criterion>
Expand Down
57 changes: 53 additions & 4 deletions .roo/rules-merge-resolver/3_tool_usage.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
<practice>Chain git commands with && for efficiency</practice>
<practice>Use --format options for structured output</practice>
<practice>Capture command output for parsing</practice>
<practice>Use GIT_EDITOR=true for non-interactive git rebase operations</practice>
<practice>Set environment variables inline to avoid prompts during automation</practice>
</best_practices>

<common_commands>
Expand All @@ -46,7 +48,7 @@

<command>
<purpose>Rebase onto main to reveal conflicts</purpose>
<syntax>git rebase origin/main</syntax>
<syntax>GIT_EDITOR=true git rebase origin/main</syntax>
</command>

<command>
Expand All @@ -71,7 +73,7 @@

<command>
<purpose>Continue rebase after resolution</purpose>
<syntax>git rebase --continue</syntax>
<syntax>GIT_EDITOR=true git rebase --continue</syntax>
</command>
</common_commands>
</tool>
Expand Down Expand Up @@ -152,7 +154,7 @@ const config = {
<step>execute_command - Get PR info with gh CLI</step>
<step>execute_command - Checkout PR with gh pr checkout --force</step>
<step>execute_command - Fetch origin main</step>
<step>execute_command - Rebase onto origin/main</step>
<step>execute_command - Rebase onto origin/main with GIT_EDITOR=true</step>
<step>execute_command - Check for conflicts with git status</step>
</sequence>
</pattern>
Expand All @@ -178,13 +180,22 @@ const config = {
<pattern name="complete_rebase">
<sequence>
<step>execute_command - Check all conflicts resolved</step>
<step>execute_command - Continue rebase with git rebase --continue</step>
<step>execute_command - Continue rebase with GIT_EDITOR=true git rebase --continue</step>
<step>execute_command - Verify clean status</step>
</sequence>
</pattern>
</tool_combination_patterns>

<error_handling>
<scenario name="interactive_prompt_blocking">
<description>Git commands waiting for interactive input</description>
<approach>
Use GIT_EDITOR=true to bypass editor prompts
Set GIT_SEQUENCE_EDITOR=true for sequence editing
Consider --no-edit flag for commit operations
</approach>
</scenario>

<scenario name="no_conflicts_after_rebase">
<description>Rebase completes without conflicts</description>
<approach>
Expand Down Expand Up @@ -225,4 +236,42 @@ const config = {
</approach>
</scenario>
</error_handling>

<non_interactive_operations>
<overview>
Ensuring git operations run without requiring user interaction is critical
for automated conflict resolution. The mode uses environment variables to
bypass interactive prompts.
</overview>

<techniques>
<technique name="GIT_EDITOR">
<description>Set to 'true' (a no-op command) to skip editor prompts</description>
<usage>GIT_EDITOR=true git rebase --continue</usage>
<when>During rebase operations that would normally open an editor</when>
</technique>

<technique name="GIT_SEQUENCE_EDITOR">
<description>Skip interactive rebase todo editing</description>
<usage>GIT_SEQUENCE_EDITOR=true git rebase -i HEAD~3</usage>
<when>When interactive rebase is triggered but no editing needed</when>
</technique>

<technique name="commit_flags">
<description>Use flags to avoid interactive prompts</description>
<examples>
<example>git commit --no-edit (use existing message)</example>
<example>git merge --no-edit (skip merge message editing)</example>
<example>git cherry-pick --no-edit (keep original message)</example>
</examples>
</technique>
</techniques>

<best_practices>
<practice>Always test commands locally first to identify potential prompts</practice>
<practice>Combine environment variables when multiple editors might be invoked</practice>
<practice>Document why non-interactive mode is used in comments</practice>
<practice>Have fallback strategies if automation fails</practice>
</best_practices>
</non_interactive_operations>
</merge_resolver_tool_usage>
7 changes: 4 additions & 3 deletions .roo/rules-merge-resolver/4_complete_example.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ From github.com:user/repo

<tool_use><![CDATA[
<execute_command>
<command>git rebase origin/main</command>
<command>GIT_EDITOR=true git rebase origin/main</command>
</execute_command>
]]></tool_use>
<expected_output><![CDATA[
Expand Down Expand Up @@ -251,7 +251,7 @@ abc123 Fix: Add listener cleanup to prevent memory leak

<tool_use><![CDATA[
<execute_command>
<command>git rebase --continue</command>
<command>GIT_EDITOR=true git rebase --continue</command>
</execute_command>
]]></tool_use>
<expected_output><![CDATA[
Expand Down Expand Up @@ -309,7 +309,8 @@ Both the feature refactor and the critical bugfix have been preserved in the res
<takeaway>Use git blame and commit messages to understand the history</takeaway>
<takeaway>Combine non-conflicting improvements when possible</takeaway>
<takeaway>Prioritize bugfixes while accommodating refactors</takeaway>
<takeaway>Complete the rebase process with git rebase --continue</takeaway>
<takeaway>Use GIT_EDITOR=true to ensure non-interactive rebase operations</takeaway>
<takeaway>Complete the rebase process with GIT_EDITOR=true git rebase --continue</takeaway>
<takeaway>Validate that both sets of changes work together</takeaway>
</key_takeaways>
</merge_resolver_example>
4 changes: 2 additions & 2 deletions apps/web-roo-code/src/app/evals/plot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -175,13 +175,13 @@ export const Plot = ({ tableData }: PlotProps) => {
<>
<div className="pt-4 pb-8 font-mono">Cost x Score</div>
<ChartContainer config={chartConfig} className="h-[500px] w-full">
<ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 20 }}>
<ScatterChart margin={{ top: 20, right: 0, bottom: 0, left: 20 }}>
<XAxis
type="number"
dataKey="cost"
name="Cost"
domain={[
(dataMin: number) => Math.round((dataMin - 5) / 5) * 5,
(dataMin: number) => Math.max(0, Math.round((dataMin - 5) / 5) * 5),
(dataMax: number) => Math.round((dataMax + 5) / 5) * 5,
]}
tickFormatter={(value) => formatCurrency(value)}
Expand Down
2 changes: 1 addition & 1 deletion packages/types/npm/package.metadata.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@roo-code/types",
"version": "1.74.0",
"version": "1.75.0",
"description": "TypeScript type definitions for Roo Code.",
"publishConfig": {
"access": "public",
Expand Down
1 change: 1 addition & 0 deletions packages/types/src/cloud.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ export type UserFeatures = z.infer<typeof userFeaturesSchema>

export const userSettingsConfigSchema = z.object({
extensionBridgeEnabled: z.boolean().optional(),
taskSyncEnabled: z.boolean().optional(),
})

export type UserSettingsConfig = z.infer<typeof userSettingsConfigSchema>
Expand Down
1 change: 1 addition & 0 deletions packages/types/src/global-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export const globalSettingsSchema = z.object({
lastShownAnnouncementId: z.string().optional(),
customInstructions: z.string().optional(),
taskHistory: z.array(historyItemSchema).optional(),
dismissedUpsells: z.array(z.string()).optional(),

// Image generation settings (experimental) - flattened for simplicity
openRouterImageApiKey: z.string().optional(),
Expand Down
5 changes: 5 additions & 0 deletions src/api/providers/__tests__/chutes.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,10 @@ describe("ChutesHandler", () => {
content: `${systemPrompt}\n${messages[0].content}`,
},
],
max_tokens: 32768,
temperature: 0.6,
stream: true,
stream_options: { include_usage: true },
}),
)
})
Expand Down Expand Up @@ -438,6 +442,7 @@ describe("ChutesHandler", () => {
expect.objectContaining({
model: modelId,
max_tokens: modelInfo.maxTokens,
temperature: 0.5,
messages: expect.arrayContaining([{ role: "system", content: systemPrompt }]),
stream: true,
stream_options: { include_usage: true },
Expand Down
1 change: 1 addition & 0 deletions src/api/providers/__tests__/fireworks.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ describe("FireworksHandler", () => {
expect.objectContaining({
model: modelId,
max_tokens: modelInfo.maxTokens,
temperature: 0.5,
messages: expect.arrayContaining([{ role: "system", content: systemPrompt }]),
stream: true,
stream_options: { include_usage: true },
Expand Down
81 changes: 2 additions & 79 deletions src/api/providers/__tests__/groq.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ describe("GroqHandler", () => {
expect(firstChunk.done).toBe(false)
expect(firstChunk.value).toMatchObject({
type: "usage",
inputTokens: 70, // 100 total - 30 cached
inputTokens: 100,
outputTokens: 50,
cacheWriteTokens: 0,
cacheReadTokens: 30,
Expand All @@ -160,11 +160,7 @@ describe("GroqHandler", () => {
it("createMessage should pass correct parameters to Groq client", async () => {
const modelId: GroqModelId = "llama-3.1-8b-instant"
const modelInfo = groqModels[modelId]
const handlerWithModel = new GroqHandler({
apiModelId: modelId,
groqApiKey: "test-groq-api-key",
modelTemperature: 0.5, // Explicitly set temperature for this test
})
const handlerWithModel = new GroqHandler({ apiModelId: modelId, groqApiKey: "test-groq-api-key" })

mockCreate.mockImplementationOnce(() => {
return {
Expand Down Expand Up @@ -194,77 +190,4 @@ describe("GroqHandler", () => {
undefined,
)
})

it("should omit temperature when modelTemperature is undefined", async () => {
const modelId: GroqModelId = "llama-3.1-8b-instant"
const handlerWithoutTemp = new GroqHandler({
apiModelId: modelId,
groqApiKey: "test-groq-api-key",
// modelTemperature is not set
})

mockCreate.mockImplementationOnce(() => {
return {
[Symbol.asyncIterator]: () => ({
async next() {
return { done: true }
},
}),
}
})

const systemPrompt = "Test system prompt"
const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "Test message" }]

const messageGenerator = handlerWithoutTemp.createMessage(systemPrompt, messages)
await messageGenerator.next()

expect(mockCreate).toHaveBeenCalledWith(
expect.objectContaining({
model: modelId,
messages: expect.arrayContaining([{ role: "system", content: systemPrompt }]),
stream: true,
}),
undefined,
)

// Verify temperature is NOT included
const callArgs = mockCreate.mock.calls[0][0]
expect(callArgs).not.toHaveProperty("temperature")
})

it("should include temperature when modelTemperature is explicitly set", async () => {
const modelId: GroqModelId = "llama-3.1-8b-instant"
const handlerWithTemp = new GroqHandler({
apiModelId: modelId,
groqApiKey: "test-groq-api-key",
modelTemperature: 0.7,
})

mockCreate.mockImplementationOnce(() => {
return {
[Symbol.asyncIterator]: () => ({
async next() {
return { done: true }
},
}),
}
})

const systemPrompt = "Test system prompt"
const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "Test message" }]

const messageGenerator = handlerWithTemp.createMessage(systemPrompt, messages)
await messageGenerator.next()

expect(mockCreate).toHaveBeenCalledWith(
expect.objectContaining({
model: modelId,
temperature: 0.7,
messages: expect.arrayContaining([{ role: "system", content: systemPrompt }]),
stream: true,
}),
undefined,
)
})
})
Loading