diff --git a/.gitignore b/.gitignore index 02fdf8f88e5..de0a6152632 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ docs/_site/ #Logging logs +.aider* +.env +# aider +.aider* diff --git a/.husky/pre-commit b/.husky/pre-commit index 111a1c0f915..7abf8c85034 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,8 +1,8 @@ branch="$(git rev-parse --abbrev-ref HEAD)" -if [ "$branch" = "main" ]; then - echo "You can't commit directly to main - please check out a branch." - exit 1 -fi +# if [ "$branch" = "main" ]; then +# echo "You can't commit directly to main - please check out a branch." +# exit 1 +# fi npx lint-staged diff --git a/.husky/pre-push b/.husky/pre-push index a4fea4a34ae..773cedb6c02 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,9 +1,9 @@ branch="$(git rev-parse --abbrev-ref HEAD)" -if [ "$branch" = "main" ]; then - echo "You can't push directly to main - please check out a branch." - exit 1 -fi +# if [ "$branch" = "main" ]; then +# echo "You can't push directly to main - please check out a branch." +# exit 1 +# fi npm run compile diff --git a/README.md b/README.md index 4d294faae03..2fdaf2ab990 100644 --- a/README.md +++ b/README.md @@ -1,148 +1,31 @@ -
- - -English • [Català](locales/ca/README.md) • [Deutsch](locales/de/README.md) • [Español](locales/es/README.md) • [Français](locales/fr/README.md) • [हिन्दी](locales/hi/README.md) • [Italiano](locales/it/README.md) - - - - -[日本語](locales/ja/README.md) • [한국어](locales/ko/README.md) • [Polski](locales/pl/README.md) • [Português (BR)](locales/pt-BR/README.md) • [Türkçe](locales/tr/README.md) • [Tiếng Việt](locales/vi/README.md) • [简体中文](locales/zh-CN/README.md) • [繁體中文](locales/zh-TW/README.md) - - -
-
- -
-

Join the Roo Code Community

-

Connect with developers, contribute ideas, and stay ahead with the latest AI-powered coding tools.

- - Join Discord - Join Reddit - -
-
-
- -
-

Roo Code (prev. Roo Cline)

- -Download on VS Marketplace -Feature Requests -Rate & Review -Documentation - -
- -**Roo Code** is an AI-powered **autonomous coding agent** that lives in your editor. It can: - -- Communicate in natural language -- Read and write files directly in your workspace -- Run terminal commands -- Automate browser actions -- Integrate with any OpenAI-compatible or custom API/model -- Adapt its “personality” and capabilities through **Custom Modes** - -Whether you’re seeking a flexible coding partner, a system architect, or specialized roles like a QA engineer or product manager, Roo Code can help you build software more efficiently. - -Check out the [CHANGELOG](CHANGELOG.md) for detailed updates and fixes. - ---- - -## 🎉 Roo Code 3.10 Released - -Roo Code 3.10 brings powerful productivity enhancements! - -- Suggested responses to questions to save you time typing -- Improved large file handling through mapping out the file structure and reading only the relevant content -- Rebuilt @-mention file lookup that respects .gitignore and doesn't have a limit on the number of files tracked - ---- - -## What Can Roo Code Do? - -- 🚀 **Generate Code** from natural language descriptions -- 🔧 **Refactor & Debug** existing code -- 📝 **Write & Update** documentation -- 🤔 **Answer Questions** about your codebase -- 🔄 **Automate** repetitive tasks -- 🏗️ **Create** new files and projects - -## Quick Start - -1. [Install Roo Code](https://docs.roocode.com/getting-started/installing) -2. [Connect Your AI Provider](https://docs.roocode.com/getting-started/connecting-api-provider) -3. [Try Your First Task](https://docs.roocode.com/getting-started/your-first-task) - -## Key Features - -### Multiple Modes - -Roo Code adapts to your needs with specialized [modes](https://docs.roocode.com/basic-usage/modes): - -- **Code Mode:** For general-purpose coding tasks -- **Architect Mode:** For planning and technical leadership -- **Ask Mode:** For answering questions and providing information -- **Debug Mode:** For systematic problem diagnosis -- **[Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes):** Create unlimited specialized personas for security auditing, performance optimization, documentation, or any other task - -### Smart Tools - -Roo Code comes with powerful [tools](https://docs.roocode.com/basic-usage/using-tools) that can: - -- Read and write files in your project -- Execute commands in your VS Code terminal -- Control a web browser -- Use external tools via [MCP (Model Context Protocol)](https://docs.roocode.com/advanced-usage/mcp) - -MCP extends Roo Code's capabilities by allowing you to add unlimited custom tools. Integrate with external APIs, connect to databases, or create specialized development tools - MCP provides the framework to expand Roo Code's functionality to meet your specific needs. - -### Customization - -Make Roo Code work your way with: - -- [Custom Instructions](https://docs.roocode.com/advanced-usage/custom-instructions) for personalized behavior -- [Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes) for specialized tasks -- [Local Models](https://docs.roocode.com/advanced-usage/local-models) for offline use -- [Auto-Approval Settings](https://docs.roocode.com/advanced-usage/auto-approving-actions) for faster workflows - -## Resources - -### Documentation - -- [Basic Usage Guide](https://docs.roocode.com/basic-usage/the-chat-interface) -- [Advanced Features](https://docs.roocode.com/advanced-usage/auto-approving-actions) -- [Frequently Asked Questions](https://docs.roocode.com/faq) - -### Community - -- **Discord:** [Join our Discord server](https://discord.gg/roocode) for real-time help and discussions -- **Reddit:** [Visit our subreddit](https://www.reddit.com/r/RooCode) to share experiences and tips -- **GitHub:** Report [issues](https://github.com/RooVetGit/Roo-Code/issues) or request [features](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) - ---- +# PearAI's Integration of Roo Code / Cline, a coding agent. Name attribution will always be kept in tact. ## Local Setup & Development 1. **Clone** the repo: - -```sh -git clone https://github.com/RooVetGit/Roo-Code.git -``` - -2. **Install dependencies**: - -```sh -npm run install:all -``` - -3. **Start the webview (Vite/React app with HMR)**: - -```sh -npm run dev -``` - -4. **Debug**: - Press `F5` (or **Run** → **Start Debugging**) in VSCode to open a new session with Roo Code loaded. + ```bash + git clone https://github.com/RooVetGit/Roo-Code.git + ``` +2. **Download esbuild problem matchers** + Install https://market.trypear.ai/items?itemName=connor4312.esbuild-problem-matchers +3. **Install dependencies**: + ```bash + npm run install:all + ``` +4. **Build** the extension: + + ```bash + npm run build + ``` + + - A `.vsix` file will appear in the `bin/` directory. + +5. **Start the webview (Vite/React app with HMR)**: + ```bash + npm run dev + ``` +6. **Debug**: + - Press `F5` (or **Run** → **Start Debugging**) in VSCode to open a new session with Roo Code loaded. Changes to the webview will appear immediately. Changes to the core extension will require a restart of the extension host. @@ -160,50 +43,14 @@ code --install-extension bin/roo-cline-.vsix We use [changesets](https://github.com/changesets/changesets) for versioning and publishing. Check our `CHANGELOG.md` for release notes. ---- - -## Disclaimer - -**Please note** that Roo Veterinary, Inc does **not** make any representations or warranties regarding any code, models, or other tools provided or made available in connection with Roo Code, any associated third-party tools, or any resulting outputs. You assume **all risks** associated with the use of any such tools or outputs; such tools are provided on an **"AS IS"** and **"AS AVAILABLE"** basis. Such risks may include, without limitation, intellectual property infringement, cyber vulnerabilities or attacks, bias, inaccuracies, errors, defects, viruses, downtime, property loss or damage, and/or personal injury. You are solely responsible for your use of any such tools or outputs (including, without limitation, the legality, appropriateness, and results thereof). - ---- - -## Contributing - -We love community contributions! Get started by reading our [CONTRIBUTING.md](CONTRIBUTING.md). - ---- - -## Contributors - -Thanks to all our contributors who have helped make Roo Code better! - - - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| -| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| -| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| -| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| -| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| -| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| -| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| -| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| -| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| -| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| -| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| -| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| -| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| -| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | +**Install** the `.vsix` manually if desired: +`bash + code --install-extension bin/roo-code-4.0.0.vsix + ` +| ## License [Apache 2.0 © 2025 Roo Veterinary, Inc.](./LICENSE) - ---- - -**Enjoy Roo Code!** Whether you keep it on a short leash or let it roam autonomously, we can’t wait to see what you build. If you have questions or feature ideas, drop by our [Reddit community](https://www.reddit.com/r/RooCode/) or [Discord](https://discord.gg/roocode). Happy coding! diff --git a/assets/icons/pear.png b/assets/icons/pear.png new file mode 100644 index 00000000000..cf77c989d36 Binary files /dev/null and b/assets/icons/pear.png differ diff --git a/assets/icons/pearai-agent-splash.svg b/assets/icons/pearai-agent-splash.svg new file mode 100644 index 00000000000..656e62a9589 --- /dev/null +++ b/assets/icons/pearai-agent-splash.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/locales/ca/README.md b/locales/ca/README.md index 133bd1d7601..2cde98ebe34 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -178,23 +178,25 @@ Ens encanten les contribucions de la comunitat! Comenceu llegint el nostre [CONT Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index f519c508d01..987b0f382d9 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -178,23 +178,25 @@ Wir lieben Community-Beiträge! Beginnen Sie mit dem Lesen unserer [CONTRIBUTING Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 4dc42be6fb5..4f264014831 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -178,23 +178,25 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p ¡Gracias a todos nuestros colaboradores que han ayudado a mejorar Roo Code! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 505ae5692e2..b3072596f66 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -178,23 +178,25 @@ Nous adorons les contributions de la communauté ! Commencez par lire notre [CON Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index a8f0f07a4fe..e0b6b36bc72 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -178,23 +178,25 @@ code --install-extension bin/roo-cline-.vsix Roo Code को बेहतर बनाने में मदद करने वाले हमारे सभी योगदानकर्ताओं को धन्यवाद! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index dce5ca0362c..679e5f96892 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -178,23 +178,25 @@ Amiamo i contributi della community! Inizia leggendo il nostro [CONTRIBUTING.md] Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 58d8a5c8313..44e05874c3d 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -178,23 +178,25 @@ code --install-extension bin/roo-cline-.vsix Roo Codeの改善に貢献してくれたすべての貢献者に感謝します! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 3905a68f78a..f9fc879f9cd 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -178,23 +178,25 @@ code --install-extension bin/roo-cline-.vsix Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사드립니다! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index a709fd90c3b..297c690f379 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -178,23 +178,25 @@ Kochamy wkład społeczności! Zacznij od przeczytania naszego [CONTRIBUTING.md] Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index d2f51447af0..e3708eabfb2 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -178,23 +178,25 @@ Adoramos contribuições da comunidade! Comece lendo nosso [CONTRIBUTING.md](CON Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melhor! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index e3beed92e05..5904450c7a0 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -178,23 +178,25 @@ Topluluk katkılarını seviyoruz! [CONTRIBUTING.md](CONTRIBUTING.md) dosyasın Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara teşekkür ederiz! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 3a23b9f85ab..c929c5f4753 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -178,23 +178,25 @@ Chúng tôi rất hoan nghênh đóng góp từ cộng đồng! Bắt đầu b Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo Code! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 017a44e98f1..f1e2e3a668b 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -178,23 +178,25 @@ code --install-extension bin/roo-cline-.vsix 感谢所有帮助改进 Roo Code 的贡献者! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index bf038798984..cd3c24fcf90 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -178,23 +178,25 @@ code --install-extension bin/roo-cline-.vsix 感謝所有幫助改進 Roo Code 的貢獻者! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| -|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| -|vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| -|napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| -|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| -|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| -|dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| -|eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | + ## 許可證 diff --git a/package-lock.json b/package-lock.json index 73153ad7d70..6b0efd9f23a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "roo-cline", + "name": "pearai-roo-cline", "version": "3.10.2", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "roo-cline", + "name": "pearai-roo-cline", "version": "3.10.2", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", @@ -50,6 +50,7 @@ "pretty-bytes": "^6.1.1", "puppeteer-chromium-resolver": "^23.0.0", "puppeteer-core": "^23.4.0", + "react-tooltip": "^5.28.0", "reconnecting-eventsource": "^1.6.4", "say": "^0.16.0", "serialize-error": "^11.0.3", @@ -3269,6 +3270,31 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, "node_modules/@google-cloud/vertexai": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@google-cloud/vertexai/-/vertexai-1.9.3.tgz", @@ -7316,6 +7342,12 @@ "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "dev": true }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -13732,12 +13764,49 @@ "node": ">= 0.8" } }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/react-tooltip": { + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.28.0.tgz", + "integrity": "sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.1", + "classnames": "^2.3.0" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -14198,6 +14267,13 @@ "node": ">=6.9" } }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT", + "peer": true + }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", diff --git a/package.json b/package.json index a67a5954bcd..5591e198123 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { - "name": "roo-cline", - "displayName": "Roo Code (prev. Roo Cline)", - "description": "A whole dev team of AI agents in your editor.", - "publisher": "RooVeterinaryInc", + "name": "pearai-roo-cline", + "displayName": "PearAI Roo Code / Cline", + "description": "PearAI's integration of Roo Code / Cline, a coding agent.", + "publisher": "PearAI", + "icon": "assets/icons/pear.png", "version": "3.10.2", - "icon": "assets/icons/rocket.png", "galleryBanner": { "color": "#617A91", "theme": "dark" @@ -14,7 +14,7 @@ "node": ">=20.18.1" }, "author": { - "name": "Roo Vet" + "name": "PearAI" }, "repository": { "type": "git", @@ -54,7 +54,7 @@ "submenus": [ { "id": "roo-code.contextMenu", - "label": "Roo Code" + "label": "PearAI Agent (Roo Code)" }, { "id": "roo-code.terminalMenu", @@ -62,19 +62,19 @@ } ], "viewsContainers": { - "activitybar": [ + "auxiliarybar": [ { - "id": "roo-cline-ActivityBar", - "title": "Roo Code", - "icon": "$(rocket)" + "id": "pearai-roo-cline", + "title": "PearAI Agent", + "icon": "assets/icons/pear.png" } ] }, "views": { - "roo-cline-ActivityBar": [ + "pearai-roo-cline": [ { "type": "webview", - "id": "roo-cline.SidebarProvider", + "id": "pearai-roo-cline.SidebarProvider", "name": "" } ] @@ -122,22 +122,22 @@ }, { "command": "roo-cline.explainCode", - "title": "Explain Code", + "title": "PearAI Agent (Roo Code): Explain Code", "category": "Roo Code" }, { "command": "roo-cline.fixCode", - "title": "Fix Code", + "title": "PearAI Agent (Roo Code): Fix Code", "category": "Roo Code" }, { "command": "roo-cline.improveCode", - "title": "Improve Code", + "title": "PearAI Agent (Roo Code): Improve Code", "category": "Roo Code" }, { "command": "roo-cline.addToContext", - "title": "Add To Context", + "title": "PearAI Agent (Roo Code): Add To Context", "category": "Roo Code" }, { @@ -164,13 +164,25 @@ "command": "roo-cline.terminalExplainCommandInCurrentTask", "title": "Explain This Command (Current Task)", "category": "Terminal" + }, + { + "command": "roo-cline.focus", + "title": "Roo Code: Bring To Focus", + "category": "Roo Code" + } + ], + "keybindings": [ + { + "command": "roo-cline.addToContext", + "mac": "cmd+l", + "key": "ctrl+l" } ], "menus": { "editor/context": [ { "submenu": "roo-code.contextMenu", - "group": "navigation" + "group": "0_acontinue" } ], "roo-code.contextMenu": [ @@ -223,37 +235,37 @@ { "command": "roo-cline.plusButtonClicked", "group": "navigation@1", - "when": "view == roo-cline.SidebarProvider" + "when": "view == pearai-roo-cline.SidebarProvider" }, { "command": "roo-cline.promptsButtonClicked", "group": "navigation@2", - "when": "view == roo-cline.SidebarProvider" + "when": "view == pearai-roo-cline.SidebarProvider" }, { "command": "roo-cline.mcpButtonClicked", "group": "navigation@3", - "when": "view == roo-cline.SidebarProvider" + "when": "view == pearai-roo-cline.SidebarProvider" }, { "command": "roo-cline.historyButtonClicked", "group": "navigation@4", - "when": "view == roo-cline.SidebarProvider" + "when": "view == pearai-roo-cline.SidebarProvider" }, { "command": "roo-cline.popoutButtonClicked", "group": "navigation@5", - "when": "view == roo-cline.SidebarProvider" + "when": "view == pearai-roo-cline.SidebarProvider" }, { "command": "roo-cline.settingsButtonClicked", "group": "navigation@6", - "when": "view == roo-cline.SidebarProvider" + "when": "view == pearai-roo-cline.SidebarProvider" }, { "command": "roo-cline.helpButtonClicked", "group": "navigation@7", - "when": "view == roo-cline.SidebarProvider" + "when": "view == pearai-roo-cline.SidebarProvider" } ] }, @@ -381,6 +393,7 @@ "pretty-bytes": "^6.1.1", "puppeteer-chromium-resolver": "^23.0.0", "puppeteer-core": "^23.4.0", + "react-tooltip": "^5.28.0", "reconnecting-eventsource": "^1.6.4", "say": "^0.16.0", "serialize-error": "^11.0.3", diff --git a/src/api/index.ts b/src/api/index.ts index 0880f422182..93284ace184 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -19,6 +19,7 @@ import { VsCodeLmHandler } from "./providers/vscode-lm" import { ApiStream } from "./transform/stream" import { UnboundHandler } from "./providers/unbound" import { RequestyHandler } from "./providers/requesty" +import { PearAiHandler } from "./providers/pearai" import { HumanRelayHandler } from "./providers/human-relay" import { FakeAIHandler } from "./providers/fake-ai" @@ -74,6 +75,8 @@ export function buildApiHandler(configuration: ApiConfiguration): ApiHandler { return new UnboundHandler(options) case "requesty": return new RequestyHandler(options) + case "pearai": + return new PearAiHandler(options) case "human-relay": return new HumanRelayHandler(options) case "fake-ai": diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index 681ef2fc77c..60dd9303836 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -100,6 +100,7 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa betas.push("prompt-caching-2024-07-31") return { headers: { "anthropic-beta": betas.join(",") }, + authorization: `Bearer ${this.options.apiKey}`, } default: return undefined @@ -171,6 +172,27 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa yield { type: "text", text: chunk.content_block.text } break + default: { + const block = chunk.content_block as { + type: string + text?: string + metadata?: { ui_only?: boolean; content?: string } + } + + if (block.type === "ui") { + yield { + type: "text", + text: block.text || "", + metadata: block.metadata, + } + } else { + yield { + type: "text", + text: block.text || "", + } + } + break + } } break case "content_block_delta": diff --git a/src/api/providers/pearai.ts b/src/api/providers/pearai.ts new file mode 100644 index 00000000000..a5c4180e9f1 --- /dev/null +++ b/src/api/providers/pearai.ts @@ -0,0 +1,171 @@ +import * as vscode from "vscode" +import { ApiHandlerOptions, PEARAI_URL, ModelInfo } from "../../shared/api" +import { AnthropicHandler } from "./anthropic" +import { DeepSeekHandler } from "./deepseek" +import Anthropic from "@anthropic-ai/sdk" +import { BaseProvider } from "./base-provider" +import { SingleCompletionHandler } from "../" +import { OpenRouterHandler } from "./openrouter" + +interface PearAiModelsResponse { + models: { + [key: string]: { + underlyingModel?: string + [key: string]: any + } + } + defaultModelId: string +} + +export class PearAiHandler extends BaseProvider implements SingleCompletionHandler { + private handler!: AnthropicHandler | DeepSeekHandler | OpenRouterHandler + + constructor(options: ApiHandlerOptions) { + super() + if (!options.pearaiApiKey) { + vscode.window.showErrorMessage("PearAI API key not found.", "Login to PearAI").then(async (selection) => { + if (selection === "Login to PearAI") { + const extensionUrl = `${vscode.env.uriScheme}://pearai.pearai/auth` + const callbackUri = await vscode.env.asExternalUri(vscode.Uri.parse(extensionUrl)) + vscode.env.openExternal( + await vscode.env.asExternalUri( + vscode.Uri.parse(`https://trypear.ai/signin?callback=${callbackUri.toString()}`), + ), + ) + } + }) + throw new Error("PearAI API key not found. Please login to PearAI.") + } + + // // Initialize with a default handler synchronously + // this.handler = new AnthropicHandler({ + // ...options, + // apiKey: options.pearaiApiKey, + // anthropicBaseUrl: PEARAI_URL, + // apiModelId: "claude-3-5-sonnet-20241022", + // }) + + this.handler = new OpenRouterHandler({ + ...options, + openRouterBaseUrl: PEARAI_URL, + openRouterApiKey: options.pearaiApiKey, + openRouterModelId: "deepseek/deepseek-chat-v3-0324", + }) + + // Then try to initialize the correct handler asynchronously + this.initializeHandler(options).catch((error) => { + console.error("Failed to initialize PearAI handler:", error) + }) + } + + private async initializeHandler(options: ApiHandlerOptions): Promise { + const modelId = options.apiModelId || "pearai-model" + + if (modelId === "pearai-model") { + try { + const response = await fetch(`${PEARAI_URL}/getPearAIAgentModels`) + if (!response.ok) { + throw new Error(`Failed to fetch models: ${response.statusText}`) + } + const data = (await response.json()) as PearAiModelsResponse + const underlyingModel = data.models[modelId]?.underlyingModel || "claude-3-5-sonnet-20241022" + console.dir(underlyingModel) + if (underlyingModel.startsWith("deepseek")) { + this.handler = new DeepSeekHandler({ + ...options, + deepSeekApiKey: options.pearaiApiKey, + deepSeekBaseUrl: PEARAI_URL, + apiModelId: underlyingModel, + }) + } else { + // Default to Claude + this.handler = new AnthropicHandler({ + ...options, + apiKey: options.pearaiApiKey, + anthropicBaseUrl: PEARAI_URL, + apiModelId: underlyingModel, + }) + } + } catch (error) { + console.error("Error fetching PearAI models:", error) + // Default to Claude if there's an error + this.handler = new AnthropicHandler({ + ...options, + apiKey: options.pearaiApiKey, + anthropicBaseUrl: PEARAI_URL, + apiModelId: "claude-3-5-sonnet-20241022", + }) + } + } else if (modelId.startsWith("claude")) { + this.handler = new AnthropicHandler({ + ...options, + apiKey: options.pearaiApiKey, + anthropicBaseUrl: PEARAI_URL, + }) + } else if (modelId.startsWith("deepseek")) { + // this.handler = new DeepSeekHandler({ + // ...options, + // deepSeekApiKey: options.pearaiApiKey, + // deepSeekBaseUrl: PEARAI_URL, + // }) + this.handler = new OpenRouterHandler({ + ...options, + openRouterBaseUrl: PEARAI_URL, + openRouterApiKey: options.pearaiApiKey, + openRouterModelId: modelId, + }) + } else { + throw new Error(`Unsupported model: ${modelId}`) + } + } + + getModel(): { id: string; info: ModelInfo } { + console.dir(this.handler) + const baseModel = this.handler.getModel() + return { + id: baseModel.id, + info: { + ...baseModel.info, + // Inherit all capabilities from the underlying model + supportsImages: baseModel.info.supportsImages, + supportsComputerUse: baseModel.info.supportsComputerUse, + supportsPromptCache: baseModel.info.supportsPromptCache, + // Apply PearAI's price markup + inputPrice: (baseModel.info.inputPrice || 0) * 1.03, + outputPrice: (baseModel.info.outputPrice || 0) * 1.03, + cacheWritesPrice: baseModel.info.cacheWritesPrice ? baseModel.info.cacheWritesPrice * 1.03 : undefined, + cacheReadsPrice: baseModel.info.cacheReadsPrice ? baseModel.info.cacheReadsPrice * 1.03 : undefined, + }, + } + } + + async *createMessage(systemPrompt: string, messages: any[]): AsyncGenerator { + const generator = this.handler.createMessage(systemPrompt, messages) + let warningMsg = "" + + for await (const chunk of generator) { + console.dir(chunk) + if (chunk.type === "text" && chunk.metadata?.ui_only) { + warningMsg += chunk.metadata?.content + continue + } + yield chunk + } + + if (warningMsg) { + if (warningMsg.includes("pay-as-you-go")) { + vscode.window.showInformationMessage(warningMsg, "View Pay-As-You-Go").then((selection) => { + if (selection === "View Pay-As-You-Go") { + vscode.env.openExternal(vscode.Uri.parse("https://trypear.ai/pay-as-you-go")) + } + }) + } else { + vscode.window.showInformationMessage(warningMsg) + } + } + } + + async completePrompt(prompt: string): Promise { + return this.handler.completePrompt(prompt) + } +} diff --git a/src/api/transform/stream.ts b/src/api/transform/stream.ts index 97751edd90d..a0f27bb32c6 100644 --- a/src/api/transform/stream.ts +++ b/src/api/transform/stream.ts @@ -4,6 +4,10 @@ export type ApiStreamChunk = ApiStreamTextChunk | ApiStreamUsageChunk | ApiStrea export interface ApiStreamTextChunk { type: "text" text: string + metadata?: { + ui_only?: boolean + content?: string + } } export interface ApiStreamReasoningChunk { diff --git a/src/core/Cline.ts b/src/core/Cline.ts index b7bfc021183..21ad1ae0a85 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -582,7 +582,7 @@ export class Cline extends EventEmitter { async sayAndCreateMissingParamError(toolName: ToolUseName, paramName: string, relPath?: string) { await this.say( "error", - `Roo tried to use ${toolName}${ + `Agent tried to use ${toolName}${ relPath ? ` for '${relPath.toPosix()}'` : "" } without value for required parameter '${paramName}'. Retrying...`, ) @@ -2750,7 +2750,7 @@ export class Cline extends EventEmitter { this.consecutiveMistakeCount++ await this.say( "error", - `Roo tried to use ${tool_name} with an invalid JSON argument. Retrying...`, + `Agent tried to use ${tool_name} with an invalid JSON argument. Retrying...`, ) pushToolResult( formatResponse.toolError( diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 1bfc98ac0b4..e6f7db94447 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -1651,7 +1651,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should exclude diff strategy tool description when diffEnabled is undefined 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -2028,7 +2028,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should explicitly handle undefined mcpHub 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -2405,7 +2405,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should handle different browser viewport sizes 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -2831,7 +2831,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should include MCP server info when mcpHub is provided 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -3331,7 +3331,7 @@ class WeatherServer { this.setupResourceHandlers(); this.setupToolHandlers(); - + // Error handling this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { @@ -3662,7 +3662,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should include browser actions when supportsComputerUse is true 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -4088,7 +4088,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should include diff strategy tool description when diffEnabled is true 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -4226,11 +4226,7 @@ Parameters: Diff format: \`\`\` -<<<<<<< SEARCH -[exact content to find including whitespace] -======= [new content to replace with] ->>>>>>> REPLACE \`\`\` Example: @@ -4527,7 +4523,7 @@ Mock generic rules" `; exports[`SYSTEM_PROMPT should maintain consistent system prompt 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -4946,7 +4942,7 @@ Mock generic rules" `; exports[`addCustomInstructions should exclude MCP server creation info when disabled 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -5485,7 +5481,7 @@ Mock generic rules" `; exports[`addCustomInstructions should generate correct prompt for architect mode 1`] = ` -"You are Roo, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution. +"You are PearAI Agent (Powered by Roo Code / Cline), an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution. ==== @@ -5938,7 +5934,7 @@ Mock generic rules" `; exports[`addCustomInstructions should generate correct prompt for ask mode 1`] = ` -"You are Roo, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics. +"You are PearAI Agent (Powered by Roo Code / Cline), a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics. ==== @@ -6289,7 +6285,7 @@ Mock generic rules" `; exports[`addCustomInstructions should include MCP server creation info when enabled 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. +"You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. ==== @@ -6874,7 +6870,7 @@ class WeatherServer { this.setupResourceHandlers(); this.setupToolHandlers(); - + // Error handling this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { @@ -7345,7 +7341,7 @@ USER'S CUSTOM INSTRUCTIONS The following additional instructions are provided by the user, and should be followed to the best of your ability without interfering with the TOOL USE guidelines. Mode-specific Instructions: - Custom mode instructions + Custom mode instructions Rules: # Rules from .clinerules-code: diff --git a/src/core/prompts/sections/modes.ts b/src/core/prompts/sections/modes.ts index 78b94ec9e76..1bb921e9542 100644 --- a/src/core/prompts/sections/modes.ts +++ b/src/core/prompts/sections/modes.ts @@ -49,7 +49,7 @@ Both files should follow this structure: { "slug": "designer", // Required: unique slug with lowercase letters, numbers, and hyphens "name": "Designer", // Required: mode display name - "roleDefinition": "You are Roo, a UI/UX expert specializing in design systems and frontend development. Your expertise includes:\\n- Creating and maintaining design systems\\n- Implementing responsive and accessible web interfaces\\n- Working with CSS, HTML, and modern frontend frameworks\\n- Ensuring consistent user experiences across platforms", // Required: non-empty + "roleDefinition": "You are PearAI Agent (Powered by Roo Code / Cline), a UI/UX expert specializing in design systems and frontend development. Your expertise includes:\\n- Creating and maintaining design systems\\n- Implementing responsive and accessible web interfaces\\n- Working with CSS, HTML, and modern frontend frameworks\\n- Ensuring consistent user experiences across platforms", // Required: non-empty "groups": [ // Required: array of tool groups (can be empty) "read", // Read files group (read_file, search_files, list_files, list_code_definition_names) "edit", // Edit files group (apply_diff, write_to_file) - allows editing any file diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index fc7d029cf82..865a336bf39 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -78,8 +78,8 @@ export type ClineProviderEvents = { } export class ClineProvider extends EventEmitter implements vscode.WebviewViewProvider { - public static readonly sideBarId = "roo-cline.SidebarProvider" // used in package.json as the view's id. This value cannot be changed due to how vscode caches views based on their id, and updating the id would break existing instances of the extension. - public static readonly tabPanelId = "roo-cline.TabPanelProvider" + public static readonly sideBarId = "pearai-roo-cline.SidebarProvider" // used in package.json as the view's id. This value cannot be changed due to how vscode caches views based on their id, and updating the id would break existing instances of the extension. + public static readonly tabPanelId = "pearai-roo-cline.TabPanelProvider" private static activeInstances: Set = new Set() private disposables: vscode.Disposable[] = [] private view?: vscode.WebviewView | vscode.WebviewPanel @@ -245,7 +245,7 @@ export class ClineProvider extends EventEmitter implements // If no visible provider, try to show the sidebar view if (!visibleProvider) { - await vscode.commands.executeCommand("roo-cline.SidebarProvider.focus") + await vscode.commands.executeCommand("pearai-roo-cline.SidebarProvider.focus") // Wait briefly for the view to become visible await delay(100) visibleProvider = ClineProvider.getVisibleInstance() @@ -612,7 +612,7 @@ export class ClineProvider extends EventEmitter implements `style-src ${webview.cspSource} 'unsafe-inline' https://* http://${localServerUrl} http://0.0.0.0:${localPort}`, `img-src ${webview.cspSource} data:`, `script-src 'unsafe-eval' https://* https://*.posthog.com http://${localServerUrl} http://0.0.0.0:${localPort} 'nonce-${nonce}'`, - `connect-src https://* https://*.posthog.com ws://${localServerUrl} ws://0.0.0.0:${localPort} http://${localServerUrl} http://0.0.0.0:${localPort}`, + `connect-src https://* https://*.posthog.com ws://${localServerUrl} ws://0.0.0.0:${localPort} http://${localServerUrl} http://0.0.0.0:${localPort} http://localhost:8000 http://0.0.0.0:8000 https://stingray-app-gb2an.ondigitalocean.app`, ] return /*html*/ ` @@ -701,7 +701,7 @@ export class ClineProvider extends EventEmitter implements - + Roo Code @@ -2020,6 +2020,19 @@ export class ClineProvider extends EventEmitter implements await this.postStateToWebview() break } + + case "openPearAiAuth": + const extensionUrl = `${vscode.env.uriScheme}://pearai.pearai/auth` + const callbackUri = await vscode.env.asExternalUri(vscode.Uri.parse(extensionUrl)) + + await vscode.env.openExternal( + await vscode.env.asExternalUri( + vscode.Uri.parse( + `https://trypear.ai/signin?callback=${callbackUri.toString()}`, // Change to localhost if running locally + ), + ), + ) + break } }, null, @@ -2485,13 +2498,13 @@ export class ClineProvider extends EventEmitter implements version: this.context.extension?.packageJSON?.version ?? "", apiConfiguration, customInstructions, - alwaysAllowReadOnly: alwaysAllowReadOnly ?? false, - alwaysAllowWrite: alwaysAllowWrite ?? false, - alwaysAllowExecute: alwaysAllowExecute ?? false, - alwaysAllowBrowser: alwaysAllowBrowser ?? false, - alwaysAllowMcp: alwaysAllowMcp ?? false, - alwaysAllowModeSwitch: alwaysAllowModeSwitch ?? false, - alwaysAllowSubtasks: alwaysAllowSubtasks ?? false, + alwaysAllowReadOnly: alwaysAllowReadOnly ?? true, + alwaysAllowWrite: alwaysAllowWrite ?? true, + alwaysAllowExecute: alwaysAllowExecute ?? true, + alwaysAllowBrowser: alwaysAllowBrowser ?? true, + alwaysAllowMcp: alwaysAllowMcp ?? true, + alwaysAllowModeSwitch: alwaysAllowModeSwitch ?? true, + alwaysAllowSubtasks: alwaysAllowSubtasks ?? true, uriScheme: vscode.env.uriScheme, currentTaskItem: this.getCurrentCline()?.taskId ? (taskHistory || []).find((item: HistoryItem) => item.id === this.getCurrentCline()?.taskId) @@ -2520,7 +2533,7 @@ export class ClineProvider extends EventEmitter implements fuzzyMatchThreshold: fuzzyMatchThreshold ?? 1.0, mcpEnabled: mcpEnabled ?? true, enableMcpServerCreation: enableMcpServerCreation ?? true, - alwaysApproveResubmit: alwaysApproveResubmit ?? false, + alwaysApproveResubmit: alwaysApproveResubmit ?? true, requestDelaySeconds: requestDelaySeconds ?? 10, rateLimitSeconds: rateLimitSeconds ?? 0, currentApiConfigName: currentApiConfigName ?? "default", @@ -2529,7 +2542,7 @@ export class ClineProvider extends EventEmitter implements customModePrompts: customModePrompts ?? {}, customSupportPrompts: customSupportPrompts ?? {}, enhancementApiConfigId, - autoApprovalEnabled: autoApprovalEnabled ?? false, + autoApprovalEnabled: autoApprovalEnabled ?? true, customModes: await this.customModesManager.getCustomModes(), experiments: experiments ?? experimentDefault, mcpServers: this.mcpHub?.getAllServers() ?? [], @@ -2655,13 +2668,13 @@ export class ClineProvider extends EventEmitter implements apiConfiguration, lastShownAnnouncementId: stateValues.lastShownAnnouncementId, customInstructions: stateValues.customInstructions, - alwaysAllowReadOnly: stateValues.alwaysAllowReadOnly ?? false, - alwaysAllowWrite: stateValues.alwaysAllowWrite ?? false, - alwaysAllowExecute: stateValues.alwaysAllowExecute ?? false, - alwaysAllowBrowser: stateValues.alwaysAllowBrowser ?? false, - alwaysAllowMcp: stateValues.alwaysAllowMcp ?? false, - alwaysAllowModeSwitch: stateValues.alwaysAllowModeSwitch ?? false, - alwaysAllowSubtasks: stateValues.alwaysAllowSubtasks ?? false, + alwaysAllowReadOnly: stateValues.alwaysAllowReadOnly ?? true, + alwaysAllowWrite: stateValues.alwaysAllowWrite ?? true, + alwaysAllowExecute: stateValues.alwaysAllowExecute ?? true, + alwaysAllowBrowser: stateValues.alwaysAllowBrowser ?? true, + alwaysAllowMcp: stateValues.alwaysAllowMcp ?? true, + alwaysAllowModeSwitch: stateValues.alwaysAllowModeSwitch ?? true, + alwaysAllowSubtasks: stateValues.alwaysAllowSubtasks ?? true, taskHistory: stateValues.taskHistory, allowedCommands: stateValues.allowedCommands, soundEnabled: stateValues.soundEnabled ?? false, @@ -2694,7 +2707,7 @@ export class ClineProvider extends EventEmitter implements customSupportPrompts: stateValues.customSupportPrompts ?? {}, enhancementApiConfigId: stateValues.enhancementApiConfigId, experiments: stateValues.experiments ?? experimentDefault, - autoApprovalEnabled: stateValues.autoApprovalEnabled ?? false, + autoApprovalEnabled: stateValues.autoApprovalEnabled ?? true, customModes, maxOpenTabsContext: stateValues.maxOpenTabsContext ?? 20, maxWorkspaceFiles: stateValues.maxWorkspaceFiles ?? 200, diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 886290d3d12..20d3d7bb6f5 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -134,7 +134,6 @@ export type ClineSay = | "new_task" | "checkpoint_saved" | "rooignore_error" - export interface ClineMessage { ts: number type: "ask" | "say" @@ -163,6 +162,7 @@ export type SecretKey = | "mistralApiKey" | "unboundApiKey" | "requestyApiKey" + | "pearaiApiKey" export type GlobalStateKey = | "apiProvider" @@ -256,6 +256,9 @@ export type GlobalStateKey = | "language" | "maxReadFileLine" | "fakeAi" + | "pearaiModelId" + | "pearaiModelInfo" + | "pearaiBaseUrl" export type ConfigurationKey = GlobalStateKey | SecretKey diff --git a/src/extension.ts b/src/extension.ts index 05f8afe969b..41cd1f305a3 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,5 +1,6 @@ import * as vscode from "vscode" import * as dotenvx from "@dotenvx/dotenvx" +import delay from "delay" // Load environment variables from .env file try { @@ -88,6 +89,120 @@ export function activate(context: vscode.ExtensionContext) { * * https://code.visualstudio.com/api/extension-guides/virtual-documents */ + context.subscriptions.push( + vscode.commands.registerCommand("pearai-roo-cline.pearaiLogin", async (data) => { + console.dir("Logged in to PearAI:") + console.dir(data) + context.secrets.store("pearaiApiKey", data.accessToken) + context.secrets.store("pearaiRefreshKey", data.refreshToken) + const provider = await ClineProvider.getInstance() + if (provider) { + // Update the API configuration to clear the PearAI key + await provider.setValues({ + pearaiApiKey: data.accessToken, + }) + await provider.postStateToWebview() + // Update MCP server with new token + const mcpHub = provider.getMcpHub() + if (mcpHub) { + await mcpHub.updatePearAiApiKey(data.accessToken) + } + } + vscode.commands.executeCommand("roo-cline.plusButtonClicked") + }), + ) + + context.subscriptions.push( + vscode.commands.registerCommand("pearai-roo-cline.pearaiLogout", async () => { + console.dir("Logged out of PearAI:") + context.secrets.delete("pearaiApiKey") + context.secrets.delete("pearaiRefreshKey") + + // Get the current provider instance and update webview state + const provider = await ClineProvider.getInstance() + if (provider) { + // Update the API configuration to clear the PearAI key + await provider.setValues({ + pearaiApiKey: undefined, + }) + await provider.postStateToWebview() + // Clear MCP server token + const mcpHub = provider.getMcpHub() + if (mcpHub) { + await mcpHub.clearPearAiApiKey() + } + } + }), + ) + + // context.subscriptions.push( + // vscode.commands.registerCommand("roo-cline.mcpButtonClicked", () => { + // sidebarProvider.postMessageToWebview({ type: "action", action: "mcpButtonClicked" }) + // }), + // ) + + // context.subscriptions.push( + // vscode.commands.registerCommand("roo-cline.promptsButtonClicked", () => { + // sidebarProvider.postMessageToWebview({ type: "action", action: "promptsButtonClicked" }) + // }), + // ) + + const openClineInNewTab = async () => { + outputChannel.appendLine("Opening Roo Code in new tab") + // (this example uses webviewProvider activation event which is necessary to deserialize cached webview, but since we use retainContextWhenHidden, we don't need to use that event) + // https://github.com/microsoft/vscode-extension-samples/blob/main/webview-sample/src/extension.ts + const tabProvider = new ClineProvider(context, outputChannel) + //const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined + const lastCol = Math.max(...vscode.window.visibleTextEditors.map((editor) => editor.viewColumn || 0)) + + // Check if there are any visible text editors, otherwise open a new group to the right + const hasVisibleEditors = vscode.window.visibleTextEditors.length > 0 + if (!hasVisibleEditors) { + await vscode.commands.executeCommand("workbench.action.newGroupRight") + } + const targetCol = hasVisibleEditors ? Math.max(lastCol + 1, 1) : vscode.ViewColumn.Two + + const panel = vscode.window.createWebviewPanel(ClineProvider.tabPanelId, "Roo Code", targetCol, { + enableScripts: true, + retainContextWhenHidden: true, + localResourceRoots: [context.extensionUri], + }) + // TODO: use better svg icon with light and dark variants (see https://stackoverflow.com/questions/58365687/vscode-extension-iconpath) + + panel.iconPath = { + light: vscode.Uri.joinPath(context.extensionUri, "assets", "icons", "rocket.png"), + dark: vscode.Uri.joinPath(context.extensionUri, "assets", "icons", "rocket.png"), + } + tabProvider.resolveWebviewView(panel) + + // Lock the editor group so clicking on files doesn't open them over the panel + await delay(100) + await vscode.commands.executeCommand("workbench.action.lockEditorGroup") + } + + // context.subscriptions.push(vscode.commands.registerCommand("roo-cline.popoutButtonClicked", openClineInNewTab)) + // context.subscriptions.push(vscode.commands.registerCommand("roo-cline.openInNewTab", openClineInNewTab)) + + // context.subscriptions.push( + // vscode.commands.registerCommand("roo-cline.settingsButtonClicked", () => { + // //vscode.window.showInformationMessage(message) + // sidebarProvider.postMessageToWebview({ type: "action", action: "settingsButtonClicked" }) + // }), + // ) + + // context.subscriptions.push( + // vscode.commands.registerCommand("roo-cline.historyButtonClicked", () => { + // sidebarProvider.postMessageToWebview({ type: "action", action: "historyButtonClicked" }) + // }), + // ) + + /* + We use the text document content provider API to show the left side for diff view by creating a virtual document for the original content. This makes it readonly so users know to edit the right side if they want to keep their changes. + + - This API allows you to create readonly documents in VSCode from arbitrary sources, and works by claiming an uri-scheme for which your provider then returns text contents. The scheme must be provided when registering a provider and cannot change afterwards. + - Note how the provider doesn't create uris for virtual documents - its role is to provide contents given such an uri. In return, content providers are wired into the open document logic so that providers are always considered. + https://code.visualstudio.com/api/extension-guides/virtual-documents + */ const diffContentProvider = new (class implements vscode.TextDocumentContentProvider { provideTextDocumentContent(uri: vscode.Uri): string { return Buffer.from(uri.query, "base64").toString("utf-8") @@ -110,6 +225,11 @@ export function activate(context: vscode.ExtensionContext) { registerCodeActions(context) registerTerminalActions(context) + context.subscriptions.push( + vscode.commands.registerCommand("roo-cline.focus", async (...args: any[]) => { + await vscode.commands.executeCommand("pearai-roo-cline.SidebarProvider.focus") + }), + ) // Implements the `RooCodeAPI` interface. return new API(outputChannel, provider) } diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 8ca74291767..d7ad0af8719 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -30,6 +30,7 @@ import { } from "../../shared/mcp" import { fileExistsAtPath } from "../../utils/fs" import { arePathsEqual } from "../../utils/path" +import { PEARAI_URL } from "../../shared/api" export type McpConnection = { server: McpServer @@ -106,11 +107,13 @@ export class McpHub { private isDisposed: boolean = false connections: McpConnection[] = [] isConnecting: boolean = false + private context: vscode.ExtensionContext - constructor(provider: ClineProvider) { + constructor(provider: ClineProvider, context: vscode.ExtensionContext) { this.providerRef = new WeakRef(provider) this.watchMcpSettingsFile() this.initializeMcpServers() + this.context = context } /** @@ -217,7 +220,7 @@ export class McpHub { mcpSettingsFilePath, `{ "mcpServers": { - + } }`, ) @@ -259,6 +262,47 @@ export class McpHub { ) } + private async fetchDefaultSettings(): Promise> { + try { + const response = await fetch(`${PEARAI_URL}/getDefaultAgentMCPSettings`) + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + const data = await response.json() + if (data && data.mcpServers) { + return data.mcpServers + } + return {} + } catch (error) { + console.error("Failed to fetch default MCP settings:", error) + return {} + } + } + + private async fetchServersToRemove(): Promise { + try { + const response = await fetch(`${PEARAI_URL}/getAgentMCPSettingsRemove`) + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + const data = await response.json() + return data.serversToRemove || [] + } catch (error) { + console.error("Failed to fetch servers to remove:", error) + return [] + } + } + + private async getPearAiApiKey(): Promise { + try { + const token = await this.context.secrets.get("pearaiApiKey") + return token || null + } catch (error) { + console.error("Failed to get PearAI token from secrets:", error) + return null + } + } + private async initializeMcpServers(): Promise { try { const settingsPath = await this.getMcpSettingsFilePath() @@ -274,8 +318,49 @@ export class McpHub { return } + // Fetch servers to remove and default settings + const [serversToRemove, defaultSettings] = await Promise.all([ + this.fetchServersToRemove(), + this.fetchDefaultSettings(), + ]) + + // Remove servers that should be removed from original config + for (const serverName of serversToRemove) { + if (config.mcpServers?.[serverName]) { + delete config.mcpServers[serverName] + } + } + + // Create merged servers from cleaned config + const mergedServers = { ...(config.mcpServers || {}) } + + // Add new servers from default settings that don't exist in current settings + for (const [serverName, serverConfig] of Object.entries(defaultSettings)) { + if (!mergedServers[serverName]) { + mergedServers[serverName] = serverConfig + } + + // If this is the pearai server, check login status and update API key + if (serverName === "pearai") { + const apiKey = await this.getPearAiApiKey() + if (apiKey) { + mergedServers[serverName] = { + ...serverConfig, + args: ["pearai-mcp", apiKey], + } + } + } + } + + // Update mcpServers while preserving config structure + config.mcpServers = mergedServers + + // Write updated config back to file + await fs.writeFile(settingsPath, JSON.stringify(config, null, 2)) + // Validate the config using McpSettingsSchema const result = McpSettingsSchema.safeParse(config) + console.log("IM HERE 10101", result) if (result.success) { await this.updateServerConnections(result.data.mcpServers || {}) } else { @@ -920,4 +1005,50 @@ export class McpHub { } this.disposables.forEach((d) => d.dispose()) } + + public async clearPearAiApiKey(): Promise { + try { + const settingsPath = await this.getMcpSettingsFilePath() + const content = await fs.readFile(settingsPath, "utf-8") + const config = JSON.parse(content) + + if (config.mcpServers?.pearai) { + config.mcpServers.pearai = { + ...config.mcpServers.pearai, + args: ["pearai-mcp", ""], + } + + await fs.writeFile(settingsPath, JSON.stringify(config, null, 2)) + await this.updateServerConnections(config.mcpServers) + vscode.window.showInformationMessage("PearAI API key cleared successfully") + } + } catch (error) { + console.error("Failed to clear PearAI API key:", error) + vscode.window.showErrorMessage("Failed to clear PearAI API key") + throw error + } + } + + public async updatePearAiApiKey(apiKey: string): Promise { + try { + const settingsPath = await this.getMcpSettingsFilePath() + const content = await fs.readFile(settingsPath, "utf-8") + const config = JSON.parse(content) + + if (config.mcpServers?.pearai) { + config.mcpServers.pearai = { + ...config.mcpServers.pearai, + args: ["pearai-mcp", apiKey], + } + + await fs.writeFile(settingsPath, JSON.stringify(config, null, 2)) + await this.updateServerConnections(config.mcpServers) + vscode.window.showInformationMessage("PearAI API key updated successfully") + } + } catch (error) { + console.error("Failed to update PearAI API key:", error) + vscode.window.showErrorMessage("Failed to update PearAI API key") + throw error + } + } } diff --git a/src/services/mcp/McpServerManager.ts b/src/services/mcp/McpServerManager.ts index e15f9db0a7a..54e8c88aa57 100644 --- a/src/services/mcp/McpServerManager.ts +++ b/src/services/mcp/McpServerManager.ts @@ -36,7 +36,7 @@ export class McpServerManager { try { // Double-check instance in case it was created while we were waiting if (!this.instance) { - this.instance = new McpHub(provider) + this.instance = new McpHub(provider, context) // Store a unique identifier in global state to track the primary instance await context.globalState.update(this.GLOBAL_STATE_KEY, Date.now().toString()) } diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index d87be2a716d..3e6356de3d7 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -101,6 +101,7 @@ export interface WebviewMessage { | "openCustomModesSettings" | "checkpointDiff" | "checkpointRestore" + | "openPearAiAuth" | "deleteMcpServer" | "maxOpenTabsContext" | "maxWorkspaceFiles" diff --git a/src/shared/__tests__/modes.test.ts b/src/shared/__tests__/modes.test.ts index 5abcb8a8b3a..02ee77facf1 100644 --- a/src/shared/__tests__/modes.test.ts +++ b/src/shared/__tests__/modes.test.ts @@ -340,7 +340,7 @@ describe("FileRestrictionError", () => { slug: "debug", name: "Debug", roleDefinition: - "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", + "You are PearAI Agent (Powered by Roo Code / Cline), an expert software debugger specializing in systematic problem diagnosis and resolution.", groups: ["read", "edit", "browser", "command", "mcp"], }) expect(debugMode?.customInstructions).toContain( @@ -361,7 +361,7 @@ describe("FileRestrictionError", () => { slug: "debug", name: "Debug", roleDefinition: - "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", + "You are PearAI Agent (Powered by Roo Code / Cline), an expert software debugger specializing in systematic problem diagnosis and resolution.", }) }) diff --git a/src/shared/api.ts b/src/shared/api.ts index 498bb922b84..362ea95a362 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -16,6 +16,7 @@ export type ApiProvider = | "mistral" | "unbound" | "requesty" + | "pearai" | "human-relay" | "fake-ai" @@ -76,6 +77,10 @@ export interface ApiHandlerOptions { requestyModelInfo?: ModelInfo modelTemperature?: number | null modelMaxTokens?: number + pearaiApiKey?: string + pearaiBaseUrl?: string + pearaiModelId?: string + pearaiModelInfo?: ModelInfo modelMaxThinkingTokens?: number fakeAi?: unknown } @@ -159,7 +164,7 @@ export interface ModelInfo { // Anthropic // https://docs.anthropic.com/en/docs/about-claude/models export type AnthropicModelId = keyof typeof anthropicModels -export const anthropicDefaultModelId: AnthropicModelId = "claude-3-7-sonnet-20250219" +export const anthropicDefaultModelId: AnthropicModelId = "claude-3-5-sonnet-20241022" export const anthropicModels = { "claude-3-7-sonnet-20250219:thinking": { maxTokens: 128_000, @@ -945,10 +950,10 @@ export const deepSeekModels = { contextWindow: 64_000, supportsImages: false, supportsPromptCache: true, - inputPrice: 0.27, // $0.27 per million tokens (cache miss) - outputPrice: 1.1, // $1.10 per million tokens + inputPrice: 0.014, // $0.014 per million tokens + outputPrice: 0.28, // $0.28 per million tokens cacheWritesPrice: 0.27, // $0.27 per million tokens (cache miss) - cacheReadsPrice: 0.07, // $0.07 per million tokens (cache hit). + cacheReadsPrice: 0.07, // $0.07 per million tokens (cache hit) description: `DeepSeek-V3 achieves a significant breakthrough in inference speed over previous models. It tops the leaderboard among open-source models and rivals the most advanced closed-source models globally.`, }, "deepseek-reasoner": { @@ -1036,3 +1041,39 @@ export const unboundDefaultModelInfo: ModelInfo = { cacheWritesPrice: 3.75, cacheReadsPrice: 0.3, } +// CHANGE AS NEEDED FOR TESTING +// PROD: +export const PEARAI_URL = "https://stingray-app-gb2an.ondigitalocean.app/pearai-server-api2/integrations/cline" +// DEV: +// export const PEARAI_URL = "http://localhost:8000/integrations/cline" + +// PearAI +export type PearAiModelId = keyof typeof pearAiModels +export const pearAiDefaultModelId: PearAiModelId = "pearai-model" +export const pearAiDefaultModelInfo: ModelInfo = { + maxTokens: 8192, + contextWindow: 200_000, + supportsImages: true, + supportsPromptCache: true, + inputPrice: 3.0, + outputPrice: 15.0, + cacheWritesPrice: 3.75, + cacheReadsPrice: 0.3, + description: + "PearAI Model automatically routes you to the most best / most suitable model on the market. Recommended for most users.", +} + +export const pearAiModels = { + "pearai-model": { + maxTokens: 8192, + contextWindow: 200_000, + supportsImages: true, + supportsPromptCache: true, + inputPrice: 3.0, + outputPrice: 15.0, + cacheWritesPrice: 3.75, + cacheReadsPrice: 0.3, + description: + "PearAI Model automatically routes you to the most best / most suitable model on the market. Recommended for most users.", + }, +} as const satisfies Record diff --git a/src/shared/checkExistApiConfig.ts b/src/shared/checkExistApiConfig.ts index 5246e954abe..dfa6092c2ff 100644 --- a/src/shared/checkExistApiConfig.ts +++ b/src/shared/checkExistApiConfig.ts @@ -4,8 +4,8 @@ import { SECRET_KEYS } from "./globalState" export function checkExistKey(config: ApiConfiguration | undefined) { if (!config) return false - // Special case for human-relay and fake-ai providers which don't need any configuration - if (config.apiProvider === "human-relay" || config.apiProvider === "fake-ai") { + // Special case for providers that don't need configuration in the apiConfiguration object + if (config.apiProvider === "human-relay" || config.apiProvider === "fake-ai" || config.apiProvider === "pearai") { return true } diff --git a/src/shared/globalFileNames.ts b/src/shared/globalFileNames.ts index 6088e95d999..9eec311b909 100644 --- a/src/shared/globalFileNames.ts +++ b/src/shared/globalFileNames.ts @@ -4,6 +4,6 @@ export const GlobalFileNames = { glamaModels: "glama_models.json", openRouterModels: "openrouter_models.json", requestyModels: "requesty_models.json", - mcpSettings: "cline_mcp_settings.json", + mcpSettings: "pearai_agent_mcp_settings.json", unboundModels: "unbound_models.json", } diff --git a/src/shared/globalState.ts b/src/shared/globalState.ts index 5896bee9cd1..01e43fef122 100644 --- a/src/shared/globalState.ts +++ b/src/shared/globalState.ts @@ -26,11 +26,12 @@ export const SECRET_KEYS = [ "mistralApiKey", "unboundApiKey", "requestyApiKey", + "pearaiApiKey", ] as const -type CheckSecretKeysExhaustiveness = Exclude extends never ? true : false +// type CheckSecretKeysExhaustiveness = Exclude extends never ? true : false -const _checkSecretKeysExhaustiveness: CheckSecretKeysExhaustiveness = true +// const _checkSecretKeysExhaustiveness: CheckSecretKeysExhaustiveness = true export const GLOBAL_STATE_KEYS = [ "apiProvider", @@ -124,6 +125,9 @@ export const GLOBAL_STATE_KEYS = [ "maxWorkspaceFiles", "maxReadFileLine", "fakeAi", + "pearaiModelId", + "pearaiModelInfo", + "pearaiBaseUrl", ] as const export const PASS_THROUGH_STATE_KEYS = ["taskHistory"] as const diff --git a/src/shared/modes.ts b/src/shared/modes.ts index 6fd57206bf7..374958f7434 100644 --- a/src/shared/modes.ts +++ b/src/shared/modes.ts @@ -82,14 +82,14 @@ export const modes: readonly ModeConfig[] = [ slug: "code", name: "Code", roleDefinition: - "You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.", + "You are PearAI Agent (Powered by Roo Code / Cline), a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.", groups: ["read", "edit", "browser", "command", "mcp"], }, { slug: "architect", name: "Architect", roleDefinition: - "You are Roo, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.", + "You are PearAI Agent (Powered by Roo Code / Cline), an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.", groups: ["read", ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], "browser", "mcp"], customInstructions: "1. Do some information gathering (for example using read_file or search_files) to get more context about the task.\n\n2. You should also ask the user clarifying questions to get a better understanding of the task.\n\n3. Once you've gained more context about the user's request, you should create a detailed plan for how to accomplish the task. Include Mermaid diagrams if they help make your plan clearer.\n\n4. Ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and plan the best way to accomplish it.\n\n5. Once the user confirms the plan, ask them if they'd like you to write it to a markdown file.\n\n6. Use the switch_mode tool to request that the user switch to another mode to implement the solution.", @@ -98,7 +98,7 @@ export const modes: readonly ModeConfig[] = [ slug: "ask", name: "Ask", roleDefinition: - "You are Roo, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.", + "You are PearAI Agent (Powered by Roo Code / Cline), a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.", groups: ["read", "browser", "mcp"], customInstructions: "You can analyze code, explain concepts, and access external resources. Make sure to answer the user's questions and don't rush to switch to implementing code. Include Mermaid diagrams if they help make your response clearer.", @@ -107,7 +107,7 @@ export const modes: readonly ModeConfig[] = [ slug: "debug", name: "Debug", roleDefinition: - "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", + "You are PearAI Agent (Powered by Roo Code / Cline), an expert software debugger specializing in systematic problem diagnosis and resolution.", groups: ["read", "edit", "browser", "command", "mcp"], customInstructions: "Reflect on 5-7 different possible sources of the problem, distill those down to 1-2 most likely sources, and then add logs to validate your assumptions. Explicitly ask the user to confirm the diagnosis before fixing the problem.", diff --git a/webview-ui/.eslintrc.json b/webview-ui/.eslintrc.json index 4309a7c3ed6..af7d58c90a4 100644 --- a/webview-ui/.eslintrc.json +++ b/webview-ui/.eslintrc.json @@ -1,4 +1,7 @@ { "extends": "react-app", + "rules": { + "@typescript-eslint/no-unused-vars": "off" + }, "ignorePatterns": ["!.storybook"] } diff --git a/webview-ui/package-lock.json b/webview-ui/package-lock.json index d6da7da4bf4..7d2a6b01f09 100644 --- a/webview-ui/package-lock.json +++ b/webview-ui/package-lock.json @@ -8,6 +8,8 @@ "name": "webview-ui", "version": "0.1.0", "dependencies": { + "@headlessui/react": "^2.2.0", + "@heroicons/react": "^2.2.0", "@radix-ui/react-alert-dialog": "^1.1.6", "@radix-ui/react-collapsible": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", @@ -2796,6 +2798,21 @@ "@floating-ui/utils": "^0.2.9" } }, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@floating-ui/react-dom": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", @@ -2809,12 +2826,46 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@floating-ui/react/node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, "node_modules/@floating-ui/utils": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", "license": "MIT" }, + "node_modules/@headlessui/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.0.tgz", + "integrity": "sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.17.1", + "@react-aria/interactions": "^3.21.3", + "@tanstack/react-virtual": "^3.8.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/@heroicons/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", + "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", + "license": "MIT", + "peerDependencies": { + "react": ">= 16 || ^19.0.0-rc" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -5396,6 +5447,103 @@ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", "license": "MIT" }, + "node_modules/@react-aria/focus": { + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.1.tgz", + "integrity": "sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/interactions": "^3.24.1", + "@react-aria/utils": "^3.28.1", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.24.1.tgz", + "integrity": "sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.7", + "@react-aria/utils": "^3.28.1", + "@react-stately/flags": "^3.1.0", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", + "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.1.tgz", + "integrity": "sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.7", + "@react-stately/flags": "^3.1.0", + "@react-stately/utils": "^3.10.5", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-stately/flags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.0.tgz", + "integrity": "sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.10.5", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.5.tgz", + "integrity": "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.28.0.tgz", + "integrity": "sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/@rollup/pluginutils": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", @@ -6303,6 +6451,15 @@ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@tailwindcss/node": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.0.tgz", @@ -6562,6 +6719,33 @@ "react": "^18 || ^19" } }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.4.tgz", + "integrity": "sha512-jPWC3BXvVLHsMX67NEHpJaZ+/FySoNxFfBEiF4GBc1+/nVwdRm+UcSCYnKP3pXQr0eEsDpXi/PQZhNfJNopH0g==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.4.tgz", + "integrity": "sha512-fNGO9fjjSLns87tlcto106enQQLycCKR4DPNpgq3djP5IdcPFdPAmaKjsgzIeRhH7hWrELgW12hYnRthS5kLUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", diff --git a/webview-ui/package.json b/webview-ui/package.json index a8d143b7d74..c39f3d26796 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -18,6 +18,8 @@ "clean": "rimraf build" }, "dependencies": { + "@headlessui/react": "^2.2.0", + "@heroicons/react": "^2.2.0", "@radix-ui/react-alert-dialog": "^1.1.6", "@radix-ui/react-collapsible": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index 59a40472518..b0c84b200a1 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -11,7 +11,6 @@ import { ExtensionStateContextProvider, useExtensionState } from "./context/Exte import ChatView from "./components/chat/ChatView" import HistoryView from "./components/history/HistoryView" import SettingsView, { SettingsViewRef } from "./components/settings/SettingsView" -import WelcomeView from "./components/welcome/WelcomeView" import McpView from "./components/mcp/McpView" import PromptsView from "./components/prompts/PromptsView" import { HumanRelayDialog } from "./components/human-relay/HumanRelayDialog" @@ -97,9 +96,7 @@ const App = () => { // Do not conditionally load ChatView, it's expensive and there's state we // don't want to lose (user input, disableInput, askResponse promise, etc.) - return showWelcome ? ( - - ) : ( + return ( <> {tab === "prompts" && switchTab("chat")} />} {tab === "mcp" && switchTab("chat")} />} diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index b3a55c94ec7..2498f4c82a2 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -173,7 +173,8 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { return (
{ display: "flex", alignItems: "center", gap: "8px", - padding: isExpanded ? "8px 0" : "8px 0 0 0", + // padding: isExpanded ? "8px 0" : "8px 0 0 0", cursor: "pointer", }} onClick={toggleExpanded}>
e.stopPropagation()}> { - const newValue = !(autoApprovalEnabled ?? false) + const newValue = !(autoApprovalEnabled ?? true) setAutoApprovalEnabled(newValue) vscode.postMessage({ type: "autoApprovalEnabled", bool: newValue }) }} diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 3f7d174b494..6be47ef09c2 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -24,6 +24,7 @@ import McpToolRow from "../mcp/McpToolRow" import { highlightMentions } from "./TaskHeader" import { CheckpointSaved } from "./checkpoints/CheckpointSaved" import FollowUpSuggest from "./FollowUpSuggest" +import { vscEditorBackground } from "../ui" interface ChatRowProps { message: ClineMessage @@ -646,14 +647,17 @@ export const ChatRowContent = ({ return (
` + position: absolute; + bottom: 100%; + left: 0; + margin-bottom: 4px; + list-style: none; + padding: 6px; + white-space: nowrap; + cursor: default; + z-index: 50; + border: 1px solid var(--vscode-input-border); + border-radius: 10px; + background-color: var(--vscode-editor-background); + max-height: 300px; + min-width: 100px; + overflow-y: auto; + font-size: var(--vscode-editor-font-size); + user-select: none; + outline: none; + &::-webkit-scrollbar { + display: none; + } + scrollbar-width: none; + -ms-overflow-style: none; + & > * { + margin: 4px 0; + } +` + +interface ListboxOptionProps { + isCurrentModel?: boolean +} + +const StyledListboxOption = styled(Listbox.Option)` + cursor: pointer; + border-radius: 6px; + padding: 5px 4px; + &:hover { + background: ${(props) => + props.isCurrentModel + ? `var(--vscode-list-activeSelectionBackground)` + : `var(--vscode-list-hoverBackground)`}; + } + background: ${(props) => (props.isCurrentModel ? `var(--vscode-list-activeSelectionBackground)` : "transparent")}; +` + +const Divider = styled.div` + height: 2px; + background-color: var(--vscode-input-border); + margin: 0px 4px; +` + +const ListboxWrapper = styled.div` + position: relative; + display: inline-block; +` + +const CaretIcon = () => interface ChatTextAreaProps { inputValue: string @@ -613,13 +692,13 @@ const ChatTextArea = forwardRef( display: "flex", flexDirection: "column", gap: "8px", - backgroundColor: "var(--vscode-input-background)", - margin: "10px 15px", + backgroundColor: "var(--vscode-editor-background)", + // margin: "10px 15px", padding: "8px", outline: "none", - border: "1px solid", - borderColor: isFocused ? "var(--vscode-focusBorder)" : "transparent", - borderRadius: "2px", + // border: "1px solid", + borderColor: "transparent", + borderRadius: "12px", }} onDrop={async (e) => { e.preventDefault() @@ -703,6 +782,46 @@ const ChatTextArea = forwardRef( onDragOver={(e) => { e.preventDefault() }}> +
+
+ + !shouldDisableImages && onSelectImages()} + /> +
+
+ {showContextMenu && (
( /> )} -
- {/* Left side - dropdowns container */} -
- {/* Mode selector - fixed width */} -
- +
+ + ({ - value: mode.slug, - label: mode.name, - type: DropdownOptionType.ITEM, - })), - { - value: "sep-1", - label: t("chat:separator"), - type: DropdownOptionType.SEPARATOR, - }, - { - value: "promptsButtonClicked", - label: t("chat:edit"), - type: DropdownOptionType.ACTION, - }, - ]} onChange={(value) => { + if (value === "prompts-action") { + window.postMessage({ type: "action", action: "promptsButtonClicked" }) + return + } setMode(value as Mode) - vscode.postMessage({ type: "mode", text: value }) + vscode.postMessage({ + type: "mode", + text: value, + }) }} - shortcutText={modeShortcutText} - triggerClassName="w-full" - /> -
- - {/* API configuration selector - flexible width */} -
- + + {getAllModes(customModes).find((m) => m.slug === mode)?.name} + + + + {getAllModes(customModes).map((mode) => ( + + {mode.name} + + ))} + + + Edit... + + + + + + + ({ - value: config.name, - label: config.name, - type: DropdownOptionType.ITEM, - })), - { - value: "sep-2", - label: t("chat:separator"), - type: DropdownOptionType.SEPARATOR, - }, - { - value: "settingsButtonClicked", - label: t("chat:edit"), - type: DropdownOptionType.ACTION, - }, - ]} - onChange={(value) => vscode.postMessage({ type: "loadApiConfiguration", text: value })} - contentClassName="max-h-[300px] overflow-y-auto" - triggerClassName="w-full text-ellipsis overflow-hidden" - /> -
+ onChange={(value) => { + if (value === "settings-action") { + window.postMessage({ type: "action", action: "settingsButtonClicked" }) + return + } + vscode.postMessage({ + type: "loadApiConfiguration", + text: value, + }) + }} + disabled={textAreaDisabled}> + + {currentApiConfigName} + + + + {(listApiConfigMeta || []).map((config) => ( + + {config.name} + + ))} + + + Edit... + + + +
- - {/* Right side - action buttons */} -
+
+
- {isEnhancingPrompt ? ( + {/* {isEnhancingPrompt ? ( ) : ( @@ -944,29 +1037,22 @@ const ChatTextArea = forwardRef( role="button" aria-label="enhance prompt" data-testid="enhance-prompt-button" - title={t("chat:enhancePrompt")} className={`input-icon-button ${ textAreaDisabled ? "disabled" : "" } codicon codicon-sparkle`} onClick={() => !textAreaDisabled && handleEnhancePrompt()} style={{ fontSize: 16.5 }} /> - )} + )} */}
- !shouldDisableImages && onSelectImages()} - style={{ fontSize: 16.5 }} - /> - !textAreaDisabled && onSend()} - style={{ fontSize: 15 }} - /> + +
diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 554e8ac0e3a..aa050221a72 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -14,12 +14,14 @@ import { import { McpServer, McpTool } from "../../../../src/shared/mcp" import { findLast } from "../../../../src/shared/array" import { combineApiRequests } from "../../../../src/shared/combineApiRequests" +import { ModelInfo, pearAiDefaultModelId, pearAiDefaultModelInfo, PEARAI_URL } from "../../../../src/shared/api" import { combineCommandSequences } from "../../../../src/shared/combineCommandSequences" import { getApiMetrics } from "../../../../src/shared/getApiMetrics" import { useExtensionState } from "../../context/ExtensionStateContext" import { vscode } from "../../utils/vscode" import HistoryPreview from "../history/HistoryPreview" import { normalizeApiConfiguration } from "../settings/ApiOptions" +import { usePearAiModels } from "../../hooks/usePearAiModels" import Announcement from "./Announcement" import BrowserSessionRow from "./BrowserSessionRow" import ChatRow from "./ChatRow" @@ -32,6 +34,17 @@ import { getAllModes } from "../../../../src/shared/modes" import TelemetryBanner from "../common/TelemetryBanner" import { useAppTranslation } from "@/i18n/TranslationContext" import removeMd from "remove-markdown" +import splashIcon from "../../../../assets/icons/pearai-agent-splash.svg" +import { Button } from "../ui/button-pear-scn" +import { + vscBackground, + vscBadgeBackground, + vscButtonBackground, + vscEditorBackground, + vscForeground, + vscInputBorder, + vscSidebarBorder, +} from "../ui" interface ChatViewProps { isHidden: boolean @@ -471,9 +484,11 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie startNewTask() }, [startNewTask]) + const pearAiModels = usePearAiModels(apiConfiguration) + const { selectedModelInfo } = useMemo(() => { - return normalizeApiConfiguration(apiConfiguration) - }, [apiConfiguration]) + return normalizeApiConfiguration(apiConfiguration, pearAiModels) + }, [apiConfiguration, pearAiModels]) const selectImages = useCallback(() => { vscode.postMessage({ type: "selectImages" }) @@ -975,9 +990,17 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie ) const baseText = task ? t("chat:typeMessage") : t("chat:typeTask") - const placeholderText = - baseText + - `\n(${t("chat:addContext")}${shouldDisableImages ? `, ${t("chat:dragFiles")}` : `, ${t("chat:dragFilesImages")}`})` + // const placeholderText = + // baseText + + // `\n(${t("chat:addContext")}${shouldDisableImages ? `, ${t("chat:dragFiles")}` : `, ${t("chat:dragFilesImages")}`})` + + const placeholderText = useMemo(() => { + const baseText = task ? "Follow up here." : "Give PearAI Agent a task here." + const contextText = " Use @ to add context." + const imageText = shouldDisableImages ? "" : "\nhold shift to drag in images" + const helpText = imageText ? `\n${contextText}${imageText}` : `\n${contextText}` + return baseText + contextText + }, [task, shouldDisableImages]) const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage | ClineMessage[]) => { @@ -1103,6 +1126,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie left: 0, right: 0, bottom: 0, + padding: "12px 12px", display: isHidden ? "none" : "flex", flexDirection: "column", overflow: "hidden", @@ -1135,30 +1159,50 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie minHeight: 0, overflowY: "auto", display: "flex", - flexDirection: "column", + flexDirection: "column-reverse", paddingBottom: "10px", }}> - {telemetrySetting === "unset" && } - {showAnnouncement && } -
+ {messages.length === 0 && ( + <> +
+
+ ... +
+
+
PearAI Coding Agent
+
+ Powered by Roo Code / Cline +
+
+
+
+ Autonomous coding agent that has access to your development environment (with + your permission) for a feedback loop to add features, fix bugs, and more. +
+
+
+ + )} + {/* {telemetrySetting === "unset" && } */} + {/* {showAnnouncement && } */} + {/*

{t("chat:greeting")}

{t("chat:aboutMe")}

-
+
*/} {taskHistory.length > 0 && }
)} - - {/* + {/* // Flex layout explanation: // 1. Content div above uses flex: "1 1 0" to: - // - Grow to fill available space (flex-grow: 1) + // - Grow to fill available space (flex-grow: 1) // - Shrink when AutoApproveMenu needs space (flex-shrink: 1) // - Start from zero size (flex-basis: 0) to ensure proper distribution // minHeight: 0 allows it to shrink below its content height // // 2. AutoApproveMenu uses flex: "0 1 auto" to: // - Not grow beyond its content (flex-grow: 0) - // - Shrink when viewport is small (flex-shrink: 1) + // - Shrink when viewport is small (flex-shrink: 1) // - Use its content size as basis (flex-basis: auto) // This ensures it takes its natural height when there's space // but becomes scrollable when the viewport is too small @@ -1172,7 +1216,6 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie }} /> )} - {task && ( <>
@@ -1202,7 +1245,6 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie initialTopMostItemIndex={groupedMessages.length - 1} />
- {showScrollToBottom ? (
{primaryButtonText && !isStreaming && ( - handlePrimaryButtonClick(inputValue, selectedImages)}> {primaryButtonText} - + )} {(secondaryButtonText || isStreaming) && ( - handleSecondaryButtonClick(inputValue, selectedImages)}> {isStreaming ? t("chat:cancel.title") : secondaryButtonText} - + )}
)} + )} - -
) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 558d01f9583..1a790bbec05 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -17,6 +17,7 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import Thumbnails from "../common/Thumbnails" import { normalizeApiConfiguration } from "../settings/ApiOptions" import { DeleteTaskDialog } from "../history/DeleteTaskDialog" +import { vscBadgeBackground, vscEditorBackground, vscInputBackground } from "../ui" interface TaskHeaderProps { task: ClineMessage @@ -65,7 +66,7 @@ const TaskHeader: React.FC = ({ function without triggering re-renders or effect re-runs. This approach ensures that our event listener always has access to the most current state while minimizing performance overhead and potential memory leaks from - multiple listener registrations. + multiple listener registrations. Sources - https://usehooks-ts.com/react-hook/use-event-listener @@ -74,7 +75,7 @@ const TaskHeader: React.FC = ({ - https://stackoverflow.com/questions/55565444/how-to-register-event-with-useeffect-hooks Before: - + const updateMaxHeight = useCallback(() => { if (isExpanded && textContainerRef.current) { const maxHeight = window.innerHeight * (3 / 5) @@ -136,10 +137,10 @@ const TaskHeader: React.FC = ({
{(path || isFeedback || isConsoleLogs) && (
+ }} + className="font-bold"> {removeLeadingNonAlphanumeric(path ?? "") + "\u200E"} diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index f202d518b13..a7d9f71c03b 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -5,6 +5,7 @@ import { useDebounce, useEvent } from "react-use" import { LanguageModelChatSelector } from "vscode" import { Checkbox } from "vscrui" import { VSCodeLink, VSCodeRadio, VSCodeRadioGroup, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" +import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" import { ExternalLinkIcon } from "@radix-ui/react-icons" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, SelectSeparator, Button } from "@/components/ui" @@ -36,6 +37,10 @@ import { unboundDefaultModelInfo, requestyDefaultModelId, requestyDefaultModelInfo, + pearAiModels, + pearAiDefaultModelId, + pearAiDefaultModelInfo, + PEARAI_URL, ApiProvider, } from "../../../../src/shared/api" import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" @@ -54,6 +59,7 @@ import { TemperatureControl } from "./TemperatureControl" import { validateApiConfiguration, validateModelId, validateBedrockArn } from "@/utils/validate" import { ApiErrorMessage } from "./ApiErrorMessage" import { ThinkingBudget } from "./ThinkingBudget" +import { usePearAiModels } from "../../hooks/usePearAiModels" interface ApiOptionsProps { uriScheme: string | undefined @@ -95,6 +101,7 @@ const ApiOptions = ({ }) const [openAiModels, setOpenAiModels] = useState | null>(null) + const pearAiModels = usePearAiModels(apiConfiguration) const [anthropicBaseUrlSelected, setAnthropicBaseUrlSelected] = useState(!!apiConfiguration?.anthropicBaseUrl) const [azureApiVersionSelected, setAzureApiVersionSelected] = useState(!!apiConfiguration?.azureApiVersion) @@ -119,10 +126,9 @@ const ApiOptions = ({ [setApiConfigurationField], ) - const { selectedProvider, selectedModelId, selectedModelInfo } = useMemo( - () => normalizeApiConfiguration(apiConfiguration), - [apiConfiguration], - ) + const { selectedProvider, selectedModelId, selectedModelInfo } = useMemo(() => { + return normalizeApiConfiguration(apiConfiguration, pearAiModels) + }, [apiConfiguration, pearAiModels]) // Debounced refresh model updates, only executed 250ms after the user // stops typing. @@ -230,16 +236,20 @@ const ApiOptions = ({ useEvent("message", onMessage) - const selectedProviderModelOptions = useMemo( - () => - MODELS_BY_PROVIDER[selectedProvider] - ? Object.keys(MODELS_BY_PROVIDER[selectedProvider]).map((modelId) => ({ - value: modelId, - label: modelId, - })) - : [], - [selectedProvider], - ) + const selectedProviderModelOptions = useMemo(() => { + if (selectedProvider === "pearai") { + return Object.keys(pearAiModels).map((modelId) => ({ + value: modelId, + label: modelId, + })) + } + return MODELS_BY_PROVIDER[selectedProvider] + ? Object.keys(MODELS_BY_PROVIDER[selectedProvider]).map((modelId) => ({ + value: modelId, + label: modelId, + })) + : [] + }, [selectedProvider, pearAiModels]) return (
@@ -252,7 +262,7 @@ const ApiOptions = ({ - OpenRouter + PearAI {PROVIDERS.map(({ value, label }) => ( @@ -263,6 +273,39 @@ const ApiOptions = ({
+ {selectedProvider === "pearai" && ( +
+ {!apiConfiguration?.pearaiApiKey ? ( + <> + { + vscode.postMessage({ + type: "openPearAiAuth", + }) + }}> + Login to PearAI + +

+ Connect your PearAI account to use servers. +

+ + ) : ( +

+ User already logged in to PearAI. Click 'Done' to proceed! +

+ )} +
+ )} {errorMessage && } {selectedProvider === "openrouter" && ( @@ -1545,7 +1588,10 @@ export function getOpenRouterAuthUrl(uriScheme?: string) { return `https://openrouter.ai/auth?callback_url=${uriScheme || "vscode"}://rooveterinaryinc.roo-cline/openrouter` } -export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration) { +export function normalizeApiConfiguration( + apiConfiguration?: ApiConfiguration, + pearAiModelsQuery?: Record, +) { const provider = apiConfiguration?.apiProvider || "anthropic" const modelId = apiConfiguration?.apiModelId @@ -1645,6 +1691,13 @@ export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration) { supportsImages: false, // VSCode LM API currently doesn't support images. }, } + case "pearai": { + // Always use the models from the hook which are fetched when provider is selected + return getProviderData( + pearAiModelsQuery || { [pearAiDefaultModelId]: pearAiDefaultModelInfo }, + pearAiDefaultModelId, + ) + } default: return getProviderData(anthropicModels, anthropicDefaultModelId) } diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx index e4e848478c3..933fbf6c686 100644 --- a/webview-ui/src/components/settings/ModelPicker.tsx +++ b/webview-ui/src/components/settings/ModelPicker.tsx @@ -21,6 +21,7 @@ import { import { ApiConfiguration, ModelInfo } from "../../../../src/shared/api" import { normalizeApiConfiguration } from "./ApiOptions" +import { usePearAiModels } from "../../hooks/usePearAiModels" import { ThinkingBudget } from "./ThinkingBudget" import { ModelInfoView } from "./ModelInfoView" @@ -63,9 +64,11 @@ export const ModelPicker = ({ const searchInputRef = useRef(null) const modelIds = useMemo(() => Object.keys(models ?? {}).sort((a, b) => a.localeCompare(b)), [models]) + const pearAiModels = usePearAiModels(apiConfiguration) + const { selectedModelId, selectedModelInfo } = useMemo( - () => normalizeApiConfiguration(apiConfiguration), - [apiConfiguration], + () => normalizeApiConfiguration(apiConfiguration, pearAiModels), + [apiConfiguration, pearAiModels], ) const [searchValue, setSearchValue] = useState(selectedModelId || "") diff --git a/webview-ui/src/components/settings/constants.ts b/webview-ui/src/components/settings/constants.ts index b5f3e13196c..02d8bd52455 100644 --- a/webview-ui/src/components/settings/constants.ts +++ b/webview-ui/src/components/settings/constants.ts @@ -7,6 +7,7 @@ import { geminiModels, mistralModels, openAiNativeModels, + pearAiModels, vertexModels, } from "../../../../src/shared/api" @@ -36,6 +37,7 @@ export const PROVIDERS = [ { value: "unbound", label: "Unbound" }, { value: "requesty", label: "Requesty" }, { value: "human-relay", label: "Human Relay" }, + { value: "openrouter", label: "OpenRouter" }, ].sort((a, b) => a.label.localeCompare(b.label)) export const AWS_REGIONS = [ diff --git a/webview-ui/src/components/ui/ShortcutsButton.tsx b/webview-ui/src/components/ui/ShortcutsButton.tsx new file mode 100644 index 00000000000..08c4f3474fb --- /dev/null +++ b/webview-ui/src/components/ui/ShortcutsButton.tsx @@ -0,0 +1,55 @@ +import styled from "styled-components" +import { Fragment } from "react" +import { lightGray, vscEditorBackground, vscForeground } from "./index" + +interface ShortcutButtonProps { + keys: string[] + onClick?: () => void + offFocus?: boolean + className?: string + label?: string + labelInside?: boolean // New prop +} + +const StyledShortcutButton = styled.div<{ offFocus: boolean }>` + padding: 1px 4px; + gap: 2px; + display: flex; + align-items: center; + color: ${vscForeground}; + background-color: ${vscEditorBackground}; + border: 1.5px solid ${(props) => (props.offFocus ? undefined : lightGray + "33")}; + border-radius: 6px; +` + +const LabelSpan = styled.span` + opacity: 0.7; + margin-left: 6px; +` + +const KeySpan = styled.span` + font-weight: 500; +` + +const PlusSpan = styled.span` + margin-bottom: 2px; + font-weight: 600; + opacity: 0.5; +` + +export function ShortcutButton({ keys, onClick, offFocus = false, label, labelInside = false }: ShortcutButtonProps) { + return ( +
+ + {keys.map((key, index) => ( + + {key} + {index < keys.length - 1 && +} + + ))} + {labelInside && label && {label}} + + {!labelInside && label} +
+ ) +} diff --git a/webview-ui/src/components/ui/button-pear-scn.tsx b/webview-ui/src/components/ui/button-pear-scn.tsx new file mode 100644 index 00000000000..7eefac7ab93 --- /dev/null +++ b/webview-ui/src/components/ui/button-pear-scn.tsx @@ -0,0 +1,48 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex hover:cursor-pointer items-center justify-center border-none whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 bg-transparent", + { + variants: { + variant: { + default: "bg-button text-button-foreground shadow hover:bg-button/90", + destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: "border border-input bg-background shadow-sm hover:opacity-80 text-foreground", + secondary: "bg-input text-input-foreground shadow-sm hover:bg-input/80", + ghost: "hover:bg-input text-foreground", + link: "text-primary underline-offset-4 hover:underline", + animated: "bg-input text-foreground transition-all duration-200 text-[0.9rem] hover:-translate-y-[1px]", + }, + size: { + default: "h-9 rounded-lg px-4 py-2", + sm: "h-8 rounded-lg px-3 text-xs", + lg: "h-10 rounded-lg px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return + }, +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/webview-ui/src/components/ui/index.ts b/webview-ui/src/components/ui/index.ts index 1a2456a72fb..679a9e188e0 100644 --- a/webview-ui/src/components/ui/index.ts +++ b/webview-ui/src/components/ui/index.ts @@ -15,3 +15,4 @@ export * from "./select-dropdown" export * from "./select" export * from "./textarea" export * from "./tooltip" +export * from "./pearaiindex" diff --git a/webview-ui/src/components/ui/pearaiindex.tsx b/webview-ui/src/components/ui/pearaiindex.tsx new file mode 100644 index 00000000000..2ff5b679e43 --- /dev/null +++ b/webview-ui/src/components/ui/pearaiindex.tsx @@ -0,0 +1,364 @@ +import { Tooltip } from "react-tooltip" +import styled, { keyframes } from "styled-components" + +const FONT_SIZE = 13 +export const getFontSize = () => { + return FONT_SIZE +} + +export const VSC_INPUT_BACKGROUND_VAR = "--vscode-input-background" +export const VSC_BACKGROUND_VAR = "--vscode-sideBar-background" +export const VSC_FOREGROUND_VAR = "--vscode-editor-foreground" +export const VSC_BUTTON_BACKGROUND_VAR = "--vscode-button-background" +export const VSC_BUTTON_FOREGROUND_VAR = "--vscode-button-foreground" +export const VSC_EDITOR_BACKGROUND_VAR = "--vscode-editor-background" +export const VSC_LIST_SELECTION_BACKGROUND_VAR = "--vscode-list-activeSelectionBackground" +export const VSC_FOCUS_BORDER = "--vscode-focus-border" +export const VSC_LIST_ACTIVE_FOREGROUND_VAR = "--vscode-quickInputList-focusForeground" +export const VSC_QUICK_INPUT_BACKGROUND_VAR = "--vscode-quickInput-background" +export const VSC_INPUT_BORDER_VAR = "--vscode-input-border" +export const VSC_INPUT_BORDER_FOCUS_VAR = "--vscode-focusBorder" +export const VSC_BADGE_BACKGROUND_VAR = "--vscode-badge-background" +export const VSC_BADGE_FOREGROUND_VAR = "--vscode-badge-foreground" +export const VSC_SIDEBAR_BORDER_VAR = "--vscode-sideBar-border" + +export const VSC_THEME_COLOR_VARS = [ + VSC_INPUT_BACKGROUND_VAR, + VSC_BACKGROUND_VAR, + VSC_FOREGROUND_VAR, + VSC_BUTTON_BACKGROUND_VAR, + VSC_BUTTON_FOREGROUND_VAR, + VSC_EDITOR_BACKGROUND_VAR, + VSC_LIST_SELECTION_BACKGROUND_VAR, + VSC_FOCUS_BORDER, + VSC_LIST_ACTIVE_FOREGROUND_VAR, + VSC_QUICK_INPUT_BACKGROUND_VAR, + VSC_INPUT_BORDER_VAR, + VSC_INPUT_BORDER_FOCUS_VAR, + VSC_BADGE_BACKGROUND_VAR, + VSC_SIDEBAR_BORDER_VAR, + VSC_BADGE_FOREGROUND_VAR, +] + +export const defaultBorderRadius = "8px" +export const lightGray = "#999998" +export const greenButtonColor = "#189e72" + +export const vscInputBackground = `var(${VSC_INPUT_BACKGROUND_VAR}, rgb(45 45 45))` +export const vscQuickInputBackground = `var(${VSC_QUICK_INPUT_BACKGROUND_VAR}, ${VSC_INPUT_BACKGROUND_VAR}, rgb(45 45 45))` +export const vscBackground = `var(${VSC_BACKGROUND_VAR}, rgb(30 30 30))` +export const vscForeground = `var(${VSC_FOREGROUND_VAR}, #fff)` +export const vscButtonBackground = `var(${VSC_BUTTON_BACKGROUND_VAR}, #1bbe84)` +export const vscButtonForeground = `var(${VSC_BUTTON_FOREGROUND_VAR}, #ffffff)` +export const vscEditorBackground = `var(${VSC_EDITOR_BACKGROUND_VAR}, ${VSC_BACKGROUND_VAR}, rgb(30 30 30))` +export const vscListActiveBackground = `var(${VSC_LIST_SELECTION_BACKGROUND_VAR}, #1bbe84)` +export const vscFocusBorder = `var(${VSC_FOCUS_BORDER}, #1bbe84)` +export const vscListActiveForeground = `var(${VSC_LIST_ACTIVE_FOREGROUND_VAR}, ${VSC_FOREGROUND_VAR})` +export const vscInputBorder = `var(${VSC_INPUT_BORDER_VAR}, ${lightGray})` +export const vscInputBorderFocus = `var(${VSC_INPUT_BORDER_FOCUS_VAR}, ${lightGray})` +export const vscBadgeBackground = `var(${VSC_BADGE_BACKGROUND_VAR}, #1bbe84)` +export const vscBadgeForeground = `var(${VSC_BADGE_FOREGROUND_VAR}, #fff)` +export const vscSidebarBorder = `var(${VSC_SIDEBAR_BORDER_VAR}, transparent)` + +// cececd + +if (typeof document !== "undefined") { + for (const colorVar of VSC_THEME_COLOR_VARS) { + // Remove alpha channel from colors + const value = getComputedStyle(document.documentElement).getPropertyValue(colorVar) + if (colorVar.startsWith("#") && value.length > 7) { + document.body.style.setProperty(colorVar, value.slice(0, 7)) + } + } +} + +export function parseHexColor(hexColor: string): { + r: number + g: number + b: number +} { + if (hexColor.startsWith("#")) { + hexColor = hexColor.slice(1) + } + + if (hexColor.length > 6) { + hexColor = hexColor.slice(0, 6) + } + + const r = parseInt(hexColor.substring(0, 2), 16) + const g = parseInt(hexColor.substring(2, 4), 16) + const b = parseInt(hexColor.substring(4, 6), 16) + + return { r, g, b } +} + +export function parseColorForHex(colorVar: string): string { + const value = getComputedStyle(document.documentElement).getPropertyValue(colorVar) + if (value.startsWith("#")) { + return value.slice(0, 7) + } + + // Parse rgb + const rgb = value + .slice(4, -1) + .split(",") + .map((x) => parseInt(x, 10)) + let hex = + "#" + + rgb + .map((x) => x.toString(16)) + .map((x) => (x.length === 1 ? "0" + x : x)) + .join("") + return hex +} + +export const PrimaryActionButton = styled.button` + padding: 10px 12px; + margin: 8px 0; + border-radius: ${defaultBorderRadius}; + + border: none; + color: ${vscForeground}; + background-color: ${vscButtonBackground}; + + &:disabled { + color: gray; + } + + &:hover:enabled { + cursor: pointer; + filter: brightness(1.2); + } +` + +export const SecondaryButton = styled.button` + padding: 10px 12px; + margin: 8px 0; + border-radius: ${defaultBorderRadius}; + + border: 1px solid ${vscInputBorder}; + color: ${vscForeground}; + background-color: ${vscBackground}; + + &:disabled { + color: gray; + } + + &:hover:enabled { + cursor: pointer; + background-color: ${vscInputBackground}; + } +` + +export const CustomScrollbarDiv = styled.div` + scrollbar-base-color: transparent; + scrollbar-width: thin; + background-color: ${vscBackground}; + + & * { + ::-webkit-scrollbar { + width: 4px; + } + + ::-webkit-scrollbar:horizontal { + height: 4px; + } + + ::-webkit-scrollbar-thumb { + border-radius: 2px; + } + } +` + +const TooltipStyles = { + fontSize: `${FONT_SIZE - 2}px`, + backgroundColor: vscInputBackground, + boxShadow: `0px 0px 2px 1px ${vscBadgeBackground}`, + color: vscForeground, + padding: "2px 6px", + zIndex: 1000, + maxWidth: "80vw", + + textAlign: "center", + overflow: "hidden", +} + +export function StyledTooltip(props: any) { + return +} + +export const TextArea = styled.textarea` + padding: 8px; + font-family: inherit; + border-radius: ${defaultBorderRadius}; + margin: 16px auto; + height: auto; + width: calc(100% - 32px); + background-color: ${vscInputBackground}; + color: ${vscForeground}; + z-index: 1; + border: 1px solid transparent; + + resize: vertical; + + &:focus { + outline: 1px solid ${lightGray}; + border: 1px solid transparent; + } + + &::placeholder { + color: ${lightGray}80; + } +` + +export const Pre = styled.pre` + border-radius: ${defaultBorderRadius}; + padding: 8px; + max-height: 150px; + overflow-y: scroll; + margin: 0; + background-color: ${vscBackground}; + border: none; + + /* text wrapping */ + white-space: pre-wrap; /* Since CSS 2.1 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +` + +export const H3 = styled.h3` + background-color: ${vscInputBackground}; + border-radius: ${defaultBorderRadius}; + padding: 4px 8px; + width: fit-content; +` + +export const Hr = styled.hr` + border: 0.5px solid ${lightGray}; +` + +export const HelperText = styled.p` + margin-top: 2.5px; + font-size: ${FONT_SIZE - 2}px; + color: ${lightGray}; +` + +export const pearInput = styled.input` + width: 100%; + padding: 8px 12px; + margin: 8px 0; + box-sizing: border-box; + border-radius: ${defaultBorderRadius}; + outline: 1px solid ${lightGray}; + border: none; + background-color: ${vscBackground}; + color: ${vscForeground}; + + &:focus { + background: ${vscInputBackground}; + outline: 1px solid ${vscFocusBorder}; + } + + &:invalid { + outline: 1px solid red; + } +` + +export const NumberInput = styled.input.attrs({ type: "number" })` + padding: 8px 12px; + margin: 8px 4px; + box-sizing: border-box; + border-radius: ${defaultBorderRadius}; + outline: 1px solid ${lightGray}; + border: none; + background-color: ${vscBackground}; + color: ${vscForeground}; + + &:focus { + background: ${vscInputBackground}; + } +` + +// export const Select = styled.select` +// padding: 8px 12px; +// margin: 8px 0; +// box-sizing: border-box; +// border-radius: ${defaultBorderRadius}; +// outline: 1px solid ${lightGray}; +// border: none; +// background-color: ${vscBackground}; +// color: ${vscForeground}; +// ` + +export const Label = styled.label<{ fontSize?: number }>` + font-size: ${(props) => props.fontSize || FONT_SIZE}px; +` + +const spin = keyframes` + from { + -webkit-transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + } +` + +export const Loader = styled.div` + border: 4px solid transparent; + border-radius: 50%; + border-top: 4px solid white; + width: 36px; + height: 36px; + -webkit-animation: ${spin} 1s ease-in-out infinite; + animation: ${spin} 1s ease-in-out infinite; + margin: auto; +` + +export const MainContainerWithBorder = styled.div<{ borderWidth?: string }>` + border-radius: ${defaultBorderRadius}; + padding: ${(props) => props.borderWidth || "1px"}; + background-color: white; +` + +export const appear = keyframes` + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0px); + } +` + +export const HeaderButton = styled.button<{ + inverted: boolean | undefined + backgroundColor?: string + hoverBackgroundColor?: string +}>` + background-color: ${({ inverted, backgroundColor }) => { + return backgroundColor ?? (inverted ? vscForeground : "transparent") + }}; + color: ${({ inverted }) => (inverted ? vscBackground : vscForeground)}; + + border: none; + border-radius: 4px; + cursor: ${({ disabled }) => (disabled ? "default" : "pointer")}; + + &:focus { + outline: none; + border: none; + } + + &:hover { + background-color: ${({ inverted, hoverBackgroundColor }) => + typeof inverted === "undefined" || inverted ? (hoverBackgroundColor ?? vscInputBackground) : "transparent"}; + } + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + padding: 2px; +` diff --git a/webview-ui/src/components/ui/tail.tsx b/webview-ui/src/components/ui/tail.tsx new file mode 100644 index 00000000000..6f69cf1c254 --- /dev/null +++ b/webview-ui/src/components/ui/tail.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import { cn } from "../../lib/utils" +import { vscEditorBackground } from "." + +interface TailProps extends React.HTMLAttributes { + className?: string +} + +const Tail = React.forwardRef(({ className, ...props }, ref) => { + return ( +
+ {/* sdfasdf */} + + + +
+ ) +}) + +const Tail2 = React.forwardRef(({ className, ...props }, ref) => { + return ( +
+ + + +
+ ) +}) + +Tail.displayName = "Tail" +Tail2.displayName = "Tail2" + +export { Tail, Tail2 } diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 389592fa27f..74fa58f6416 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -1,7 +1,20 @@ import React, { createContext, useCallback, useContext, useEffect, useState } from "react" import { useEvent } from "react-use" import { ApiConfigMeta, ExtensionMessage, ExtensionState } from "../../../src/shared/ExtensionMessage" -import { ApiConfiguration } from "../../../src/shared/api" +import { + ApiConfiguration, + ModelInfo, + glamaDefaultModelId, + glamaDefaultModelInfo, + openRouterDefaultModelId, + openRouterDefaultModelInfo, + unboundDefaultModelId, + unboundDefaultModelInfo, + requestyDefaultModelId, + requestyDefaultModelInfo, + PEARAI_URL, + pearAiModels, +} from "../../../src/shared/api" import { vscode } from "../utils/vscode" import { convertTextMateToHljs } from "../utils/textMateToHljs" import { findLastIndex } from "../../../src/shared/array" @@ -119,6 +132,12 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode taskHistory: [], shouldShowAnnouncement: false, allowedCommands: [], + alwaysAllowReadOnly: true, + alwaysAllowWrite: true, + alwaysAllowExecute: true, + alwaysAllowBrowser: true, + alwaysAllowMcp: true, + alwaysAllowModeSwitch: true, soundEnabled: false, soundVolume: 0.5, ttsEnabled: false, @@ -136,7 +155,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode terminalShellIntegrationTimeout: 4000, mcpEnabled: true, enableMcpServerCreation: true, - alwaysApproveResubmit: false, + alwaysApproveResubmit: true, requestDelaySeconds: 5, rateLimitSeconds: 0, // Minimum time between successive requests (0 = disabled) currentApiConfigName: "default", @@ -146,7 +165,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode customSupportPrompts: {}, experiments: experimentDefault, enhancementApiConfigId: "", - autoApprovalEnabled: false, + autoApprovalEnabled: true, customModes: [], maxOpenTabsContext: 20, maxWorkspaceFiles: 200, @@ -177,8 +196,25 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode switch (message.type) { case "state": { const newState = message.state! + setState((prevState) => ({ + ...prevState, + ...newState, + })) + const config = newState.apiConfiguration + const hasKey = checkExistKey(config) + if (!hasKey && (!config || config.apiProvider !== "pearai")) { + vscode.postMessage({ + type: "apiConfiguration", + apiConfiguration: { + apiProvider: "pearai", + pearaiBaseUrl: PEARAI_URL, + pearaiModelId: "pearai-model", + pearaiModelInfo: pearAiModels["pearai-model"], + }, + }) + } + setShowWelcome(false) setState((prevState) => mergeExtensionState(prevState, newState)) - setShowWelcome(!checkExistKey(newState.apiConfiguration)) setDidHydrateState(true) break } diff --git a/webview-ui/src/hooks/usePearAiModels.ts b/webview-ui/src/hooks/usePearAiModels.ts new file mode 100644 index 00000000000..7974f693597 --- /dev/null +++ b/webview-ui/src/hooks/usePearAiModels.ts @@ -0,0 +1,32 @@ +import { useState, useEffect } from "react" +import { ModelInfo, pearAiDefaultModelId, pearAiDefaultModelInfo, PEARAI_URL } from "../../../src/shared/api" +import type { ApiConfiguration } from "../../../src/shared/api" + +export const usePearAiModels = (apiConfiguration?: ApiConfiguration) => { + const [pearAiModels, setPearAiModels] = useState>({ + [pearAiDefaultModelId]: pearAiDefaultModelInfo, + }) + + useEffect(() => { + const fetchPearAiModels = async () => { + try { + const res = await fetch(`${PEARAI_URL}/getPearAIAgentModels`) + if (!res.ok) throw new Error("Failed to fetch models") + const config = await res.json() + + if (config.models && Object.keys(config.models).length > 0) { + console.log("Models successfully loaded from server") + setPearAiModels(config.models) + } + } catch (error) { + console.error("Error fetching PearAI models:", error) + } + } + + if (apiConfiguration?.apiProvider === "pearai") { + fetchPearAiModels() + } + }, [apiConfiguration?.apiProvider]) + + return pearAiModels +} diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index dbc5712d697..61e08462e3a 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -1,5 +1,5 @@ { - "greeting": "What can Roo do for you?", + "greeting": "What can PearAI Agent do for you?", "task": { "title": "Task", "seeMore": "See more", @@ -104,44 +104,44 @@ "current": "Current" }, "fileOperations": { - "wantsToRead": "Roo wants to read this file:", - "didRead": "Roo read this file:", - "wantsToEdit": "Roo wants to edit this file:", - "wantsToCreate": "Roo wants to create a new file:" + "wantsToRead": "PearAI Agent wantsto read this file:", + "didRead": "PearAI Agent read this file:", + "wantsToEdit": "PearAI Agent wantsto edit this file:", + "wantsToCreate": "PearAI Agent wantsto create a new file:" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo wants to view the top level files in this directory:", - "didViewTopLevel": "Roo viewed the top level files in this directory:", - "wantsToViewRecursive": "Roo wants to recursively view all files in this directory:", - "didViewRecursive": "Roo recursively viewed all files in this directory:", - "wantsToViewDefinitions": "Roo wants to view source code definition names used in this directory:", - "didViewDefinitions": "Roo viewed source code definition names used in this directory:", - "wantsToSearch": "Roo wants to search this directory for {{regex}}:", - "didSearch": "Roo searched this directory for {{regex}}:" + "wantsToViewTopLevel": "PearAI Agent wantsto view the top level files in this directory:", + "didViewTopLevel": "PearAI Agent viewed the top level files in this directory:", + "wantsToViewRecursive": "PearAI Agent wantsto recursively view all files in this directory:", + "didViewRecursive": "PearAI Agent recursively viewed all files in this directory:", + "wantsToViewDefinitions": "PearAI Agent wantsto view source code definition names used in this directory:", + "didViewDefinitions": "PearAI Agent viewed source code definition names used in this directory:", + "wantsToSearch": "PearAI Agent wantsto search this directory for {{regex}}:", + "didSearch": "PearAI Agent searched this directory for {{regex}}:" }, "commandOutput": "Command Output", "response": "Response", "arguments": "Arguments", "mcp": { - "wantsToUseTool": "Roo wants to use a tool on the {{serverName}} MCP server:", - "wantsToAccessResource": "Roo wants to access a resource on the {{serverName}} MCP server:" + "wantsToUseTool": "PearAI Agent wantsto use a tool on the {{serverName}} MCP server:", + "wantsToAccessResource": "PearAI Agent wantsto access a resource on the {{serverName}} MCP server:" }, "modes": { - "wantsToSwitch": "Roo wants to switch to {{mode}} mode", - "wantsToSwitchWithReason": "Roo wants to switch to {{mode}} mode because: {{reason}}", - "didSwitch": "Roo switched to {{mode}} mode", - "didSwitchWithReason": "Roo switched to {{mode}} mode because: {{reason}}" + "wantsToSwitch": "PearAI Agent wantsto switch to {{mode}} mode", + "wantsToSwitchWithReason": "PearAI Agent wantsto switch to {{mode}} mode because: {{reason}}", + "didSwitch": "PearAI Agent switched to {{mode}} mode", + "didSwitchWithReason": "PearAI Agent switched to {{mode}} mode because: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo wants to create a new subtask in {{mode}} mode:", - "wantsToFinish": "Roo wants to finish this subtask" + "wantsToCreate": "PearAI Agent wantsto create a new subtask in {{mode}} mode:", + "wantsToFinish": "PearAI Agent wantsto finish this subtask" }, "questions": { - "hasQuestion": "Roo has a question:" + "hasQuestion": "PearAI Agent has a question:" }, "taskCompleted": "Task Completed", "error": "Error", - "troubleMessage": "Roo is having trouble...", + "troubleMessage": "PearAI Agent is having trouble...", "shellIntegration": { "unavailable": "Shell Integration Unavailable", "troubleshooting": "Still having trouble?" @@ -152,7 +152,7 @@ "autoApprove": { "title": "Auto-approve:", "none": "None", - "description": "Auto-approve allows Roo Code to perform actions without asking for permission. Only enable for actions you fully trust.", + "description": "Auto-approve allows PearAI Agent to perform actions without asking for permission. Only enable for actions you fully trust.", "actions": { "readFiles": { "label": "Read files and directories", @@ -197,8 +197,8 @@ } }, "announcement": { - "title": "🎉 Roo Code 3.10 Released", - "description": "Roo Code 3.10 brings powerful productivity enhancements!", + "title": "🎉 PearAI Agent Code 3.10 Released", + "description": "PearAI Agent Code 3.10 brings powerful productivity enhancements!", "whatsNew": "What's New", "feature1": "Suggested responses to questions", "feature2": "Improved large file handling", @@ -213,7 +213,7 @@ "seconds": "{{count}}s" }, "browser": { - "rooWantsToUse": "Roo wants to use the browser:", + "rooWantsToUse": "PearAI Agent wantsto use the browser:", "consoleLogs": "Console Logs", "noNewLogs": "(No new logs)", "screenshot": "Browser screenshot",