diff --git a/.github/workflows/website-preview.yml b/.github/workflows/website-preview.yml index 6966005eaf..65cf3e5418 100644 --- a/.github/workflows/website-preview.yml +++ b/.github/workflows/website-preview.yml @@ -70,15 +70,20 @@ jobs: comment.body.includes(commentIdentifier) ); - if (existingComment) { - return; - } - const comment = commentIdentifier + '\n🚀 **Preview deployed!**\n\nYour changes have been deployed to Vercel:\n\n**Preview URL:** ' + deploymentUrl + '\n\nThis preview will be updated automatically when you push new commits to this PR.'; - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: comment - }); + if (existingComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existingComment.id, + body: comment + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: comment + }); + } diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..ae09fd9b30 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,5 @@ +# AGENTS.md + +This file provides guidance to agents when working with code in this repository. + +- Settings View Pattern: When working on `SettingsView`, inputs must bind to the local `cachedState`, NOT the live `useExtensionState()`. The `cachedState` acts as a buffer for user edits, isolating them from the `ContextProxy` source-of-truth until the user explicitly clicks "Save". Wiring inputs directly to the live state causes race conditions. diff --git a/CHANGELOG.md b/CHANGELOG.md index 764491226e..9eb498b7f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Roo Code Changelog +## [3.42.0] - 2026-01-22 + +![3.42.0 Release - ChatGPT Usage Tracking](/releases/3.42.0-release.png) + +- Added UI to track your ChatGPT usage limits in the OpenAI Codex provider (PR #10813 by @hannesrudolph) +- Removed deprecated Claude Code provider (PR #10883 by @daniel-lxs) +- Streamlined codebase by removing legacy XML tool calling functionality (#10848 by @hannesrudolph, PR #10841 by @hannesrudolph) +- Standardize model selectors across all providers: Improved consistency of model selection UI (#10650 by @hannesrudolph, PR #10294 by @hannesrudolph) +- Enable prompt caching for Cerebras zai-glm-4.7 model (#10601 by @jahanson, PR #10670 by @app/roomote) +- Add Kimi K2 thinking model to VertexAI provider (#9268 by @diwakar-s-maurya, PR #9269 by @app/roomote) +- Warn users when too many MCP tools are enabled (PR #10772 by @app/roomote) +- Migrate context condensing prompt to customSupportPrompts (PR #10881 by @hannesrudolph) +- Unify export path logic and default to Downloads folder (PR #10882 by @hannesrudolph) +- Performance improvements for webview state synchronization (PR #10842 by @hannesrudolph) +- Fix: Handle mode selector empty state on workspace switch (#10660 by @hannesrudolph, PR #9674 by @app/roomote) +- Fix: Resolve race condition in context condensing prompt input (PR #10876 by @hannesrudolph) +- Fix: Prevent double emission of text/reasoning in OpenAI native and codex handlers (PR #10888 by @hannesrudolph) +- Fix: Prevent task abortion when resuming via IPC/bridge (PR #10892 by @cte) +- Fix: Enforce file restrictions for all editing tools (PR #10896 by @app/roomote) +- Fix: Remove custom condensing model option (PR #10901 by @hannesrudolph) +- Unify user content tags to for consistent prompt formatting (#10658 by @hannesrudolph, PR #10723 by @app/roomote) +- Clarify linked SKILL.md file handling in prompts (PR #10907 by @hannesrudolph) +- Fix: Padding on Roo Code Cloud teaser (PR #10889 by @app/roomote) + ## [3.41.3] - 2026-01-18 - Fix: Thinking block word-breaking to prevent horizontal scroll in the chat UI (PR #10806 by @roomote) diff --git a/apps/cli/package.json b/apps/cli/package.json index 700ff0c506..6348bbe020 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -30,6 +30,8 @@ "@trpc/client": "^11.8.1", "@vscode/ripgrep": "^1.15.9", "commander": "^12.1.0", + "cross-spawn": "^7.0.6", + "execa": "^9.5.2", "fuzzysort": "^3.1.0", "ink": "^6.6.0", "p-wait-for": "^5.0.2", diff --git a/apps/web-evals/src/app/runs/new/new-run.tsx b/apps/web-evals/src/app/runs/new/new-run.tsx index cea15c6ddd..8d44ef38e7 100644 --- a/apps/web-evals/src/app/runs/new/new-run.tsx +++ b/apps/web-evals/src/app/runs/new/new-run.tsx @@ -56,7 +56,6 @@ import { useRooCodeCloudModels } from "@/hooks/use-roo-code-cloud-models" import { Button, - Checkbox, FormControl, FormField, FormItem, @@ -111,7 +110,6 @@ export function NewRun() { const [provider, setModelSource] = useState<"roo" | "openrouter" | "other">("other") const [executionMethod, setExecutionMethod] = useState("vscode") - const [useNativeToolProtocol, setUseNativeToolProtocol] = useState(true) const [commandExecutionTimeout, setCommandExecutionTimeout] = useState(20) const [terminalShellIntegrationTimeout, setTerminalShellIntegrationTimeout] = useState(30) // seconds @@ -464,7 +462,6 @@ export function NewRun() { ...(runValues.settings || {}), apiProvider: "openrouter", openRouterModelId: selection.model, - toolProtocol: useNativeToolProtocol ? "native" : "xml", commandExecutionTimeout, terminalShellIntegrationTimeout: terminalShellIntegrationTimeout * 1000, } @@ -474,7 +471,6 @@ export function NewRun() { ...(runValues.settings || {}), apiProvider: "roo", apiModelId: selection.model, - toolProtocol: useNativeToolProtocol ? "native" : "xml", commandExecutionTimeout, terminalShellIntegrationTimeout: terminalShellIntegrationTimeout * 1000, } @@ -485,7 +481,6 @@ export function NewRun() { ...EVALS_SETTINGS, ...providerSettings, ...importedSettings.globalSettings, - toolProtocol: useNativeToolProtocol ? "native" : "xml", commandExecutionTimeout, terminalShellIntegrationTimeout: terminalShellIntegrationTimeout * 1000, } @@ -512,7 +507,6 @@ export function NewRun() { configSelections, importedSettings, router, - useNativeToolProtocol, commandExecutionTimeout, terminalShellIntegrationTimeout, ], @@ -688,26 +682,6 @@ export function NewRun() { )} -
- -
- -
-
- {settings && ( )} @@ -792,26 +766,6 @@ export function NewRun() { ))} - -
- -
- -
-
)} diff --git a/apps/web-roo-code/src/app/legal/cookies/page.tsx b/apps/web-roo-code/src/app/legal/cookies/page.tsx index c8058a34e7..895d7c2b45 100644 --- a/apps/web-roo-code/src/app/legal/cookies/page.tsx +++ b/apps/web-roo-code/src/app/legal/cookies/page.tsx @@ -100,6 +100,19 @@ export default function CookiePolicy() { 1 year ph_* + + HubSpot + + Marketing automation and visitor tracking + + + Analytics (only with your consent) + + 13 months + + hubspotutk, __hstc, __hssrc, __hssc + + @@ -122,6 +135,15 @@ export default function CookiePolicy() { PostHog Privacy Policy

+

+ + HubSpot Privacy Policy + +

Essential cookies

@@ -133,10 +155,10 @@ export default function CookiePolicy() {

Analytics cookies

- We use PostHog analytics cookies to understand how visitors interact with our website. This - helps us improve our services and user experience. Analytics cookies are placed only if you give - consent through our cookie banner. The lawful basis for processing these cookies is your - consent, which you can withdraw at any time. + We use PostHog and HubSpot analytics cookies to understand how visitors interact with our + website. This helps us improve our services, user experience, and marketing efforts. Analytics + cookies are placed only if you give consent through our cookie banner. The lawful basis for + processing these cookies is your consent, which you can withdraw at any time.

Third-party services

diff --git a/apps/web-roo-code/src/app/pricing/page.tsx b/apps/web-roo-code/src/app/pricing/page.tsx index 487c14d087..6851b47b6a 100644 --- a/apps/web-roo-code/src/app/pricing/page.tsx +++ b/apps/web-roo-code/src/app/pricing/page.tsx @@ -291,11 +291,7 @@ export default function PricingPage() {
  • To pay for Cloud Agents running time (${PRICE_CREDITS}/hour)
  • To pay for AI model inference costs ( - + varies by model ) diff --git a/apps/web-roo-code/src/app/slack/page.tsx b/apps/web-roo-code/src/app/slack/page.tsx new file mode 100644 index 0000000000..c1fb39cb3e --- /dev/null +++ b/apps/web-roo-code/src/app/slack/page.tsx @@ -0,0 +1,401 @@ +import { + ArrowRight, + Brain, + CreditCard, + GitBranch, + GraduationCap, + Link2, + MessageSquare, + Settings, + Shield, + Slack, + Users, + Zap, +} from "lucide-react" +import type { LucideIcon } from "lucide-react" +import type { Metadata } from "next" + +import { AnimatedBackground } from "@/components/homepage" +import { SlackThreadDemo } from "@/components/slack/slack-thread-demo" +import { Button } from "@/components/ui" +import { EXTERNAL_LINKS } from "@/lib/constants" +import { SEO } from "@/lib/seo" +import { ogImageUrl } from "@/lib/og" + +const TITLE = "Roo Code for Slack" +const DESCRIPTION = + "Mention @Roomote in any channel to explain code, plan features, or ship a PR, all without leaving the conversation." +const OG_DESCRIPTION = "Your AI Team in Slack" +const PATH = "/slack" + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: ogImageUrl(TITLE, OG_DESCRIPTION), + width: 1200, + height: 630, + alt: TITLE, + }, + ], + locale: SEO.locale, + type: "website", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [ogImageUrl(TITLE, OG_DESCRIPTION)], + }, + keywords: [ + ...SEO.keywords, + "slack integration", + "slack bot", + "AI in slack", + "code assistant slack", + "@Roomote", + "team collaboration", + ], +} + +// Invalidate cache when a request comes in, at most once every hour. +export const revalidate = 3600 + +type ValueProp = { + icon: LucideIcon + title: string + description: string +} + +const VALUE_PROPS: ValueProp[] = [ + { + icon: GitBranch, + title: "Discussion to PR.", + description: + "Your team discusses a feature in Slack. @Roomote turns the discussion into a plan. Then builds it. All without leaving the conversation.", + }, + { + icon: Brain, + title: "Thread-aware.", + description: + '@Roomote reads the full thread before responding. Ask "Can we add caching here?" and it knows exactly what code you mean.', + }, + { + icon: Link2, + title: "Chain agents.", + description: + "Start with a Planner to spec it out. Then call the Coder to build it. Multi-step workflows, one Slack thread.", + }, + { + icon: Users, + title: "Open to all.", + description: + "Anyone on your team can ask @Roomote to fix bugs, build features, or investigate issues. Engineering gets looped in only when needed.", + }, + { + icon: GraduationCap, + title: "Built-in learning.", + description: "Public channel mentions show everyone how to leverage agents. Learn by watching.", + }, + { + icon: Shield, + title: "Safe by design.", + description: "Agents never touch main/master directly. They produce branches and PRs. You approve.", + }, +] + +type WorkflowStep = { + step: number + title: string + description: string +} + +const WORKFLOW_STEPS: WorkflowStep[] = [ + { + step: 1, + title: "Turn the discussion into a plan", + description: "Your team discusses a feature. When it gets complex, summon the Planner agent.", + }, + { + step: 2, + title: "Refine the plan in the thread", + description: + "The team reviews the spec in the thread, suggests changes, asks questions. Mention @Roomote again to refine.", + }, + { + step: 3, + title: "Build the plan", + description: "Once the plan looks good, hand it off to the Coder agent to implement.", + }, + { + step: 4, + title: "Review and ship", + description: "The Coder creates a branch and opens a PR. The team reviews, and the feature ships.", + }, +] + +type OnboardingStep = { + icon: LucideIcon + title: string + description: string + link?: { + href: string + text: string + } +} + +const ONBOARDING_STEPS: OnboardingStep[] = [ + { + icon: CreditCard, + title: "1. Team Plan", + description: "Slack requires a Team plan.", + link: { + href: EXTERNAL_LINKS.CLOUD_APP_TEAM_TRIAL, + text: "Start a free trial", + }, + }, + { + icon: Settings, + title: "2. Connect", + description: 'Sign in to Roo Code Cloud and go to Settings. Click "Connect" next to Slack.', + }, + { + icon: Slack, + title: "3. Authorize", + description: "Authorize the Roo Code app to access your Slack workspace.", + }, + { + icon: MessageSquare, + title: "4. Add to channels", + description: "Add @Roomote to the channels where you want it available.", + }, +] + +export default function SlackPage(): JSX.Element { + return ( + <> + {/* Hero Section */} +
    + +
    +
    +
    +
    + + Powered by Roo Code Cloud +
    +

    + @Roomote: Your AI Team in Slack +

    +

    + Mention @Roomote in any channel to explain code, plan features, or ship a PR, all + without leaving the conversation. +

    + +
    + +
    + +
    +
    +
    +
    + + {/* Value Props Section */} +
    +
    +
    +
    +
    +
    +

    + Why your team will love using Roo Code in Slack +

    +

    + AI agents that understand context, chain together for complex work, and keep your team in + control. +

    +
    +
    + {VALUE_PROPS.map((prop, index) => { + const Icon = prop.icon + return ( +
    +
    + +
    +

    {prop.title}

    +

    {prop.description}

    +
    + ) + })} +
    +
    +
    + + {/* Featured Workflow Section */} +
    +
    +
    +
    +
    + +
    +
    + + Featured Workflow +
    +

    + Thread to Shipped Feature +

    +

    + Turn Slack discussions into working code. No context lost, no meetings needed. +

    +
    + +
    +
    + {/* YouTube Video Embed */} +
    +