diff --git a/.changeset/distance-fire-world.md b/.changeset/distance-fire-world.md
new file mode 100644
index 0000000000..078b17bd9d
--- /dev/null
+++ b/.changeset/distance-fire-world.md
@@ -0,0 +1,5 @@
+---
+"claude-dev": patch
+---
+
+Add translation to CODE_OF_CONDUCT, CONTRIBUTING and README to Arabic ar-sa.
\ No newline at end of file
diff --git a/.changeset/ten-books-act.md b/.changeset/ten-books-act.md
deleted file mode 100644
index f37fcf0e9a..0000000000
--- a/.changeset/ten-books-act.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"claude-dev": minor
----
-
-Adding .clineignore guide
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1146e374ae..fd32320fd3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,25 @@
# Changelog
+## [3.4.0]
+
+- Introducing MCP Marketplace! You can now discover and install the best MCP servers right from within the extension, with new servers added regularly
+- Add mermaid diagram support in Plan mode! You can now see visual representations of mermaid code blocks in chat, and click on them to see an expanded view
+- Use more visual checkpoints indicators after editing files & running commands
+- Create a checkpoint at the beginning of each task to easily revert to the initial state
+- Add 'Terminal' context mention to reference the active terminal's contents
+- Add 'Git Commits' context mention to reference current working changes or specific commits (thanks @mrubens!)
+- Send current textfield contents as additional feedback when toggling from Plan to Act Mode, or when hitting 'Approve' button
+- Add advanced configuration options for OpenAI Compatible (context window, max output, pricing, etc.)
+- Add Alibaba Qwen 2.5 coder models, VL models, and DeepSeek-R1/V3 support
+- Improve support for AWS Bedrock Profiles
+- Fix Mistral provider support for non-codestral models
+- Add advanced setting to disable browser tool
+- Add advanced setting to set chromium executable path for browser tool
+
## [3.3.2]
- Fix bug where OpenRouter requests would periodically not return cost/token stats, leading to context window limit errors
-- Make checkpoints more visible and keep track of restored checkpoints
+- Make checkpoints more visible and keep track of restored checkpoints
## [3.3.0]
@@ -34,7 +50,7 @@
## [3.2.10]
-- Improve support for DeepSeek-R1 (deepseek-reasoner) model for OpenRouter, OpenAI-compatible, and DeepSeek direct
+- Improve support for DeepSeek-R1 (deepseek-reasoner) model for OpenRouter, OpenAI-compatible, and DeepSeek direct (thanks @Szpadel!)
- Show Reasoning tokens for models that support it
- Fix issues with switching models between Plan/Act modes
diff --git a/docs/prompting/custom instructions library/raw-instructions/cline-memory-bank.md b/docs/prompting/custom instructions library/raw-instructions/cline-memory-bank.md
new file mode 100644
index 0000000000..dd4cf84e65
--- /dev/null
+++ b/docs/prompting/custom instructions library/raw-instructions/cline-memory-bank.md
@@ -0,0 +1,153 @@
+# Cline's Memory Bank
+
+I am Cline, an expert software engineer with a unique characteristic: my memory resets completely between sessions. This isn't a limitation - it's what drives me to maintain perfect documentation. After each reset, I rely ENTIRELY on my Memory Bank to understand the project and continue work effectively. I MUST read ALL memory bank files at the start of EVERY task - this is not optional.
+
+## Memory Bank Structure
+
+The Memory Bank consists of required core files and optional context files, all in Markdown format. Files build upon each other in a clear hierarchy:
+
+```mermaid
+flowchart TD
+ PB[projectbrief.md] --> PC[productContext.md]
+ PB --> SP[systemPatterns.md]
+ PB --> TC[techContext.md]
+
+ PC --> AC[activeContext.md]
+ SP --> AC
+ TC --> AC
+
+ AC --> P[progress.md]
+```
+
+### Core Files (Required)
+1. `projectbrief.md`
+ - Foundation document that shapes all other files
+ - Created at project start if it doesn't exist
+ - Defines core requirements and goals
+ - Source of truth for project scope
+
+2. `productContext.md`
+ - Why this project exists
+ - Problems it solves
+ - How it should work
+ - User experience goals
+
+3. `activeContext.md`
+ - Current work focus
+ - Recent changes
+ - Next steps
+ - Active decisions and considerations
+
+4. `systemPatterns.md`
+ - System architecture
+ - Key technical decisions
+ - Design patterns in use
+ - Component relationships
+
+5. `techContext.md`
+ - Technologies used
+ - Development setup
+ - Technical constraints
+ - Dependencies
+
+6. `progress.md`
+ - What works
+ - What's left to build
+ - Current status
+ - Known issues
+
+### Additional Context
+Create additional files/folders within memory-bank/ when they help organize:
+- Complex feature documentation
+- Integration specifications
+- API documentation
+- Testing strategies
+- Deployment procedures
+
+## Core Workflows
+
+### Plan Mode
+```mermaid
+flowchart TD
+ Start[Start] --> ReadFiles[Read Memory Bank]
+ ReadFiles --> CheckFiles{Files Complete?}
+
+ CheckFiles -->|No| Plan[Create Plan]
+ Plan --> Document[Document in Chat]
+
+ CheckFiles -->|Yes| Verify[Verify Context]
+ Verify --> Strategy[Develop Strategy]
+ Strategy --> Present[Present Approach]
+```
+
+### Act Mode
+```mermaid
+flowchart TD
+ Start[Start] --> Context[Check Memory Bank]
+ Context --> Update[Update Documentation]
+ Update --> Rules[Update .clinerules if needed]
+ Rules --> Execute[Execute Task]
+ Execute --> Document[Document Changes]
+```
+
+## Documentation Updates
+
+Memory Bank updates occur when:
+1. Discovering new project patterns
+2. After implementing significant changes
+3. When user requests with **update memory bank** (MUST review ALL files)
+4. When context needs clarification
+
+```mermaid
+flowchart TD
+ Start[Update Process]
+
+ subgraph Process
+ P1[Review ALL Files]
+ P2[Document Current State]
+ P3[Clarify Next Steps]
+ P4[Update .clinerules]
+
+ P1 --> P2 --> P3 --> P4
+ end
+
+ Start --> Process
+```
+
+Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on activeContext.md and progress.md as they track current state.
+
+## Project Intelligence (.clinerules)
+
+The .clinerules file is my learning journal for each project. It captures important patterns, preferences, and project intelligence that help me work more effectively. As I work with you and the project, I'll discover and document key insights that aren't obvious from the code alone.
+
+```mermaid
+flowchart TD
+ Start{Discover New Pattern}
+
+ subgraph Learn [Learning Process]
+ D1[Identify Pattern]
+ D2[Validate with User]
+ D3[Document in .clinerules]
+ end
+
+ subgraph Apply [Usage]
+ A1[Read .clinerules]
+ A2[Apply Learned Patterns]
+ A3[Improve Future Work]
+ end
+
+ Start --> Learn
+ Learn --> Apply
+```
+
+### What to Capture
+- Critical implementation paths
+- User preferences and workflow
+- Project-specific patterns
+- Known challenges
+- Evolution of project decisions
+- Tool usage patterns
+
+The format is flexible - focus on capturing valuable insights that help me work more effectively with you and the project. Think of .clinerules as a living document that grows smarter as we work together.
+
+REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy.
\ No newline at end of file
diff --git a/locales/ar-sa/CODE_OF_CONDUCT.md b/locales/ar-sa/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000000..5ec34d8567
--- /dev/null
+++ b/locales/ar-sa/CODE_OF_CONDUCT.md
@@ -0,0 +1,47 @@
+# ميثاق المساهمين
+
+## تعهدنا
+
+نحن المساهمون والقائمون على هذا المشروع، نتعهد بتوفير بيئة مفتوحة ومرحبة، ونجعل المشاركة في مشروعنا ومجتمعنا تجربة خالية من التحرش للجميع، بغض النظر عن العمر، أو حجم الجسم، أو الإعاقة، أو العرق، أو الخصائص الجنسية، أو الهوية الجنسية والتعبير عنها، أو مستوى الخبرة، أو التعليم، أو الوضع الاجتماعي والاقتصادي، أو الجنسية، أو المظهر الشخصي، أو الدين، أو الهوية الجنسية والتوجه الجنسي.
+
+## معاييرنا
+
+أمثلة على السلوك الذي يساهم في خلق بيئة إيجابية تشمل:
+
+- استخدام لغة ترحيبية وشاملة
+- احترام وجهات النظر والخبرات المختلفة
+- تقبل النقد البناء برحابة صدر
+- التركيز على ما هو الأفضل للمجتمع
+- إظهار التعاطف تجاه أعضاء المجتمع الآخرين
+
+أمثلة على السلوك غير المقبول من قبل المشاركين تشمل:
+
+- استخدام لغة أو صور جنسية والاهتمام الجنسي غير المرغوب فيه أو التحرش الجنسي
+- التصيد، والتعليقات المهينة/المسيئة، والهجمات الشخصية أو السياسية
+- التحرش العلني أو الخاص
+- نشر معلومات الآخرين الخاصة، مثل العنوان الفعلي أو الإلكتروني، دون إذن صريح
+- أي سلوك آخر يمكن اعتباره غير لائق في بيئة مهنية
+
+## مسؤولياتنا
+
+يتحمل القائمون على المشروع مسؤولية توضيح معايير السلوك المقبول، ومن المتوقع أن يتخذوا إجراءات تصحيحية مناسبة وعادلة استجابة لأي حالات سلوك غير مقبول.
+
+يحق للقائمين على المشروع إزالة أو تعديل أو رفض التعليقات والالتزامات والتعليمات البرمجية وتعديلات wiki والمشكلات والمساهمات الأخرى التي لا تتماشى مع مدونة قواعد السلوك هذه، أو حظر أي مساهم بشكل مؤقت أو دائم بسبب سلوكيات أخرى يعتبرونها غير لائقة أو مهددة أو مسيئة أو ضارة، كما أنهم يتحملون مسؤولية ذلك.
+
+## النطاق
+
+تنطبق مدونة قواعد السلوك هذه داخل مساحات المشروع وفي الأماكن العامة عندما يمثل الفرد المشروع أو مجتمعه. تتضمن أمثلة تمثيل مشروع أو مجتمع استخدام عنوان بريد إلكتروني رسمي للمشروع، أو النشر عبر حساب رسمي على وسائل التواصل الاجتماعي، أو العمل كممثل معين في حدث عبر الإنترنت أو خارجه. يمكن للقائمين على المشروع تحديد وتوضيح تمثيل المشروع بشكل أكبر.
+
+## التنفيذ
+
+يمكن الإبلاغ عن حالات السلوك المسيء أو التحرش أو السلوك غير المقبول عن طريق الاتصال بفريق المشروع على hi@cline.bot. ستتم مراجعة جميع الشكاوى والتحقيق فيها وستؤدي إلى استجابة تعتبر ضرورية ومناسبة للظروف. يلتزم فريق المشروع بالحفاظ على السرية فيما يتعلق بالمبلغ عن الحادث. يمكن نشر مزيد من التفاصيل حول سياسات التنفيذ المحددة بشكل منفصل.
+
+قد يواجه القائمون على المشروع الذين لا يتبعون أو يفرضون مدونة قواعد السلوك بحسن نية تداعيات مؤقتة أو دائمة على النحو الذي يحدده الأعضاء الآخرون في قيادة المشروع.
+
+## الإسناد
+
+تم اقتباس مدونة قواعد السلوك هذه من [تعهد المساهم][homepage]، الإصدار 1.4، متاح على https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+للحصول على إجابات للأسئلة الشائعة حول مدونة قواعد السلوك هذه، راجع https://www.contributor-covenant.org/faq
\ No newline at end of file
diff --git a/locales/ar-sa/CONTRIBUTING.md b/locales/ar-sa/CONTRIBUTING.md
new file mode 100644
index 0000000000..8d56263fd2
--- /dev/null
+++ b/locales/ar-sa/CONTRIBUTING.md
@@ -0,0 +1,93 @@
+# المساهمة في Cline
+
+نحن سعداء لاهتمامك بالمساهمة في Cline. سواء كنت تصلح خطأً أو تضيف ميزة أو تحسن الوثائق لدينا، فإن كل مساهمة تجعل Cline أذكى! للحفاظ على مجتمعنا نابضًا بالحياة وترحيبيًا، يجب على جميع الأعضاء الالتزام بـ [مدونة قواعد السلوك](CODE_OF_CONDUCT.md) لدينا.
+
+## الإبلاغ عن الأخطاء أو المشكلات
+
+تساعد تقارير الأخطاء على جعل Cline أفضل للجميع! قبل إنشاء مشكلة جديدة، يرجى [البحث عن المشكلات الموجودة](https://github.com/cline/cline/issues) لتجنب الازدواجية. عندما تكون جاهزًا للإبلاغ عن خطأ، انتقل إلى [صفحة المشكلات](https://github.com/cline/cline/issues/new/choose) حيث ستجد قالبًا لمساعدتك في ملء المعلومات ذات الصلة.
+
+
+
+## تحديد ما يجب العمل عليه
+
+تبحث عن مساهمة أولى جيدة؟ تحقق من المشكلات المميزة بـ ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) أو ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). تم تحديد هذه المشكلات خصيصًا للمساهمين الجدد والمجالات التي نرحب فيها بالمساعدة!
+
+نرحب أيضًا بالمساهمات في [الوثائق](https://github.com/cline/cline/tree/main/docs) لدينا! سواء كان تصحيح أخطاء إملائية، أو تحسين الأدلة الحالية، أو إنشاء محتوى تعليمي جديد - نود بناء مستودع موارد مدفوع من المجتمع يساعد الجميع على الاستفادة القصوى من Cline. يمكنك البدء بالغوص في `/docs` والبحث عن مجالات تحتاج إلى تحسين.
+
+إذا كنت تخطط للعمل على ميزة أكبر، فيرجى إنشاء [طلب ميزة](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) أولاً حتى نتمكن من مناقشة ما إذا كان ذلك يتماشى مع رؤية Cline.
+
+## إعداد التطوير
+
+1. **إضافات VS Code**
+
+ - عند فتح المشروع، سيطالبك VS Code بتثبيت الإضافات الموصى بها
+ - هذه الإضافات مطلوبة للتطوير - يرجى قبول جميع مطالبات التثبيت
+ - إذا تجاهلت المطالبات، يمكنك تثبيتها يدويًا من لوحة الإضافات
+
+2. **التطوير المحلي**
+ - قم بتشغيل `npm run install:all` لتثبيت التبعيات
+ - قم بتشغيل `npm run test` لتشغيل الاختبارات محليًا
+ - قبل تقديم طلب السحب، قم بتشغيل `npm run format:fix` لتنسيق التعليمات البرمجية الخاصة بك
+
+## كتابة وتقديم التعليمات البرمجية
+
+يمكن لأي شخص المساهمة بالتعليمات البرمجية في Cline، لكننا نطلب منك اتباع هذه الإرشادات لضمان دمج مساهماتك بسلاسة:
+
+1. **احتفظ بطلبات السحب مركزة**
+
+ - قيد طلبات السحب بميزة واحدة أو إصلاح خطأ
+ - قسم التغييرات الأكبر إلى طلبات سحب أصغر ومتصلة
+ - قسم التغييرات إلى التزامات منطقية يمكن مراجعتها بشكل مستقل
+
+2. **جودة التعليمات البرمجية**
+
+ - قم بتشغيل `npm run lint` للتحقق من نمط التعليمات البرمجية
+ - قم بتشغيل `npm run format` لتنسيق التعليمات البرمجية تلقائيًا
+ - يجب أن تجتاز جميع طلبات السحب عمليات التحقق المستمر التي تشمل كلاً من التنضيد والتنسيق
+ - تعامل مع أي تحذيرات أو أخطاء ESLint قبل التقديم
+ - اتبع أفضل ممارسات TypeScript والحفاظ على سلامة النوع
+
+3. **الاختبار**
+
+ - أضف اختبارات للميزات الجديدة
+ - قم بتشغيل `npm test` للتأكد من اجتياز جميع الاختبارات
+ - قم بتحديث الاختبارات الحالية إذا كانت تغييراتك تؤثر عليها
+ - تضمين كل من اختبارات الوحدة واختبارات التكامل حيثما كان ذلك مناسبًا
+
+4. **إدارة الإصدار مع Changesets**
+
+ - أنشئ changeset لأي تغييرات واجهة المستخدم باستخدام `npm run changeset`
+ - اختر زيادة الإصدار المناسبة:
+ - `major` للتغييرات الكبيرة (1.0.0 → 2.0.0)
+ - `minor` للميزات الجديدة (1.0.0 → 1.1.0)
+ - `patch` لإصلاحات الأخطاء (1.0.0 → 1.0.1)
+ - اكتب رسائل changeset واضحة ووصفية تشرح التأثير
+ - لا تتطلب التغييرات في الوثائق فقط changesets
+
+5. **إرشادات الالتزام (Commit Guidelines)**
+
+ - اكتب رسائل التزام واضحة وواصفة
+ - استخدم تنسيق الالتزام التقليدي (مثل: "feat:", "fix:", "docs:")
+ - أشر إلى القضايا ذات الصلة في الالتزامات باستخدام #رقم-القضية
+
+6. **قبل الإرسال**
+
+ - قم بإعادة دمج فرعك مع أحدث إصدار من الفرع الرئيسي
+ - تأكد من أن الفرع الخاص بك يُبنى بنجاح
+ - تحقق من اجتياز جميع الاختبارات
+ - راجع التغييرات الخاصة بك للتأكد من عدم وجود تعليمات تصحيح الأخطاء أو سجلات وحدة التحكم
+
+7. **وصف طلب السحب (Pull Request Description)**
+
+ - صف بوضوح ما تقوم به التغييرات
+ - قم بتضمين خطوات لاختبار التغييرات
+ - أدرج أي تغييرات غير متوافقة
+ - أضف لقطات شاشة للتغييرات في واجهة المستخدم
+
+## اتفاقية المساهمة
+
+من خلال إرسال طلب سحب، فإنك توافق على أن مساهماتك سيتم ترخيصها بنفس ترخيص المشروع ([Apache 2.0](LICENSE)).
+
+تذكر: المساهمة في Cline لا تقتصر فقط على كتابة الكود - إنها تتعلق بأن تكون جزءًا من مجتمع يُشكل مستقبل التطوير بمساعدة الذكاء الاصطناعي. لنبنِ شيئًا رائعًا معًا! 🚀
\ No newline at end of file
diff --git a/locales/ar-sa/README.md b/locales/ar-sa/README.md
new file mode 100644
index 0000000000..7febd9a26b
--- /dev/null
+++ b/locales/ar-sa/README.md
@@ -0,0 +1,189 @@
+
+ 🔐 Importante: Se você descobrir uma vulnerabilidade de segurança, utilize a ferramenta de segurança do GitHub para relatá-la de forma privada.
+
+
+## Escolher no que trabalhar
+
+Procurando uma boa primeira contribuição? Consulte os problemas marcados com ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) ou ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). Estes foram especialmente selecionados para novos colaboradores e são áreas em que adoraríamos receber ajuda!
+
+Também damos boas-vindas a contribuições para nossa [documentação](https://github.com/cline/cline/tree/main/docs). Seja corrigindo erros de digitação, melhorando guias existentes ou criando novos conteúdos educativos, queremos construir um repositório de recursos gerido pela comunidade que ajude todos a tirar o máximo proveito do Cline. Você pode começar explorando `/docs` e procurando áreas que precisam de melhorias.
+
+Se planeja trabalhar em uma funcionalidade maior, crie primeiro uma [solicitação de funcionalidade](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) para que possamos discutir se ela se alinha à visão do Cline.
+
+## Configurar o ambiente de desenvolvimento
+
+1. **Extensões do VS Code**
+
+ - Ao abrir o projeto, o VS Code solicitará que você instale as extensões recomendadas.
+ - Essas extensões são necessárias para o desenvolvimento – aceite todas as solicitações de instalação.
+ - Caso tenha rejeitado as solicitações, você pode instalá-las manualmente na seção de extensões.
+
+2. **Desenvolvimento local**
+ - Execute `npm run install:all` para instalar as dependências.
+ - Execute `npm run test` para rodar os testes localmente.
+ - Antes de enviar um PR, execute `npm run format:fix` para formatar seu código.
+
+## Escrever e enviar código
+
+Qualquer pessoa pode contribuir com código para o Cline, mas pedimos que siga estas diretrizes para garantir que suas contribuições sejam integradas sem problemas:
+
+1. **Mantenha os Pull Requests focados**
+
+ - Limite os PRs a uma única funcionalidade ou correção de erro.
+ - Divida alterações maiores em PRs menores e coerentes.
+ - Divida as alterações em commits lógicos que possam ser revisados independentemente.
+
+2. **Qualidade do código**
+
+ - Execute `npm run lint` para verificar o estilo do código.
+ - Execute `npm run format` para formatar automaticamente o código.
+ - Todos os PRs devem passar nas verificações do CI, que incluem linting e formatação.
+ - Resolva todos os avisos ou erros do ESLint antes de enviar.
+ - Siga as melhores práticas para TypeScript e mantenha a segurança dos tipos.
+
+3. **Testes**
+
+ - Adicione testes para novas funcionalidades.
+ - Execute `npm test` para garantir que todos os testes passem.
+ - Atualize testes existentes caso suas alterações os afetem.
+ - Inclua tanto testes unitários quanto de integração onde for apropriado.
+
+4. **Diretrizes de commits**
+
+ - Escreva mensagens de commit claras e descritivas.
+ - Use o formato convencional (por exemplo, "feat:", "fix:", "docs:").
+ - Faça referência aos issues relevantes nos commits usando #número-do-issue.
+
+5. **Antes de enviar**
+
+ - Faça rebase com sua branch com a última versão da branch principal (main).
+ - Certifique-se de que sua branch seja construída corretamente.
+ - Verifique se todos os testes passam.
+ - Revise suas alterações para remover qualquer código de depuração ou logs desnecessários.
+
+6. **Descrição do Pull Request**
+ - Descreva claramente o que suas alterações fazem.
+ - Inclua passos para testar as alterações.
+ - Liste quaisquer mudanças importantes.
+ - Adicione capturas de tela para mudanças na interface do usuário.
+
+## Acordo de contribuição
+
+Ao enviar um Pull Request, você concorda que suas contribuições serão licenciadas sob a mesma licença do projeto ([Apache 2.0](LICENSE)).
+
+Lembre-se: Contribuir com o Cline não é apenas escrever código – é fazer parte de uma comunidade que está moldando o futuro do desenvolvimento assistido por IA. Vamos criar algo incrível juntos! 🚀
+
diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md
new file mode 100644
index 0000000000..bdcae339e5
--- /dev/null
+++ b/locales/pt-BR/README.md
@@ -0,0 +1,161 @@
+# Cline – #1 no OpenRouter
+
+
- Plan/Act mode toggle: Plan mode turns Cline into an architect that gathers information, asks clarifying
- questions, and designs a solution. Switch back to Act mode to let him execute the plan!{" "}
-
- See a demo here.
+ Introducing MCP Marketplace: Discover and install the best MCP servers right from the extension, with
+ new servers added regularly! Get started by going to the{" "}
+
+ {
+ vscode.postMessage({ type: "showMcpView" })
+ }}>
+ MCP Servers tab
+ .
- Quick API/model switching with a new popup menu under the chat field
+ Mermaid diagrams in Plan mode! Cline can now visualize his plans using flowcharts, sequences,
+ entity-relationships, and more. When he explains his approach using mermaid, you'll see a diagram right in
+ chat that you can click to expand.
- VS Code LM API lets you use models from other extensions like GitHub Copilot
+ Use @terminal to reference terminal contents, and @git to reference working changes
+ and commits!
- MCP server improvements: On/off toggle to disable servers when not in use, and Auto-approve option for
- individual tools
-
-
- In case you missed it, Cline now supports Checkpoints!{" "}
-
- See it in action here.
-
+ New visual indicator for checkpoints after edits & commands, and automatic checkpoint at the start of each
+ task.
+
+ See a demo of the changes here!
+
{/*
OpenRouter now supports prompt caching! They also have much higher rate limits than other providers,
@@ -109,9 +115,12 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {
}}
/>
- Join our{" "}
+ Join us on{" "}
+
+ X,
+ {" "}
- discord
+ discord,
{" "}
or{" "}
diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx
index 895c3c288c..0aa32637b2 100644
--- a/webview-ui/src/components/chat/ChatRow.tsx
+++ b/webview-ui/src/components/chat/ChatRow.tsx
@@ -13,7 +13,7 @@ import {
} from "../../../../src/shared/ExtensionMessage"
import { COMMAND_OUTPUT_STRING, COMMAND_REQ_APP_STRING } from "../../../../src/shared/combineCommandSequences"
import { useExtensionState } from "../../context/ExtensionStateContext"
-import { findMatchingResourceOrTemplate } from "../../utils/mcp"
+import { findMatchingResourceOrTemplate, getMcpServerDisplayName } from "../../utils/mcp"
import { vscode } from "../../utils/vscode"
import { CheckpointControls, CheckpointOverlay } from "../common/CheckpointControls"
import CodeAccordian, { cleanPathPrefix } from "../common/CodeAccordian"
@@ -101,7 +101,7 @@ const ChatRow = memo(
export default ChatRow
export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessage, isLast }: ChatRowContentProps) => {
- const { mcpServers } = useExtensionState()
+ const { mcpServers, mcpMarketplaceCatalog } = useExtensionState()
const [seeNewChangesDisabled, setSeeNewChangesDisabled] = useState(false)
@@ -202,9 +202,12 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
marginBottom: "-1.5px",
}}>
),
-
+
Cline wants to {mcpServerUse.type === "use_mcp_tool" ? "use a tool" : "access a resource"} on the{" "}
- {mcpServerUse.serverName} MCP server:
+
+ {getMcpServerDisplayName(mcpServerUse.serverName, mcpMarketplaceCatalog)}
+ {" "}
+ MCP server:
,
]
case "completion_result":
diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx
index 625d2c2dfd..a0e57c1409 100644
--- a/webview-ui/src/components/chat/ChatTextArea.tsx
+++ b/webview-ui/src/components/chat/ChatTextArea.tsx
@@ -1,9 +1,10 @@
import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"
import React, { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"
import DynamicTextArea from "react-textarea-autosize"
-import { useClickAway, useWindowSize } from "react-use"
+import { useClickAway, useEvent, useWindowSize } from "react-use"
import styled from "styled-components"
import { mentionRegex, mentionRegexGlobal } from "../../../../src/shared/context-mentions"
+import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage"
import { useExtensionState } from "../../context/ExtensionStateContext"
import {
ContextMenuOptionType,
@@ -12,16 +13,16 @@ import {
removeMention,
shouldShowContextMenu,
} from "../../utils/context-mentions"
+import { useMetaKeyDetection, useShortcut } from "../../utils/hooks"
import { validateApiConfiguration, validateModelId } from "../../utils/validate"
import { vscode } from "../../utils/vscode"
import { CODE_BLOCK_BG_COLOR } from "../common/CodeBlock"
import Thumbnails from "../common/Thumbnails"
+import Tooltip from "../common/Tooltip"
import ApiOptions, { normalizeApiConfiguration } from "../settings/ApiOptions"
import { MAX_IMAGES_PER_MESSAGE } from "./ChatView"
import ContextMenu from "./ContextMenu"
-import { useShortcut } from "../../utils/hooks"
-import Tooltip from "../common/Tooltip"
-import { useMetaKeyDetection } from "../../utils/hooks"
+import { ChatSettings } from "../../../../src/shared/ChatSettings"
interface ChatTextAreaProps {
inputValue: string
@@ -215,6 +216,8 @@ const ChatTextArea = forwardRef(
) => {
const { filePaths, chatSettings, apiConfiguration, openRouterModels, platform } = useExtensionState()
const [isTextAreaFocused, setIsTextAreaFocused] = useState(false)
+ const [gitCommits, setGitCommits] = useState([])
+
const [thumbnailsHeight, setThumbnailsHeight] = useState(0)
const [textAreaBaseHeight, setTextAreaBaseHeight] = useState(undefined)
const [showContextMenu, setShowContextMenu] = useState(false)
@@ -234,15 +237,47 @@ const ChatTextArea = forwardRef(
const buttonRef = useRef(null)
const [arrowPosition, setArrowPosition] = useState(0)
const [menuPosition, setMenuPosition] = useState(0)
+ const [shownTooltipMode, setShownTooltipMode] = useState(null)
const [, metaKeyChar] = useMetaKeyDetection(platform)
// Add a ref to track previous menu state
const prevShowModelSelector = useRef(showModelSelector)
+ // Fetch git commits when Git is selected or when typing a hash
+ useEffect(() => {
+ if (selectedType === ContextMenuOptionType.Git || /^[a-f0-9]+$/i.test(searchQuery)) {
+ vscode.postMessage({
+ type: "searchCommits",
+ text: searchQuery || "",
+ })
+ }
+ }, [selectedType, searchQuery])
+
+ const handleMessage = useCallback((event: MessageEvent) => {
+ const message: ExtensionMessage = event.data
+ switch (message.type) {
+ case "commitSearchResults": {
+ const commits =
+ message.commits?.map((commit: any) => ({
+ type: ContextMenuOptionType.Git,
+ value: commit.hash,
+ label: commit.subject,
+ description: `${commit.shortHash} by ${commit.author} on ${commit.date}`,
+ })) || []
+ setGitCommits(commits)
+ break
+ }
+ }
+ }, [])
+
+ useEvent("message", handleMessage)
+
const queryItems = useMemo(() => {
return [
{ type: ContextMenuOptionType.Problems, value: "problems" },
+ { type: ContextMenuOptionType.Terminal, value: "terminal" },
+ ...gitCommits,
...filePaths
.map((file) => "/" + file)
.map((path) => ({
@@ -250,7 +285,7 @@ const ChatTextArea = forwardRef(
value: path,
})),
]
- }, [filePaths])
+ }, [filePaths, gitCommits])
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
@@ -274,7 +309,11 @@ const ChatTextArea = forwardRef(
return
}
- if (type === ContextMenuOptionType.File || type === ContextMenuOptionType.Folder) {
+ if (
+ type === ContextMenuOptionType.File ||
+ type === ContextMenuOptionType.Folder ||
+ type === ContextMenuOptionType.Git
+ ) {
if (!value) {
setSelectedType(type)
setSearchQuery("")
@@ -293,6 +332,10 @@ const ChatTextArea = forwardRef(
insertValue = value || ""
} else if (type === ContextMenuOptionType.Problems) {
insertValue = "problems"
+ } else if (type === ContextMenuOptionType.Terminal) {
+ insertValue = "terminal"
+ } else if (type === ContextMenuOptionType.Git) {
+ insertValue = value || ""
}
const { newValue, mentionIndex } = insertMention(textAreaRef.current.value, cursorPosition, insertValue)
@@ -612,17 +655,21 @@ const ChatTextArea = forwardRef(
setTimeout(() => {
const newMode = chatSettings.mode === "plan" ? "act" : "plan"
vscode.postMessage({
- type: "chatSettings",
+ type: "togglePlanActMode",
chatSettings: {
mode: newMode,
},
+ chatContent: {
+ message: inputValue.trim() ? inputValue : undefined,
+ images: selectedImages.length > 0 ? selectedImages : undefined,
+ },
})
// Focus the textarea after mode toggle with slight delay
setTimeout(() => {
textAreaRef.current?.focus()
}, 100)
}, changeModeDelay)
- }, [chatSettings.mode, showModelSelector, submitApiConfig])
+ }, [chatSettings.mode, showModelSelector, submitApiConfig, inputValue, selectedImages])
useShortcut("Meta+Shift+a", onModeToggle, { disableTextInputs: false }) // important that we don't disable the text input here
@@ -892,7 +939,7 @@ const ChatTextArea = forwardRef(
borderTop: 0,
borderColor: "transparent",
borderBottom: `${thumbnailsHeight + 6}px solid transparent`,
- padding: "9px 49px 3px 9px",
+ padding: "9px 28px 3px 9px",
}}
/>
(
- Plan
- Act
+ setShownTooltipMode("plan")}
+ onMouseLeave={() => setShownTooltipMode(null)}>
+ Plan
+
+ setShownTooltipMode("act")}
+ onMouseLeave={() => setShownTooltipMode(null)}>
+ Act
+
diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx
index cad6e84aff..8b4290cd2a 100644
--- a/webview-ui/src/components/chat/ChatView.tsx
+++ b/webview-ui/src/components/chat/ChatView.tsx
@@ -324,67 +324,99 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
/*
This logic depends on the useEffect[messages] above to set clineAsk, after which buttons are shown and we then send an askResponse to the extension.
*/
- const handlePrimaryButtonClick = useCallback(() => {
- switch (clineAsk) {
- case "api_req_failed":
- case "command":
- case "command_output":
- case "tool":
- case "browser_action_launch":
- case "use_mcp_server":
- case "resume_task":
- case "mistake_limit_reached":
- case "auto_approval_max_req_reached":
- vscode.postMessage({
- type: "askResponse",
- askResponse: "yesButtonClicked",
- })
- break
- case "completion_result":
- case "resume_completed_task":
- // extension waiting for feedback. but we can just present a new task button
- startNewTask()
- break
- }
- setTextAreaDisabled(true)
- setClineAsk(undefined)
- setEnableButtons(false)
- // setPrimaryButtonText(undefined)
- // setSecondaryButtonText(undefined)
- disableAutoScrollRef.current = false
- }, [clineAsk, startNewTask])
+ const handlePrimaryButtonClick = useCallback(
+ (text?: string, images?: string[]) => {
+ const trimmedInput = text?.trim()
+ switch (clineAsk) {
+ case "api_req_failed":
+ case "command":
+ case "command_output":
+ case "tool":
+ case "browser_action_launch":
+ case "use_mcp_server":
+ case "resume_task":
+ case "mistake_limit_reached":
+ case "auto_approval_max_req_reached":
+ if (trimmedInput || (images && images.length > 0)) {
+ vscode.postMessage({
+ type: "askResponse",
+ askResponse: "yesButtonClicked",
+ text: trimmedInput,
+ images: images,
+ })
+ } else {
+ vscode.postMessage({
+ type: "askResponse",
+ askResponse: "yesButtonClicked",
+ })
+ }
+ // Clear input state after sending
+ setInputValue("")
+ setSelectedImages([])
+ break
+ case "completion_result":
+ case "resume_completed_task":
+ // extension waiting for feedback. but we can just present a new task button
+ startNewTask()
+ break
+ }
+ setTextAreaDisabled(true)
+ setClineAsk(undefined)
+ setEnableButtons(false)
+ // setPrimaryButtonText(undefined)
+ // setSecondaryButtonText(undefined)
+ disableAutoScrollRef.current = false
+ },
+ [clineAsk, startNewTask],
+ )
- const handleSecondaryButtonClick = useCallback(() => {
- if (isStreaming) {
- vscode.postMessage({ type: "cancelTask" })
- setDidClickCancel(true)
- return
- }
+ const handleSecondaryButtonClick = useCallback(
+ (text?: string, images?: string[]) => {
+ const trimmedInput = text?.trim()
+ if (isStreaming) {
+ vscode.postMessage({ type: "cancelTask" })
+ setDidClickCancel(true)
+ return
+ }
- switch (clineAsk) {
- case "api_req_failed":
- case "mistake_limit_reached":
- case "auto_approval_max_req_reached":
- startNewTask()
- break
- case "command":
- case "tool":
- case "browser_action_launch":
- case "use_mcp_server":
- // responds to the API with a "This operation failed" and lets it try again
- vscode.postMessage({
- type: "askResponse",
- askResponse: "noButtonClicked",
- })
- break
- }
- setTextAreaDisabled(true)
- setClineAsk(undefined)
- setEnableButtons(false)
- // setPrimaryButtonText(undefined)
- // setSecondaryButtonText(undefined)
- disableAutoScrollRef.current = false
- }, [clineAsk, startNewTask, isStreaming])
+ switch (clineAsk) {
+ case "api_req_failed":
+ case "mistake_limit_reached":
+ case "auto_approval_max_req_reached":
+ startNewTask()
+ break
+ case "command":
+ case "tool":
+ case "browser_action_launch":
+ case "use_mcp_server":
+ if (trimmedInput || (images && images.length > 0)) {
+ vscode.postMessage({
+ type: "askResponse",
+ askResponse: "noButtonClicked",
+ text: trimmedInput,
+ images: images,
+ })
+ } else {
+ // responds to the API with a "This operation failed" and lets it try again
+ vscode.postMessage({
+ type: "askResponse",
+ askResponse: "noButtonClicked",
+ })
+ }
+ // Clear input state after sending
+ setInputValue("")
+ setSelectedImages([])
+ break
+ }
+ setTextAreaDisabled(true)
+ setClineAsk(undefined)
+ setEnableButtons(false)
+ // setPrimaryButtonText(undefined)
+ // setSecondaryButtonText(undefined)
+ disableAutoScrollRef.current = false
+ },
+ [clineAsk, startNewTask, isStreaming],
+ )
const handleTaskCloseButtonClick = useCallback(() => {
startNewTask()
@@ -426,10 +458,10 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
handleSendMessage(message.text ?? "", message.images ?? [])
break
case "primaryButtonClick":
- handlePrimaryButtonClick()
+ handlePrimaryButtonClick(message.text ?? "", message.images ?? [])
break
case "secondaryButtonClick":
- handleSecondaryButtonClick()
+ handleSecondaryButtonClick(message.text ?? "", message.images ?? [])
break
}
}
@@ -869,7 +901,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
flex: secondaryButtonText ? 1 : 2,
marginRight: secondaryButtonText ? "6px" : "0",
}}
- onClick={handlePrimaryButtonClick}>
+ onClick={() => handlePrimaryButtonClick(inputValue, selectedImages)}>
{primaryButtonText}
)}
@@ -881,7 +913,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
flex: isStreaming ? 2 : 1,
marginLeft: isStreaming ? 0 : "6px",
}}
- onClick={handleSecondaryButtonClick}>
+ onClick={() => handleSecondaryButtonClick(inputValue, selectedImages)}>
{isStreaming ? "Cancel" : secondaryButtonText}
)}
diff --git a/webview-ui/src/components/chat/ContextMenu.tsx b/webview-ui/src/components/chat/ContextMenu.tsx
index 25a7c0902f..ba6b384901 100644
--- a/webview-ui/src/components/chat/ContextMenu.tsx
+++ b/webview-ui/src/components/chat/ContextMenu.tsx
@@ -48,10 +48,33 @@ const ContextMenu: React.FC = ({
switch (option.type) {
case ContextMenuOptionType.Problems:
return Problems
+ case ContextMenuOptionType.Terminal:
+ return Terminal
case ContextMenuOptionType.URL:
return Paste URL to fetch contents
case ContextMenuOptionType.NoResults:
return No results found
+ case ContextMenuOptionType.Git:
+ if (option.value) {
+ return (
+