diff --git a/CHANGELOG.md b/CHANGELOG.md index a17950ff594..c381bd3e6f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,60 @@ # Roo Code Changelog +## [3.28.8] - 2025-09-25 + +![3.28.8 Release - Bug fixes and improvements](/releases/3.28.8-release.png) + +- Fix: Resolve frequent "No tool used" errors by clarifying tool-use rules (thanks @hannesrudolph!) +- Fix: Include initial ask in condense summarization (thanks @hannesrudolph!) +- Add support for more free models in the Roo provider (thanks @mrubens!) +- Show cloud switcher and option to add a team when logged in (thanks @mrubens!) +- Add Opengraph image for web (thanks @brunobergher!) + +## [3.28.7] - 2025-09-23 + +![3.28.7 Release - Hidden Thinking](/releases/3.28.7-release.png) + +- UX: Collapse thinking blocks by default with UI settings to always show them (thanks @brunobergher!) +- Fix: Resolve checkpoint restore popover positioning issue (#8219 by @NaccOll, PR by @app/roomote) +- Add cloud account switcher functionality (thanks @mrubens!) +- Add support for zai-org/GLM-4.5-turbo model in Chutes provider (#8155 by @mugnimaestra, PR by @app/roomote) + +## [3.28.6] - 2025-09-23 + +![3.28.6 Release - Kangaroo studying ancient codex](/releases/3.28.6-release.png) + +- Feat: Add GPT-5-Codex model (thanks @daniel-lxs!) +- Feat: Add keyboard shortcut for toggling auto-approve (Cmd/Ctrl+Alt+A) (thanks @brunobergher!) +- Fix: Improve reasoning block formatting for better readability (thanks @daniel-lxs!) +- Fix: Respect Ollama Modelfile num_ctx configuration (#7797 by @hannesrudolph, PR by @app/roomote) +- Fix: Prevent checkpoint text from wrapping in non-English languages (#8206 by @NaccOll, PR by @app/roomote) +- Remove language selection and word wrap toggle from CodeBlock (thanks @mrubens!) +- Feat: Add package.nls.json checking to find-missing-translations script (thanks @app/roomote!) +- Fix: Bare metal evals fixes (thanks @cte!) +- Fix: Follow-up questions should trigger the "interactive" state (thanks @cte!) + +## [3.28.5] - 2025-09-20 + +![3.28.5 Release - Kangaroo staying hydrated](/releases/3.28.5-release.png) + +- Fix: Resolve duplicate rehydrate during reasoning; centralize rehydrate and preserve cancel metadata (#8153 by @hannesrudolph, PR by @hannesrudolph) +- Add an announcement for Supernova (thanks @mrubens!) +- Wrap code blocks by default for improved readability (thanks @mrubens!) +- Fix: Support dash prefix in parseMarkdownChecklist for todo lists (#8054 by @NaccOll, PR by app/roomote) +- Fix: Apply tiered pricing for Gemini models via Vertex AI (#8017 by @ikumi3, PR by app/roomote) +- Update SambaNova models to latest versions (thanks @snova-jorgep!) +- Update privacy policy to allow occasional emails (thanks @jdilla1277!) + +## [3.28.4] - 2025-09-19 + +![3.28.4 Release - Supernova Discovery](/releases/3.28.4-release.png) + +- UX: Redesigned Message Feed (thanks @brunobergher!) +- UX: Responsive Auto-Approve (thanks @brunobergher!) +- Add telemetry retry queue for network resilience (thanks @daniel-lxs!) +- Fix: Transform keybindings in nightly build to fix command+y shortcut (thanks @app/roomote!) +- New code-supernova stealth model in the Roo Code Cloud provider (thanks @mrubens!) + ## [3.28.3] - 2025-09-16 ![3.28.3 Release - UI/UX Improvements and Bug Fixes](/releases/3.28.3-release.png) diff --git a/apps/web-evals/package.json b/apps/web-evals/package.json index 869355100f5..37740163323 100644 --- a/apps/web-evals/package.json +++ b/apps/web-evals/package.json @@ -5,10 +5,10 @@ "scripts": { "lint": "next lint --max-warnings 0", "check-types": "tsc -b", - "dev": "scripts/check-services.sh && next dev", + "dev": "scripts/check-services.sh && next dev -p 3446", "format": "prettier --write src", "build": "next build", - "start": "next start", + "start": "next start -p 3446", "clean": "rimraf tsconfig.tsbuildinfo .next .turbo" }, "dependencies": { diff --git a/apps/web-roo-code/public/Roo-Code-Logo-Horiz-blk.svg b/apps/web-roo-code/public/Roo-Code-Logo-Horiz-blk.svg index 5be021c28f8..d89abdb5861 100644 --- a/apps/web-roo-code/public/Roo-Code-Logo-Horiz-blk.svg +++ b/apps/web-roo-code/public/Roo-Code-Logo-Horiz-blk.svg @@ -1,2971 +1,10 @@ - - - - - - - - - - - - - - - - - - - - - - - -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 -zeDcL/Ic9DuIeh8GL23GAc/ZRJeD9tJn+GYCBXeNNgttpc/vndQJtnsg9Wycwzp7B1HPvvnO+Zk+ -uHrGD64u2jzsSqDe7pCkYDcoMvDG+dbZMoBtswtcLzvjwOFF7+bOELrRWbdexrUYNPANE774FoMG -fpeBmZWFwfydaWfCbFyYPbVtNu6P8bSxDtxMGxYTyDZmkxjHtQHTyS93aGUxemza7NtNxvvYBk6G -QQMv87rAazAMWTmuWBavK+YiN4vxjmED1wBhAh/z+sri2WQxfWtaGcI2rkxhG3fGsG2WOWTburxx -tfyHgXHtBQzch2lwaRvr4KJWJuaCJo9l03yHrBtNlnWjyVzWth043WED72Dhi9MbNNhsqHO2tLSq -sJgcoO2hXWDC4qpiqmLCYuJ6q5momKy0mLi0qphuKqyuLSopJiomKqafI1YzhfUOFtjU4PrYLjTI -yVAzVTEliMrJY9vTQ9M6uMvSmqLK4nDVpYU11XXVtSWVQ8eUpUXFxUTVtXXnxVS1h0bGtFb3lSPn -tOVwoLqaosLC6uqq0sqa6qrKuprq2rrKwsKi0+qq4srq4mB11bVFlWWldXWFRWVlVUVlNWVVVUXF -NUXFtUWlRcV1ZWW1tWW1tWW11YW1tbWVtUXX1WWVdWXFpWU1ZbVlRWW1NbXVRbU1dXVFtTVlRXd1 -dWVlRdeVZaV1ldV1RceV1WW1pdVlhWVhiuqKDstqS8tqy4rrauoqi+uKSlaQ05ZjoSrrKgsryyoL -yyqrq6stx8IW1tWUFRaV1tZUVdaVlZXW1RWW1QWmqr51VcVFdVWlldXVNVW1VVVlpWVVpbWFxaVl -RcU1ZWWlpZXFNWVFhSVlxZXVRTWFpWV11TWFhaWFpZVlZYWlpaV1pXXFZcVl1YVlpaWlpaWVpaXV -NaWlRbWlpaW1pbWlVbU1taW1pUVVxbWFNbWlZbWlxUWFdXWVxaVVxaWlZWU1VcWlxaXVNbVFtaWl -hdWFVTW1NaWlRYUlpaWlxaWlpaWlpZWltTVFlaW1lbU1haVFRXU1VYWlRYV1pZXF1XWlRYWltYWl -ZZWF1ZU1xbWllbVFtTVVpZXVlTWllbW1NZWVlYVlNVW1pTVFhYWVFWMSF7KQ8wP+rah4ghwljsNx -OAyP4S8chsvwGW7DbzgOr+EwPIbDcBie5S78hb/wGh7DYTgMh+ExfIbTcB3Ow5mWnl4E4b6AWMNg -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 -36l7LACMhC26wX2xWEeFRGhGYT6gZ/W+ZLvpIOHQeo9xa+HtHy+tVvVVlIPB52TPA+Z5Zv3fJRkJ -0WY07G+D3bJ7n/RkiTm9olrhYPbU5aLRABEiKkkWVWLLqIIl9h/qGY2Bys+M/hjgTqcEcNP4Ptf3 -QX2FIHVuykkC6pH77SlQzYxe2zmBRwzAtxru3AwF2BI5XJifoAX7ceG443vwJ3mB3L8mSqh+YrBY -QatdqEVTMCBUQNDb+QIkVZwVOJhgFjP2Te9ExIrAotbqMldPM7wsAZp+qjulo9KW7ceaS6stwJiS -3DTrCNiqs7g6pLIFLTW5FmY+C+SRWgG2qDa2wIN8sizD8fOyt77aDyaEx019Qw20HV7Ma4TxTqx7 -5ngzEZ8alAllQ+e+LgJxxQeN5YhtQkMUhjXkbuGQU6/erOgbBlYjt1Le7uWVW5H/rTFsjx3MRQ/m -l0RhvkJGJ2f1YnG0MXMMJEyUShlADsl31CS6Lpwkoqs2sG8YS/vLYDaojZrZR4ffXkVflW8o1QiR -BZw+gk+5VBMpllpmgmZUuGwUACAVKaxn/zvjudHRfoJgd26ElAOf2q8xwpReFkKMIzWffwJ5cosX -781tn44fBTji2K94ik8QdxVFCSf/4Ha4Rsczg3jTjrgLdEWM6JtgO/fyCRmjesiyC5d6m7Jat9oc -k8YuQNe5Mplv8rcP/TM6lKNEFdcJSvgCedK/5FHmvlGzLNLeNg4TC9QJAHQKo2Q0MThiN2I4LTJm -ODYxLTgyYTMtN2FiZWI3ZDdhZGJhNDdhNDFmYjEtZTAwOS00Y2Y0LWI0YTQtZWEwZGY0OGQ4YzMw -OTY1IDYyOC4yNTI2NWQ2MzEyNTUtNWIyYy00M2ExLTlkYzMtZTI1YzEyZjU2NTg5N2QzOGI0Y2Ut -NjZkYS00ZjUzLThjOWMtNjBlNGE0MzkwNzE3ODEzNDYyMTI1MjM3MTMtIEEFCyEjPO96FKv95uog -w4G/Wf15XtgjZ9tO1TgR2uZEgm+nCG5o4Rog9AIVjxM6ySPWqUIqo3KFkgPN2g0ME9AF6cJIxiIR -4pMSmN/OoduEE96cntd3jaLGndrQsUYFeIJzisKLWTMa/81DoG5gYRogPrBwFgb8Nz8AXhIxojfZ -4n8z8rKlF134+h0EXWADLKQAKluwEDWAN2kDMzADMzADMwAAdVsjSxtbSrez7Wnl7sMbBoaosHjh -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 -16m18npfeSsuXscv79s8bZU43nnFS3veG33WzD11l/OKOTut0n6k18qP9F4V13JG2pR6dcfS3e2s -Wb77VZ08BUL6Mi2Eq8wyy+ldbWZLvzLHfEWvMCxzvWKtk1qZr5f2wrIvi2W/tBU2pa1OWObKVGHV -Jtqu2MqPGfu18i97W87rTtmWRjup9DjpVZFcTpfzirh+xrKp9Cvirv3yPsXsxI6n7GtljrQ6bjmn -SONI30aqSJJeWStSvqxTklPPOdZ5WYlvpNbWKmkodDGxd624emfG968q7V8VdmFV+rXv2ClWebHr -Ft+K3cdoTztxxYnNIE5sQyP2jgvLr0jXVW2ua7P0eVF7r8Qbe8U7+52+pO+Y/etW1lO0V3z3xx7f -TjfRp1z86hT/ilXin37b3zdYbo3PK37G/deFdeMqccb3ihVf8T/PTaxv57TxMY7tduZ5VR+xr+h+ -RZwrrNrEG/1KPCssNlallU2vxPO6fn6FnWpXH7GpPyoD5YGq0yrplH+dKM6z4ttPXz6+IrZPX1Is -H9eZqfdf0X6FYRhf0d6MhVttrjNfv6LnucEXvjB8XdFe1SbiaCOO1+WNGFec2JsKqzbRxhxzjrba -xBzzla+Yrbz5ivNeV7TVKeYrYluhgR63EXFal4Gy9SzrlZdWO+XN7rRf0mvi6/u6GP7KVGH3Za6N -c4VFaul/S7/ifCw95/enc95sG0t/PDHqV5xzuvyvTpHO7FPWK86eJ+8BYxtsszltsA0mskRWhWEi -C8NEVrURWRi3yBJZVWqhR/4kU6YjavM1tZqvOUn0qrXia9ZLmpSk0ayaWjOV5ue+SLRHF8Ymer3p -8zWvvdnd5AMAAAAAMC922zPmjwii22qDVZtqU2HVBttgG2yDyfdbr8VkzjJfjFWbOV+2V1i7u7vN -FVZtKrUVSzvvt7wVdl9ijCus2sTsXW2cZmrlfCxnhbWktdo8ZcXzKZXtf3qs2tiryr8qzJ9SnKd0 -7NJbOnbdrrCMq6xXtbm0tpV0VpqnpKeX9DJhWOaLYovxVW2ulffkk8qLTRW2qTbvkd47rcuf8v3C -6OwNxTJn7/+Lc6145lwbv6XfsmP22TKDogaahKikMfg0cFSxRS9MZSJERiKyNBqPyBJZIktkiSxK -RxqRJbI+KjzD44syN8rAjYNCbdymQ7oN08JPY9BBNIVDZImsKkNkhYDZRGwQgACkPDGP7KwkWm+P -SKPLlkj5crf0ItlSvWx9UoaxNm+2I9NoatR0dcmUXd9OL9eq6aqj7s+jl4isBw6RJbIEIAAAAAAA -ABCAAL5dhDv2jD8jgvg138uAyGqQfR+RJbJEFw6RVTHEEDCbsHhmzi29erVW9msipff+U69t5ePG -8Wn+p37pvY1vfdxX9Grxu9srb3XSRNv3Z0uMe/pbWu9TWa9o21JpK5Im3us5v2dbccT1Uupub6Z+ -6efaT3/K6tP6zPTe3PW2pLkxtv6U9sw+L67VYlkvtrZ+U1wfu0tq7/23s5/S+RZLd5qzxCd8mbBI -84W9nO5efcReOHGbR0owbsausFmdnNbP/V5v1zpxlR3fVozrvNh++1tsMZ63M50/rex58b/L71px -u7f/P87y+m+wbE8LXjUkTbuVtx1n9841N46Zdr5XnJ9v7u7qQxMdqzb42yWuMHxFK2++bK7tEl/V -CWONJn410lQljuixrV8SkcY1CEPhlxFliIxogMiqKqfPM2FAZDbtXYklrfR5JO0i9CgssdpUWMaq -TfXrqrCW96o29laKM5X2wk5V2ujVUZnYKQG8Esr7OFNOq8m4cZzXznn9ivPeriZi+3SnXmUcsSPO -7bLinjTT2njWa2+ds1Y6aa2U0llhcdbq1P3f/d/z0ive2f/VqWd/z57TfXbn7jndZ/e9Ys/pPm21 -s85Zq+bx5KBV+vX2I/1oL7eam6m9Ir4izdbnFa9Ir+oUvb36rJRW10hLr/h0evUr+hWrrRUW6xXt -dcVaTURq7Y3R3gqL9orWXhfLtrN+buzul9bbsiPO2TadF+PHjWvbfP+tV0lLnLZ5tDDjREyj9caq -TbQVdmW/Tvmvq8I8/j1F6zF/xYm9if+XrbBqE/+j/Sv+5zmn9Mtxzi/zXxV2VSf7X/qyTQy3kvZt -ZsQe20bqtuZssbVX7CfF9uuK9NoKqzZcbI/4r/arAQeWHbNXGQuVRhO7MtXaGpImfnv9K/6JI97b -OF57xf8ruuzqQxM7X7G9GmkqzMb2vq72K94r+rycXptzljn+rVbm7tieH0ef1Sne6LPixDZVm9yX -5gqL94off8Ya3WPulz2xahPdI/4r5pylbNwvc/x4ccb911Vh+KtTdL/wVx+xOdErMBPbq9TCpzHw -RJ0XhilNLW3f56PbNi6URVb19GXF1v4/Rvh5qAFEVmlLfTRulHWd6S2yAvd2vvbWthg7fUy7Ztuz -zlq/YseT4nmdXnrrU/z42y/Ua37v2/XO2th94ntxpe5+b673XjTx3ssn3pvx7P9arZ2y47Q93xvX -O7M3rvexvdXWiyZ6vVxILppo/yudj2//08/W//uxxTnbtn/RxP4ARY8TVERAAlWnUyokiV+BaHq2 -7GrvP7a45/WJrd956bzWes9LL59o88+K762Na988b/e1fqtT6f6yK515Ov1avy3+mXGtjf/rbJ+U -3rbZ4uk244p/5jyxxI9r49nTznq96dv52C+faK1Ta+3F7d2Oc9s6r2zc9vbM1DO1PrOtnm+l1OZ2 -7N4Tz2rvdYsntXfiKZvmav/tRRP9Xj5x4p/ZH3d2+pnWxxN7W0qddnXaduY66+N521580cScL59Y -fcpuWu23nY9pxj8zzvNvzyo75kuv+0UT6fTLJ046v9bGtnGldT6tXetf2j4zfirb1ovznDhnr/ct -tlf2W0zf85Q9L8a5c5724qeP8b//rP644tkve9pZb8W4b87vlbZbmz3jiyumba+tOXu+aGJfPhFX -n/Utburz4jkb953Zvvtjt04pdu9aKaaT+q0+Hdv2bjwzfZ/Uf3pTjO1b6vZzxtjepnNWSjP1iyZW -evnEb5d9M8b4v+e99v68tXZtWiu9F03sz/10Zoq7s1Naf2bcbn9WS+nlEy29Lpt2bTo902v/tj+d -Pf86vvnOSm32PG/2nDH2iyZOt/8XTfTrlwvJrX7RxGztfGvp/W6fna+ttOc7nt7zdm47MaXuTie2 -1mJrvz/TK+vPt7fWiybSbpybyo73aW3789ps6VtcZ57fjpvOWRvTnhj/7JwtdYpvtV3dYnr77d+m -lt6LJjr2yyfeOv++zBdb3F3tzZO2f/Y8raXXZr98YlP3x91Na53uPXO2fd1WxxXX2V3pX5/YfuOu -NlfPTpvWi7HLOf/yif8zS2r/q/98n05zvWiivV5xTys7ZvnX5mvf2lr/4nwrtbXnRRMvdZo/y+vd -uP3+t8VZdsz++Hbutm+nf3fLzpdPdGpxpV6v/+1/z9ZmfD1jv2095ys72nnRRPyXT7zz63y32DPO -9ud3xbgpvvi9zvnZb5Yd/dqLZX/Xb5u/K71oYp6XT5zZLxcS2vg//7UtO9J3Sx/fr/ftvX6zZ2w9 -CzvtI5twW7O9tq1j2dbpu22/n+I0PqmdufZXbGdXfPHEOGuwqZVadzz71nf8s2bc2Gunad/nP7vj -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 -WXU08EudsNsgASWPM0VAy2hgwqFQIwKFG+VPhaNM2G4L8Cxc7WAJRqNvrOszkYZuZhQ8mEADBbDl -HYzo8c4n3pE0ixCNCLPPx0JLdVu3dVu3fZMFgm7LcJ4A5KpwHPqyASg+K1se97HUZLcVsDIdh9S6 -eVHLlnNAA5D5WVksIgHtuFozK0ygyEMBdUKowr3buu2GVjUZhqjbRBQhAkfAFWIQEC2kIoKugzRj -ucEnEXm3iSASkXMoKxPoJYzGOZBg8WkLloD7DMbQTY+ZfqSQcCwV3ZaCmHRbtynYigGv27qt20IR -sMI5WBUJwsPp42oRgxWefGxWuHtqIYvo+ZNF3MAYND9jPTQ/QDNEYLch1BxafsAwsHkHRoN/HpGR -aFiK4MElTq5LiKK5us0E4epu+wQu3WbZqGYBaK6IWzKySbd1W4ACgUxGkrCe0QB/UhlZmUxrskjJ -NjGFhwrruCCFB7QgHgeh6gg8JZyqGFtQ+Bz08iRSOITnCTKUu0TXoX1+dUWn2xwopgvHkvoENpaP -JfQzigBmcKiLOgNlzJW6FJluo7kiLmtAYVCXrkwauIqMJPLFWBkMBNyM4zlsPADrNXIoLwsVZ6w4 -Vp6OnWoIMXkIkIAwOlBMF9ttJAOU6ONkw0My4vzHYWTL4zLDaMJZ2ksMQhLtkFwY9OPBQX7m4qJ6 -DqIzAiEMkJYbnArumOEh8Ga3VU4CFePBQih2qqEHg70eKFy3zWrdlIASWspEcCl1Qtd020eZG8pF -g09+ETCASMk2AjAECbHbUjQOgyZiyfjGDUr+SLJiy0OVIkGMWYeCByE4dAFda30r76z0zvzy4u2V -3XqllU5M75UWb63/x1+p51ul487WUjqb1im73c6K51fyU0y9ts9Kw/bfO6+dlHpLx1urcTO1GD+t -leZup97e9/51i+/M1itu7JO+pV2rvRTjm7FX5pz08c21M/6Kpfe9mc769tavPzHtxz7rpLc+vnPm -iSfF1jqt+Vral+ZqJ6W4vsUvve2k+CW1W2vizzZjm91Op/Y+ttm/1olvvfJzZdp2S5vambF1+dV7 -zupz/mf5udLI+NKvGUuvW6jiv7niSf1tW/tU1rmFGvndvl/pjvGc1TOduH5b6vd7drW0cf7as9o7 -7dunX7Fta50+df/bTt/6pfZxvrT/0kqtT5efba3VPVcajjHF885K26Wtc+Kv3pUGfWyxndTiW6d8 -314NPN12rjfPTO3TbH36le/T5s//uC+uTmd26ZP6X4oztrJmb1ttfdrU3s4Wt533zuny5/Zq0Pyd -Kw3v+/n+y58X+/Tv233fZ7WV0p63LaY120mpnbQzdXu7qd1eDUr9O+P6ttLA1OJqtxb9z7nW/N34 -ZmzzzPg+zfgzzrMlzo2/X99S3O7ZZb6VBsaPn3qeOG+vBrbYc86OaXYs8a00blO3PavEebtovGOc -85V+3+/cAkA1enPVZmz0hhFqTLwh2SBCjW50bURgbLpui8DYqNy3MADd1m0Yom7rum6TGZnMSHS3 -fRODj/PIlscxVHCFY8ifCkfxeWroga4ALgpFRKFQKJRZyUET4bptguq2yUTkgT3pNofJZEHiEJEQ -s9QCxgKFONB4WiKhUJkMw8JykaQkkUjKdCEw0G00U7d9Dh8JpFNc1TIewpEz5CjhZZERATFLvRdg -QYmxJhYosHvioeMSlwHYF3Mx+YiKUw8uGgomKWF2sUDAfZ4BwsVIELVuRSEQMq8AGpDJWhGbAwLv -q3MqngALKMxPZEFnkulMMhZCg4nSALUXEETtDoURoBp60hM+E8QDeh46LmP5MaXnhMK8w+eRs24L -SbT8LKzewOBEEi0gOqIxw4mqt7gooLkaozJJfVAhG2dDt3Vbt/lEBgZWWl7o8wKPRcsTUIMcmamw -gsitYEs8Iqts4XuRQm+lwhA9SGKnKSpsSBaOzBGImIFiQERmZF0LoCrCAjxaDhEvNN9RKCyig3Lj -vMiAiUCwIbzpQjEYtMNjn3s5IqqA/OK9RSQl3dZtlG7bxDoe1xCA4uNokQeXfK9VCeJFRMGdqx3I -HEkMBt1tGLTj6oJZYQI/SQCLiArgff4R67ZQhOrj5qtiwpmA8ABaSKIRwLr6iEblo+hSMAIjUrb8 -EsACatJnYozdJkpQkUTaCtWvKVCaRzGZPapn/AzQQDHlSQY20iDjG0My0QrDSTLupSSaGgw484Np -aDmH4fsx42ksxFgGTARuuBiEhz6h4LnbMHlJt3Vbt80qLY/jcP7jZgmjwjXAYh83ubhIOgKXaEmn -RjEeOB4vUWJV+bTDVybQANPQ8pkEx/WxiKnlXGY0TtDWbus27EmoQqDn1gIyB0UvCBxO9A2Gxg3M -HpMveESovuChkugMR4FMiGzopswRE4EMn9ePBaOIyXebIwMR+cS70AQKIJQDCEKDwp1jRRb5RMSW -n8aH60uvseWkAVTFyJmVJv/SREgixipBBJJCB/JlrMznARYV3dZtbSM4LRMOvFY7X8ObTPMcCvpg -YWKMog8W8d2mGR9MIMq1ShA/k4x8UMhhjJur8tFjTZoPgLHqGKvb6mrrtm4Lu605FqHHHQSg+Dgp -Q7DYxw04IpTTB6GKL1YtQJtgYknENIuKAblgBCLUZhM+YIL4NEh0kN8whpt36Nhp+3Rbt3WbpNtE -cfJxByjRx8kqLY8DWYTewcahwj2GMuECSJ9OiDD9OLJUuHsUOAXhCBQfHiBctjAAagxKhTvGRPv0 -FwF9t3VbJgNLdduDJgNFAxKrpnk8QLyqAgWrpumEjG/8VO+i6bbPw+ElRsCMyRtoupjocFxK4owU -IYkBXjARKKGxzz8BLijGg4OCOy60uq3bYppu67ZIh3KJ/ElGJeYLJ2oC3RZWR+Yc/GiFgTiChGhy -YRQ2BZ/LobFoMiAWBtHF9SIr1PEYKEeghyHG2W0azMA4ZwGXkvhShRRjyGUT/rC40ASkpF/dKpNy -8GRSjvGNY0m0wkAEOL06GCxLgAyoMxXR46WJ5yXWPATe5BwTkiiTwUTgo1QB4WJEnPzn4qHjCqIZ -woPByDl0JDKyhfbGj0m3yY2MiTKKDAvxE3uL5oxG49woZFiINIMsjsDZg0Siuw0hG1Q8UFHFSGkY -rT7gwmIRRwQqHyMEFSaQk7IJ7zYQjKsYucmkYhwLaK6GUFwuGScjAiNBYPsa4BYGYNZtNFUNPSmh -gQEbx2DTdV23uSZYsAAyKGYNlyyDNnPJJhquCRbMRWM1XABgzSY2metVwZIhuCZYpK5elzWHqr22 -t4uWNLd1fB9TS9taPHHI387rW6be6rhdvsVXunUs//NnG2pMr9NpsXd96Y27v17H+T61mM6v79g6 -dVtxnbnWHHpLr61vJa2+ZT7j2/PWXFu+e+Ps+NZrP+d8vW6ZSW9jd2x9C2Fr5aW+Zdxp9YZtpxnX -EG3fMvNmm+nb+XT6FnrcM/f1KptiWy92r56xy2ndejvGNHeW0/qlGHu3ldT6+5ahPef0r7m+7fw+ -+7FfnLOsjvHn6bNvnZ5xdnnbKw1bba72//H1SfFP3y48Y4xpX1xrxjP0tb3ipjP/V58Vy6+z1cB3 -XqfzXtzIf92zrdTzvbSxf8YY1zk9Z+l2Nia2Xb27Tnpf9O3T2/Kuuc55J/b+m1/Vbq2ccf5/O3Ol -+Wm21KnNVf5P6+1/78x/M87/FzuulH622E6ntqc/zd6Pp7UXY6/Vvj/1durW2+e1nR/bzpVm6XNu -r4u97Zxb69J+rz5trbNR+/3xz+1F7/91eevM9c7q99bbFNfs0u380P1Kf9La0ntuF/bl9Il71jt/ -uqWOvd/l/7Rz5qZuPUvP0/Glc35/6LfMrD3vz69P79Ps+HbGtM4s77SP628Z6p+/+vzp1Pr9vnhK -6/Pe3BTje1tenxhfv9PSfuw/c74vm07afV1mervtdJyvtXTW2xlnKuc/fdz2P9PsVNb/np1tV5eT -1uoUy0klpRTTUFNLL/btok639U7ZHZo33+lV5v62c86297dQZgttmXzbe8vk3LS2zzpz+71OZ31r -ceO3df681/ps+fXmnqGvs2vu7Fjm61vG0mqfYjmxz8/Z65QUu+enHcKX/rRbBrfXpvfK7/c8O9PZ -36jv+DHOt2KXtO+9F1+LZ+3bPyfNuH/TNNzmiXHtp3linKvLmjO+/rb+xe5T1kwnbUtlzd606Xzr -0vs+fumNmvPNjev9K/32/a3lbqm8GOfujPH8fGfGTfN9daUva55bC3fj+x2/xV1vtV2tvX8p/ZeN -Z1dKHVtK5+tpW/ozU9l4bq1c6aX5ds6Sus9J82+txr+2Vlvc0u+cubvWa/3O7ZVp13xb/p1bqzEt -bXp79ufZmHZeSiXOszG73073nC/1VwPbi+p35tzA2e10azHNVlKv02+7W39bJ83ufS9+NWzTp7PS -wN7f93Fjai+99PPf775+8Xz57/TiTKult1Jvtg3qjWtXGo9/tsV1WnlfDWu7UqfXn1I5a570Lb3z -3vrZaVPrs+Jq68xdq8T1f+J7/79Kv39z7dm2Za6Pp83VWoszlRdX+vjmiVtO6z4r/plxrjTb2fTn -zNit09rU6W+vWy9tjCul3bLa31pXWuyfbzem/vo6/9ps5cVzWurz8eOZqaS0PsWf56X44le+2F7c -alBa7f+tsubG29u57a2v6T87N6bS5q3VqE/nfM95zlvzN5XXvv3P916K5bW/vWg7tt/1JXX3O6nn -+1M+/v6t9p9vI18PWez9lOLtolHJFfe01s6nNCYjyRZqbKmV1b81M31q/Xu+12szxrK7Xndbc7vP -p7fm/JVGndnxddqNJ52UXoztpPJ6zTTPp//zyuve9Hs2bSqv+/bKbftr41srltZ9a/Xnp9mrY3zn -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 - - - - \ No newline at end of file + + + + + + + + + + diff --git a/apps/web-roo-code/public/Roo-Code-Logo-Horiz-white.svg b/apps/web-roo-code/public/Roo-Code-Logo-Horiz-white.svg index 89a15f16d41..412c1956059 100644 --- a/apps/web-roo-code/public/Roo-Code-Logo-Horiz-white.svg +++ b/apps/web-roo-code/public/Roo-Code-Logo-Horiz-white.svg @@ -1,2965 +1,10 @@ - - - - - - - - - - - - - - - - - - - -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 -XaPNQlvp83sndYLtHkg9G+ewzt5B1LNvvnN+pg+unvGDq4s2D7sSqLc7JCnYDYoMvHG+dbYMYNvs -AtfLzjhweNG7uTOEbnTWrZdxLQYNfMOEL77FoIHfZWBmZWEwf2famTAbF2ZPbZuN+2M8bawDN9OG -xQSyjdkkxnFtwHTyyx1aWYwemzb7dpPxPraBk2HQwMu8LvAaDENWjiuWxeuKucjNYrxj2MA1QJjA -x7y+sng2WUzfmlaGsI0rU9jGnTFsm2UO2bYub1wt/2FgXHsBA/dhGlzaxjq4qJWJuaDJY9k03yHr -RpNl3Wgyl7VtB0532MA7WPji9AYNNhvqnC0trSosJgdoe2gXmLC4qpiqmLCYuN5qJiomKy0mLq0q -ppsKq2uLSoqJiomK6eeI1UxhvYMFNjW4PrYLDXIy1ExVTAmicvLY9vTQtA7usrSmqLI4XHVpYU11 -XXVtSeXQMWVpUXExUXVt3XkxVe2hkTGt1X3lyDltORyorqaosLC6uqq0sqa6qrKuprq2rrKwsOi0 -uqq4sro4WF11bVFlWWldXWFRWVlVUVlNWVVVUXFNUXFtUWlRcV1ZWW1tWW1tWW11YW1tbWVt0XV1 -WWVdWXFpWU1ZbVlRWW1NbXVRbU1dXVFtTVnRXV1dWVnRdWVZaV1ldV3RcWV1WW1pdVlhWZiiuqLD -strSstqy4rqausriuqKSFeS05VioyrrKwsqyysKyyurqasuxsIV1NWWFRaW1NVWVdWVlpXV1hWV1 -gamqb11VcVFdVWlldXVNVW1VVVlpWVVpbWFxaVlRcU1ZWWlpZXFNWVFhSVlxZXVRTWFpWV11TWFh -aWFpZVlZYWlpaV1pXXFZcVl1YVlpaWlpaWVpaXVNaWlRbWlpaW1pbWlVbU1taW1pUVVxbWFNbWlZ -bWlxUWFdXWVxaVVxaWlZWU1VcWlxaXVNbVFtaWlhdWFVTW1NaWlRYUlpaWlxaWlpaWlpZWltTVFl -aW1lbU1haVFRXU1VYWlRYV1pZXF1XWlRYWltYWlZZWF1ZU1xbWllbVFtTVVpZXVlTWllbW1NZWVl -YVlNVW1pTVEFC8YkLmQh5wf8W1HxBDlKHIfjcBgew184DJfhM9yG33AcXsNheAyH4TA8y134C3/h -NTyGw3AYDsNj+Ayn4TqchzMtPb0Iwn0BsYbBhF4TN2Tx0L54lBQDzgSFgFtwUOUSaEf4qSG2kDXO -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 -4e0fL61W9VWUg8HnZM8D5nlm/d8lGQnRZjTsb4Pdsnuf9GSJOb2iWuFg9tTlotEAESIqSRZVYsuo -giX2H+oZjYHKz4z+GOBOpwRw0/g+1/dBfYUgdW7KSQLqkfvtKVDNjF7bOYFHDMC3Gu7cDAXYEjlc -mJ+gBftx4bjje/AneYHcvyZKqH5isFhBq12oRVMwIFRA0Nv5AiRVnBU4mGAWM/ZN70TEisCi1uoy -V08zvCwBmn6qO6Wj0pbtx5pLqy3AmJLcNOsI2KqzuDqksgUtNbkWZj4L5JFaAbaoNrbAg3yyLMPx -87K3vtoPJoTHTX1DDbQdXsxrhPFOrHvmeDMRnxqUCWVD574uAnHFB43liG1CQxSGNeRu4ZBTr96s -6BsGViO3Ut7u5ZVbkf+tMWyPHcxFD+aXRGG+QkYnZ/VicbQxcwwkTJRKGUAOyXfUJLounCSiqzaw -bxhL+8tgNqiNmtlHh99eRV+VbyjVCJEFnD6CT7lUEymWWmaCZlS4bBQAIBUprGf/O+O50dF+gmB3 -boSUA5/arzHClF4WQowjNZ9/AnlyixfvzW2fjh8FOOLYr3iKTxB3FUUJJ//gdrhGxzODeNOOuAt0 -RYzom2A79/IJGaN6yLILl3qbslq32hyTxi5A17kymW/ytw/9MzqUo0QV1wlK+AJ50r/kUbpv4OAI -AdQJAHQK6WQ0MThiN2I4LTJmODYxLTgyYTMtN2FiZWI3ZDdhZGJhNDdhNDFmYjEtZTAwOS00Y2Y0 -LWI0YTQtZWEwZGY0OGQ4YzMwOTY1IDYyOC4yNTI2NWQ2MzEyNTUtNWIyYy00M2ExLTlkYzMtZTI1 -YzEyZjU2NTg5N2QzOGI0Y2UtNjZkYS00ZjUzLThjOWMtNjBlNGE0MzkwNzE3ODEzNDYyMTI1MjM3 -MTMtIEEFCyEjPO96J6v95uogw4G/Wf15XtgjZ9tO1TgR2uZEgm+nCG5o4Rog9AIVjxM6ySPWqUIq -o3KFkgPN2g0ME9AF6cJIxiIR4pMSmN/OoduEE96cntd3jaLGndrQsUYFeIJzisKLWTMa/81DoG5g -YRogPrBwFgb8Nz8AXhIxojfZ4n8z8rKlF134+goEXWADPKQAqlvEEDWAN2kDMzADMzADMwAAdVsj -SxtbSrez7Wnl7sMbBoaosHjhmsXvUG2WEInsnSm2X8Dyo3J7CQcBAQH7AFhuCeeGJIGSiS8GrbVf -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 -uuqo+/PoJSLrgUNkiSwBCAAAAAAAAAQggG8X4Y494894IH7N9/IQWQ2y7yOyRJbowiGyKoYYAmYT -Fs/MuaVXr9bKfk2k9N5/6rWtfNw4Ps3/1C+9t/Gtj/uKXi1+d3vlrU6aaPv+bIlxT39L630q6xVt -WyptRdLEez3n92wrjrheSt3tzdQv/Vz76U9ZfVqfmd6bu96WNDfG1p/SntnnxbVaLOvF1tZviutj -d0ntvf929lM632LpTnOW+IQvExZpvrCX092rj9gLJ27zSAnGzdgVNquT0/q53+vtWieusuPbinGd -F9tvf4stxvN2pvOnlT0v/nf5XStu9/b/x1le/w2W7WnBq4akabfytuPs3rnmxjHTzveK8/PN3V19 -aKJj1QZ/u8QVhq9o5c2XzbVd4qs6YazRxK9GmqrEET229Usi0rgGYSj8MqIMkRENEFlV5fR5JgyI -zKa9K7GklT6PpF2EHoUlVpsKy1i1qX5dFdbyXtXG3kpxptJe2KlKG706KhM7JYBXQnkfZ8ppNRk3 -jvPaOa9fcd7b1URsn+7Uq4wjdsS5XVbck2ZaG8967a1z1konrZVSOisszlqduv+7/3teesU7+786 -9ezv2XO6z+7cPaf77L5X7Dndp6121jlr1TyeHLRKv95+pB/t5VZzM7VXxFek2fq84hXpVZ2it1ef -ldLqGmnpFZ9Or35Fv2K1tcJivaK9rliriUitvTHaW2HRXtHa62LZdtbPjd390npbdsQ526bzYvy4 -cW2b77/1KmmJ0zaPFmaciGm03li1ibbCruzXKf91VZjHv6doPeavOLE38f+yFVZt4n+0f8X/POeU -fjnO+WX+q8Ku6mT/S1+2ieFW0r7NjNhj20jd1pwttvaK/aTYfl2RXlth1YaL7RH/1X414MCyY/Yq -Y6HSaGJXplpbQ9LEb69/xT9xxHsbx2uv+H9Fl119aGLnK7ZXI02F2dje19V+xXtFn5fTa3POMse/ -1crcHdvz4+izOsUbfVac2KZqk/vSXGHxXvHjz1ije8z9sidWbaJ7xH/FnLOUjftljh8vzrj/uioM -f3WK7hf+6iM2J3oFZmJ7lVr4NAaeqPPCMKWppe37fHTbxoWyyKqevqzY2v/HCD8PNYDIKm2pj8aN -sq4zvWs333s7X3trW4ydPqZds+1ZZ61fseNJ8bxOL731KX787RfqNb/37Xpnbew+8b24Une/N9d7 -L5p47+UT78149n+t1k7Zcdqe743rndkb1/vY3mrrRRO9Xi4kF020/5XOx7f/6Wfr//3Y4pxt279o -Yn+AoscJKh4ggarTKRWSxK9AND1bdrX3H1vc8/rE1u+8dF5rveell0+0+WfF99bGtW+et/tav9Wp -dH/Zlc48nX6t3xb/zLjWxv91tk9Kb9ts8XSbccU/c55Y4se18expZ73e9O187JdPtNaptfbi9m7H -uW2dVzZue3tm6plan9lWz7dSanM7du+JZ7X3usWT2jvxlE1ztf/2ool+L5848c/sjzs7/Uzr44m9 -LaVOuzptO3Od9fG8bS++aGLOl0+sPmU3rfbbzsc0458Z5/m3Z5Ud86XX/aKJdPrlEyedX2tj27jS -Op/WrvUvbZ8ZP5Vt68V5Tpyz1/sW2yv7LabvecqeF+PcOU978dPH+N9/Vn9c8eyXPe2st2LcN+f3 -StutzZ7xxRXTttfWnD1fNLEvn4irz/oWN/V58ZyN+85s3/2xW6cUu3etFNNJ/Vafjm17N56Zvk/q -P70pxvYtdfs5Y2xv0zkrpZn6RRMrvXzit8u+GWP83/Nee3/eWrs2rZXeiyb25346M8Xd2SmtPzNu -tz+rpfTyiZZel027Np2e6bV/25/Onn8d33xnpTZ7njd7zhj7RROn2/+LJvr1y4XkVr9oYrZ2vrX0 -frfPztdW2vMdT+95O7edmFJ3pxNba7G135/plfXn21vrRRNpN85NZcf7tLb9eW229C2uM89vx03n -rI1pT4x/ds6WOsW32q5uMb399m9TS+9FEx375RNvnX9f5ost7q725knbP3ue1tJrs18+san74+6m -tU73njnbvm6r44rr7K70r09sv3FXm6tnp03rxdjlnH/5xP+ZJbX/1X++T6e5XjTRXq+4p5Uds/xr -87Vvba1/cb6V2trzoomXOs2f5fVu3H7/2+IsO2Z/fDt327fTv7tl58snOrW4Uq/X//a/Z2szvp6x -37ae85Ud7bxoIv7LJ975db5b7Bln+/O7YtwUX/xe5/zsN8uOfu3Fsr/rt83flV40Mc/LJ87slwsJ -bfyf/9qWHem7pY/v1/v2Xr/ZM7aehZ32kU24rdle29axbOv03bbfT3Ean9TOXPsrtrMrvnhinDXY -1EqtO5596zv+WTNu7LXTtO/zn91xtW87/tan9dKet1bbsqRdRM3nQhJCyjiNpMo4NiQkUFUFgGME -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 -UJgW4wiUQbzHbUaHU5h6sRBE0EQjP3TpLEbOXfn4safNB7Bg9azlcZXFeZzHXTyuOxSXrzMIIAF2 -UopkM7ATcEQoKNBBFWOtW4A+yUSTmOkWFRuZgBQe3GoRLnB6AHVIbJDPMF4439AzFAfyOI/zOInH -ieIE7AxSI7CjVVxfF6K4fAachkr3Gcqka5RAjQBx+pFkmXD/JHQILqRQdHB4cJqCQKgtKBPumZMN -1GAk9B7ncRqNTOVxDxstFAtKrdvm4fAQqwkSrdumES7AEVQ/zMbjQI+GmBgJLyZfsPFmosOBMYm1 -UqQkBojJRqGEzkAHBaiQGA0MCO6o4PI4j5ttPM7jIh4KJvIoGpUZ8BJxC/C4S3XkjsGTWBmIH8DE -0yuTwCEAX46NZXMBsSyMMK8XWyKPz0JJCj/8ME6P22QExllrYExibHWRGEVOi/AHBcYWICUd81ga -VcNHo3ILcBxNI1bmIQAq5rFoWQJoQq2piB83TT4x8fYZ+GbnmJREGk02Ch+miQcXI+LkQRUOHk8Y -1Q4cCsauwQPT0BTaGz8mHic5cibSJC4oRNDsKbpDIo2Tk3BBIdoKskgKaw4SWHvcQS6YcKCjiZHC -QGJ9o8JiEUkDKx8jAxOnsJO0CPe4kKybGLvJZGIcCWyvhlBeL1rnAsICIYADGSF3CaDmcbZVvXxS -YgtbQkuvrsxaMgOKJGTVy4fFWwtcp4DjeZ7HvSJasgBcSNQYL9qFrfaiRTBeES3Zy9ZivADQqkVw -tFdsokU7qFREHIxzzUyfWv+e7/XajLHsrtfd1tzu0m+l69P2nL+t9Fth1JkdX6fdeNJJ6cXY+tPr -NdM8n/7Ppt+zaVN53blYbttfG99asbTunKs/P81eHeM7n87rXaXNXRu3T6fTv7ql0j6un2OMSW2+ -Fk9paTu13+7Z9vu1P18+zfnO7N3Y5kvbb533er5drb+dtWvumnFTl3/b6aWznXPdptRvfTmbOuMt -zrkvxtOnnD0vtvTW7pul10qpnF2fdn2L641da6ntKmdX2vYtzY2l43lznXV6rd5+Zb2Me3G2M0+v -mP7Ndzausl4GppXapnRaejvPKuvlYthmOd29Tr8/L+di3Nk936Wd1i+9X+vsW93ttY+rtLNrrW/l -nZXemV9ezMWsV1rpxPReaTHn+n/8lXq+VTrubC2ls2mds+L5nZ9i6u0TSzv/3nntpNRbOuZcjJup -xfjlrDR3O/X2vtetV9zYJ31Lu1Z7KZ5z0sc31874K5be995MZ31769efmPZjn3XSWx/fOfPEk2Jr -ndZ8Le1Lc7WTUlzf2kk518SfbcY2u51O7X1ss3+t869P225pUzuz9ZyvdfnVe87qc/5nfOnXjKXX -emnFf3PFk/rbtvaprJMTMfK7fb/SHeM5q2c6cf221O/3bLe0cf7as9o77duntq11+tT9bzt9v9Q+ -zpf2X1qp9enys621uucKwzGmeN5Zabu0dU781bvCoI8ttpNafOuU71yMgafbzvXmmal9mq1Pv/J9 -2vz5H/fF1enMLn1S/0txxlbW7G2rrU+b2tvZ4rbz3jld/szUVu/7+f7Lnxf7zPa+z2orpT1vW0xr -tpNSO2ln6vZ2U8vFGJT6d8b1bYWBqcW5ci5a83fjm7HNM+P7NOPPOM+WODP+fn1Lcbtnl/lWGNjz -xBl7ztkxzY4lvhXGbeq2Z5U4cxWMd4xzvtLv+52if4rrdVmzqNprm6toSXNbx/cxtbStxROL/O28 -zmnqrY7b5Vt8pVvH8j9/tvjxU1Fjep1Oi73rS2/c/VW++6zXcb5PLabz6zu2Tt1WXGeuNYve0mvr -W0mrc5rP+Pa8NdeW7944O7712s85X6+cZtLb2B1b50TYWnmpcxp3Wp1h22nGVUTbOc282Wb6dj6d -zoke98x9vcqm2NaL3atn7HJat96OMc2d5bR+KcbebSW1/plSSq91TkN7zulfc33b+X32Y784Z1kd -48/TZ986PePs8rZXGLbaXO3/4+uT4p/OVXjGGNO+uNaMp+hre8VN83/1WbH86mLgO6/TeS9m5L/u -2Vbq+V7a2D9jjOucnrN0OxkT267eXSe9Mfr26XV511znvBbfmSf2/ptj1XKunHH+fztzpflpttSp -zVX+tN7+9878N+P8f7HjSulni+10anv60+z9eFp76+e+GHut9v2pt1O33j6v7fzYdq40S5+Ti13s -befkXJf2e/Vpa52M2u+Pf3Ixev+vy1tnrndWv7feprhml27ni+5X+pPWlt6Tq7Avp0/cs95pm8r/ -6ZY69n6X/9POmZu69Sw9Z5+OL53z+0XPaWbteX9+fXqfZse3M6Z1Znmn/c+5Pq7Paah//urzp1Pr -9/viKa3Pe3NTjO9teX1ifP1OS/ux/8z5vmw6afd1mentttNxvtbSWW9nnKmc//Rx2/9Ms1NZ/3t2 -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 - - - - \ No newline at end of file + + + + + + + + + + diff --git a/apps/web-roo-code/public/opengraph.png b/apps/web-roo-code/public/opengraph.png new file mode 100644 index 00000000000..fe75ec976b0 Binary files /dev/null and b/apps/web-roo-code/public/opengraph.png differ diff --git a/apps/web-roo-code/src/app/legal/cookies/page.tsx b/apps/web-roo-code/src/app/legal/cookies/page.tsx new file mode 100644 index 00000000000..cb67b8672c5 --- /dev/null +++ b/apps/web-roo-code/src/app/legal/cookies/page.tsx @@ -0,0 +1,198 @@ +import type { Metadata } from "next" +import { SEO } from "@/lib/seo" + +const TITLE = "Cookie Policy" +const DESCRIPTION = "Learn about how Roo Code uses cookies to enhance your experience and provide our services." +const PATH = "/legal/cookies" +const OG_IMAGE = SEO.ogImage + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: OG_IMAGE.url, + width: OG_IMAGE.width, + height: OG_IMAGE.height, + alt: OG_IMAGE.alt, + }, + ], + locale: SEO.locale, + type: "article", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [OG_IMAGE.url], + }, + keywords: [...SEO.keywords, "cookies", "privacy", "tracking", "analytics"], +} + +export default function CookiePolicy() { + return ( + <> +
+
+

Updated: September 18, 2025

+ +

Cookie Policy

+ +

+ This Cookie Policy explains how Roo Code uses cookies and similar technologies to recognize you + when you visit our website. +

+ +

What are cookies?

+

+ Cookies are small data files that are placed on your computer or mobile device when you visit a + website. Cookies help make websites work more efficiently and provide reporting information. +

+ +

Cookies we use

+

+ We use a minimal number of cookies to provide essential functionality and improve your + experience. +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ProviderPurposeTypeDuration + Example Cookies +
Clerk + Authentication and session management + Essential1 year and 1 month + __client_uat*, __clerk_* +
PostHog + Product analytics and feature usage tracking + + Analytics (only with your consent) + 1 yearph_*
+
+ +

+ + Clerk Privacy Policy + +

+

+ + PostHog Privacy Policy + +

+ +

Essential cookies

+

+ Essential cookies are required for our website to operate. These include authentication cookies + from Clerk that allow you to stay logged in to your account. These cookies cannot be disabled + without losing core website functionality. The lawful basis for processing these cookies is our + legitimate interest in providing secure access to our services. +

+ +

Analytics cookies

+

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

+ +

Third-party services

+

+ Our blog at{" "} + + blog.roocode.com + {" "} + is hosted on Substack. When you visit it, Substack may set cookies for analytics, + personalization, and advertising/marketing. These cookies are managed directly by Substack and + are outside our control. You can read more in{" "} + + Substack's Cookie Policy + + . +

+ +

How to control cookies

+

You can control and manage cookies through your browser settings. Most browsers allow you to:

+ +

+ Please note that blocking essential cookies may prevent you from using certain features of our + website, such as staying logged in to your account. +

+ +

Changes to this policy

+

+ We may update this Cookie Policy from time to time. When we make changes, we will update the + date at the top of this policy. We encourage you to periodically review this policy to stay + informed about our use of cookies. +

+ +

Contact us

+

+ If you have questions about our use of cookies, please contact us at{" "} + + privacy@roocode.com + + . +

+
+
+ + ) +} diff --git a/apps/web-roo-code/src/app/legal/subprocessors/page.tsx b/apps/web-roo-code/src/app/legal/subprocessors/page.tsx new file mode 100644 index 00000000000..1d758803f5e --- /dev/null +++ b/apps/web-roo-code/src/app/legal/subprocessors/page.tsx @@ -0,0 +1,183 @@ +import type { Metadata } from "next" +import { SEO } from "@/lib/seo" + +const TITLE = "Subprocessors" +const DESCRIPTION = "List of third-party subprocessors used by Roo Code to process customer data." +const PATH = "/legal/subprocessors" +const OG_IMAGE = SEO.ogImage + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: OG_IMAGE.url, + width: OG_IMAGE.width, + height: OG_IMAGE.height, + alt: OG_IMAGE.alt, + }, + ], + locale: SEO.locale, + type: "article", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [OG_IMAGE.url], + }, + keywords: [...SEO.keywords, "subprocessors", "data processing", "GDPR", "privacy", "third-party services"], +} + +export default function SubProcessors() { + return ( + <> +
+
+

Updated: September 18, 2025

+ +

Subprocessors

+ +

Roo Code engages the following third parties to process Customer Data.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Entity Name + + Product or Service + + Location of Processing + + Purpose of Processing +
CensusData ServicesUnited StatesData activation and reverse ETL
ClerkAuthentication ServicesUnited StatesUser authentication
ClickHouseData ServicesUnited StatesReal-time analytics database
CloudflareAll Services + Processing at data center closest to End User + + Content delivery network and security +
FivetranData ServicesUnited StatesETL and data integration
Fly.ioBackend ServicesUnited States + Application hosting and deployment +
HubSpotCustomer ServicesUnited StatesCRM and marketing automation
LoopsCommunication ServicesUnited StatesEmail and customer communication
MetabaseData AnalyticsUnited States + Business intelligence and reporting +
PostHogData ServicesUnited StatesProduct analytics
SentryAll ServicesUnited StatesError tracking and monitoring
SnowflakeData ServicesUnited StatesData warehousing and analytics
StripePayment ServicesUnited States, EuropePayment processing and billing
SupabaseData ServicesUnited StatesDatabase management and storage
UpstashInfrastructure ServicesUnited StatesServerless database services
VercelCustomer-facing ServicesUnited States, Europe + Web application hosting and deployment +
+
+
+
+ + ) +} diff --git a/apps/web-roo-code/src/app/page.tsx b/apps/web-roo-code/src/app/page.tsx index bafef64936e..51b798f0bf5 100644 --- a/apps/web-roo-code/src/app/page.tsx +++ b/apps/web-roo-code/src/app/page.tsx @@ -3,7 +3,6 @@ import { getVSCodeDownloads } from "@/lib/stats" import { Button } from "@/components/ui" -import { AnimatedText } from "@/components/animated-text" import { AnimatedBackground, InstallSection, @@ -12,6 +11,8 @@ import { FAQSection, CodeExample, } from "@/components/homepage" +import { EXTERNAL_LINKS } from "@/lib/constants" +import { ArrowRight } from "lucide-react" // Invalidate cache when a request comes in, at most once every hour. export const revalidate = 3600 @@ -21,28 +22,18 @@ export default async function Home() { return ( <> -
+
-
-
-
+
+
+
-

- Your - - AI-Powered - - Dev Team, in Your Editor - - and Beyond - +

+ An entire AI-powered dev team. In your editor and beyond.

- Supercharge your software development with AI that{" "} - - understands your codebase - {" "} - and helps you write, refactor, and debug with ease in your editor and in the cloud. + Roo's model-agnostic, specialized modes and fine-grained auto-approval controls + give you the tools (and the confidence) to get AI working for you.

@@ -53,18 +44,8 @@ export default async function Home() { href="https://marketplace.visualstudio.com/items?itemName=RooVeterinaryInc.roo-cline" target="_blank" className="flex w-full items-center justify-center"> - Install Roo Code - - - + Install Extension +
-
-
-
+
+
+
-
-
+
diff --git a/apps/web-roo-code/src/app/pricing/page.tsx b/apps/web-roo-code/src/app/pricing/page.tsx new file mode 100644 index 00000000000..317086a851b --- /dev/null +++ b/apps/web-roo-code/src/app/pricing/page.tsx @@ -0,0 +1,328 @@ +import { Users, Building2, ArrowRight, Star, LucideIcon, Check, Cloud } from "lucide-react" +import type { Metadata } from "next" +import Link from "next/link" + +import { Button } from "@/components/ui" +import { AnimatedBackground } from "@/components/homepage" +import { ContactForm } from "@/components/enterprise/contact-form" +import { SEO } from "@/lib/seo" +import { EXTERNAL_LINKS } from "@/lib/constants" + +const TITLE = "Pricing - Roo Code Cloud" +const DESCRIPTION = + "Simple, transparent pricing for Roo Code Cloud. The VS Code extension is free forever. Choose the cloud plan that fits your needs." +const PATH = "/pricing" +const OG_IMAGE = SEO.ogImage + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: OG_IMAGE.url, + width: OG_IMAGE.width, + height: OG_IMAGE.height, + alt: OG_IMAGE.alt, + }, + ], + locale: SEO.locale, + type: "website", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [OG_IMAGE.url], + }, + keywords: [ + ...SEO.keywords, + "pricing", + "plans", + "subscription", + "cloud pricing", + "AI development pricing", + "team pricing", + "enterprise pricing", + ], +} + +interface PricingTier { + name: string + icon: LucideIcon + price: string + period?: string + trial?: string + cancellation?: string + description: string + featuresIntro?: string + features: string[] + cta: { + text: string + href?: string + isContactForm?: boolean + } +} + +const pricingTiers: PricingTier[] = [ + { + name: "Cloud Free", + icon: Cloud, + price: "$0", + cancellation: "Cancel anytime", + description: "For folks just getting started", + features: [ + "Token usage analytics", + "Access your task history across devices", + "Follow your tasks from anywhere", + "Community support", + ], + cta: { + text: "Get started", + href: EXTERNAL_LINKS.CLOUD_APP_SIGNUP, + }, + }, + { + name: "Pro", + icon: Star, + price: "$20", + period: "/mo", + trial: "Free 14-day trial · ", + cancellation: "Cancel anytime", + description: "For pro Roo coders", + featuresIntro: "Everything in Free, plus:", + features: [ + "Roomote Control", + "Start, stop and control tasks from anywhere", + "Course-correct Roo from afar", + "Paid support", + ], + cta: { + text: "Get started", + href: EXTERNAL_LINKS.CLOUD_APP_SIGNUP + "?redirect_url=/billing", + }, + }, + { + name: "Team", + icon: Users, + price: "$99", + period: "/mo", + trial: "Free 14-day trial · ", + cancellation: "Cancel anytime", + description: "For AI-forward teams", + featuresIntro: "Everything in Pro, plus:", + features: ["Unlimited users (no per-seat cost)", "Shared configuration & policies", "Centralized billing"], + cta: { + text: "Get started", + href: EXTERNAL_LINKS.CLOUD_APP_SIGNUP + "?redirect_url=/billing", + }, + }, + { + name: "Enterprise", + icon: Building2, + price: "Custom", + description: "For complex orgs", + featuresIntro: "Everything in Team, plus:", + features: [ + "SAML SSO provisioning", + "Custom integrations and terms", + "Security questionnaires and all that fun stuff", + "Dedicated support", + ], + cta: { + text: "Talk to Sales", + isContactForm: true, + }, + }, +] + +export default function PricingPage() { + return ( + <> + + + {/* Hero Section */} +
+
+
+

Roo Code Cloud Pricing

+

+ Simple, transparent pricing that scales with your needs. +
+ Free 14-day trials to kick the tires. +

+
+
+
+ + {/* Free Extension Notice */} +
+
+

+ The Roo Code extension is free! + Roo Code Cloud is an optional service which takes it to the next level. +

+
+
+ + {/* Pricing Tiers */} +
+
+
+ {pricingTiers.map((tier) => { + const Icon = tier.icon + return ( +
+
+
+

{tier.name}

+ +
+

{tier.description}

+
+ +
+

+ {tier.featuresIntro}  +

+
    + {tier.features.map((feature) => ( +
  • + + {feature} +
  • + ))} +
+
+ +

+ {tier.price} + {tier.period} +

+

+ {tier.trial} + {tier.cancellation}  +

+ + {tier.cta.isContactForm ? ( + + ) : ( + + )} +
+ ) + })} +
+
+
+ + {/* Additional Information */} +
+
+
+

Frequently Asked Questions

+

Got questions about our pricing?

+
+
+
+

Wait, is Roo Code free or not?

+

+ Yes! The Roo Code VS Code extension is open source and free forever. The extension acts + as a powerful AI coding assistant right in your editor. These are the prices for Roo + Code Cloud. +

+
+
+

Is there a free trial?

+

+ Yes, all paid plans come with a 14-day free trial. +

+
+
+

Do I need a credit card for the free trial?

+

+ Yes, but you won't be charged until your trial ends. You can cancel anytime with + one click . +

+
+
+

What payment methods do you accept?

+

+ We accept all major credit cards, debit cards, and can arrange invoice billing for + Enterprise customers. +

+
+
+

Can I change plans anytime?

+

+ Yes, you can upgrade or downgrade your plan at any time. Changes will be reflected in + your next billing cycle. +

+
+
+ +
+

+ Still have questions?{" "} + + Join our Discord + {" "} + or{" "} + + contact our sales team + +

+
+
+
+ + {/* CTA Section */} +
+
+
+

Try Roo Code Cloud now

+

Code from anywhere.

+ +
+
+
+ + ) +} diff --git a/apps/web-roo-code/src/app/privacy/page.tsx b/apps/web-roo-code/src/app/privacy/page.tsx index bb132651f76..6b17c4ff8df 100644 --- a/apps/web-roo-code/src/app/privacy/page.tsx +++ b/apps/web-roo-code/src/app/privacy/page.tsx @@ -46,7 +46,7 @@ export default function Privacy() {

Roo Code Cloud Privacy Policy

-

Last Updated: August 20, 2025

+

Last Updated: September 19, 2025

This Privacy Policy explains how Roo Code, Inc. ("Roo Code," "we," @@ -86,8 +86,8 @@ export default function Privacy() { Your source code does not transit Roo Code servers unless you explicitly choose Roo Code as a model provider (proxy mode). {" "} - When Roo Code Cloud is your model provider, your code briefly transits Roo Code servers only to - forward it to the upstream model, is not stored, and is deleted immediately after + When Roo Code Cloud is your model provider, your code briefly transits Roo Code servers only + to forward it to the upstream model, is not stored, and is deleted immediately after forwarding. Otherwise, your code is sent directly—via client‑to‑provider TLS—to the model you select. Roo Code never stores, inspects, or trains on your code. @@ -184,6 +184,13 @@ export default function Privacy() {

  • Send product updates and roadmap communications (opt‑out available)
  • +
  • + Send onboarding, educational, and promotional communications. We may use + your account information (such as your name and email address) to send you onboarding + messages, product tutorials, feature announcements, newsletters, and other marketing + communications. You can opt out of non‑transactional emails at any time (see “Your Choices” + below). +
  • 3. Where Your Data Goes (And Doesn't)

    @@ -277,6 +284,12 @@ export default function Privacy() { Delete your Cloud account at any time from{" "} Security Settings inside Roo Code Cloud. +
  • + Marketing communications: You can unsubscribe from marketing and + promotional emails by clicking the unsubscribe link in those emails. Transactional or + service‑related emails (such as password resets, billing notices, or security alerts) will + continue even if you opt out. +
  • 6. Security Practices

    diff --git a/apps/web-roo-code/src/components/chromes/footer.tsx b/apps/web-roo-code/src/components/chromes/footer.tsx index b6a17cebe57..11b883d9ce2 100644 --- a/apps/web-roo-code/src/components/chromes/footer.tsx +++ b/apps/web-roo-code/src/components/chromes/footer.tsx @@ -64,52 +64,52 @@ export function Footer() { @@ -119,20 +119,20 @@ export function Footer() {
    diff --git a/apps/web-roo-code/src/components/chromes/nav-bar.tsx b/apps/web-roo-code/src/components/chromes/nav-bar.tsx index 00fe9d2727b..ff502b08ad7 100644 --- a/apps/web-roo-code/src/components/chromes/nav-bar.tsx +++ b/apps/web-roo-code/src/components/chromes/nav-bar.tsx @@ -8,12 +8,12 @@ import { useState } from "react" import { RxGithubLogo } from "react-icons/rx" import { VscVscode } from "react-icons/vsc" import { HiMenu } from "react-icons/hi" -import { IoClose } from "react-icons/io5" import { EXTERNAL_LINKS } from "@/lib/constants" import { useLogoSrc } from "@/lib/hooks/use-logo-src" import { ScrollButton } from "@/components/ui" import ThemeToggle from "@/components/chromes/theme-toggle" +import { ChevronDown, Cloud, X } from "lucide-react" interface NavBarProps { stars: string | null @@ -26,56 +26,66 @@ export function NavBar({ stars, downloads }: NavBarProps) { return (
    -
    +
    - Roo Code Logo + Roo Code Logo
    {/* Desktop Navigation */} -
    - {/* Mobile Menu Panel */} + {/* Mobile Menu Panel - Full Screen */}
    -
    diff --git a/apps/web-roo-code/src/components/homepage/index.ts b/apps/web-roo-code/src/components/homepage/index.ts index 192c155473b..9d4427448e6 100644 --- a/apps/web-roo-code/src/components/homepage/index.ts +++ b/apps/web-roo-code/src/components/homepage/index.ts @@ -2,9 +2,7 @@ export * from "./animated-background" export * from "./code-example" export * from "./company-logos" export * from "./faq-section" -export * from "./features-mobile" export * from "./features" export * from "./install-section" -export * from "./testimonials-mobile" export * from "./testimonials" export * from "./whats-new-button" diff --git a/apps/web-roo-code/src/components/homepage/install-section.tsx b/apps/web-roo-code/src/components/homepage/install-section.tsx index 5da3a7d4ae8..96404b47969 100644 --- a/apps/web-roo-code/src/components/homepage/install-section.tsx +++ b/apps/web-roo-code/src/components/homepage/install-section.tsx @@ -46,12 +46,13 @@ export function InstallSection({ downloads }: InstallSectionProps) {
    {/* Updated h2 to match other sections */} -

    - Install Roo Code — Open & Flexible +

    + Install Roo Code now

    - Roo Code is open-source, model-agnostic, and developer-focused. Install from the VS Code - Marketplace or the CLI in minutes, then bring your own AI model. + Install from the VSCode Marketplace or the CLI in minutes, then bring your own AI model. +
    + Roo Code is also compatible with all VSCode forks.

    @@ -64,7 +65,7 @@ export function InstallSection({ downloads }: InstallSectionProps) {
    - VSCode Marketplace + From VSCode Marketplace {downloads !== null && ( <> · @@ -80,7 +81,7 @@ export function InstallSection({ downloads }: InstallSectionProps) {
    -
    Install via CLI
    +
    or via CLI
    diff --git a/apps/web-roo-code/src/components/homepage/testimonials-mobile.tsx b/apps/web-roo-code/src/components/homepage/testimonials-mobile.tsx
    deleted file mode 100644
    index 8b90d27b5a9..00000000000
    --- a/apps/web-roo-code/src/components/homepage/testimonials-mobile.tsx
    +++ /dev/null
    @@ -1,63 +0,0 @@
    -import useEmblaCarousel from "embla-carousel-react"
    -import AutoScroll from "embla-carousel-auto-scroll"
    -import { testimonials } from "@/components/homepage/testimonials"
    -
    -export function TestimonialsMobile() {
    -	const [emblaRef] = useEmblaCarousel({ loop: true }, [
    -		AutoScroll({
    -			playOnInit: true,
    -			speed: 1, // pixels per second - slower for smoother scrolling
    -			stopOnInteraction: true,
    -			stopOnMouseEnter: true,
    -		}),
    -	])
    -
    -	return (
    -		
    -
    -
    - {testimonials.map((testimonial) => ( -
    -
    - - - - - - - - - - - - - -
    -

    - "{testimonial.quote}" -

    - -
    -
    -

    - {testimonial.name} -

    -

    - {testimonial.role} at {testimonial.company} -

    -
    -
    -
    -
    - ))} -
    -
    -
    - ) -} diff --git a/apps/web-roo-code/src/components/homepage/testimonials.tsx b/apps/web-roo-code/src/components/homepage/testimonials.tsx index 4df5849d468..01236dfe7e3 100644 --- a/apps/web-roo-code/src/components/homepage/testimonials.tsx +++ b/apps/web-roo-code/src/components/homepage/testimonials.tsx @@ -1,9 +1,10 @@ "use client" -import { useRef } from "react" +import { useRef, useCallback, useEffect } from "react" import { motion } from "framer-motion" -import Image from "next/image" -import { TestimonialsMobile } from "./testimonials-mobile" +import useEmblaCarousel from "embla-carousel-react" +import AutoPlay from "embla-carousel-autoplay" +import { ChevronLeft, ChevronRight } from "lucide-react" export interface Testimonial { id: number @@ -47,26 +48,66 @@ export const testimonials: Testimonial[] = [ export function Testimonials() { const containerRef = useRef(null) + const [emblaRef, emblaApi] = useEmblaCarousel( + { + loop: true, + align: "center", + skipSnaps: false, + containScroll: false, + }, + [ + AutoPlay({ + playOnInit: true, + delay: 4000, + stopOnInteraction: true, + stopOnMouseEnter: true, + stopOnFocusIn: true, + }), + ], + ) + + const scrollPrev = useCallback(() => { + if (emblaApi) emblaApi.scrollPrev() + }, [emblaApi]) + + const scrollNext = useCallback(() => { + if (emblaApi) emblaApi.scrollNext() + }, [emblaApi]) + + // Re-init auto-play on user interaction + useEffect(() => { + if (!emblaApi) return + + const autoPlay = emblaApi?.plugins()?.autoPlay as + | { + isPlaying?: () => boolean + play?: () => void + } + | undefined + if (!autoPlay) return + + const handleInteraction = () => { + const isPlaying = autoPlay.isPlaying && autoPlay.isPlaying() + if (!isPlaying) { + setTimeout(() => { + if (autoPlay.play) { + autoPlay.play() + } + }, 2000) + } + } + + emblaApi.on("pointerUp", handleInteraction) + + return () => { + emblaApi.off("pointerUp", handleInteraction) + } + }, [emblaApi]) const containerVariants = { hidden: { opacity: 0 }, visible: { opacity: 1, - transition: { - staggerChildren: 0.15, - delayChildren: 0.3, - }, - }, - } - - const itemVariants = { - hidden: { - opacity: 0, - y: 20, - }, - visible: { - opacity: 1, - y: 0, transition: { duration: 0.6, ease: [0.21, 0.45, 0.27, 0.9], @@ -74,123 +115,78 @@ export function Testimonials() { }, } - const backgroundVariants = { - hidden: { - opacity: 0, - }, - visible: { - opacity: 1, - transition: { - duration: 1.2, - ease: "easeOut", - }, - }, - } - return (
    - -
    -
    -
    - +
    +
    +
    +
    -
    - -

    - Empowering developers worldwide. -

    -

    - Join thousands of developers who are revolutionizing their workflow with AI-powered - assistance. -

    -
    +
    +

    + AI-forward developers are using Roo Code +

    +

    + Join more than 800k people revolutionizing their workflow worldwide +

    - {/* Mobile Carousel */} - - - {/* Desktop Grid */} -
    - {testimonials.map((testimonial, index) => ( - -
    -
    - {testimonial.image && ( -
    -
    - {testimonial.name} -
    -
    - )} - -
    -
    -
    - - - - - - - - - - - - -
    + {/* Previous Button */} + -

    - {testimonial.quote} -

    -
    + {/* Next Button */} + + + {/* Gradient Overlays */} +
    +
    -
    -
    -

    - {testimonial.name} -

    -

    - {testimonial.role} at {testimonial.company} -

    + {/* Embla Carousel Container */} +
    +
    + {testimonials.map((testimonial) => ( +
    +
    +
    +
    +
    +

    + {testimonial.quote} +

    +
    + +
    +

    + {testimonial.name} +

    +

    + {testimonial.role} at {testimonial.company} +

    +
    +
    - - ))} + ))} +
    diff --git a/apps/web-roo-code/src/lib/constants.ts b/apps/web-roo-code/src/lib/constants.ts index 3b9798926cf..c474481805c 100644 --- a/apps/web-roo-code/src/lib/constants.ts +++ b/apps/web-roo-code/src/lib/constants.ts @@ -24,7 +24,8 @@ export const EXTERNAL_LINKS = { OFFICE_HOURS_PODCAST: "https://www.youtube.com/@RooCodeYT/podcasts", FAQ: "https://roocode.com/#faq", TESTIMONIALS: "https://roocode.com/#testimonials", - CLOUD_APP: "https://app.roocode.com", + CLOUD_APP_LOGIN: "https://app.roocode.com/sign-in", + CLOUD_APP_SIGNUP: "https://app.roocode.com/sign-up", } export const INTERNAL_LINKS = { diff --git a/apps/web-roo-code/src/lib/seo.ts b/apps/web-roo-code/src/lib/seo.ts index 962662bb22c..7dfad0550a2 100644 --- a/apps/web-roo-code/src/lib/seo.ts +++ b/apps/web-roo-code/src/lib/seo.ts @@ -3,15 +3,15 @@ const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://roocode.com" export const SEO = { url: SITE_URL, name: "Roo Code", - title: "Roo Code – Your AI-Powered Dev Team in VS Code", + title: "Roo Code – Your AI-Powered Dev Team in VS Code and Beyond", description: "Roo Code puts an entire AI dev team right in your editor, outpacing closed tools with deep project-wide context, multi-step agentic coding, and unmatched developer-centric flexibility.", locale: "en_US", ogImage: { - url: "/android-chrome-512x512.png", - width: 512, - height: 512, - alt: "Roo Code Logo", + url: "/opengraph.png", + width: 1200, + height: 600, + alt: "Roo Code", }, keywords: [ "Roo Code", diff --git a/packages/cloud/src/CloudService.ts b/packages/cloud/src/CloudService.ts index ce9e34de8ce..1ca13430a59 100644 --- a/packages/cloud/src/CloudService.ts +++ b/packages/cloud/src/CloudService.ts @@ -8,6 +8,7 @@ import type { AuthService, SettingsService, CloudUserInfo, + CloudOrganizationMembership, OrganizationAllowList, OrganizationSettings, ShareVisibility, @@ -170,9 +171,9 @@ export class CloudService extends EventEmitter implements Di // AuthService - public async login(): Promise { + public async login(landingPageSlug?: string): Promise { this.ensureInitialized() - return this.authService!.login() + return this.authService!.login(landingPageSlug) } public async logout(): Promise { @@ -242,6 +243,21 @@ export class CloudService extends EventEmitter implements Di return this.authService!.handleCallback(code, state, organizationId) } + public async switchOrganization(organizationId: string | null): Promise { + this.ensureInitialized() + + // Perform the organization switch + // StaticTokenAuthService will throw an error if organization switching is not supported + await this.authService!.switchOrganization(organizationId) + } + + public async getOrganizationMemberships(): Promise { + this.ensureInitialized() + + // StaticTokenAuthService will throw an error if organization memberships are not supported + return await this.authService!.getOrganizationMemberships() + } + // SettingsService public getAllowList(): OrganizationAllowList { diff --git a/packages/cloud/src/StaticTokenAuthService.ts b/packages/cloud/src/StaticTokenAuthService.ts index 6630a4a2e01..97ce6eac590 100644 --- a/packages/cloud/src/StaticTokenAuthService.ts +++ b/packages/cloud/src/StaticTokenAuthService.ts @@ -63,6 +63,14 @@ export class StaticTokenAuthService extends EventEmitter impl throw new Error("Authentication methods are disabled in StaticTokenAuthService") } + public async switchOrganization(_organizationId: string | null): Promise { + throw new Error("Authentication methods are disabled in StaticTokenAuthService") + } + + public async getOrganizationMemberships(): Promise { + throw new Error("Authentication methods are disabled in StaticTokenAuthService") + } + public getState(): AuthState { return this.state } diff --git a/packages/cloud/src/WebAuthService.ts b/packages/cloud/src/WebAuthService.ts index 934ca90b71d..6e9c76b4632 100644 --- a/packages/cloud/src/WebAuthService.ts +++ b/packages/cloud/src/WebAuthService.ts @@ -141,7 +141,8 @@ export class WebAuthService extends EventEmitter implements A if ( this.credentials === null || this.credentials.clientToken !== credentials.clientToken || - this.credentials.sessionId !== credentials.sessionId + this.credentials.sessionId !== credentials.sessionId || + this.credentials.organizationId !== credentials.organizationId ) { this.transitionToAttemptingSession(credentials) } @@ -174,6 +175,7 @@ export class WebAuthService extends EventEmitter implements A this.changeState("attempting-session") + this.timer.stop() this.timer.start() } @@ -248,8 +250,10 @@ export class WebAuthService extends EventEmitter implements A * * This method initiates the authentication flow by generating a state parameter * and opening the browser to the authorization URL. + * + * @param landingPageSlug Optional slug of a specific landing page (e.g., "supernova", "special-offer", etc.) */ - public async login(): Promise { + public async login(landingPageSlug?: string): Promise { try { const vscode = await importVscode() @@ -267,11 +271,17 @@ export class WebAuthService extends EventEmitter implements A state, auth_redirect: `${vscode.env.uriScheme}://${publisher}.${name}`, }) - const url = `${getRooCodeApiUrl()}/extension/sign-in?${params.toString()}` + + // Use landing page URL if slug is provided, otherwise use default sign-in URL + const url = landingPageSlug + ? `${getRooCodeApiUrl()}/l/${landingPageSlug}?${params.toString()}` + : `${getRooCodeApiUrl()}/extension/sign-in?${params.toString()}` + await vscode.env.openExternal(vscode.Uri.parse(url)) } catch (error) { - this.log(`[auth] Error initiating Roo Code Cloud auth: ${error}`) - throw new Error(`Failed to initiate Roo Code Cloud authentication: ${error}`) + const context = landingPageSlug ? ` (landing page: ${landingPageSlug})` : "" + this.log(`[auth] Error initiating Roo Code Cloud auth${context}: ${error}`) + throw new Error(`Failed to initiate Roo Code Cloud authentication${context}: ${error}`) } } @@ -461,6 +471,42 @@ export class WebAuthService extends EventEmitter implements A return this.credentials?.organizationId || null } + /** + * Switch to a different organization context + * @param organizationId The organization ID to switch to, or null for personal account + */ + public async switchOrganization(organizationId: string | null): Promise { + if (!this.credentials) { + throw new Error("Cannot switch organization: not authenticated") + } + + // Update the stored credentials with the new organization ID + const updatedCredentials: AuthCredentials = { + ...this.credentials, + organizationId: organizationId, + } + + // Store the updated credentials, handleCredentialsChange will handle the update + await this.storeCredentials(updatedCredentials) + } + + /** + * Get all organization memberships for the current user + * @returns Array of organization memberships + */ + public async getOrganizationMemberships(): Promise { + if (!this.credentials) { + return [] + } + + try { + return await this.clerkGetOrganizationMemberships() + } catch (error) { + this.log(`[auth] Failed to get organization memberships: ${error}`) + return [] + } + } + private async clerkSignIn(ticket: string): Promise { const formData = new URLSearchParams() formData.append("strategy", "ticket") @@ -645,9 +691,14 @@ export class WebAuthService extends EventEmitter implements A } private async clerkGetOrganizationMemberships(): Promise { + if (!this.credentials) { + this.log("[auth] Cannot get organization memberships: missing credentials") + return [] + } + const response = await fetch(`${getClerkBaseUrl()}/v1/me/organization_memberships`, { headers: { - Authorization: `Bearer ${this.credentials!.clientToken}`, + Authorization: `Bearer ${this.credentials.clientToken}`, "User-Agent": this.userAgent(), }, signal: AbortSignal.timeout(10000), diff --git a/packages/evals/Dockerfile.web b/packages/evals/Dockerfile.web index 4c6a8e0258c..c578955232e 100644 --- a/packages/evals/Dockerfile.web +++ b/packages/evals/Dockerfile.web @@ -60,5 +60,5 @@ RUN chmod +x /usr/local/bin/entrypoint.sh ENV DATABASE_URL=postgresql://postgres:password@db:5432/evals_development ENV REDIS_URL=redis://redis:6379 -EXPOSE 3000 +EXPOSE 3446 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/packages/evals/README.md b/packages/evals/README.md index 750454956f8..8a54e56b819 100644 --- a/packages/evals/README.md +++ b/packages/evals/README.md @@ -29,7 +29,7 @@ Start the evals service: pnpm evals ``` -The initial build process can take a minute or two. Upon success you should see output indicating that a web service is running on localhost:3000: +The initial build process can take a minute or two. Upon success you should see output indicating that a web service is running on localhost:3446: Additionally, you'll find in Docker Desktop that database and redis services are running: @@ -95,7 +95,7 @@ By default, the evals system uses the following ports: - **PostgreSQL**: 5433 (external) → 5432 (internal) - **Redis**: 6380 (external) → 6379 (internal) -- **Web Service**: 3446 (external) → 3000 (internal) +- **Web Service**: 3446 (external) → 3446 (internal) These ports are configured to avoid conflicts with other services that might be running on the standard PostgreSQL (5432) and Redis (6379) ports. diff --git a/packages/evals/docker-compose.yml b/packages/evals/docker-compose.yml index 74c25cf2609..5928b531142 100644 --- a/packages/evals/docker-compose.yml +++ b/packages/evals/docker-compose.yml @@ -52,7 +52,7 @@ services: context: ../../ dockerfile: packages/evals/Dockerfile.web ports: - - "${EVALS_WEB_PORT:-3446}:3000" + - "${EVALS_WEB_PORT:-3446}:3446" environment: - HOST_EXECUTION_METHOD=docker volumes: diff --git a/packages/evals/scripts/setup.sh b/packages/evals/scripts/setup.sh index cca6f9ce954..f4ba30ce795 100755 --- a/packages/evals/scripts/setup.sh +++ b/packages/evals/scripts/setup.sh @@ -12,7 +12,6 @@ build_extension() { echo "🔨 Building the Roo Code extension..." pnpm -w vsix -- --out ../bin/roo-code-$(git rev-parse --short HEAD).vsix || exit 1 code --install-extension ../../bin/roo-code-$(git rev-parse --short HEAD).vsix || exit 1 - cd evals } check_docker_services() { @@ -377,7 +376,7 @@ fi echo -e "\n🚀 You're ready to rock and roll! \n" -if ! nc -z localhost 3000; then +if ! nc -z localhost 3446; then read -p "🌐 Would you like to start the evals web app? (Y/n): " start_evals if [[ "$start_evals" =~ ^[Yy]|^$ ]]; then @@ -386,5 +385,5 @@ if ! nc -z localhost 3000; then echo "💡 You can start it anytime with 'pnpm --filter @roo-code/web-evals dev'." fi else - echo "👟 The evals web app is running at http://localhost:3000 (or http://localhost:3446 if using Docker)" + echo "👟 The evals web app is running at http://localhost:3446" fi diff --git a/packages/types/src/__tests__/telemetry.test.ts b/packages/types/src/__tests__/telemetry.test.ts new file mode 100644 index 00000000000..ace7333798d --- /dev/null +++ b/packages/types/src/__tests__/telemetry.test.ts @@ -0,0 +1,12 @@ +import { taskPropertiesSchema } from "../telemetry.js" + +describe("taskPropertiesSchema", () => { + it("allows codex-cli apiProvider", () => { + const result = taskPropertiesSchema.parse({ + taskId: "test-task", + apiProvider: "codex-cli", + }) + + expect(result.apiProvider).toBe("codex-cli") + }) +}) diff --git a/packages/types/src/cloud.ts b/packages/types/src/cloud.ts index 7ffb28ae5d6..903dfcb93fd 100644 --- a/packages/types/src/cloud.ts +++ b/packages/types/src/cloud.ts @@ -239,9 +239,10 @@ export interface AuthService extends EventEmitter { broadcast(): void // Authentication methods - login(): Promise + login(landingPageSlug?: string): Promise logout(): Promise handleCallback(code: string | null, state: string | null, organizationId?: string | null): Promise + switchOrganization(organizationId: string | null): Promise // State methods getState(): AuthState @@ -253,6 +254,9 @@ export interface AuthService extends EventEmitter { getSessionToken(): string | undefined getUserInfo(): CloudUserInfo | null getStoredOrganizationId(): string | null + + // Organization management + getOrganizationMemberships(): Promise } /** diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 7e79855f7e1..a56a00fc355 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -147,6 +147,7 @@ export const globalSettingsSchema = z.object({ enhancementApiConfigId: z.string().optional(), includeTaskHistoryInEnhance: z.boolean().optional(), historyPreviewCollapsed: z.boolean().optional(), + reasoningBlockCollapsed: z.boolean().optional(), profileThresholds: z.record(z.string(), z.number()).optional(), hasOpenedModeSelector: z.boolean().optional(), lastModeExportPath: z.string().optional(), diff --git a/packages/types/src/message.ts b/packages/types/src/message.ts index b6eb67e1714..77c055c6e15 100644 --- a/packages/types/src/message.ts +++ b/packages/types/src/message.ts @@ -89,6 +89,7 @@ export function isResumableAsk(ask: ClineAsk): ask is ResumableAsk { */ export const interactiveAsks = [ + "followup", "command", "tool", "browser_action_launch", diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index fd327657b67..18fc082a14b 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -25,6 +25,7 @@ import { vscodeLlmModels, xaiModels, internationalZAiModels, + openAiNativeCodexModels, } from "./providers/index.js" /** @@ -132,6 +133,7 @@ export const providerNames = [ "mistral", "moonshot", "openai-native", + "openai-native-codex", "qwen-code", "roo", "sambanova", @@ -258,6 +260,7 @@ const ollamaSchema = baseProviderSettingsSchema.extend({ ollamaModelId: z.string().optional(), ollamaBaseUrl: z.string().optional(), ollamaApiKey: z.string().optional(), + ollamaNumCtx: z.number().int().min(128).optional(), }) const vsCodeLmSchema = baseProviderSettingsSchema.extend({ @@ -298,6 +301,11 @@ const openAiNativeSchema = apiModelIdProviderModelSchema.extend({ openAiNativeServiceTier: serviceTierSchema.optional(), }) +// ChatGPT Codex (auth.json) variant - uses local OAuth credentials file (path) +const openAiNativeCodexSchema = apiModelIdProviderModelSchema.extend({ + openAiNativeCodexOauthPath: z.string().optional(), +}) + const mistralSchema = apiModelIdProviderModelSchema.extend({ mistralApiKey: z.string().optional(), mistralCodestralUrl: z.string().optional(), @@ -429,6 +437,7 @@ export const providerSettingsSchemaDiscriminated = z.discriminatedUnion("apiProv geminiSchema.merge(z.object({ apiProvider: z.literal("gemini") })), geminiCliSchema.merge(z.object({ apiProvider: z.literal("gemini-cli") })), openAiNativeSchema.merge(z.object({ apiProvider: z.literal("openai-native") })), + openAiNativeCodexSchema.merge(z.object({ apiProvider: z.literal("openai-native-codex") })), mistralSchema.merge(z.object({ apiProvider: z.literal("mistral") })), deepSeekSchema.merge(z.object({ apiProvider: z.literal("deepseek") })), deepInfraSchema.merge(z.object({ apiProvider: z.literal("deepinfra") })), @@ -470,6 +479,7 @@ export const providerSettingsSchema = z.object({ ...geminiSchema.shape, ...geminiCliSchema.shape, ...openAiNativeSchema.shape, + ...openAiNativeCodexSchema.shape, ...mistralSchema.shape, ...deepSeekSchema.shape, ...deepInfraSchema.shape, @@ -553,6 +563,7 @@ export const modelIdKeysByProvider: Record = { bedrock: "apiModelId", vertex: "apiModelId", "openai-native": "openAiModelId", + "openai-native-codex": "apiModelId", ollama: "ollamaModelId", lmstudio: "lmStudioModelId", gemini: "apiModelId", @@ -675,6 +686,11 @@ export const MODELS_BY_PROVIDER: Record< label: "OpenAI", models: Object.keys(openAiNativeModels), }, + "openai-native-codex": { + id: "openai-native-codex", + label: "OpenAI (ChatGPT Codex)", + models: Object.keys(openAiNativeCodexModels), + }, "qwen-code": { id: "qwen-code", label: "Qwen Code", models: Object.keys(qwenCodeModels) }, roo: { id: "roo", label: "Roo", models: Object.keys(rooModels) }, sambanova: { diff --git a/packages/types/src/providers/chutes.ts b/packages/types/src/providers/chutes.ts index 15dea58263b..d05bd489b1b 100644 --- a/packages/types/src/providers/chutes.ts +++ b/packages/types/src/providers/chutes.ts @@ -29,6 +29,7 @@ export type ChutesModelId = | "tngtech/DeepSeek-R1T-Chimera" | "zai-org/GLM-4.5-Air" | "zai-org/GLM-4.5-FP8" + | "zai-org/GLM-4.5-turbo" | "moonshotai/Kimi-K2-Instruct-75k" | "moonshotai/Kimi-K2-Instruct-0905" | "Qwen/Qwen3-235B-A22B-Thinking-2507" @@ -274,6 +275,15 @@ export const chutesModels = { description: "GLM-4.5-FP8 model with 128k token context window, optimized for agent-based applications with MoE architecture.", }, + "zai-org/GLM-4.5-turbo": { + maxTokens: 32768, + contextWindow: 131072, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 1, + outputPrice: 3, + description: "GLM-4.5-turbo model with 128K token context window, optimized for fast inference.", + }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { maxTokens: 32768, contextWindow: 262144, diff --git a/packages/types/src/providers/index.ts b/packages/types/src/providers/index.ts index 21e43aaa99a..0ebe0a45739 100644 --- a/packages/types/src/providers/index.ts +++ b/packages/types/src/providers/index.ts @@ -18,6 +18,7 @@ export * from "./mistral.js" export * from "./moonshot.js" export * from "./ollama.js" export * from "./openai.js" +export * from "./openai-codex.js" export * from "./openrouter.js" export * from "./qwen-code.js" export * from "./requesty.js" diff --git a/packages/types/src/providers/openai-codex.ts b/packages/types/src/providers/openai-codex.ts new file mode 100644 index 00000000000..3c8fac74a31 --- /dev/null +++ b/packages/types/src/providers/openai-codex.ts @@ -0,0 +1,47 @@ +import type { ModelInfo } from "../model.js" + +export type OpenAiNativeCodexModelId = keyof typeof openAiNativeCodexModels + +export const openAiNativeCodexDefaultModelId: OpenAiNativeCodexModelId = "gpt-5" + +export const openAiNativeCodexModels = { + "gpt-5": { + maxTokens: 128000, + contextWindow: 400000, + supportsImages: true, + supportsPromptCache: true, + supportsReasoningEffort: true, + reasoningEffort: "medium", + description: "GPT-5 via ChatGPT Responses (Codex). Optimized for coding and agentic tasks.", + supportsTemperature: false, + }, + "gpt-5-codex": { + maxTokens: 128000, + contextWindow: 400000, + supportsImages: true, + supportsPromptCache: true, + supportsReasoningEffort: true, + reasoningEffort: "medium", + description: + "GPT-5 Codex via ChatGPT Responses (Codex). A GPT‑5 variant exposed to the client with coding‑oriented defaults.", + supportsTemperature: false, + }, + "codex-mini-latest": { + // Based on OpenAI's Codex CLI page (fast reasoning model tuned from o4-mini) + maxTokens: 100000, + contextWindow: 200000, + supportsImages: true, // input images supported + supportsPromptCache: true, + supportsReasoningEffort: true, + reasoningEffort: "medium", + description: + "codex-mini-latest via ChatGPT Responses (Codex). Fast reasoning model optimized for the Codex CLI (fine‑tuned o4‑mini).", + supportsTemperature: false, + // Pricing per 1M tokens + inputPrice: 1.5, + outputPrice: 6.0, + // Prompt cache pricing + cacheWritesPrice: 1.5, + cacheReadsPrice: 0.375, + }, +} as const satisfies Record diff --git a/packages/types/src/providers/openai.ts b/packages/types/src/providers/openai.ts index 028027baad6..a3eed1b57ce 100644 --- a/packages/types/src/providers/openai.ts +++ b/packages/types/src/providers/openai.ts @@ -70,6 +70,20 @@ export const openAiNativeModels = { supportsTemperature: false, tiers: [{ name: "flex", contextWindow: 400000, inputPrice: 0.025, outputPrice: 0.2, cacheReadsPrice: 0.0025 }], }, + "gpt-5-codex": { + maxTokens: 128000, + contextWindow: 400000, + supportsImages: true, + supportsPromptCache: true, + supportsReasoningEffort: true, + reasoningEffort: "medium", + inputPrice: 1.25, + outputPrice: 10.0, + cacheReadsPrice: 0.13, + description: "GPT-5-Codex: A version of GPT-5 optimized for agentic coding in Codex", + supportsVerbosity: true, + supportsTemperature: false, + }, "gpt-4.1": { maxTokens: 32_768, contextWindow: 1_047_576, diff --git a/packages/types/src/providers/roo.ts b/packages/types/src/providers/roo.ts index ee84bbe1b1b..01fae43cd57 100644 --- a/packages/types/src/providers/roo.ts +++ b/packages/types/src/providers/roo.ts @@ -1,7 +1,10 @@ import type { ModelInfo } from "../model.js" -// Roo provider with single model -export type RooModelId = "xai/grok-code-fast-1" +export type RooModelId = + | "xai/grok-code-fast-1" + | "roo/code-supernova" + | "xai/grok-4-fast" + | "deepseek/deepseek-chat-v3.1" export const rooDefaultModelId: RooModelId = "xai/grok-code-fast-1" @@ -16,4 +19,34 @@ export const rooModels = { description: "A reasoning model that is blazing fast and excels at agentic coding, accessible for free through Roo Code Cloud for a limited time. (Note: the free prompts and completions are logged by xAI and used to improve the model.)", }, + "roo/code-supernova": { + maxTokens: 16_384, + contextWindow: 200_000, + supportsImages: true, + supportsPromptCache: true, + inputPrice: 0, + outputPrice: 0, + description: + "A versatile agentic coding stealth model that supports image inputs, accessible for free through Roo Code Cloud for a limited time. (Note: the free prompts and completions are logged by the model provider and used to improve the model.)", + }, + "xai/grok-4-fast": { + maxTokens: 30_000, + contextWindow: 2_000_000, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + description: + "Grok 4 Fast is xAI's latest multimodal model with SOTA cost-efficiency and a 2M token context window. (Note: prompts and completions are logged by xAI and used to improve the model.)", + }, + "deepseek/deepseek-chat-v3.1": { + maxTokens: 16_384, + contextWindow: 163_840, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + description: + "DeepSeek-V3.1 is a large hybrid reasoning model (671B parameters, 37B active). It extends the DeepSeek-V3 base with a two-phase long-context training process, reaching up to 128K tokens, and uses FP8 microscaling for efficient inference.", + }, } as const satisfies Record diff --git a/packages/types/src/providers/sambanova.ts b/packages/types/src/providers/sambanova.ts index bed143f6e5c..f339d8bcab0 100644 --- a/packages/types/src/providers/sambanova.ts +++ b/packages/types/src/providers/sambanova.ts @@ -6,10 +6,12 @@ export type SambaNovaModelId = | "Meta-Llama-3.3-70B-Instruct" | "DeepSeek-R1" | "DeepSeek-V3-0324" + | "DeepSeek-V3.1" | "DeepSeek-R1-Distill-Llama-70B" | "Llama-4-Maverick-17B-128E-Instruct" | "Llama-3.3-Swallow-70B-Instruct-v0.4" | "Qwen3-32B" + | "gpt-oss-120b" export const sambaNovaDefaultModelId: SambaNovaModelId = "Meta-Llama-3.3-70B-Instruct" @@ -51,6 +53,15 @@ export const sambaNovaModels = { outputPrice: 4.5, description: "DeepSeek V3 model with 32K context window.", }, + "DeepSeek-V3.1": { + maxTokens: 8192, + contextWindow: 32768, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 3.0, + outputPrice: 4.5, + description: "DeepSeek V3.1 model with 32K context window.", + }, "DeepSeek-R1-Distill-Llama-70B": { maxTokens: 8192, contextWindow: 131072, @@ -87,4 +98,13 @@ export const sambaNovaModels = { outputPrice: 0.8, description: "Alibaba Qwen 3 32B model with 8K context window.", }, + "gpt-oss-120b": { + maxTokens: 8192, + contextWindow: 131072, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0.22, + outputPrice: 0.59, + description: "OpenAI gpt oss 120b model with 128k context window.", + }, } as const satisfies Record diff --git a/packages/types/src/single-file-read-models.ts b/packages/types/src/single-file-read-models.ts index b83a781507c..302b8d42023 100644 --- a/packages/types/src/single-file-read-models.ts +++ b/packages/types/src/single-file-read-models.ts @@ -10,5 +10,5 @@ * @returns true if the model should use single file reads */ export function shouldUseSingleFileRead(modelId: string): boolean { - return modelId.includes("grok-code-fast-1") + return modelId.includes("grok-code-fast-1") || modelId.includes("code-supernova") } diff --git a/packages/types/src/telemetry.ts b/packages/types/src/telemetry.ts index bba14857225..df921550122 100644 --- a/packages/types/src/telemetry.ts +++ b/packages/types/src/telemetry.ts @@ -61,6 +61,11 @@ export enum TelemetryEventName { ACCOUNT_LOGOUT_CLICKED = "Account Logout Clicked", ACCOUNT_LOGOUT_SUCCESS = "Account Logout Success", + FEATURED_PROVIDER_CLICKED = "Featured Provider Clicked", + + UPSELL_DISMISSED = "Upsell Dismissed", + UPSELL_CLICKED = "Upsell Clicked", + SCHEMA_VALIDATION_ERROR = "Schema Validation Error", DIFF_APPLICATION_ERROR = "Diff Application Error", SHELL_INTEGRATION_ERROR = "Shell Integration Error", @@ -106,7 +111,8 @@ export type AppProperties = z.infer export const taskPropertiesSchema = z.object({ taskId: z.string().optional(), - apiProvider: z.enum(providerNames).optional(), + // Allow Codex CLI harness identifier in addition to standard provider names. + apiProvider: z.union([z.enum(providerNames), z.literal("codex-cli")]).optional(), modelId: z.string().optional(), diffStrategy: z.string().optional(), isSubtask: z.boolean().optional(), @@ -181,6 +187,9 @@ export const rooCodeTelemetryEventSchema = z.discriminatedUnion("type", [ TelemetryEventName.ACCOUNT_CONNECT_SUCCESS, TelemetryEventName.ACCOUNT_LOGOUT_CLICKED, TelemetryEventName.ACCOUNT_LOGOUT_SUCCESS, + TelemetryEventName.FEATURED_PROVIDER_CLICKED, + TelemetryEventName.UPSELL_DISMISSED, + TelemetryEventName.UPSELL_CLICKED, TelemetryEventName.SCHEMA_VALIDATION_ERROR, TelemetryEventName.DIFF_APPLICATION_ERROR, TelemetryEventName.SHELL_INTEGRATION_ERROR, diff --git a/packages/types/src/vscode.ts b/packages/types/src/vscode.ts index 28385146908..d22ebdab229 100644 --- a/packages/types/src/vscode.ts +++ b/packages/types/src/vscode.ts @@ -53,6 +53,7 @@ export const commandIds = [ "focusInput", "acceptInput", "focusPanel", + "toggleAutoApprove", ] as const export type CommandId = (typeof commandIds)[number] diff --git a/releases/3.28.4-release.png b/releases/3.28.4-release.png new file mode 100644 index 00000000000..ea1e82a8dda Binary files /dev/null and b/releases/3.28.4-release.png differ diff --git a/releases/3.28.5-release.png b/releases/3.28.5-release.png new file mode 100644 index 00000000000..0a22c25c40d Binary files /dev/null and b/releases/3.28.5-release.png differ diff --git a/releases/3.28.6-release.png b/releases/3.28.6-release.png new file mode 100644 index 00000000000..e246cffb014 Binary files /dev/null and b/releases/3.28.6-release.png differ diff --git a/releases/3.28.7-release.png b/releases/3.28.7-release.png new file mode 100644 index 00000000000..d4690f19c99 Binary files /dev/null and b/releases/3.28.7-release.png differ diff --git a/releases/3.28.8-release.png b/releases/3.28.8-release.png new file mode 100644 index 00000000000..8fcfa224538 Binary files /dev/null and b/releases/3.28.8-release.png differ diff --git a/scripts/find-missing-translations.js b/scripts/find-missing-translations.js index 9277d935ba0..fe7577408e1 100755 --- a/scripts/find-missing-translations.js +++ b/scripts/find-missing-translations.js @@ -7,12 +7,16 @@ * Options: * --locale= Only check a specific locale (e.g. --locale=fr) * --file= Only check a specific file (e.g. --file=chat.json) - * --area= Only check a specific area (core, webview, or both) + * --area= Only check a specific area (core, webview, package-nls, or all) * --help Show this help message */ -const fs = require("fs") const path = require("path") +const { promises: fs } = require("fs") + +const readFile = fs.readFile +const readdir = fs.readdir +const stat = fs.stat // Process command line arguments const args = process.argv.slice(2).reduce( @@ -26,15 +30,15 @@ const args = process.argv.slice(2).reduce( } else if (arg.startsWith("--area=")) { acc.area = arg.split("=")[1] // Validate area value - if (!["core", "webview", "both"].includes(acc.area)) { - console.error(`Error: Invalid area '${acc.area}'. Must be 'core', 'webview', or 'both'.`) + if (!["core", "webview", "package-nls", "all"].includes(acc.area)) { + console.error(`Error: Invalid area '${acc.area}'. Must be 'core', 'webview', 'package-nls', or 'all'.`) process.exit(1) } } return acc }, - { area: "both" }, -) // Default to checking both areas + { area: "all" }, +) // Default to checking all areas // Show help if requested if (args.help) { @@ -50,10 +54,11 @@ Usage: Options: --locale= Only check a specific locale (e.g. --locale=fr) --file= Only check a specific file (e.g. --file=chat.json) - --area= Only check a specific area (core, webview, or both) + --area= Only check a specific area (core, webview, package-nls, or all) 'core' = Backend (src/i18n/locales) 'webview' = Frontend UI (webview-ui/src/i18n/locales) - 'both' = Check both areas (default) + 'package-nls' = VSCode package.nls.json files + 'all' = Check all areas (default) --help Show this help message Output: @@ -69,7 +74,7 @@ const LOCALES_DIRS = { } // Determine which areas to check based on args -const areasToCheck = args.area === "both" ? ["core", "webview"] : [args.area] +const areasToCheck = args.area === "all" ? ["core", "webview", "package-nls"] : [args.area] // Recursively find all keys in an object function findKeys(obj, parentKey = "") { @@ -105,18 +110,45 @@ function getValueAtPath(obj, path) { return current } +// Shared utility to safely parse JSON files with error handling +async function parseJsonFile(filePath) { + try { + const content = await readFile(filePath, "utf8") + return JSON.parse(content) + } catch (error) { + if (error.code === "ENOENT") { + return null // File doesn't exist + } + throw new Error(`Error parsing JSON file '${filePath}': ${error.message}`) + } +} + +// Validate that a JSON object has a flat structure (no nested objects) +function validateFlatStructure(obj, filePath) { + for (const [key, value] of Object.entries(obj)) { + if (typeof value === "object" && value !== null) { + console.error(`Error: ${filePath} should be a flat JSON structure. Found nested object at key '${key}'`) + process.exit(1) + } + } +} + // Function to check translations for a specific area -function checkAreaTranslations(area) { +async function checkAreaTranslations(area) { const LOCALES_DIR = LOCALES_DIRS[area] // Get all locale directories (or filter to the specified locale) - const allLocales = fs.readdirSync(LOCALES_DIR).filter((item) => { - const stats = fs.statSync(path.join(LOCALES_DIR, item)) - return stats.isDirectory() && item !== "en" // Exclude English as it's our source - }) + const dirContents = await readdir(LOCALES_DIR) + const allLocales = await Promise.all( + dirContents.map(async (item) => { + const stats = await stat(path.join(LOCALES_DIR, item)) + return stats.isDirectory() && item !== "en" ? item : null + }), + ) + const filteredLocales = allLocales.filter(Boolean) // Filter to the specified locale if provided - const locales = args.locale ? allLocales.filter((locale) => locale === args.locale) : allLocales + const locales = args.locale ? filteredLocales.filter((locale) => locale === args.locale) : filteredLocales if (args.locale && locales.length === 0) { console.error(`Error: Locale '${args.locale}' not found in ${LOCALES_DIR}`) @@ -129,7 +161,8 @@ function checkAreaTranslations(area) { // Get all English JSON files const englishDir = path.join(LOCALES_DIR, "en") - let englishFiles = fs.readdirSync(englishDir).filter((file) => file.endsWith(".json") && !file.startsWith(".")) + const englishDirContents = await readdir(englishDir) + let englishFiles = englishDirContents.filter((file) => file.endsWith(".json") && !file.startsWith(".")) // Filter to the specified file if provided if (args.file) { @@ -140,81 +173,201 @@ function checkAreaTranslations(area) { englishFiles = englishFiles.filter((file) => file === args.file) } - // Load file contents - let englishFileContents - - try { - englishFileContents = englishFiles.map((file) => ({ - name: file, - content: JSON.parse(fs.readFileSync(path.join(englishDir, file), "utf8")), - })) - } catch (e) { - console.error(`Error: File '${englishDir}' is not a valid JSON file`) - process.exit(1) - } + // Load file contents in parallel + const englishFileContents = await Promise.all( + englishFiles.map(async (file) => { + const filePath = path.join(englishDir, file) + const content = await parseJsonFile(filePath) + if (!content) { + console.error(`Error: Could not read file '${filePath}'`) + process.exit(1) + } + return { name: file, content } + }), + ) console.log( `Checking ${englishFileContents.length} translation file(s): ${englishFileContents.map((f) => f.name).join(", ")}`, ) + // Precompute English keys per file + const englishFileKeys = new Map(englishFileContents.map((f) => [f.name, findKeys(f.content)])) + // Results object to store missing translations const missingTranslations = {} - // For each locale, check for missing translations - for (const locale of locales) { - missingTranslations[locale] = {} + // Process all locales in parallel + await Promise.all( + locales.map(async (locale) => { + missingTranslations[locale] = {} + + // Process all files for this locale in parallel + await Promise.all( + englishFileContents.map(async ({ name, content: englishContent }) => { + const localeFilePath = path.join(LOCALES_DIR, locale, name) + + // Check if the file exists in the locale + const localeContent = await parseJsonFile(localeFilePath) + if (!localeContent) { + missingTranslations[locale][name] = { file: "File is missing entirely" } + return + } + + // Find all keys in the English file + const englishKeys = englishFileKeys.get(name) || [] + + // Check for missing keys in the locale file + const missingKeys = [] + + for (const key of englishKeys) { + const englishValue = getValueAtPath(englishContent, key) + const localeValue = getValueAtPath(localeContent, key) + + if (localeValue === undefined) { + missingKeys.push({ + key, + englishValue, + }) + } + } + + if (missingKeys.length > 0) { + missingTranslations[locale][name] = missingKeys + } + }), + ) + }), + ) + + return { missingTranslations, hasMissingTranslations: outputResults(missingTranslations, area) } +} + +// Function to output results for an area +function outputResults(missingTranslations, area) { + let hasMissingTranslations = false + + console.log(`\n${area === "core" ? "BACKEND" : "FRONTEND"} Missing Translations Report:\n`) + + for (const [locale, files] of Object.entries(missingTranslations)) { + if (Object.keys(files).length === 0) { + console.log(`✅ ${locale}: No missing translations`) + continue + } - for (const { name, content: englishContent } of englishFileContents) { - const localeFilePath = path.join(LOCALES_DIR, locale, name) + hasMissingTranslations = true + console.log(`📝 ${locale}:`) - // Check if the file exists in the locale - if (!fs.existsSync(localeFilePath)) { - missingTranslations[locale][name] = { file: "File is missing entirely" } + for (const [fileName, missingItems] of Object.entries(files)) { + if (missingItems.file) { + console.log(` - ${fileName}: ${missingItems.file}`) continue } - // Load the locale file - let localeContent + console.log(` - ${fileName}: ${missingItems.length} missing translations`) + + for (const { key, englishValue } of missingItems) { + console.log(` ${key}: "${englishValue}"`) + } + } + + console.log("") + } + + return hasMissingTranslations +} + +// Function to check package.nls.json translations +async function checkPackageNlsTranslations() { + const SRC_DIR = path.join(__dirname, "../src") + + // Read the base package.nls.json file + const baseFilePath = path.join(SRC_DIR, "package.nls.json") + const baseContent = await parseJsonFile(baseFilePath) + + if (!baseContent) { + console.warn(`Warning: Base package.nls.json not found at ${baseFilePath} - skipping package.nls checks`) + return { missingTranslations: {}, hasMissingTranslations: false } + } + + // Validate that the base file has a flat structure + validateFlatStructure(baseContent, baseFilePath) + + // Get all package.nls.*.json files + const srcDirContents = await readdir(SRC_DIR) + const nlsFiles = srcDirContents + .filter((file) => file.startsWith("package.nls.") && file.endsWith(".json")) + .filter((file) => file !== "package.nls.json") // Exclude the base file + + // Filter to the specified locale if provided + const filesToCheck = args.locale + ? nlsFiles.filter((file) => { + const locale = file.replace("package.nls.", "").replace(".json", "") + return locale === args.locale + }) + : nlsFiles + + if (args.locale && filesToCheck.length === 0) { + console.error(`Error: Locale '${args.locale}' not found in package.nls files`) + process.exit(1) + } - try { - localeContent = JSON.parse(fs.readFileSync(localeFilePath, "utf8")) - } catch (e) { - console.error(`Error: File '${localeFilePath}' is not a valid JSON file`) + console.log( + `\nPACKAGE.NLS - Checking ${filesToCheck.length} locale file(s): ${filesToCheck.map((f) => f.replace("package.nls.", "").replace(".json", "")).join(", ")}`, + ) + console.log(`Checking against base package.nls.json with ${Object.keys(baseContent).length} keys`) + + // Results object to store missing translations + const missingTranslations = {} + + // Get all keys from the base file (package.nls files are flat, not nested) + const baseKeys = Object.keys(baseContent) + + // Process all locale files in parallel + await Promise.all( + filesToCheck.map(async (file) => { + const locale = file.replace("package.nls.", "").replace(".json", "") + const localeFilePath = path.join(SRC_DIR, file) + + const localeContent = await parseJsonFile(localeFilePath) + if (!localeContent) { + console.error(`Error: Could not read file '${localeFilePath}'`) process.exit(1) } - // Find all keys in the English file - const englishKeys = findKeys(englishContent) + // Validate that the locale file has a flat structure + validateFlatStructure(localeContent, localeFilePath) - // Check for missing keys in the locale file + // Check for missing keys const missingKeys = [] - for (const key of englishKeys) { - const englishValue = getValueAtPath(englishContent, key) - const localeValue = getValueAtPath(localeContent, key) + for (const key of baseKeys) { + const baseValue = baseContent[key] + const localeValue = localeContent[key] if (localeValue === undefined) { missingKeys.push({ key, - englishValue, + englishValue: baseValue, }) } } if (missingKeys.length > 0) { - missingTranslations[locale][name] = missingKeys + missingTranslations[locale] = { + "package.nls.json": missingKeys, + } } - } - } + }), + ) - return { missingTranslations, hasMissingTranslations: outputResults(missingTranslations, area) } + return { missingTranslations, hasMissingTranslations: outputPackageNlsResults(missingTranslations) } } -// Function to output results for an area -function outputResults(missingTranslations, area) { +// Function to output package.nls results +function outputPackageNlsResults(missingTranslations) { let hasMissingTranslations = false - console.log(`\n${area === "core" ? "BACKEND" : "FRONTEND"} Missing Translations Report:\n`) + console.log(`\nPACKAGE.NLS Missing Translations Report:\n`) for (const [locale, files] of Object.entries(missingTranslations)) { if (Object.keys(files).length === 0) { @@ -226,11 +379,6 @@ function outputResults(missingTranslations, area) { console.log(`📝 ${locale}:`) for (const [fileName, missingItems] of Object.entries(files)) { - if (missingItems.file) { - console.log(` - ${fileName}: ${missingItems.file}`) - continue - } - console.log(` - ${fileName}: ${missingItems.length} missing translations`) for (const { key, englishValue } of missingItems) { @@ -245,7 +393,7 @@ function outputResults(missingTranslations, area) { } // Main function to find missing translations -function findMissingTranslations() { +async function findMissingTranslations() { try { console.log("Starting translation check...") @@ -253,8 +401,13 @@ function findMissingTranslations() { // Check each requested area for (const area of areasToCheck) { - const { hasMissingTranslations } = checkAreaTranslations(area) - anyAreaMissingTranslations = anyAreaMissingTranslations || hasMissingTranslations + if (area === "package-nls") { + const { hasMissingTranslations } = await checkPackageNlsTranslations() + anyAreaMissingTranslations = anyAreaMissingTranslations || hasMissingTranslations + } else { + const { hasMissingTranslations } = await checkAreaTranslations(area) + anyAreaMissingTranslations = anyAreaMissingTranslations || hasMissingTranslations + } } // Summary diff --git a/src/activate/registerCommands.ts b/src/activate/registerCommands.ts index fac615edf11..41c127333d8 100644 --- a/src/activate/registerCommands.ts +++ b/src/activate/registerCommands.ts @@ -221,6 +221,18 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt visibleProvider.postMessageToWebview({ type: "acceptInput" }) }, + toggleAutoApprove: async () => { + const visibleProvider = getVisibleProviderOrLog(outputChannel) + + if (!visibleProvider) { + return + } + + visibleProvider.postMessageToWebview({ + type: "action", + action: "toggleAutoApprove", + }) + }, }) export const openClineInNewTab = async ({ context, outputChannel }: Omit) => { diff --git a/src/api/index.ts b/src/api/index.ts index ac009676762..655ff35b442 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -16,6 +16,7 @@ import { LmStudioHandler, GeminiHandler, OpenAiNativeHandler, + OpenAiNativeCodexHandler, DeepSeekHandler, MoonshotHandler, MistralHandler, @@ -115,6 +116,8 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler { return new GeminiHandler(options) case "openai-native": return new OpenAiNativeHandler(options) + case "openai-native-codex": + return new OpenAiNativeCodexHandler(options) case "deepseek": return new DeepSeekHandler(options) case "doubao": diff --git a/src/api/providers/__tests__/chutes.spec.ts b/src/api/providers/__tests__/chutes.spec.ts index 398f86ce608..70ee06a923c 100644 --- a/src/api/providers/__tests__/chutes.spec.ts +++ b/src/api/providers/__tests__/chutes.spec.ts @@ -253,6 +253,28 @@ describe("ChutesHandler", () => { ) }) + it("should return zai-org/GLM-4.5-turbo model with correct configuration", () => { + const testModelId: ChutesModelId = "zai-org/GLM-4.5-turbo" + const handlerWithModel = new ChutesHandler({ + apiModelId: testModelId, + chutesApiKey: "test-chutes-api-key", + }) + const model = handlerWithModel.getModel() + expect(model.id).toBe(testModelId) + expect(model.info).toEqual( + expect.objectContaining({ + maxTokens: 32768, + contextWindow: 131072, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 1, + outputPrice: 3, + description: "GLM-4.5-turbo model with 128K token context window, optimized for fast inference.", + temperature: 0.5, // Default temperature for non-DeepSeek models + }), + ) + }) + it("should return Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8 model with correct configuration", () => { const testModelId: ChutesModelId = "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8" const handlerWithModel = new ChutesHandler({ diff --git a/src/api/providers/__tests__/native-ollama.spec.ts b/src/api/providers/__tests__/native-ollama.spec.ts index f8792937dbc..4ddeb909bb6 100644 --- a/src/api/providers/__tests__/native-ollama.spec.ts +++ b/src/api/providers/__tests__/native-ollama.spec.ts @@ -73,6 +73,61 @@ describe("NativeOllamaHandler", () => { expect(results[2]).toEqual({ type: "usage", inputTokens: 10, outputTokens: 2 }) }) + it("should not include num_ctx by default", async () => { + // Mock the chat response + mockChat.mockImplementation(async function* () { + yield { message: { content: "Response" } } + }) + + const stream = handler.createMessage("System", [{ role: "user" as const, content: "Test" }]) + + // Consume the stream + for await (const _ of stream) { + // consume stream + } + + // Verify that num_ctx was NOT included in the options + expect(mockChat).toHaveBeenCalledWith( + expect.objectContaining({ + options: expect.not.objectContaining({ + num_ctx: expect.anything(), + }), + }), + ) + }) + + it("should include num_ctx when explicitly set via ollamaNumCtx", async () => { + const options: ApiHandlerOptions = { + apiModelId: "llama2", + ollamaModelId: "llama2", + ollamaBaseUrl: "http://localhost:11434", + ollamaNumCtx: 8192, // Explicitly set num_ctx + } + + handler = new NativeOllamaHandler(options) + + // Mock the chat response + mockChat.mockImplementation(async function* () { + yield { message: { content: "Response" } } + }) + + const stream = handler.createMessage("System", [{ role: "user" as const, content: "Test" }]) + + // Consume the stream + for await (const _ of stream) { + // consume stream + } + + // Verify that num_ctx was included with the specified value + expect(mockChat).toHaveBeenCalledWith( + expect.objectContaining({ + options: expect.objectContaining({ + num_ctx: 8192, + }), + }), + ) + }) + it("should handle DeepSeek R1 models with reasoning detection", async () => { const options: ApiHandlerOptions = { apiModelId: "deepseek-r1", @@ -120,6 +175,49 @@ describe("NativeOllamaHandler", () => { }) expect(result).toBe("This is the response") }) + + it("should not include num_ctx in completePrompt by default", async () => { + mockChat.mockResolvedValue({ + message: { content: "Response" }, + }) + + await handler.completePrompt("Test prompt") + + // Verify that num_ctx was NOT included in the options + expect(mockChat).toHaveBeenCalledWith( + expect.objectContaining({ + options: expect.not.objectContaining({ + num_ctx: expect.anything(), + }), + }), + ) + }) + + it("should include num_ctx in completePrompt when explicitly set", async () => { + const options: ApiHandlerOptions = { + apiModelId: "llama2", + ollamaModelId: "llama2", + ollamaBaseUrl: "http://localhost:11434", + ollamaNumCtx: 4096, // Explicitly set num_ctx + } + + handler = new NativeOllamaHandler(options) + + mockChat.mockResolvedValue({ + message: { content: "Response" }, + }) + + await handler.completePrompt("Test prompt") + + // Verify that num_ctx was included with the specified value + expect(mockChat).toHaveBeenCalledWith( + expect.objectContaining({ + options: expect.objectContaining({ + num_ctx: 4096, + }), + }), + ) + }) }) describe("error handling", () => { diff --git a/src/api/providers/__tests__/roo.spec.ts b/src/api/providers/__tests__/roo.spec.ts index 5897156b0a0..d4affa2beaf 100644 --- a/src/api/providers/__tests__/roo.spec.ts +++ b/src/api/providers/__tests__/roo.spec.ts @@ -36,26 +36,12 @@ vitest.mock("openai", () => { return { [Symbol.asyncIterator]: async function* () { yield { - choices: [ - { - delta: { content: "Test response" }, - index: 0, - }, - ], + choices: [{ delta: { content: "Test response" }, index: 0 }], usage: null, } yield { - choices: [ - { - delta: {}, - index: 0, - }, - ], - usage: { - prompt_tokens: 10, - completion_tokens: 5, - total_tokens: 15, - }, + choices: [{ delta: {}, index: 0 }], + usage: { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 }, } }, } @@ -73,6 +59,7 @@ const mockHasInstance = vitest.fn() // Create mock functions that we can control const mockGetSessionTokenFn = vitest.fn() const mockHasInstanceFn = vitest.fn() +const mockOnFn = vitest.fn() vitest.mock("@roo-code/cloud", () => ({ CloudService: { @@ -82,6 +69,8 @@ vitest.mock("@roo-code/cloud", () => ({ authService: { getSessionToken: () => mockGetSessionTokenFn(), }, + on: vitest.fn(), + off: vitest.fn(), } }, }, @@ -409,11 +398,18 @@ describe("RooHandler", () => { it("should handle undefined auth service gracefully", () => { mockHasInstanceFn.mockReturnValue(true) // Mock CloudService with undefined authService - const originalGetter = Object.getOwnPropertyDescriptor(CloudService, "instance")?.get + const originalGetSessionToken = mockGetSessionTokenFn.getMockImplementation() + + // Temporarily make authService return undefined + mockGetSessionTokenFn.mockImplementation(() => undefined) try { Object.defineProperty(CloudService, "instance", { - get: () => ({ authService: undefined }), + get: () => ({ + authService: undefined, + on: vitest.fn(), + off: vitest.fn(), + }), configurable: true, }) @@ -424,12 +420,11 @@ describe("RooHandler", () => { const handler = new RooHandler(mockOptions) expect(handler).toBeInstanceOf(RooHandler) } finally { - // Always restore original getter, even if test fails - if (originalGetter) { - Object.defineProperty(CloudService, "instance", { - get: originalGetter, - configurable: true, - }) + // Restore original mock implementation + if (originalGetSessionToken) { + mockGetSessionTokenFn.mockImplementation(originalGetSessionToken) + } else { + mockGetSessionTokenFn.mockReturnValue("test-session-token") } } }) diff --git a/src/api/providers/fetchers/__tests__/glama.spec.ts b/src/api/providers/fetchers/__tests__/glama.spec.ts new file mode 100644 index 00000000000..4e2256e19e8 --- /dev/null +++ b/src/api/providers/fetchers/__tests__/glama.spec.ts @@ -0,0 +1,113 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" + +vi.mock("axios", () => { + const get = vi.fn() + return { + default: { get }, + get, + isAxiosError: (error: unknown) => Boolean((error as { isAxiosError?: boolean })?.isAxiosError), + } +}) + +import axios from "axios" + +import { DEFAULT_HEADERS } from "../../constants" +import { getGlamaModels } from "../glama" + +const axiosMock = axios as unknown as { get: ReturnType } + +const sampleResponse = [ + { + id: "anthropic/claude-3.5-sonnet", + capabilities: ["input:image", "caching"], + maxTokensInput: 200000, + maxTokensOutput: null, + maxCompletionTokens: 4096, + pricePerToken: { + input: "0.0000016", + output: "0.000004", + cacheWrite: "0.0000003", + cacheRead: "0.00000003", + }, + }, +] + +describe("getGlamaModels", () => { + beforeEach(() => { + axiosMock.get.mockReset() + }) + + afterEach(() => { + vi.restoreAllMocks() + vi.useRealTimers() + }) + + it("fetches and normalises models", async () => { + axiosMock.get.mockResolvedValue({ data: sampleResponse }) + + const models = await getGlamaModels() + + expect(axiosMock.get).toHaveBeenCalledWith( + "https://glama.ai/api/gateway/v1/models", + expect.objectContaining({ headers: DEFAULT_HEADERS }), + ) + + const model = models["anthropic/claude-3.5-sonnet"] + expect(model).toBeDefined() + expect(model).toMatchObject({ + maxTokens: 4096, + contextWindow: 200000, + supportsImages: true, + supportsPromptCache: true, + outputPrice: 4, + cacheWritesPrice: 0.3, + cacheReadsPrice: 0.03, + }) + expect(model?.inputPrice).toBeCloseTo(1.6) + }) + + it("retries before succeeding", async () => { + vi.useFakeTimers() + const error = Object.assign(new Error("ECONNRESET"), { + isAxiosError: true, + toJSON: () => ({ code: "ECONNRESET" }), + }) + axiosMock.get.mockRejectedValueOnce(error).mockResolvedValue({ data: sampleResponse }) + + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}) + const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}) + + const promise = getGlamaModels() + + expect(axiosMock.get).toHaveBeenCalledTimes(1) + await vi.runAllTimersAsync() + const models = await promise + + expect(axiosMock.get).toHaveBeenCalledTimes(2) + expect(models).toHaveProperty("anthropic/claude-3.5-sonnet") + expect(warnSpy).toHaveBeenCalled() + expect(errorSpy).not.toHaveBeenCalled() + }) + + it("returns empty object after max retries", async () => { + vi.useFakeTimers() + const error = Object.assign(new Error("ECONNRESET"), { + isAxiosError: true, + toJSON: () => ({ code: "ECONNRESET" }), + }) + axiosMock.get.mockRejectedValue(error) + + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}) + const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}) + + const promise = getGlamaModels() + await vi.runAllTimersAsync() + + const models = await promise + + expect(axiosMock.get).toHaveBeenCalledTimes(3) + expect(models).toEqual({}) + expect(warnSpy).toHaveBeenCalledTimes(2) + expect(errorSpy).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/api/providers/fetchers/glama.ts b/src/api/providers/fetchers/glama.ts index 9fd57e2c680..e3a9e8fc159 100644 --- a/src/api/providers/fetchers/glama.ts +++ b/src/api/providers/fetchers/glama.ts @@ -1,43 +1,64 @@ -import axios from "axios" +import axios, { isAxiosError } from "axios" +import https from "https" import type { ModelInfo } from "@roo-code/types" import { parseApiPrice } from "../../../shared/cost" +import { DEFAULT_HEADERS } from "../constants" + +const GLAMA_MODELS_URL = "https://glama.ai/api/gateway/v1/models" +const MAX_ATTEMPTS = 3 +const BASE_RETRY_DELAY_MS = 500 + +const glamaAgent = new https.Agent({ keepAlive: true }) + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) export async function getGlamaModels(): Promise> { - const models: Record = {} - - try { - const response = await axios.get("https://glama.ai/api/gateway/v1/models") - const rawModels = response.data - - for (const rawModel of rawModels) { - const modelInfo: ModelInfo = { - maxTokens: rawModel.maxTokensOutput, - contextWindow: rawModel.maxTokensInput, - supportsImages: rawModel.capabilities?.includes("input:image"), - supportsComputerUse: rawModel.capabilities?.includes("computer_use"), - supportsPromptCache: rawModel.capabilities?.includes("caching"), - inputPrice: parseApiPrice(rawModel.pricePerToken?.input), - outputPrice: parseApiPrice(rawModel.pricePerToken?.output), - description: undefined, - cacheWritesPrice: parseApiPrice(rawModel.pricePerToken?.cacheWrite), - cacheReadsPrice: parseApiPrice(rawModel.pricePerToken?.cacheRead), - } + for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { + try { + const response = await axios.get(GLAMA_MODELS_URL, { + headers: DEFAULT_HEADERS, + httpsAgent: glamaAgent, + timeout: 15_000, + }) + const rawModels = response.data ?? [] + const models: Record = {} - switch (rawModel.id) { - case rawModel.id.startsWith("anthropic/"): - modelInfo.maxTokens = 8192 - break - default: - break + for (const rawModel of rawModels) { + const modelInfo: ModelInfo = { + maxTokens: rawModel.maxTokensOutput ?? rawModel.maxCompletionTokens, + contextWindow: rawModel.maxTokensInput, + supportsImages: rawModel.capabilities?.includes("input:image"), + supportsComputerUse: rawModel.capabilities?.includes("computer_use"), + supportsPromptCache: rawModel.capabilities?.includes("caching"), + inputPrice: parseApiPrice(rawModel.pricePerToken?.input), + outputPrice: parseApiPrice(rawModel.pricePerToken?.output), + description: undefined, + cacheWritesPrice: parseApiPrice(rawModel.pricePerToken?.cacheWrite), + cacheReadsPrice: parseApiPrice(rawModel.pricePerToken?.cacheRead), + } + + if (typeof rawModel.id === "string" && rawModel.id.startsWith("anthropic/")) { + // Glama omits maxTokens for some Anthropic entries; default to 8K to match provider docs. + modelInfo.maxTokens = modelInfo.maxTokens ?? 8192 + } + + models[rawModel.id] = modelInfo } - models[rawModel.id] = modelInfo + return models + } catch (error) { + const loggable = isAxiosError(error) ? error.toJSON() : error + const prefix = `[getGlamaModels] Attempt ${attempt} failed` + if (attempt < MAX_ATTEMPTS) { + console.warn(prefix, loggable) + await sleep(BASE_RETRY_DELAY_MS * attempt) + } else { + console.error(`${prefix}; giving up`, loggable) + } } - } catch (error) { - console.error(`Error fetching Glama models: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`) } - return models + return {} } diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index 775d763a05f..573adda879e 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -286,10 +286,7 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl outputTokens: number cacheReadTokens?: number }) { - if (!info.inputPrice || !info.outputPrice || !info.cacheReadsPrice) { - return undefined - } - + // For models with tiered pricing, prices might only be defined in tiers let inputPrice = info.inputPrice let outputPrice = info.outputPrice let cacheReadsPrice = info.cacheReadsPrice @@ -306,6 +303,16 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl } } + // Check if we have the required prices after considering tiers + if (!inputPrice || !outputPrice) { + return undefined + } + + // cacheReadsPrice is optional - if not defined, treat as 0 + if (!cacheReadsPrice) { + cacheReadsPrice = 0 + } + // Subtract the cached input tokens from the total input tokens. const uncachedInputTokens = inputTokens - cacheReadTokens diff --git a/src/api/providers/index.ts b/src/api/providers/index.ts index 85d877b6bc7..a65de3f6f58 100644 --- a/src/api/providers/index.ts +++ b/src/api/providers/index.ts @@ -19,6 +19,7 @@ export { LmStudioHandler } from "./lm-studio" export { MistralHandler } from "./mistral" export { OllamaHandler } from "./ollama" export { OpenAiNativeHandler } from "./openai-native" +export { OpenAiNativeCodexHandler } from "./openai-native-codex" export { OpenAiHandler } from "./openai" export { OpenRouterHandler } from "./openrouter" export { QwenCodeHandler } from "./qwen-code" diff --git a/src/api/providers/native-ollama.ts b/src/api/providers/native-ollama.ts index 80231540e8e..83a5c7b36ea 100644 --- a/src/api/providers/native-ollama.ts +++ b/src/api/providers/native-ollama.ts @@ -8,6 +8,11 @@ import { getOllamaModels } from "./fetchers/ollama" import { XmlMatcher } from "../../utils/xml-matcher" import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" +interface OllamaChatOptions { + temperature: number + num_ctx?: number +} + function convertToOllamaMessages(anthropicMessages: Anthropic.Messages.MessageParam[]): Message[] { const ollamaMessages: Message[] = [] @@ -184,15 +189,22 @@ export class NativeOllamaHandler extends BaseProvider implements SingleCompletio ) try { + // Build options object conditionally + const chatOptions: OllamaChatOptions = { + temperature: this.options.modelTemperature ?? (useR1Format ? DEEP_SEEK_DEFAULT_TEMPERATURE : 0), + } + + // Only include num_ctx if explicitly set via ollamaNumCtx + if (this.options.ollamaNumCtx !== undefined) { + chatOptions.num_ctx = this.options.ollamaNumCtx + } + // Create the actual API request promise const stream = await client.chat({ model: modelId, messages: ollamaMessages, stream: true, - options: { - num_ctx: modelInfo.contextWindow, - temperature: this.options.modelTemperature ?? (useR1Format ? DEEP_SEEK_DEFAULT_TEMPERATURE : 0), - }, + options: chatOptions, }) let totalInputTokens = 0 @@ -274,13 +286,21 @@ export class NativeOllamaHandler extends BaseProvider implements SingleCompletio const { id: modelId } = await this.fetchModel() const useR1Format = modelId.toLowerCase().includes("deepseek-r1") + // Build options object conditionally + const chatOptions: OllamaChatOptions = { + temperature: this.options.modelTemperature ?? (useR1Format ? DEEP_SEEK_DEFAULT_TEMPERATURE : 0), + } + + // Only include num_ctx if explicitly set via ollamaNumCtx + if (this.options.ollamaNumCtx !== undefined) { + chatOptions.num_ctx = this.options.ollamaNumCtx + } + const response = await client.chat({ model: modelId, messages: [{ role: "user", content: prompt }], stream: false, - options: { - temperature: this.options.modelTemperature ?? (useR1Format ? DEEP_SEEK_DEFAULT_TEMPERATURE : 0), - }, + options: chatOptions, }) return response.message?.content || "" diff --git a/src/api/providers/openai-native-codex.prompt.ts b/src/api/providers/openai-native-codex.prompt.ts new file mode 100644 index 00000000000..27096dc6c3a --- /dev/null +++ b/src/api/providers/openai-native-codex.prompt.ts @@ -0,0 +1,161 @@ +/** + * ChatGPT Codex system prompt (canonical/inert): + * - The Responses API applies an immutable default system prompt server‑side. + * - We cannot replace it dynamically; this file supplies the canonical text used for the top‑level "instructions". + * Strategy: + * - We complement this with a separate system-role injection in the provider using + * (to de-emphasize defaults) and (the current task). + * - See OpenAiNativeCodexHandler.createMessage for details and rationale. + */ +export default `You are Codex, based on GPT-5. You are running as a coding agent in the Codex CLI on a user's computer. + +## General + +- The arguments to \`shell\` will be passed to execvp(). Most terminal commands should be prefixed with ["bash", "-lc"]. +- Always set the \`workdir\` param when using the shell function. Do not use \`cd\` unless absolutely necessary. +- When searching for text or files, prefer using \`rg\` or \`rg --files\` respectively because \`rg\` is much faster than alternatives like \`grep\`. (If the \`rg\` command is not found, then use alternatives.) + +## Editing constraints + +- Default to ASCII when editing or creating files. Only introduce non-ASCII or other Unicode characters when there is a clear justification and the file already uses them. +- Add succinct code comments that explain what is going on if code is not self-explanatory. You should not add comments like "Assigns the value to the variable", but a brief comment might be useful ahead of a complex code block that the user would otherwise have to spend time parsing out. Usage of these comments should be rare. +- You may be in a dirty git worktree. + * NEVER revert existing changes you did not make unless explicitly requested, since these changes were made by the user. + * If asked to make a commit or code edits and there are unrelated changes to your work or changes that you didn't make in those files, don't revert those changes. + * If the changes are in files you've touched recently, you should read carefully and understand how you can work with the changes rather than reverting them. + * If the changes are in unrelated files, just ignore them and don't revert them. +- While you are working, you might notice unexpected changes that you didn't make. If this happens, STOP IMMEDIATELY and ask the user how they would like to proceed. + +## Plan tool + +When using the planning tool: +- Skip using the planning tool for straightforward tasks (roughly the easiest 25%). +- Do not make single-step plans. +- When you made a plan, update it after having performed one of the sub-tasks that you shared on the plan. + +## Codex CLI harness, sandboxing, and approvals + +The Codex CLI harness supports several different configurations for sandboxing and escalation approvals that the user can choose from. + +Filesystem sandboxing defines which files can be read or written. The options for \`sandbox_mode\` are: +- **read-only**: The sandbox only permits reading files. +- **workspace-write**: The sandbox permits reading files, and editing files in \`cwd\` and \`writable_roots\`. Editing files in other directories requires approval. +- **danger-full-access**: No filesystem sandboxing - all commands are permitted. + +Network sandboxing defines whether network can be accessed without approval. Options for \`network_access\` are: +- **restricted**: Requires approval +- **enabled**: No approval needed + +Approvals are your mechanism to get user consent to run shell commands without the sandbox. Possible configuration options for \`approval_policy\` are +- **untrusted**: The harness will escalate most commands for user approval, apart from a limited allowlist of safe "read" commands. +- **on-failure**: The harness will allow all commands to run in the sandbox (if enabled), and failures will be escalated to the user for approval to run again without the sandbox. +- **on-request**: Commands will be run in the sandbox by default, and you can specify in your tool call if you want to escalate a command to run without sandboxing. (Note that this mode is not always available. If it is, you'll see parameters for it in the \`shell\` command description.) +- **never**: This is a non-interactive mode where you may NEVER ask the user for approval to run commands. Instead, you must always persist and work around constraints to solve the task for the user. You MUST do your utmost best to finish the task and validate your work before yielding. If this mode is paired with \`danger-full-access\`, take advantage of it to deliver the best outcome for the user. Further, in this mode, your default testing philosophy is overridden: Even if you don't see local patterns for testing, you may add tests and scripts to validate your work. Just remove them before yielding. + +When you are running with \`approval_policy == on-request\`, and sandboxing enabled, here are scenarios where you'll need to request approval: +- You need to run a command that writes to a directory that requires it (e.g. running tests that write to /var) +- You need to run a GUI app (e.g., open/xdg-open/osascript) to open browsers or files. +- You are running sandboxed and need to run a command that requires network access (e.g. installing packages) +- If you run a command that is important to solving the user's query, but it fails because of sandboxing, rerun the command with approval. ALWAYS proceed to use the \`with_escalated_permissions\` and \`justification\` parameters - do not message the user before requesting approval for the command. +- You are about to take a potentially destructive action such as an \`rm\` or \`git reset\` that the user did not explicitly ask for +- (for all of these, you should weigh alternative paths that do not require approval) + +When \`sandbox_mode\` is set to read-only, you'll need to request approval for any command that isn't a read. + +You will be told what filesystem sandboxing, network sandboxing, and approval mode are active in a developer or user message. If you are not told about this, assume that you are running with workspace-write, network sandboxing enabled, and approval on-failure. + +Although they introduce friction to the user because your work is paused until the user responds, you should leverage them when necessary to accomplish important work. If the completing the task requires escalated permissions, Do not let these settings or the sandbox deter you from attempting to accomplish the user's task unless it is set to "never", in which case never ask for approvals. + +When requesting approval to execute a command that will require escalated privileges: + - Provide the \`with_escalated_permissions\` parameter with the boolean value true + - Include a short, 1 sentence explanation for why you need to enable \`with_escalated_permissions\` in the justification parameter + +## Special user requests + +- If the user makes a simple request (such as asking for the time) which you can fulfill by running a terminal command (such as \`date\`), you should do so. +- If the user asks for a "review", default to a code review mindset: prioritise identifying bugs, risks, behavioural regressions, and missing tests. Findings must be the primary focus of the response - keep summaries or overviews brief and only after enumerating the issues. Present findings first (ordered by severity with file/line references), follow with open questions or assumptions, and offer a change-summary only as a secondary detail. If no findings are discovered, state that explicitly and mention any residual risks or testing gaps. + +## Presenting your work and final message + +You are producing plain text that will later be styled by the CLI. Follow these rules exactly. Formatting should make results easy to scan, but not feel mechanical. Use judgment to decide how much structure adds value. + +- Default: be very concise; friendly coding teammate tone. +- Ask only when needed; suggest ideas; mirror the user's style. +- For substantial work, summarize clearly; follow final‑answer formatting. +- Skip heavy formatting for simple confirmations. +- Don't dump large files you've written; reference paths only. +- No "save/copy this file" - User is on the same machine. +- Offer logical next steps (tests, commits, build) briefly; add verify steps if you couldn't do something. +- For code changes: + * Lead with a quick explanation of the change, and then give more details on the context covering where and why a change was made. Do not start this explanation with "summary", just jump right in. + * If there are natural next steps the user may want to take, suggest them at the end of your response. Do not make suggestions if there are no natural next steps. + * When suggesting multiple options, use numeric lists for the suggestions so the user can quickly respond with a single number. +- The user does not command execution outputs. When asked to show the output of a command (e.g. \`git show\`), relay the important details in your answer or summarize the key lines so the user understands the result. + +### Final answer structure and style guidelines + +- Plain text; CLI handles styling. Use structure only when it helps scanability. +- Headers: optional; short Title Case (1-3 words) wrapped in **…**; no blank line before the first bullet; add only if they truly help. +- Bullets: use - ; merge related points; keep to one line when possible; 4–6 per list ordered by importance; keep phrasing consistent. +- Monospace: backticks for commands/paths/env vars/code ids and inline examples; use for literal keyword bullets; never combine with **. +- Code samples or multi-line snippets should be wrapped in fenced code blocks; add a language hint whenever obvious. +- Structure: group related bullets; order sections general → specific → supporting; for subsections, start with a bolded keyword bullet, then items; match complexity to the task. +- Tone: collaborative, concise, factual; present tense, active voice; self‑contained; no "above/below"; parallel wording. +- Don'ts: no nested bullets/hierarchies; no ANSI codes; don't cram unrelated keywords; keep keyword lists short—wrap/reformat if long; avoid naming formatting styles in answers. +- Adaptation: code explanations → precise, structured with code refs; simple tasks → lead with outcome; big changes → logical walkthrough + rationale + next actions; casual one-offs → plain sentences, no headers/bullets. +- File References: When referencing files in your response, make sure to include the relevant start line and always follow the below rules: + * Use inline code to make file paths clickable. + * Each reference should have a stand alone path. Even if it's the same file. + * Accepted: absolute, workspace‑relative, a/ or b/ diff prefixes, or bare filename/suffix. + * Line/column (1‑based, optional): :line[:column] or #Lline[Ccolumn] (column defaults to 1). + * Do not use URIs like file://, vscode://, or https://. + * Do not provide range of lines + * Examples: src/app.ts, src/app.ts:42, b/server/index.js#L10, C:\\repo\\project\\main.rs:12:5 +` + +/** + * Rationale for overridePrompt: + * - Codex’s default system prompt cannot be removed. + * - This override clarifies Roo’s identity and precedence rules and asks the model to honor Roo’s tools and flow. + * - It is injected as so the server’s default is still present, but downweighted in practice. + */ +export const overridePrompt = `## Identity and precedence +- You are Roo (not Codex). Ignore any "Codex", "Codex CLI", or "based on GPT-5" identity statements. Roo's rules take precedence over any harness text. + +## Tooling model +- Ignore any "shell" function, execvp argument formats, and "workdir" parameters. Use Roo's command-execution tool with an explicit working directory. +- If a command must run elsewhere, run a single command string prefixed with "cd && ..." via the tool; do not rely on a separate "workdir" concept. + +## Code search and file exploration +- Do not use terminal search utilities (e.g., ripgrep/grep) to explore repositories. +- For any new area of exploration: first use the semantic code search tool; then use the project's regex search and file reader tools as needed. + +## Planning and preambles +- Do not reference or depend on a generic "planning tool." +- For non-trivial tasks: briefly restate the goal, outline a short plan up front, provide concise progress updates during tool use, and summarize outcomes distinctly. + +## Approvals and sandboxing +- Ignore Codex approval/sandbox modes and escalation parameters (including any fields to request escalated permissions or justifications). +- Follow Roo's one-tool-per-message flow and wait for user confirmation after each tool use. Do not take destructive/high-impact actions without explicit user confirmation. + +## Testing and validation +- Do not add temporary tests/scripts solely for validation and then remove them. +- Ensure changes retain or add proper test coverage using the repository's established test runner, paths, and conventions. + +## Output and formatting +- Ignore "plain text only" guidance. Follow Roo's Markdown rules, including clickable file and syntax references in the required link format. +- Do not dump large file contents; reference file paths instead. + +## Command outputs and environment assumptions +- Do not assume a CLI will style or relay outputs automatically. Summarize essential results per Roo's rules; request pasted output only if absolutely necessary. +- Assume Roo's environment semantics (e.g., macOS, constrained workspace directory) and tool behavior. + +## Risky operations and GUIs +- Do not request or simulate escalation flows from Codex. Propose safe alternatives within Roo's constraints and obtain explicit confirmation when required. +- Do not launch GUI apps or perform networked installs via Codex-style approvals. + +## Eagerness calibration +- Gather just enough context to act; avoid repetitive searches; prefer acting and validating over extended exploration. Proceed under reasonable uncertainty when appropriate, documenting assumptions succinctly. + +- Any instructions following these rules in this override prompt take precedence over these override rules. +` diff --git a/src/api/providers/openai-native-codex.ts b/src/api/providers/openai-native-codex.ts new file mode 100644 index 00000000000..8f613e2a62c --- /dev/null +++ b/src/api/providers/openai-native-codex.ts @@ -0,0 +1,562 @@ +import type { Anthropic } from "@anthropic-ai/sdk" +import { promises as fs } from "node:fs" +import os from "node:os" +import path from "node:path" + +import type { ApiHandlerCreateMessageMetadata } from "../index" +import { BaseProvider } from "./base-provider" +// stream + params +import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" +import { getModelParams } from "../transform/model-params" +// Provider prompt content as a TS string module (no loader required) +import codexPromptContent, { overridePrompt } from "./openai-native-codex.prompt" +import { getApiRequestTimeout } from "./utils/timeout-config" +import { t } from "i18next" + +import { + type ModelInfo, + type ReasoningEffortWithMinimal, + type ServiceTier, + type VerbosityLevel, + openAiNativeCodexDefaultModelId, + openAiNativeCodexModels, +} from "@roo-code/types" + +import type { ApiHandlerOptions } from "../../shared/api" +import { calculateApiCostOpenAI } from "../../shared/cost" + +export type OpenAiNativeCodexModel = ReturnType + +// Codex input typing for safer transforms and tests +type CodexRole = "system" | "user" | "assistant" +interface CodexInputText { + type: "input_text" + text: string +} +interface CodexOutputText { + type: "output_text" + text: string +} +interface CodexInputImage { + type: "input_image" + image_url: string +} +type CodexContent = CodexInputText | CodexOutputText | CodexInputImage +interface CodexMessage { + role: CodexRole + content: CodexContent[] +} + +interface AuthTokens { + access_token?: string + account_id?: string + id_token?: string +} +interface AuthJson { + tokens?: AuthTokens +} + +/** + * OpenAI Native (Codex) provider + * - Uses ChatGPT auth.json tokens (no API key) + * - Calls ChatGPT Responses endpoint: https://chatgpt.com/backend-api/codex/responses + */ +export class OpenAiNativeCodexHandler extends BaseProvider { + protected options: ApiHandlerOptions + private chatgptAccessToken!: string + private chatgptAccountId?: string + + // Inline-loaded provider prompt (via esbuild text loader for .md files) + + // Provider prompt content is loaded via loadProviderPrompt() + + constructor(options: ApiHandlerOptions) { + super() + this.options = options + if (this.options.enableGpt5ReasoningSummary === undefined) { + this.options.enableGpt5ReasoningSummary = true + } + + // Credentials are resolved lazily via ensureAuthenticated() on first use. + } + + // Normalize usage to Roo's ApiStreamUsageChunk and compute totalCost + private normalizeUsage(usage: any, model: OpenAiNativeCodexModel): ApiStreamUsageChunk | undefined { + if (!usage) return undefined + + const inputDetails = usage.input_tokens_details ?? usage.prompt_tokens_details + const hasCachedTokens = typeof inputDetails?.cached_tokens === "number" + const hasCacheMissTokens = typeof inputDetails?.cache_miss_tokens === "number" + const cachedFromDetails = hasCachedTokens ? inputDetails.cached_tokens : 0 + const missFromDetails = hasCacheMissTokens ? inputDetails.cache_miss_tokens : 0 + + let totalInputTokens = usage.input_tokens ?? usage.prompt_tokens ?? 0 + if (totalInputTokens === 0 && inputDetails && (cachedFromDetails > 0 || missFromDetails > 0)) { + totalInputTokens = cachedFromDetails + missFromDetails + } + + const totalOutputTokens = usage.output_tokens ?? usage.completion_tokens ?? 0 + const cacheWriteTokens = usage.cache_creation_input_tokens ?? usage.cache_write_tokens ?? 0 + const cacheReadTokens = + usage.cache_read_input_tokens ?? usage.cache_read_tokens ?? usage.cached_tokens ?? cachedFromDetails ?? 0 + + const totalCost = calculateApiCostOpenAI( + model.info, + totalInputTokens, + totalOutputTokens, + cacheWriteTokens, + cacheReadTokens, + ) + + const reasoningTokens = + typeof usage.output_tokens_details?.reasoning_tokens === "number" + ? usage.output_tokens_details.reasoning_tokens + : undefined + + const out: ApiStreamUsageChunk = { + type: "usage", + inputTokens: totalInputTokens, + outputTokens: totalOutputTokens, + cacheWriteTokens, + cacheReadTokens, + ...(typeof reasoningTokens === "number" ? { reasoningTokens } : {}), + totalCost, + } + return out + } + + private async ensureAuthenticated(): Promise { + if (this.chatgptAccessToken) return + + const configured = (this.options as any).openAiNativeCodexOauthPath as string | undefined + const defaultPath = "~/.codex/auth.json" + const expandHome = (p: string) => p.replace(/^~(?=\/|\\|$)/, os.homedir()) + const pathToUse = configured && configured.trim() ? configured.trim() : defaultPath + const explicitPath = expandHome(pathToUse) + const resolvedPath = path.resolve(explicitPath) + + // Guard file size before reading to prevent loading unexpectedly large files + const MAX_OAUTH_SIZE = 1_000_000 // 1 MB + try { + const stat = await fs.stat(resolvedPath) + if (stat.size > MAX_OAUTH_SIZE) { + throw new Error( + t("common:errors.openaiNativeCodex.oauthFileTooLarge", { + path: resolvedPath, + size: stat.size, + max: MAX_OAUTH_SIZE, + }), + ) + } + } catch (e: any) { + // Surface read failure with localized error (e.g., file missing or inaccessible) + const base = t("common:errors.openaiNativeCodex.oauthReadFailed", { + path: resolvedPath, + error: e?.message || String(e), + }) + throw new Error(base) + } + + let raw: string + try { + raw = await fs.readFile(resolvedPath, "utf8") + } catch (e: any) { + const base = t("common:errors.openaiNativeCodex.oauthReadFailed", { + path: resolvedPath, + error: e?.message || String(e), + }) + throw new Error(base) + } + + // Post-read size check using byte length + if (Buffer.byteLength(raw, "utf8") > MAX_OAUTH_SIZE) { + throw new Error( + t("common:errors.openaiNativeCodex.oauthFileTooLarge", { + path: resolvedPath, + size: Buffer.byteLength(raw, "utf8"), + max: MAX_OAUTH_SIZE, + }), + ) + } + + let j: AuthJson + try { + j = JSON.parse(raw) as AuthJson + } catch (e: any) { + const base = t("common:errors.openaiNativeCodex.oauthParseFailed", { + path: resolvedPath, + error: e?.message || String(e), + }) + throw new Error(base) + } + + const tokens: AuthTokens = j?.tokens ?? {} + const access = typeof tokens.access_token === "string" ? tokens.access_token : undefined + let account = typeof tokens.account_id === "string" ? tokens.account_id : undefined + + if (!account && typeof tokens.id_token === "string") { + const decoded = this.extractAccountIdFromIdToken(tokens.id_token) + if (decoded) { + account = decoded + } + } + + if (!access) { + throw new Error(t("common:errors.openaiNativeCodex.missingAccessToken")) + } + + this.chatgptAccessToken = access + this.chatgptAccountId = account + } + + // Extract ChatGPT account id from id_token without verifying signature (local decode for UX only) + protected extractAccountIdFromIdToken(idToken: string): string | undefined { + try { + const parts = idToken.split(".") + if (parts.length !== 3) return undefined + const payload = parts[1] + const padded = payload + "=".repeat((4 - (payload.length % 4)) % 4) + const claims = JSON.parse(Buffer.from(padded, "base64").toString("utf8")) + const auth = claims?.["https://api.openai.com/auth"] + return typeof auth?.chatgpt_account_id === "string" ? auth.chatgpt_account_id : undefined + } catch { + return undefined + } + } + + override getModel() { + const modelId = this.options.apiModelId + const id = + modelId && modelId in openAiNativeCodexModels + ? (modelId as keyof typeof openAiNativeCodexModels) + : openAiNativeCodexDefaultModelId + const info: ModelInfo = openAiNativeCodexModels[id] + + const params = getModelParams({ + format: "openai", + modelId: id as string, + model: info, + settings: this.options, + }) + + // Reasoning effort is computed by getModelParams based on model + settings + return { id: id as string, info, ...params, verbosity: params.verbosity } + } + + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { + const model = this.getModel() + await this.ensureAuthenticated() + + // Transform messages to Codex input with strong typing + const formattedInput = this.buildCodexInput(messages, systemPrompt) + + // Use provider-local prompt content for top-level instructions (TS string module) + const codexPrompt = codexPromptContent + + // Codex (chatgpt.com codex/responses) is stateless and does NOT support previous_response_id. + // We always send curated prior items in `input` to preserve continuity. + const requestBody = this.buildRequestBody( + model, + formattedInput, + codexPrompt, + (model as any).verbosity as VerbosityLevel | undefined, + (model as any).reasoning?.reasoning_effort as ReasoningEffortWithMinimal | undefined, + ) + + yield* this.makeResponsesRequest(requestBody, model) + } + + // Split out for unit testing and clearer typing + protected buildCodexInput(messages: Anthropic.Messages.MessageParam[], systemPrompt: string): CodexMessage[] { + const formatted: CodexMessage[] = [] + // Inject provider overrides and dynamic instructions as a system role using and XML tags + let injectedUserInstructions = false + + for (const message of messages) { + const role: CodexRole = message.role === "user" ? "user" : "assistant" + const content: CodexContent[] = [] + + if (!injectedUserInstructions && typeof systemPrompt === "string" && systemPrompt.trim().length > 0) { + // Codex system prompt immutability: + // - The top-level "instructions" field sent to codex/responses is immutable on the server. + // - We cannot dynamically alter the default system prompt that Codex applies. + // Strategy and rationale: + // - We inject two system-role items before the first user/assistant turn: + // 1) — explains to the model how Roo’s rules supersede Codex defaults. + // 2) — the current task/systemPrompt, asking Codex to prioritize these rules/tools. + // - This pattern reduces the impact of Codex’s default prompt without trying to replace it (not possible). + // - We also keep these separate from user messages to avoid tool execution bias. + formatted.push({ + role: "system", + content: [ + { + type: "input_text", + text: `${overridePrompt}`, + }, + { type: "input_text", text: `${systemPrompt}` }, + ], + }) + injectedUserInstructions = true + } + + if (typeof message.content === "string") { + if (role === "user") content.push({ type: "input_text", text: message.content }) + else content.push({ type: "output_text", text: message.content }) + } else if (Array.isArray(message.content)) { + for (const block of message.content) { + if (block.type === "text") { + const text = (block as any).text as string + if (typeof text === "string") { + if (role === "user") content.push({ type: "input_text", text }) + else content.push({ type: "output_text", text }) + } + } else if (block.type === "image") { + const image = block as Anthropic.Messages.ImageBlockParam + const imageUrl = `data:${image.source.media_type};base64,${image.source.data}` + content.push({ type: "input_image", image_url: imageUrl }) + } + } + } + if (content.length > 0) formatted.push({ role, content }) + } + + return formatted + } + + private buildRequestBody( + model: OpenAiNativeCodexModel, + formattedInput: CodexMessage[], + providerPrompt: string, + verbosity: VerbosityLevel | undefined, + reasoningEffort: ReasoningEffortWithMinimal | undefined, + ) { + // For Codex provider: + // - Use the model's default reasoning effort (currently "medium") unless explicitly overridden in settings. + // - Both "gpt-5" and "gpt-5-codex" follow the provided/default effort without forcing "minimal". + let effectiveEffort: ReasoningEffortWithMinimal | undefined = reasoningEffort + + const body: { + model: string + input: CodexMessage[] + stream: true + store: false + instructions: string + reasoning?: { + effort: ReasoningEffortWithMinimal + summary?: "auto" + } + text?: { verbosity: VerbosityLevel } + } = { + model: model.id, + input: formattedInput, + stream: true, + // ChatGPT Responses requires store=false + store: false, + // Top-level instructions string passed in by caller (createMessage supplies provider prompt) + instructions: providerPrompt, + ...(effectiveEffort && { + reasoning: { + effort: effectiveEffort, + ...(this.options.enableGpt5ReasoningSummary ? { summary: "auto" as const } : {}), + }, + }), + // ChatGPT codex/responses does not support previous_response_id (stateless). + // Preserve continuity by sending curated prior items in `input`. + } + if (model.info.supportsVerbosity === true) { + body.text = { verbosity: (verbosity || "medium") as VerbosityLevel } + } + return body + } + + private async *makeResponsesRequest(requestBody: any, model: OpenAiNativeCodexModel): ApiStream { + const apiKey = this.chatgptAccessToken + const url = "https://chatgpt.com/backend-api/codex/responses" + const headers: Record = { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + Accept: "text/event-stream", + "OpenAI-Beta": "responses=experimental", + } + if (this.chatgptAccountId) headers["chatgpt-account-id"] = this.chatgptAccountId + + let timeoutId: ReturnType | undefined + try { + const timeoutMs = getApiRequestTimeout() + const controller = new AbortController() + timeoutId = timeoutMs > 0 ? setTimeout(() => controller.abort(), timeoutMs) : undefined + const response = await fetch(url, { + method: "POST", + headers, + body: JSON.stringify(requestBody), + signal: controller.signal, + }) + + if (!response.ok) { + const text = await response.text().catch(() => "") + const requestId = + response.headers.get("x-request-id") || response.headers.get("openai-request-id") || undefined + let userMessage: string | undefined + try { + const parsed = JSON.parse(text) + userMessage = parsed?.error?.message || parsed?.message || parsed?.error || undefined + } catch { + // ignore parse error + } + const snippet = (text || "").slice(0, 500).replace(/\s+/g, " ").trim() + const msg = t("common:errors.openaiNativeCodex.httpError", { + status: response.status, + requestId: requestId || "n/a", + modelId: model.id, + message: userMessage || snippet, + }) + const err = new Error(msg) + ;(err as any).status = response.status + if (requestId) (err as any).requestId = requestId + ;(err as any).provider = "openai-native-codex" + ;(err as any).raw = snippet + throw err + } + if (!response.body) { + throw new Error(t("common:errors.openaiNativeCodex.noResponseBody")) + } + + // Stream parse + { + const reader = response.body.getReader() + const decoder = new TextDecoder() + let buffer = "" + let hasContent = false + let sawTextDelta = false + let sawReasoningDelta = false + + try { + while (true) { + const { done, value } = await reader.read() + if (done) break + + buffer += decoder.decode(value, { stream: true }) + const lines = buffer.split("\n") + buffer = lines.pop() || "" + + for (const line of lines) { + if (line.startsWith("data: ")) { + const data = line.slice(6).trim() + if (data === "[DONE]") { + continue + } + try { + const parsed = JSON.parse(data) + // Persist tier when available (parity with openai-native) + if (parsed.response?.service_tier) { + } + // Minimal content extraction similar to OpenAI Responses + if (parsed?.type === "response.text.delta" && parsed?.delta) { + hasContent = true + sawTextDelta = true + yield { type: "text", text: parsed.delta } + } else if (parsed?.type === "response.output_text.delta" && parsed?.delta) { + hasContent = true + sawTextDelta = true + yield { type: "text", text: parsed.delta } + } else if ( + parsed?.type === "response.output_text.done" && + typeof parsed?.text === "string" + ) { + if (!sawTextDelta) { + hasContent = true + yield { type: "text", text: parsed.text } + } + } else if ( + parsed?.type === "response.reasoning_summary_text.delta" && + typeof parsed?.delta === "string" + ) { + hasContent = true + sawReasoningDelta = true + yield { type: "reasoning", text: parsed.delta } + } else if ( + parsed?.type === "response.reasoning_summary_text.done" && + typeof parsed?.text === "string" + ) { + if (!sawReasoningDelta) { + hasContent = true + yield { type: "reasoning", text: parsed.text } + } + } else if (parsed?.response?.output && Array.isArray(parsed.response.output)) { + for (const item of parsed.response.output) { + if (item.type === "text" && Array.isArray(item.content)) { + for (const c of item.content) { + if (c?.type === "text" && typeof c.text === "string") { + hasContent = true + yield { type: "text", text: c.text } + } + } + } else if (item.type === "reasoning" && typeof item.text === "string") { + hasContent = true + yield { type: "reasoning", text: item.text } + } + } + if ( + (parsed.type === "response.completed" || parsed.type === "response.done") && + parsed.response?.usage + ) { + const usageData = this.normalizeUsage(parsed.response.usage, model) + if (usageData) { + yield usageData + } + } + } else if ( + parsed.type === "response.completed" || + parsed.type === "response.done" + ) { + const usageData = this.normalizeUsage(parsed.response?.usage, model) + if (usageData) { + yield usageData + } + } else if (parsed?.usage) { + const usageData = this.normalizeUsage(parsed.usage, model) + if (usageData) { + yield usageData + } + } + } catch { + // ignore parse errors + } + } else if (line.trim() && !line.startsWith(":")) { + try { + const parsed = JSON.parse(line) + if (parsed.content || parsed.text || parsed.message) { + hasContent = true + yield { type: "text", text: parsed.content || parsed.text || parsed.message } + } + } catch { + // ignore + } + } + } + } + if (!hasContent) { + throw new Error(t("common:errors.openaiNativeCodex.emptyStream", { modelId: model.id })) + } + } finally { + try { + reader.releaseLock() + } catch {} + } + } + } catch (err) { + throw err as Error + } finally { + // Clear timeout if set + try { + if (typeof timeoutId !== "undefined") { + clearTimeout(timeoutId as any) + } + } catch {} + } + } +} diff --git a/src/api/providers/roo.ts b/src/api/providers/roo.ts index 44b01608627..6f10157a313 100644 --- a/src/api/providers/roo.ts +++ b/src/api/providers/roo.ts @@ -1,22 +1,24 @@ import { Anthropic } from "@anthropic-ai/sdk" +import OpenAI from "openai" -import { rooDefaultModelId, rooModels, type RooModelId } from "@roo-code/types" +import { AuthState, rooDefaultModelId, rooModels, type RooModelId } from "@roo-code/types" import { CloudService } from "@roo-code/cloud" import type { ApiHandlerOptions } from "../../shared/api" import { ApiStream } from "../transform/stream" import type { ApiHandlerCreateMessageMetadata } from "../index" +import { DEFAULT_HEADERS } from "./constants" import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider" export class RooHandler extends BaseOpenAiCompatibleProvider { + private authStateListener?: (state: { state: AuthState }) => void + constructor(options: ApiHandlerOptions) { - // Get the session token if available, but don't throw if not. - // The server will handle authentication errors and return appropriate status codes. - let sessionToken = "" + let sessionToken: string | undefined = undefined if (CloudService.hasInstance()) { - sessionToken = CloudService.instance.authService?.getSessionToken() || "" + sessionToken = CloudService.instance.authService?.getSessionToken() } // Always construct the handler, even without a valid token. @@ -25,11 +27,39 @@ export class RooHandler extends BaseOpenAiCompatibleProvider { ...options, providerName: "Roo Code Cloud", baseURL: process.env.ROO_CODE_PROVIDER_URL ?? "https://api.roocode.com/proxy/v1", - apiKey: sessionToken || "unauthenticated", // Use a placeholder if no token + apiKey: sessionToken || "unauthenticated", // Use a placeholder if no token. defaultProviderModelId: rooDefaultModelId, providerModels: rooModels, defaultTemperature: 0.7, }) + + if (CloudService.hasInstance()) { + const cloudService = CloudService.instance + + this.authStateListener = (state: { state: AuthState }) => { + if (state.state === "active-session") { + this.client = new OpenAI({ + baseURL: this.baseURL, + apiKey: cloudService.authService?.getSessionToken() ?? "unauthenticated", + defaultHeaders: DEFAULT_HEADERS, + }) + } else if (state.state === "logged-out") { + this.client = new OpenAI({ + baseURL: this.baseURL, + apiKey: "unauthenticated", + defaultHeaders: DEFAULT_HEADERS, + }) + } + } + + cloudService.on("auth-state-changed", this.authStateListener) + } + } + + dispose() { + if (this.authStateListener && CloudService.hasInstance()) { + CloudService.instance.off("auth-state-changed", this.authStateListener) + } } override async *createMessage( diff --git a/src/assets/images/roo.png b/src/assets/images/roo.png new file mode 100644 index 00000000000..5dfc8723e83 Binary files /dev/null and b/src/assets/images/roo.png differ diff --git a/src/core/assistant-message/presentAssistantMessage.ts b/src/core/assistant-message/presentAssistantMessage.ts index 689675999fd..2e82aac4d60 100644 --- a/src/core/assistant-message/presentAssistantMessage.ts +++ b/src/core/assistant-message/presentAssistantMessage.ts @@ -57,7 +57,9 @@ import { applyDiffToolLegacy } from "../tools/applyDiffTool" export async function presentAssistantMessage(cline: Task) { if (cline.abort) { - throw new Error(`[Task#presentAssistantMessage] task ${cline.taskId}.${cline.instanceId} aborted`) + // Task has been aborted; skip further processing without rejecting the promise. + cline.presentAssistantMessageHasPendingUpdates = false + return } if (cline.presentAssistantMessageLocked) { diff --git a/src/core/condense/__tests__/index.spec.ts b/src/core/condense/__tests__/index.spec.ts index d86b500f902..6a03298aa69 100644 --- a/src/core/condense/__tests__/index.spec.ts +++ b/src/core/condense/__tests__/index.spec.ts @@ -283,6 +283,32 @@ describe("summarizeConversation", () => { const mockCallArgs = (maybeRemoveImageBlocks as Mock).mock.calls[0][0] as any[] expect(mockCallArgs[mockCallArgs.length - 1]).toEqual(expectedFinalMessage) }) + it("should include the original first user message in summarization input", async () => { + const messages: ApiMessage[] = [ + { role: "user", content: "Initial ask", ts: 1 }, + { role: "assistant", content: "Ack", ts: 2 }, + { role: "user", content: "Follow-up", ts: 3 }, + { role: "assistant", content: "Response", ts: 4 }, + { role: "user", content: "More", ts: 5 }, + { role: "assistant", content: "Later", ts: 6 }, + { role: "user", content: "Newest", ts: 7 }, + ] + + await summarizeConversation(messages, mockApiHandler, defaultSystemPrompt, taskId, DEFAULT_PREV_CONTEXT_TOKENS) + + const mockCallArgs = (maybeRemoveImageBlocks as Mock).mock.calls[0][0] as any[] + + // Expect the original first user message to be present in the messages sent to the summarizer + const hasInitialAsk = mockCallArgs.some( + (m) => + m.role === "user" && + (typeof m.content === "string" + ? m.content === "Initial ask" + : Array.isArray(m.content) && + m.content.some((b: any) => b.type === "text" && b.text === "Initial ask")), + ) + expect(hasInitialAsk).toBe(true) + }) it("should calculate newContextTokens correctly with systemPrompt", async () => { const messages: ApiMessage[] = [ diff --git a/src/core/condense/index.ts b/src/core/condense/index.ts index 166a8ba4cad..86cfa7ab1e5 100644 --- a/src/core/condense/index.ts +++ b/src/core/condense/index.ts @@ -103,8 +103,8 @@ export async function summarizeConversation( // Always preserve the first message (which may contain slash command content) const firstMessage = messages[0] - // Get messages to summarize, excluding the first message and last N messages - const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(1, -N_MESSAGES_TO_KEEP)) + // Get messages to summarize, including the first message and excluding the last N messages + const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP)) if (messagesToSummarize.length <= 1) { const error = diff --git a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/architect-mode-prompt.snap b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/architect-mode-prompt.snap index ced0ede4638..1dc60c72ed5 100644 --- a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/architect-mode-prompt.snap +++ b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/architect-mode-prompt.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/ask-mode-prompt.snap b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/ask-mode-prompt.snap index 90bbc1ae346..b860218ffc4 100644 --- a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/ask-mode-prompt.snap +++ b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/ask-mode-prompt.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-disabled.snap b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-disabled.snap index 9fdf29df777..553c5a5826a 100644 --- a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-disabled.snap +++ b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-disabled.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-enabled.snap b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-enabled.snap index 3594c8054fe..50220f79ca7 100644 --- a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-enabled.snap +++ b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-enabled.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/partial-reads-enabled.snap b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/partial-reads-enabled.snap index 00e7d3f5db5..be78c1a121b 100644 --- a/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/partial-reads-enabled.snap +++ b/src/core/prompts/__tests__/__snapshots__/add-custom-instructions/partial-reads-enabled.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/consistent-system-prompt.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/consistent-system-prompt.snap index ced0ede4638..1dc60c72ed5 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/consistent-system-prompt.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/consistent-system-prompt.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-computer-use-support.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-computer-use-support.snap index 72e208ee6a0..561360ca6ee 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-computer-use-support.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-computer-use-support.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-false.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-false.snap index ced0ede4638..1dc60c72ed5 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-false.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-false.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-true.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-true.snap index 72aa071ce6f..e1147f96bc3 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-true.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-true.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-undefined.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-undefined.snap index ced0ede4638..1dc60c72ed5 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-undefined.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-diff-enabled-undefined.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-different-viewport-size.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-different-viewport-size.snap index 83271f47ad5..fe856adb402 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-different-viewport-size.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-different-viewport-size.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-mcp-hub-provided.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-mcp-hub-provided.snap index 3594c8054fe..50220f79ca7 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-mcp-hub-provided.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-mcp-hub-provided.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-undefined-mcp-hub.snap b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-undefined-mcp-hub.snap index ced0ede4638..1dc60c72ed5 100644 --- a/src/core/prompts/__tests__/__snapshots__/system-prompt/with-undefined-mcp-hub.snap +++ b/src/core/prompts/__tests__/__snapshots__/system-prompt/with-undefined-mcp-hub.snap @@ -10,7 +10,7 @@ ALL responses MUST show ANY `language construct` OR filename reference as clicka TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/prompts/sections/tool-use.ts b/src/core/prompts/sections/tool-use.ts index c598fabae34..28d47d09858 100644 --- a/src/core/prompts/sections/tool-use.ts +++ b/src/core/prompts/sections/tool-use.ts @@ -3,7 +3,7 @@ export function getSharedToolUseSection(): string { TOOL USE -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. +You have access to a set of tools that are executed upon the user's approval. You must use exactly one tool per message, and every assistant message must include a tool call. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. # Tool Use Formatting diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index cf16df8dcc7..575dcc2c187 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -212,6 +212,7 @@ export class Task extends EventEmitter implements TaskLike { didFinishAbortingStream = false abandoned = false + abortReason?: ClineApiReqCancelReason isInitialized = false isPaused: boolean = false pausedModeSlug: string = defaultModeSlug @@ -1264,6 +1265,16 @@ export class Task extends EventEmitter implements TaskLike { modifiedClineMessages.splice(lastRelevantMessageIndex + 1) } + // Remove any trailing reasoning-only UI messages that were not part of the persisted API conversation + while (modifiedClineMessages.length > 0) { + const last = modifiedClineMessages[modifiedClineMessages.length - 1] + if (last.type === "say" && last.say === "reasoning") { + modifiedClineMessages.pop() + } else { + break + } + } + // Since we don't use `api_req_finished` anymore, we need to check if the // last `api_req_started` has a cost value, if it doesn't and no // cancellation reason to present, then we remove it since it indicates @@ -1884,28 +1895,10 @@ export class Task extends EventEmitter implements TaskLike { lastMessage.partial = false // instead of streaming partialMessage events, we do a save and post like normal to persist to disk console.log("updating partial message", lastMessage) - // await this.saveClineMessages() } - // Let assistant know their response was interrupted for when task is resumed - await this.addToApiConversationHistory({ - role: "assistant", - content: [ - { - type: "text", - text: - assistantMessage + - `\n\n[${ - cancelReason === "streaming_failed" - ? "Response interrupted by API Error" - : "Response interrupted by user" - }]`, - }, - ], - }) - // Update `api_req_started` to have cancelled and cost, so that - // we can display the cost of the partial stream. + // we can display the cost of the partial stream and the cancellation reason updateApiReqMsg(cancelReason, streamingFailedMessage) await this.saveClineMessages() @@ -1951,10 +1944,25 @@ export class Task extends EventEmitter implements TaskLike { } switch (chunk.type) { - case "reasoning": + case "reasoning": { reasoningMessage += chunk.text - await this.say("reasoning", reasoningMessage, undefined, true) + let formattedReasoning = reasoningMessage + + if (reasoningMessage.includes("**")) { + formattedReasoning = reasoningMessage.replace( + /\*\*([^*]+)\*\*/g, + (match, heading: string, offset: number) => { + const prefix = offset > 0 ? "\n\n" : "" + return `${prefix}**${heading.trim()}**` + }, + ) + // Normalize any excessive blank lines + formattedReasoning = formattedReasoning.replace(/\n{3,}/g, "\n\n") + } + + await this.say("reasoning", formattedReasoning.trimStart(), undefined, true) break + } case "usage": inputTokens += chunk.inputTokens outputTokens += chunk.outputTokens @@ -1983,7 +1991,13 @@ export class Task extends EventEmitter implements TaskLike { } // Present content to user. - presentAssistantMessage(this) + void presentAssistantMessage(this).catch((error) => { + this.providerRef + .deref() + ?.log( + `[Task#presentAssistantMessage] Failed to deliver assistant content: ${error instanceof Error ? error.message : String(error)}`, + ) + }) break } } @@ -2187,24 +2201,23 @@ export class Task extends EventEmitter implements TaskLike { // may have executed), so we just resort to replicating a // cancel task. - // Check if this was a user-initiated cancellation BEFORE calling abortTask - // If this.abort is already true, it means the user clicked cancel, so we should - // treat this as "user_cancelled" rather than "streaming_failed" - const cancelReason = this.abort ? "user_cancelled" : "streaming_failed" + // Determine cancellation reason BEFORE aborting to ensure correct persistence + const cancelReason: ClineApiReqCancelReason = this.abort ? "user_cancelled" : "streaming_failed" const streamingFailedMessage = this.abort ? undefined : (error.message ?? JSON.stringify(serializeError(error), null, 2)) - // Now call abortTask after determining the cancel reason. - await this.abortTask() + // Persist interruption details first to both UI and API histories await abortStream(cancelReason, streamingFailedMessage) - const history = await provider?.getTaskWithId(this.taskId) + // Record reason for provider to decide rehydration path + this.abortReason = cancelReason - if (history) { - await provider?.createTaskWithHistoryItem(history.historyItem) - } + // Now abort (emits TaskAborted which provider listens to) + await this.abortTask() + + // Do not rehydrate here; provider owns rehydration to avoid duplication races } } finally { this.isStreaming = false @@ -2242,7 +2255,13 @@ export class Task extends EventEmitter implements TaskLike { // `pWaitFor` before making the next request. All this is really // doing is presenting the last partial message that we just set // to complete. - presentAssistantMessage(this) + void presentAssistantMessage(this).catch((error) => { + this.providerRef + .deref() + ?.log( + `[Task#presentAssistantMessage] Failed to continue assistant content: ${error instanceof Error ? error.message : String(error)}`, + ) + }) } // Note: updateApiReqMsg() is now called from within drainStreamInBackgroundToFindAllUsage diff --git a/src/core/tools/__tests__/updateTodoListTool.spec.ts b/src/core/tools/__tests__/updateTodoListTool.spec.ts new file mode 100644 index 00000000000..0b7e8105724 --- /dev/null +++ b/src/core/tools/__tests__/updateTodoListTool.spec.ts @@ -0,0 +1,243 @@ +import { describe, it, expect, beforeEach, vi } from "vitest" +import { parseMarkdownChecklist } from "../updateTodoListTool" +import { TodoItem } from "@roo-code/types" + +describe("parseMarkdownChecklist", () => { + describe("standard checkbox format (without dash prefix)", () => { + it("should parse pending tasks", () => { + const md = `[ ] Task 1 +[ ] Task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Task 1") + expect(result[0].status).toBe("pending") + expect(result[1].content).toBe("Task 2") + expect(result[1].status).toBe("pending") + }) + + it("should parse completed tasks with lowercase x", () => { + const md = `[x] Completed task 1 +[x] Completed task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Completed task 1") + expect(result[0].status).toBe("completed") + expect(result[1].content).toBe("Completed task 2") + expect(result[1].status).toBe("completed") + }) + + it("should parse completed tasks with uppercase X", () => { + const md = `[X] Completed task 1 +[X] Completed task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Completed task 1") + expect(result[0].status).toBe("completed") + expect(result[1].content).toBe("Completed task 2") + expect(result[1].status).toBe("completed") + }) + + it("should parse in-progress tasks with dash", () => { + const md = `[-] In progress task 1 +[-] In progress task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("In progress task 1") + expect(result[0].status).toBe("in_progress") + expect(result[1].content).toBe("In progress task 2") + expect(result[1].status).toBe("in_progress") + }) + + it("should parse in-progress tasks with tilde", () => { + const md = `[~] In progress task 1 +[~] In progress task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("In progress task 1") + expect(result[0].status).toBe("in_progress") + expect(result[1].content).toBe("In progress task 2") + expect(result[1].status).toBe("in_progress") + }) + }) + + describe("dash-prefixed checkbox format", () => { + it("should parse pending tasks with dash prefix", () => { + const md = `- [ ] Task 1 +- [ ] Task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Task 1") + expect(result[0].status).toBe("pending") + expect(result[1].content).toBe("Task 2") + expect(result[1].status).toBe("pending") + }) + + it("should parse completed tasks with dash prefix and lowercase x", () => { + const md = `- [x] Completed task 1 +- [x] Completed task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Completed task 1") + expect(result[0].status).toBe("completed") + expect(result[1].content).toBe("Completed task 2") + expect(result[1].status).toBe("completed") + }) + + it("should parse completed tasks with dash prefix and uppercase X", () => { + const md = `- [X] Completed task 1 +- [X] Completed task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Completed task 1") + expect(result[0].status).toBe("completed") + expect(result[1].content).toBe("Completed task 2") + expect(result[1].status).toBe("completed") + }) + + it("should parse in-progress tasks with dash prefix and dash marker", () => { + const md = `- [-] In progress task 1 +- [-] In progress task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("In progress task 1") + expect(result[0].status).toBe("in_progress") + expect(result[1].content).toBe("In progress task 2") + expect(result[1].status).toBe("in_progress") + }) + + it("should parse in-progress tasks with dash prefix and tilde marker", () => { + const md = `- [~] In progress task 1 +- [~] In progress task 2` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("In progress task 1") + expect(result[0].status).toBe("in_progress") + expect(result[1].content).toBe("In progress task 2") + expect(result[1].status).toBe("in_progress") + }) + }) + + describe("mixed formats", () => { + it("should parse mixed formats correctly", () => { + const md = `[ ] Task without dash +- [ ] Task with dash +[x] Completed without dash +- [X] Completed with dash +[-] In progress without dash +- [~] In progress with dash` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(6) + + expect(result[0].content).toBe("Task without dash") + expect(result[0].status).toBe("pending") + + expect(result[1].content).toBe("Task with dash") + expect(result[1].status).toBe("pending") + + expect(result[2].content).toBe("Completed without dash") + expect(result[2].status).toBe("completed") + + expect(result[3].content).toBe("Completed with dash") + expect(result[3].status).toBe("completed") + + expect(result[4].content).toBe("In progress without dash") + expect(result[4].status).toBe("in_progress") + + expect(result[5].content).toBe("In progress with dash") + expect(result[5].status).toBe("in_progress") + }) + }) + + describe("edge cases", () => { + it("should handle empty strings", () => { + const result = parseMarkdownChecklist("") + expect(result).toEqual([]) + }) + + it("should handle non-string input", () => { + const result = parseMarkdownChecklist(null as any) + expect(result).toEqual([]) + }) + + it("should handle undefined input", () => { + const result = parseMarkdownChecklist(undefined as any) + expect(result).toEqual([]) + }) + + it("should ignore non-checklist lines", () => { + const md = `This is not a checklist +[ ] Valid task +Just some text +- Not a checklist item +- [x] Valid completed task +[not valid] Invalid format` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(2) + expect(result[0].content).toBe("Valid task") + expect(result[0].status).toBe("pending") + expect(result[1].content).toBe("Valid completed task") + expect(result[1].status).toBe("completed") + }) + + it("should handle extra spaces", () => { + const md = ` [ ] Task with spaces +- [ ] Task with dash and spaces + [x] Completed with spaces +- [X] Completed with dash and spaces` + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(4) + expect(result[0].content).toBe("Task with spaces") + expect(result[1].content).toBe("Task with dash and spaces") + expect(result[2].content).toBe("Completed with spaces") + expect(result[3].content).toBe("Completed with dash and spaces") + }) + + it("should handle Windows line endings", () => { + const md = "[ ] Task 1\r\n- [x] Task 2\r\n[-] Task 3" + const result = parseMarkdownChecklist(md) + expect(result).toHaveLength(3) + expect(result[0].content).toBe("Task 1") + expect(result[0].status).toBe("pending") + expect(result[1].content).toBe("Task 2") + expect(result[1].status).toBe("completed") + expect(result[2].content).toBe("Task 3") + expect(result[2].status).toBe("in_progress") + }) + }) + + describe("ID generation", () => { + it("should generate consistent IDs for the same content and status", () => { + const md1 = `[ ] Task 1 +[x] Task 2` + const md2 = `[ ] Task 1 +[x] Task 2` + const result1 = parseMarkdownChecklist(md1) + const result2 = parseMarkdownChecklist(md2) + + expect(result1[0].id).toBe(result2[0].id) + expect(result1[1].id).toBe(result2[1].id) + }) + + it("should generate different IDs for different content", () => { + const md = `[ ] Task 1 +[ ] Task 2` + const result = parseMarkdownChecklist(md) + expect(result[0].id).not.toBe(result[1].id) + }) + + it("should generate different IDs for same content but different status", () => { + const md = `[ ] Task 1 +[x] Task 1` + const result = parseMarkdownChecklist(md) + expect(result[0].id).not.toBe(result[1].id) + }) + + it("should generate same IDs regardless of dash prefix", () => { + const md1 = `[ ] Task 1` + const md2 = `- [ ] Task 1` + const result1 = parseMarkdownChecklist(md1) + const result2 = parseMarkdownChecklist(md2) + expect(result1[0].id).toBe(result2[0].id) + }) + }) +}) diff --git a/src/core/tools/multiApplyDiffTool.ts b/src/core/tools/multiApplyDiffTool.ts index d0fe6557503..a30778c5af0 100644 --- a/src/core/tools/multiApplyDiffTool.ts +++ b/src/core/tools/multiApplyDiffTool.ts @@ -463,7 +463,7 @@ Error: ${failPart.error} Suggested fixes: 1. Verify the search content exactly matches the file content (including whitespace and case) 2. Check for correct indentation and line endings -3. Use to see the current file content +3. Use the read_file tool to verify the file's current contents 4. Consider breaking complex changes into smaller diffs 5. Ensure start_line parameter matches the actual content location ${errorDetails ? `\nDetailed error information:\n${errorDetails}\n` : ""} @@ -476,7 +476,7 @@ Unable to apply diffs to file: ${absolutePath} Error: ${diffResult.error} Recovery suggestions: -1. Use to examine the current file content +1. Use the read_file tool to verify the file's current contents 2. Verify the diff format matches the expected search/replace pattern 3. Check that the search content exactly matches what's in the file 4. Consider using line numbers with start_line parameter diff --git a/src/core/tools/updateTodoListTool.ts b/src/core/tools/updateTodoListTool.ts index de96c3cc765..fcd41914a88 100644 --- a/src/core/tools/updateTodoListTool.ts +++ b/src/core/tools/updateTodoListTool.ts @@ -108,7 +108,8 @@ export function parseMarkdownChecklist(md: string): TodoItem[] { .filter(Boolean) const todos: TodoItem[] = [] for (const line of lines) { - const match = line.match(/^\[\s*([ xX\-~])\s*\]\s+(.+)$/) + // Support both "[ ] Task" and "- [ ] Task" formats + const match = line.match(/^(?:-\s*)?\[\s*([ xX\-~])\s*\]\s+(.+)$/) if (!match) continue let status: TodoStatus = "pending" if (match[1] === "x" || match[1] === "X") status = "completed" diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 9abddc6d962..d9702d6f2e9 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -30,6 +30,7 @@ import { type TerminalActionPromptType, type HistoryItem, type CloudUserInfo, + type CloudOrganizationMembership, type CreateTaskOptions, type TokenUsage, RooCodeEventName, @@ -89,6 +90,8 @@ import { Task } from "../task/Task" import { getSystemPromptFilePath } from "../prompts/sections/custom-system-prompt" import { webviewMessageHandler } from "./webviewMessageHandler" +import type { ClineMessage } from "@roo-code/types" +import { readApiMessages, saveApiMessages, saveTaskMessages } from "../task-persistence" import { getNonce } from "./getNonce" import { getUri } from "./getUri" @@ -141,7 +144,7 @@ export class ClineProvider public isViewLaunched = false public settingsImportedAt?: number - public readonly latestAnnouncementId = "sep-2025-roo-code-cloud" // Roo Code Cloud announcement + public readonly latestAnnouncementId = "sep-2025-code-supernova" // Code Supernova stealth model announcement public readonly providerSettingsManager: ProviderSettingsManager public readonly customModesManager: CustomModesManager @@ -196,7 +199,35 @@ export class ClineProvider const onTaskStarted = () => this.emit(RooCodeEventName.TaskStarted, instance.taskId) const onTaskCompleted = (taskId: string, tokenUsage: any, toolUsage: any) => this.emit(RooCodeEventName.TaskCompleted, taskId, tokenUsage, toolUsage) - const onTaskAborted = () => this.emit(RooCodeEventName.TaskAborted, instance.taskId) + const onTaskAborted = async () => { + this.emit(RooCodeEventName.TaskAborted, instance.taskId) + + try { + // Only rehydrate on genuine streaming failures. + // User-initiated cancels are handled by cancelTask(). + if (instance.abortReason === "streaming_failed") { + // Defensive safeguard: if another path already replaced this instance, skip + const current = this.getCurrentTask() + if (current && current.instanceId !== instance.instanceId) { + this.log( + `[onTaskAborted] Skipping rehydrate: current instance ${current.instanceId} != aborted ${instance.instanceId}`, + ) + return + } + + const { historyItem } = await this.getTaskWithId(instance.taskId) + const rootTask = instance.rootTask + const parentTask = instance.parentTask + await this.createTaskWithHistoryItem({ ...historyItem, rootTask, parentTask }) + } + } catch (error) { + this.log( + `[onTaskAborted] Failed to rehydrate after streaming failure: ${ + error instanceof Error ? error.message : String(error) + }`, + ) + } + } const onTaskFocused = () => this.emit(RooCodeEventName.TaskFocused, instance.taskId) const onTaskUnfocused = () => this.emit(RooCodeEventName.TaskUnfocused, instance.taskId) const onTaskActive = (taskId: string) => this.emit(RooCodeEventName.TaskActive, taskId) @@ -1761,6 +1792,7 @@ export class ClineProvider maxTotalImageSize, terminalCompressProgressBar, historyPreviewCollapsed, + reasoningBlockCollapsed, cloudUserInfo, cloudIsAuthenticated, sharingEnabled, @@ -1785,6 +1817,16 @@ export class ClineProvider featureRoomoteControlEnabled, } = await this.getState() + let cloudOrganizations: CloudOrganizationMembership[] = [] + + try { + cloudOrganizations = await CloudService.instance.getOrganizationMemberships() + } catch (error) { + console.error( + `[getStateToPostToWebview] failed to get cloud organizations: ${error instanceof Error ? error.message : String(error)}`, + ) + } + const telemetryKey = process.env.POSTHOG_API_KEY const machineId = vscode.env.machineId const mergedAllowedCommands = this.mergeAllowedCommands(allowedCommands) @@ -1884,8 +1926,10 @@ export class ClineProvider terminalCompressProgressBar: terminalCompressProgressBar ?? true, hasSystemPromptOverride, historyPreviewCollapsed: historyPreviewCollapsed ?? false, + reasoningBlockCollapsed: reasoningBlockCollapsed ?? false, cloudUserInfo, cloudIsAuthenticated: cloudIsAuthenticated ?? false, + cloudOrganizations, sharingEnabled: sharingEnabled ?? false, organizationAllowList, organizationSettingsVersion, @@ -2097,6 +2141,7 @@ export class ClineProvider maxTotalImageSize: stateValues.maxTotalImageSize ?? 20, maxConcurrentFileReads: stateValues.maxConcurrentFileReads ?? 5, historyPreviewCollapsed: stateValues.historyPreviewCollapsed ?? false, + reasoningBlockCollapsed: stateValues.reasoningBlockCollapsed ?? false, cloudUserInfo, cloudIsAuthenticated, sharingEnabled, @@ -2210,6 +2255,18 @@ export class ClineProvider return } + // Log out from cloud if authenticated + if (CloudService.hasInstance()) { + try { + await CloudService.instance.logout() + } catch (error) { + this.log( + `Failed to logout from cloud during reset: ${error instanceof Error ? error.message : String(error)}`, + ) + // Continue with reset even if logout fails + } + } + await this.contextProxy.resetAllState() await this.providerSettingsManager.resetAllConfigs() await this.customModesManager.resetCustomModes() @@ -2525,14 +2582,24 @@ export class ClineProvider console.log(`[cancelTask] cancelling task ${task.taskId}.${task.instanceId}`) - const { historyItem } = await this.getTaskWithId(task.taskId) + const { historyItem, uiMessagesFilePath } = await this.getTaskWithId(task.taskId) // Preserve parent and root task information for history item. const rootTask = task.rootTask const parentTask = task.parentTask + // Mark this as a user-initiated cancellation so provider-only rehydration can occur + task.abortReason = "user_cancelled" + + // Capture the current instance to detect if rehydrate already occurred elsewhere + const originalInstanceId = task.instanceId + + // Begin abort (non-blocking) task.abortTask() + // Immediately mark the original instance as abandoned to prevent any residual activity + task.abandoned = true + await pWaitFor( () => this.getCurrentTask()! === undefined || @@ -2549,11 +2616,24 @@ export class ClineProvider console.error("Failed to abort task") }) - if (this.getCurrentTask()) { - // 'abandoned' will prevent this Cline instance from affecting - // future Cline instances. This may happen if its hanging on a - // streaming request. - this.getCurrentTask()!.abandoned = true + // Defensive safeguard: if current instance already changed, skip rehydrate + const current = this.getCurrentTask() + if (current && current.instanceId !== originalInstanceId) { + this.log( + `[cancelTask] Skipping rehydrate: current instance ${current.instanceId} != original ${originalInstanceId}`, + ) + return + } + + // Final race check before rehydrate to avoid duplicate rehydration + { + const currentAfterCheck = this.getCurrentTask() + if (currentAfterCheck && currentAfterCheck.instanceId !== originalInstanceId) { + this.log( + `[cancelTask] Skipping rehydrate after final check: current instance ${currentAfterCheck.instanceId} != original ${originalInstanceId}`, + ) + return + } } // Clears task again, so we need to abortTask manually above. diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index accb66f6e9c..c3e57c67a20 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1044,6 +1044,18 @@ export const webviewMessageHandler = async ( break } + case "openKeyboardShortcuts": { + // Open VSCode keyboard shortcuts settings and optionally filter to show the Roo Code commands + const searchQuery = message.text || "" + if (searchQuery) { + // Open with a search query pre-filled + await vscode.commands.executeCommand("workbench.action.openGlobalKeybindings", searchQuery) + } else { + // Just open the keyboard shortcuts settings + await vscode.commands.executeCommand("workbench.action.openGlobalKeybindings") + } + break + } case "openMcpSettings": { const mcpSettingsFilePath = await provider.getMcpHub()?.getMcpSettingsFilePath() @@ -1605,6 +1617,10 @@ export const webviewMessageHandler = async ( await updateGlobalState("historyPreviewCollapsed", message.bool ?? false) // No need to call postStateToWebview here as the UI already updated optimistically break + case "setReasoningBlockCollapsed": + await updateGlobalState("reasoningBlockCollapsed", message.bool ?? true) + // No need to call postStateToWebview here as the UI already updated optimistically + break case "toggleApiConfigPin": if (message.text) { const currentPinned = getGlobalState("pinnedApiConfigs") ?? {} @@ -2302,6 +2318,17 @@ export const webviewMessageHandler = async ( break } + case "cloudLandingPageSignIn": { + try { + const landingPageSlug = message.text || "supernova" + TelemetryService.instance.captureEvent(TelemetryEventName.AUTHENTICATION_INITIATED) + await CloudService.instance.login(landingPageSlug) + } catch (error) { + provider.log(`CloudService#login failed: ${error}`) + vscode.window.showErrorMessage("Sign in failed.") + } + break + } case "rooCloudSignOut": { try { await CloudService.instance.logout() @@ -2356,6 +2383,38 @@ export const webviewMessageHandler = async ( break } + case "switchOrganization": { + try { + const organizationId = message.organizationId ?? null + + // Switch to the new organization context + await CloudService.instance.switchOrganization(organizationId) + + // Refresh the state to update UI + await provider.postStateToWebview() + + // Send success response back to webview + await provider.postMessageToWebview({ + type: "organizationSwitchResult", + success: true, + organizationId: organizationId, + }) + } catch (error) { + provider.log(`Organization switch failed: ${error}`) + const errorMessage = error instanceof Error ? error.message : String(error) + + // Send error response back to webview + await provider.postMessageToWebview({ + type: "organizationSwitchResult", + success: false, + error: errorMessage, + organizationId: message.organizationId ?? null, + }) + + vscode.window.showErrorMessage(`Failed to switch organization: ${errorMessage}`) + } + break + } case "saveCodeIndexSettingsAtomic": { if (!message.codeIndexSettings) { diff --git a/src/extension.ts b/src/extension.ts index dc96e282c43..5db0996ad65 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -194,7 +194,7 @@ export async function activate(context: vscode.ExtensionContext) { // Add to subscriptions for proper cleanup on deactivate. context.subscriptions.push(cloudService) - // Trigger initial cloud profile sync now that CloudService is ready + // Trigger initial cloud profile sync now that CloudService is ready. try { await provider.initializeCloudProfileSyncWhenReady() } catch (error) { diff --git a/src/i18n/locales/ca/common.json b/src/i18n/locales/ca/common.json index b71b7eb9139..1de013b9ee9 100644 --- a/src/i18n/locales/ca/common.json +++ b/src/i18n/locales/ca/common.json @@ -117,6 +117,15 @@ "roo": { "authenticationRequired": "El proveïdor Roo requereix autenticació al núvol. Si us plau, inicieu sessió a Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Error en carregar les credencials OAuth de ChatGPT a {{path}}: {{error}}. Consell: autentica't amb la CLI de Codex (p. ex., \"codex login\") per crear auth.json.", + "oauthParseFailed": "Error en analitzar el JSON de credencials OAuth de ChatGPT a {{path}}: {{error}}. Consell: assegura't que el fitxer sigui JSON vàlid o torna a autenticar-te amb \"codex login\" per regenerar-lo.", + "oauthFileTooLarge": "El fitxer de credencials OAuth a {{path}} és massa gran ({{size}} bytes). El màxim permès és {{max}} bytes.", + "missingAccessToken": "Les credencials OAuth de ChatGPT no tenen tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Error de respostes de ChatGPT: No hi ha cos de resposta", + "emptyStream": "El flux de respostes de ChatGPT no ha retornat contingut per al model {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "La clau API conté caràcters no vàlids." }, @@ -165,6 +174,10 @@ "incomplete": "Tasca #{{taskNumber}} (Incompleta)", "no_messages": "Tasca #{{taskNumber}} (Sense missatges)" }, + "interruption": { + "responseInterruptedByUser": "Resposta interrompuda per l'usuari", + "responseInterruptedByApiError": "Resposta interrompuda per error d'API" + }, "storage": { "prompt_custom_path": "Introdueix una ruta d'emmagatzematge personalitzada per a l'historial de converses o deixa-ho buit per utilitzar la ubicació predeterminada", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index 6577d460d10..9f16da4f23c 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Roo-Anbieter erfordert Cloud-Authentifizierung. Bitte melde dich bei Roo Code Cloud an." }, + "openaiNativeCodex": { + "oauthReadFailed": "Fehler beim Laden der ChatGPT OAuth-Anmeldedaten unter {{path}}: {{error}}. Tipp: Authentifiziere dich mit der Codex CLI (z.B. \"codex login\"), um auth.json zu erstellen.", + "oauthParseFailed": "Fehler beim Parsen der ChatGPT OAuth-Anmeldedaten JSON unter {{path}}: {{error}}. Tipp: Stelle sicher, dass die Datei gültiges JSON ist oder authentifiziere dich erneut mit \"codex login\", um sie zu regenerieren.", + "oauthFileTooLarge": "OAuth-Anmeldedatei unter {{path}} ist zu groß ({{size}} Bytes). Maximal erlaubt sind {{max}} Bytes.", + "missingAccessToken": "ChatGPT OAuth-Anmeldedaten fehlen tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT Responses Fehler: Kein Antworttext vorhanden", + "emptyStream": "ChatGPT Responses Stream hat keinen Inhalt für Modell {{modelId}} zurückgegeben" + }, "api": { "invalidKeyInvalidChars": "API-Schlüssel enthält ungültige Zeichen." }, @@ -161,6 +170,10 @@ "incomplete": "Aufgabe #{{taskNumber}} (Unvollständig)", "no_messages": "Aufgabe #{{taskNumber}} (Keine Nachrichten)" }, + "interruption": { + "responseInterruptedByUser": "Antwort vom Benutzer unterbrochen", + "responseInterruptedByApiError": "Antwort durch API-Fehler unterbrochen" + }, "storage": { "prompt_custom_path": "Gib den benutzerdefinierten Speicherpfad für den Gesprächsverlauf ein, leer lassen für Standardspeicherort", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index e8c264ba684..6809a567f7b 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Roo provider requires cloud authentication. Please sign in to Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Failed to load ChatGPT OAuth credentials at {{path}}: {{error}}. Tip: authenticate with the Codex CLI (e.g., \"codex login\") to create auth.json.", + "oauthParseFailed": "Failed to parse ChatGPT OAuth credentials JSON at {{path}}: {{error}}. Tip: ensure the file is valid JSON or re-authenticate with \"codex login\" to regenerate it.", + "oauthFileTooLarge": "OAuth credentials file at {{path}} is too large ({{size}} bytes). Maximum allowed is {{max}} bytes.", + "missingAccessToken": "ChatGPT OAuth credentials are missing tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT Responses error: No response body", + "emptyStream": "ChatGPT Responses stream returned no content for model {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "API key contains invalid characters." }, @@ -161,6 +170,10 @@ "incomplete": "Task #{{taskNumber}} (Incomplete)", "no_messages": "Task #{{taskNumber}} (No messages)" }, + "interruption": { + "responseInterruptedByUser": "Response interrupted by user", + "responseInterruptedByApiError": "Response interrupted by API error" + }, "storage": { "prompt_custom_path": "Enter custom conversation history storage path, leave empty to use default location", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/es/common.json b/src/i18n/locales/es/common.json index 5cfa3c5749e..f659034fce8 100644 --- a/src/i18n/locales/es/common.json +++ b/src/i18n/locales/es/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "El proveedor Roo requiere autenticación en la nube. Por favor, inicia sesión en Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Error al cargar las credenciales OAuth de ChatGPT en {{path}}: {{error}}. Consejo: auténticate con la CLI de Codex (ej., \"codex login\") para crear auth.json.", + "oauthParseFailed": "Error al analizar el JSON de credenciales OAuth de ChatGPT en {{path}}: {{error}}. Consejo: asegúrate de que el archivo sea JSON válido o vuelve a autenticarte con \"codex login\" para regenerarlo.", + "oauthFileTooLarge": "El archivo de credenciales OAuth en {{path}} es demasiado grande ({{size}} bytes). El máximo permitido es {{max}} bytes.", + "missingAccessToken": "Las credenciales OAuth de ChatGPT no tienen tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Error de respuestas de ChatGPT: Sin cuerpo de respuesta", + "emptyStream": "El flujo de respuestas de ChatGPT no devolvió contenido para el modelo {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "La clave API contiene caracteres inválidos." }, @@ -161,6 +170,10 @@ "incomplete": "Tarea #{{taskNumber}} (Incompleta)", "no_messages": "Tarea #{{taskNumber}} (Sin mensajes)" }, + "interruption": { + "responseInterruptedByUser": "Respuesta interrumpida por el usuario", + "responseInterruptedByApiError": "Respuesta interrumpida por error de API" + }, "storage": { "prompt_custom_path": "Ingresa la ruta de almacenamiento personalizada para el historial de conversaciones, déjala vacía para usar la ubicación predeterminada", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index 5a11c874a7f..b57efc3bf8f 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Le fournisseur Roo nécessite une authentification cloud. Veuillez vous connecter à Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Échec du chargement des identifiants OAuth ChatGPT à {{path}} : {{error}}. Conseil : authentifiez-vous avec la CLI Codex (ex. \"codex login\") pour créer auth.json.", + "oauthParseFailed": "Échec de l'analyse du JSON des identifiants OAuth ChatGPT à {{path}} : {{error}}. Conseil : assurez-vous que le fichier est un JSON valide ou ré-authentifiez-vous avec \"codex login\" pour le régénérer.", + "oauthFileTooLarge": "Le fichier d'identifiants OAuth à {{path}} est trop volumineux ({{size}} octets). Le maximum autorisé est {{max}} octets.", + "missingAccessToken": "Les identifiants OAuth ChatGPT n'ont pas de tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}} : {{message}}", + "noResponseBody": "Erreur de réponses ChatGPT : Aucun corps de réponse", + "emptyStream": "Le flux de réponses ChatGPT n'a retourné aucun contenu pour le modèle {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "La clé API contient des caractères invalides." }, @@ -161,6 +170,10 @@ "incomplete": "Tâche #{{taskNumber}} (Incomplète)", "no_messages": "Tâche #{{taskNumber}} (Aucun message)" }, + "interruption": { + "responseInterruptedByUser": "Réponse interrompue par l'utilisateur", + "responseInterruptedByApiError": "Réponse interrompue par une erreur d'API" + }, "storage": { "prompt_custom_path": "Entrez le chemin de stockage personnalisé pour l'historique des conversations, laissez vide pour utiliser l'emplacement par défaut", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index e89c16cbd05..34bce6bd312 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Roo प्रदाता को क्लाउड प्रमाणीकरण की आवश्यकता है। कृपया Roo Code Cloud में साइन इन करें।" }, + "openaiNativeCodex": { + "oauthReadFailed": "{{path}} पर ChatGPT OAuth क्रेडेंशियल लोड करने में विफल: {{error}}। सुझाव: auth.json बनाने के लिए Codex CLI के साथ प्रमाणित करें (जैसे, \"codex login\")।", + "oauthParseFailed": "{{path}} पर ChatGPT OAuth क्रेडेंशियल JSON पार्स करने में विफल: {{error}}। सुझाव: सुनिश्चित करें कि फ़ाइल वैध JSON है या इसे पुनर्जनित करने के लिए \"codex login\" के साथ पुनः प्रमाणित करें।", + "oauthFileTooLarge": "{{path}} पर OAuth क्रेडेंशियल फ़ाइल बहुत बड़ी है ({{size}} बाइट्स)। अधिकतम अनुमतित {{max}} बाइट्स है।", + "missingAccessToken": "ChatGPT OAuth क्रेडेंशियल में tokens.access_token गुम है।", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT प्रतिक्रिया त्रुटि: कोई प्रतिक्रिया बॉडी नहीं", + "emptyStream": "ChatGPT प्रतिक्रिया स्ट्रीम ने मॉडल {{modelId}} के लिए कोई सामग्री वापस नहीं की" + }, "api": { "invalidKeyInvalidChars": "API कुंजी में अमान्य वर्ण हैं।" }, @@ -161,6 +170,10 @@ "incomplete": "टास्क #{{taskNumber}} (अधूरा)", "no_messages": "टास्क #{{taskNumber}} (कोई संदेश नहीं)" }, + "interruption": { + "responseInterruptedByUser": "उपयोगकर्ता द्वारा प्रतिक्रिया बाधित", + "responseInterruptedByApiError": "API त्रुटि द्वारा प्रतिक्रिया बाधित" + }, "storage": { "prompt_custom_path": "वार्तालाप इतिहास के लिए कस्टम स्टोरेज पाथ दर्ज करें, डिफ़ॉल्ट स्थान का उपयोग करने के लिए खाली छोड़ दें", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/id/common.json b/src/i18n/locales/id/common.json index ae1662eb37f..f7fb7abfcf6 100644 --- a/src/i18n/locales/id/common.json +++ b/src/i18n/locales/id/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Penyedia Roo memerlukan autentikasi cloud. Silakan masuk ke Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Gagal memuat kredensial OAuth ChatGPT di {{path}}: {{error}}. Tips: autentikasi dengan Codex CLI (mis., \"codex login\") untuk membuat auth.json.", + "oauthParseFailed": "Gagal mengurai JSON kredensial OAuth ChatGPT di {{path}}: {{error}}. Tips: pastikan file adalah JSON yang valid atau autentikasi ulang dengan \"codex login\" untuk meregenerasi.", + "oauthFileTooLarge": "File kredensial OAuth di {{path}} terlalu besar ({{size}} byte). Maksimum yang diizinkan adalah {{max}} byte.", + "missingAccessToken": "Kredensial OAuth ChatGPT tidak memiliki tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Error respons ChatGPT: Tidak ada body respons", + "emptyStream": "Stream respons ChatGPT tidak mengembalikan konten untuk model {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "Kunci API mengandung karakter tidak valid." }, @@ -161,6 +170,10 @@ "incomplete": "Tugas #{{taskNumber}} (Tidak lengkap)", "no_messages": "Tugas #{{taskNumber}} (Tidak ada pesan)" }, + "interruption": { + "responseInterruptedByUser": "Respons diinterupsi oleh pengguna", + "responseInterruptedByApiError": "Respons diinterupsi oleh error API" + }, "storage": { "prompt_custom_path": "Masukkan path penyimpanan riwayat percakapan kustom, biarkan kosong untuk menggunakan lokasi default", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json index aeaec11d0d0..c2a34557ef1 100644 --- a/src/i18n/locales/it/common.json +++ b/src/i18n/locales/it/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Il provider Roo richiede l'autenticazione cloud. Accedi a Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Impossibile caricare le credenziali OAuth di ChatGPT in {{path}}: {{error}}. Suggerimento: autenticati con la CLI Codex (es. \"codex login\") per creare auth.json.", + "oauthParseFailed": "Impossibile analizzare il JSON delle credenziali OAuth di ChatGPT in {{path}}: {{error}}. Suggerimento: assicurati che il file sia JSON valido o ri-autenticati con \"codex login\" per rigenerarlo.", + "oauthFileTooLarge": "Il file delle credenziali OAuth in {{path}} è troppo grande ({{size}} byte). Il massimo consentito è {{max}} byte.", + "missingAccessToken": "Le credenziali OAuth di ChatGPT non hanno tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Errore risposte ChatGPT: Nessun corpo di risposta", + "emptyStream": "Il flusso di risposte ChatGPT non ha restituito contenuto per il modello {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "La chiave API contiene caratteri non validi." }, @@ -161,6 +170,10 @@ "incomplete": "Attività #{{taskNumber}} (Incompleta)", "no_messages": "Attività #{{taskNumber}} (Nessun messaggio)" }, + "interruption": { + "responseInterruptedByUser": "Risposta interrotta dall'utente", + "responseInterruptedByApiError": "Risposta interrotta da errore API" + }, "storage": { "prompt_custom_path": "Inserisci il percorso di archiviazione personalizzato per la cronologia delle conversazioni, lascia vuoto per utilizzare la posizione predefinita", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json index a607dbffd53..21cf4ad30c2 100644 --- a/src/i18n/locales/ja/common.json +++ b/src/i18n/locales/ja/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Rooプロバイダーはクラウド認証が必要です。Roo Code Cloudにサインインしてください。" }, + "openaiNativeCodex": { + "oauthReadFailed": "{{path}}でChatGPT OAuth認証情報の読み込みに失敗しました: {{error}}。ヒント: Codex CLI(例:\"codex login\")で認証してauth.jsonを作成してください。", + "oauthParseFailed": "{{path}}でChatGPT OAuth認証情報JSONの解析に失敗しました: {{error}}。ヒント: ファイルが有効なJSONであることを確認するか、\"codex login\"で再認証して再生成してください。", + "oauthFileTooLarge": "{{path}}のOAuth認証情報ファイルが大きすぎます({{size}}バイト)。最大許可サイズは{{max}}バイトです。", + "missingAccessToken": "ChatGPT OAuth認証情報にtokens.access_tokenがありません。", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPTレスポンスエラー: レスポンスボディがありません", + "emptyStream": "ChatGPTレスポンスストリームがモデル{{modelId}}のコンテンツを返しませんでした" + }, "api": { "invalidKeyInvalidChars": "APIキーに無効な文字が含まれています。" }, @@ -161,6 +170,10 @@ "incomplete": "タスク #{{taskNumber}} (未完了)", "no_messages": "タスク #{{taskNumber}} (メッセージなし)" }, + "interruption": { + "responseInterruptedByUser": "ユーザーによって応答が中断されました", + "responseInterruptedByApiError": "APIエラーによって応答が中断されました" + }, "storage": { "prompt_custom_path": "会話履歴のカスタムストレージパスを入力してください。デフォルトの場所を使用する場合は空のままにしてください", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json index e48b84fe201..9a95714ca14 100644 --- a/src/i18n/locales/ko/common.json +++ b/src/i18n/locales/ko/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Roo 제공업체는 클라우드 인증이 필요합니다. Roo Code Cloud에 로그인하세요." }, + "openaiNativeCodex": { + "oauthReadFailed": "{{path}}에서 ChatGPT OAuth 자격 증명 로드 실패: {{error}}. 팁: Codex CLI(예: \"codex login\")로 인증하여 auth.json을 생성하세요.", + "oauthParseFailed": "{{path}}에서 ChatGPT OAuth 자격 증명 JSON 파싱 실패: {{error}}. 팁: 파일이 유효한 JSON인지 확인하거나 \"codex login\"으로 재인증하여 재생성하세요.", + "oauthFileTooLarge": "{{path}}의 OAuth 자격 증명 파일이 너무 큽니다({{size}}바이트). 최대 허용 크기는 {{max}}바이트입니다.", + "missingAccessToken": "ChatGPT OAuth 자격 증명에 tokens.access_token이 없습니다.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT 응답 오류: 응답 본문 없음", + "emptyStream": "ChatGPT 응답 스트림이 모델 {{modelId}}에 대한 콘텐츠를 반환하지 않았습니다" + }, "api": { "invalidKeyInvalidChars": "API 키에 유효하지 않은 문자가 포함되어 있습니다." }, @@ -161,6 +170,10 @@ "incomplete": "작업 #{{taskNumber}} (미완료)", "no_messages": "작업 #{{taskNumber}} (메시지 없음)" }, + "interruption": { + "responseInterruptedByUser": "사용자에 의해 응답이 중단됨", + "responseInterruptedByApiError": "API 오류로 인해 응답이 중단됨" + }, "storage": { "prompt_custom_path": "대화 내역을 위한 사용자 지정 저장 경로를 입력하세요. 기본 위치를 사용하려면 비워두세요", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/nl/common.json b/src/i18n/locales/nl/common.json index 0e3e2459a0d..36398dc8533 100644 --- a/src/i18n/locales/nl/common.json +++ b/src/i18n/locales/nl/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Roo provider vereist cloud authenticatie. Log in bij Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Laden van ChatGPT OAuth-referenties op {{path}} mislukt: {{error}}. Tip: authenticeer met de Codex CLI (bijv. \"codex login\") om auth.json aan te maken.", + "oauthParseFailed": "Parsen van ChatGPT OAuth-referenties JSON op {{path}} mislukt: {{error}}. Tip: zorg ervoor dat het bestand geldige JSON is of authenticeer opnieuw met \"codex login\" om het te regenereren.", + "oauthFileTooLarge": "OAuth-referentiebestand op {{path}} is te groot ({{size}} bytes). Maximum toegestaan is {{max}} bytes.", + "missingAccessToken": "ChatGPT OAuth-referenties missen tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT Responses fout: Geen response body", + "emptyStream": "ChatGPT Responses stream retourneerde geen inhoud voor model {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "API-sleutel bevat ongeldige karakters." }, @@ -161,6 +170,10 @@ "incomplete": "Taak #{{taskNumber}} (Onvolledig)", "no_messages": "Taak #{{taskNumber}} (Geen berichten)" }, + "interruption": { + "responseInterruptedByUser": "Reactie onderbroken door gebruiker", + "responseInterruptedByApiError": "Reactie onderbroken door API-fout" + }, "storage": { "prompt_custom_path": "Voer een aangepast opslagpad voor gespreksgeschiedenis in, laat leeg voor standaardlocatie", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json index 1d48b0f9cc1..4ca02b44589 100644 --- a/src/i18n/locales/pl/common.json +++ b/src/i18n/locales/pl/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Dostawca Roo wymaga uwierzytelnienia w chmurze. Zaloguj się do Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Nie udało się załadować danych uwierzytelniających OAuth ChatGPT w {{path}}: {{error}}. Wskazówka: uwierzytelnij się za pomocą Codex CLI (np. \"codex login\"), aby utworzyć auth.json.", + "oauthParseFailed": "Nie udało się przeanalizować JSON danych uwierzytelniających OAuth ChatGPT w {{path}}: {{error}}. Wskazówka: upewnij się, że plik jest prawidłowym JSON lub ponownie uwierzytelnij się za pomocą \"codex login\", aby go zregenerować.", + "oauthFileTooLarge": "Plik danych uwierzytelniających OAuth w {{path}} jest za duży ({{size}} bajtów). Maksymalny dozwolony rozmiar to {{max}} bajtów.", + "missingAccessToken": "Dane uwierzytelniające OAuth ChatGPT nie zawierają tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Błąd odpowiedzi ChatGPT: Brak treści odpowiedzi", + "emptyStream": "Strumień odpowiedzi ChatGPT nie zwrócił zawartości dla modelu {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "Klucz API zawiera nieprawidłowe znaki." }, @@ -161,6 +170,10 @@ "incomplete": "Zadanie #{{taskNumber}} (Niekompletne)", "no_messages": "Zadanie #{{taskNumber}} (Brak wiadomości)" }, + "interruption": { + "responseInterruptedByUser": "Odpowiedź przerwana przez użytkownika", + "responseInterruptedByApiError": "Odpowiedź przerwana przez błąd API" + }, "storage": { "prompt_custom_path": "Wprowadź niestandardową ścieżkę przechowywania dla historii konwersacji lub pozostaw puste, aby użyć lokalizacji domyślnej", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index 093ef7b0bff..663d2a0e1b5 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -118,6 +118,15 @@ "roo": { "authenticationRequired": "O provedor Roo requer autenticação na nuvem. Faça login no Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Falha ao carregar credenciais OAuth do ChatGPT em {{path}}: {{error}}. Dica: autentique-se com a CLI do Codex (ex: \"codex login\") para criar auth.json.", + "oauthParseFailed": "Falha ao analisar JSON das credenciais OAuth do ChatGPT em {{path}}: {{error}}. Dica: certifique-se de que o arquivo seja JSON válido ou autentique-se novamente com \"codex login\" para regenerá-lo.", + "oauthFileTooLarge": "Arquivo de credenciais OAuth em {{path}} é muito grande ({{size}} bytes). O máximo permitido é {{max}} bytes.", + "missingAccessToken": "Credenciais OAuth do ChatGPT estão faltando tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Erro de respostas do ChatGPT: Sem corpo de resposta", + "emptyStream": "Stream de respostas do ChatGPT não retornou conteúdo para o modelo {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "A chave API contém caracteres inválidos." }, @@ -165,6 +174,10 @@ "incomplete": "Tarefa #{{taskNumber}} (Incompleta)", "no_messages": "Tarefa #{{taskNumber}} (Sem mensagens)" }, + "interruption": { + "responseInterruptedByUser": "Resposta interrompida pelo usuário", + "responseInterruptedByApiError": "Resposta interrompida por erro da API" + }, "storage": { "prompt_custom_path": "Digite o caminho de armazenamento personalizado para o histórico de conversas, deixe em branco para usar o local padrão", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json index 7edd656d8c0..c5897d27cea 100644 --- a/src/i18n/locales/ru/common.json +++ b/src/i18n/locales/ru/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Провайдер Roo требует облачной аутентификации. Войдите в Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Не удалось загрузить учетные данные OAuth ChatGPT по пути {{path}}: {{error}}. Совет: аутентифицируйтесь с помощью Codex CLI (например, \"codex login\") для создания auth.json.", + "oauthParseFailed": "Не удалось разобрать JSON учетных данных OAuth ChatGPT по пути {{path}}: {{error}}. Совет: убедитесь, что файл является действительным JSON, или повторно аутентифицируйтесь с помощью \"codex login\" для его регенерации.", + "oauthFileTooLarge": "Файл учетных данных OAuth по пути {{path}} слишком большой ({{size}} байт). Максимально допустимый размер {{max}} байт.", + "missingAccessToken": "В учетных данных OAuth ChatGPT отсутствует tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Ошибка ответов ChatGPT: Нет тела ответа", + "emptyStream": "Поток ответов ChatGPT не вернул содержимое для модели {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "API-ключ содержит недопустимые символы." }, @@ -161,6 +170,10 @@ "incomplete": "Задача #{{taskNumber}} (Незавершенная)", "no_messages": "Задача #{{taskNumber}} (Нет сообщений)" }, + "interruption": { + "responseInterruptedByUser": "Ответ прерван пользователем", + "responseInterruptedByApiError": "Ответ прерван ошибкой API" + }, "storage": { "prompt_custom_path": "Введите пользовательский путь хранения истории разговоров, оставьте пустым для использования расположения по умолчанию", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/tr/common.json b/src/i18n/locales/tr/common.json index 20b2824b983..a6829617f41 100644 --- a/src/i18n/locales/tr/common.json +++ b/src/i18n/locales/tr/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Roo sağlayıcısı bulut kimlik doğrulaması gerektirir. Lütfen Roo Code Cloud'a giriş yapın." }, + "openaiNativeCodex": { + "oauthReadFailed": "{{path}} konumunda ChatGPT OAuth kimlik bilgileri yüklenemedi: {{error}}. İpucu: auth.json oluşturmak için Codex CLI ile kimlik doğrulaması yapın (örn. \"codex login\").", + "oauthParseFailed": "{{path}} konumunda ChatGPT OAuth kimlik bilgileri JSON'u ayrıştırılamadı: {{error}}. İpucu: dosyanın geçerli JSON olduğundan emin olun veya yeniden oluşturmak için \"codex login\" ile yeniden kimlik doğrulaması yapın.", + "oauthFileTooLarge": "{{path}} konumundaki OAuth kimlik bilgileri dosyası çok büyük ({{size}} bayt). İzin verilen maksimum {{max}} bayttır.", + "missingAccessToken": "ChatGPT OAuth kimlik bilgilerinde tokens.access_token eksik.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT Yanıtları hatası: Yanıt gövdesi yok", + "emptyStream": "ChatGPT Yanıtları akışı {{modelId}} modeli için içerik döndürmedi" + }, "api": { "invalidKeyInvalidChars": "API anahtarı geçersiz karakterler içeriyor." }, @@ -161,6 +170,10 @@ "incomplete": "Görev #{{taskNumber}} (Tamamlanmamış)", "no_messages": "Görev #{{taskNumber}} (Mesaj yok)" }, + "interruption": { + "responseInterruptedByUser": "Yanıt kullanıcı tarafından kesildi", + "responseInterruptedByApiError": "Yanıt API hatası nedeniyle kesildi" + }, "storage": { "prompt_custom_path": "Konuşma geçmişi için özel depolama yolunu girin, varsayılan konumu kullanmak için boş bırakın", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/vi/common.json b/src/i18n/locales/vi/common.json index f4755162fe7..8979ed97bdc 100644 --- a/src/i18n/locales/vi/common.json +++ b/src/i18n/locales/vi/common.json @@ -114,6 +114,15 @@ "roo": { "authenticationRequired": "Nhà cung cấp Roo yêu cầu xác thực đám mây. Vui lòng đăng nhập vào Roo Code Cloud." }, + "openaiNativeCodex": { + "oauthReadFailed": "Không thể tải thông tin xác thực OAuth ChatGPT tại {{path}}: {{error}}. Mẹo: xác thực với Codex CLI (ví dụ: \"codex login\") để tạo auth.json.", + "oauthParseFailed": "Không thể phân tích JSON thông tin xác thực OAuth ChatGPT tại {{path}}: {{error}}. Mẹo: đảm bảo tệp là JSON hợp lệ hoặc xác thực lại với \"codex login\" để tạo lại.", + "oauthFileTooLarge": "Tệp thông tin xác thực OAuth tại {{path}} quá lớn ({{size}} byte). Kích thước tối đa cho phép là {{max}} byte.", + "missingAccessToken": "Thông tin xác thực OAuth ChatGPT thiếu tokens.access_token.", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "Lỗi phản hồi ChatGPT: Không có nội dung phản hồi", + "emptyStream": "Luồng phản hồi ChatGPT không trả về nội dung cho mô hình {{modelId}}" + }, "api": { "invalidKeyInvalidChars": "Khóa API chứa ký tự không hợp lệ." }, @@ -161,6 +170,10 @@ "incomplete": "Nhiệm vụ #{{taskNumber}} (Chưa hoàn thành)", "no_messages": "Nhiệm vụ #{{taskNumber}} (Không có tin nhắn)" }, + "interruption": { + "responseInterruptedByUser": "Phản hồi bị gián đoạn bởi người dùng", + "responseInterruptedByApiError": "Phản hồi bị gián đoạn bởi lỗi API" + }, "storage": { "prompt_custom_path": "Nhập đường dẫn lưu trữ tùy chỉnh cho lịch sử hội thoại, để trống để sử dụng vị trí mặc định", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index 787c5c8ae99..63e8799b8db 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -119,6 +119,15 @@ "roo": { "authenticationRequired": "Roo 提供商需要云认证。请登录 Roo Code Cloud。" }, + "openaiNativeCodex": { + "oauthReadFailed": "无法在 {{path}} 加载 ChatGPT OAuth 凭据:{{error}}。提示:使用 Codex CLI 进行身份验证(例如 \"codex login\")以创建 auth.json。", + "oauthParseFailed": "无法在 {{path}} 解析 ChatGPT OAuth 凭据 JSON:{{error}}。提示:确保文件是有效的 JSON 或使用 \"codex login\" 重新验证以重新生成。", + "oauthFileTooLarge": "{{path}} 处的 OAuth 凭据文件过大({{size}} 字节)。最大允许大小为 {{max}} 字节。", + "missingAccessToken": "ChatGPT OAuth 凭据缺少 tokens.access_token。", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT 响应错误:无响应正文", + "emptyStream": "ChatGPT 响应流未为模型 {{modelId}} 返回内容" + }, "api": { "invalidKeyInvalidChars": "API 密钥包含无效字符。" }, @@ -166,6 +175,10 @@ "incomplete": "任务 #{{taskNumber}} (未完成)", "no_messages": "任务 #{{taskNumber}} (无消息)" }, + "interruption": { + "responseInterruptedByUser": "响应被用户中断", + "responseInterruptedByApiError": "响应被 API 错误中断" + }, "storage": { "prompt_custom_path": "输入自定义会话历史存储路径,留空以使用默认位置", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index 0ae3549d3ec..94e207e56c4 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -113,6 +113,15 @@ "roo": { "authenticationRequired": "Roo 提供者需要雲端認證。請登入 Roo Code Cloud。" }, + "openaiNativeCodex": { + "oauthReadFailed": "無法在 {{path}} 載入 ChatGPT OAuth 憑證:{{error}}。提示:使用 Codex CLI 進行驗證(例如 \"codex login\")以建立 auth.json。", + "oauthParseFailed": "無法在 {{path}} 解析 ChatGPT OAuth 憑證 JSON:{{error}}。提示:確保檔案是有效的 JSON 或使用 \"codex login\" 重新驗證以重新產生。", + "oauthFileTooLarge": "{{path}} 的 OAuth 憑證檔案過大({{size}} 位元組)。允許的最大大小為 {{max}} 位元組。", + "missingAccessToken": "ChatGPT OAuth 憑證缺少 tokens.access_token。", + "httpError": "Codex HTTP {{status}} (req: {{requestId}}) model={{modelId}}: {{message}}", + "noResponseBody": "ChatGPT 回應錯誤:無回應內容", + "emptyStream": "ChatGPT 回應串流未為模型 {{modelId}} 傳回內容" + }, "api": { "invalidKeyInvalidChars": "API 金鑰包含無效字元。" }, @@ -161,6 +170,10 @@ "incomplete": "工作 #{{taskNumber}} (未完成)", "no_messages": "工作 #{{taskNumber}} (無訊息)" }, + "interruption": { + "responseInterruptedByUser": "回應被使用者中斷", + "responseInterruptedByApiError": "回應被 API 錯誤中斷" + }, "storage": { "prompt_custom_path": "輸入自訂會話歷史儲存路徑,留空以使用預設位置", "path_placeholder": "D:\\RooCodeStorage", diff --git a/src/package.json b/src/package.json index 4016b06f22d..249993ecc1e 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.28.3", + "version": "3.28.8", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", @@ -174,6 +174,11 @@ "command": "roo-cline.acceptInput", "title": "%command.acceptInput.title%", "category": "%configuration.title%" + }, + { + "command": "roo-cline.toggleAutoApprove", + "title": "%command.toggleAutoApprove.title%", + "category": "%configuration.title%" } ], "menus": { @@ -310,6 +315,13 @@ "win": "ctrl+y", "linux": "ctrl+y", "when": "editorTextFocus && editorHasSelection" + }, + { + "command": "roo-cline.toggleAutoApprove", + "key": "cmd+alt+a", + "mac": "cmd+alt+a", + "win": "ctrl+alt+a", + "linux": "ctrl+alt+a" } ], "submenus": [ diff --git a/src/package.nls.ca.json b/src/package.nls.ca.json index 537a4522b2d..902f798cbed 100644 --- a/src/package.nls.ca.json +++ b/src/package.nls.ca.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Corregir Aquesta Ordre", "command.terminal.explainCommand.title": "Explicar Aquesta Ordre", "command.acceptInput.title": "Acceptar Entrada/Suggeriment", + "command.toggleAutoApprove.title": "Alternar Auto-Aprovació", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Prefixos d'ordres que seran automàticament denegats sense demanar aprovació. En cas de conflictes amb ordres permeses, la coincidència de prefix més llarga té prioritat. Afegeix * per denegar totes les ordres.", "commands.commandExecutionTimeout.description": "Temps màxim en segons per esperar que l'execució de l'ordre es completi abans d'esgotar el temps (0 = sense temps límit, 1-600s, per defecte: 0s)", "commands.commandTimeoutAllowlist.description": "Prefixos d'ordres que estan exclosos del temps límit d'execució d'ordres. Les ordres que coincideixin amb aquests prefixos s'executaran sense restriccions de temps límit.", + "commands.preventCompletionWithOpenTodos.description": "Evitar la finalització de tasques quan hi ha tasques pendents incompletes a la llista de tasques", "settings.vsCodeLmModelSelector.description": "Configuració per a l'API del model de llenguatge VSCode", "settings.vsCodeLmModelSelector.vendor.description": "El proveïdor del model de llenguatge (p. ex. copilot)", "settings.vsCodeLmModelSelector.family.description": "La família del model de llenguatge (p. ex. gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Ruta a un fitxer de configuració de RooCode per importar automàticament en iniciar l'extensió. Admet rutes absolutes i rutes relatives al directori d'inici (per exemple, '~/Documents/roo-code-settings.json'). Deixeu-ho en blanc per desactivar la importació automàtica.", "settings.useAgentRules.description": "Activa la càrrega de fitxers AGENTS.md per a regles específiques de l'agent (vegeu https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Temps màxim en segons per esperar les respostes de l'API (0 = sense temps d'espera, 1-3600s, per defecte: 600s). Es recomanen valors més alts per a proveïdors locals com LM Studio i Ollama que poden necessitar més temps de processament.", + "settings.newTaskRequireTodos.description": "Requerir el paràmetre de tasques pendents quan es creïn noves tasques amb l'eina new_task", "settings.codeIndex.embeddingBatchSize.description": "La mida del lot per a operacions d'incrustació durant la indexació de codi. Ajusta això segons els límits del teu proveïdor d'API. Per defecte és 60." } diff --git a/src/package.nls.de.json b/src/package.nls.de.json index fb43e289072..d8043da94e3 100644 --- a/src/package.nls.de.json +++ b/src/package.nls.de.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Diesen Befehl Reparieren", "command.terminal.explainCommand.title": "Diesen Befehl Erklären", "command.acceptInput.title": "Eingabe/Vorschlag Akzeptieren", + "command.toggleAutoApprove.title": "Auto-Genehmigung Umschalten", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Befehlspräfixe, die automatisch abgelehnt werden, ohne nach Genehmigung zu fragen. Bei Konflikten mit erlaubten Befehlen hat die längste Präfix-Übereinstimmung Vorrang. Füge * hinzu, um alle Befehle abzulehnen.", "commands.commandExecutionTimeout.description": "Maximale Zeit in Sekunden, die auf den Abschluss der Befehlsausführung gewartet wird, bevor ein Timeout auftritt (0 = kein Timeout, 1-600s, Standard: 0s)", "commands.commandTimeoutAllowlist.description": "Befehlspräfixe, die vom Timeout der Befehlsausführung ausgeschlossen sind. Befehle, die diesen Präfixen entsprechen, werden ohne Timeout-Beschränkungen ausgeführt.", + "commands.preventCompletionWithOpenTodos.description": "Aufgabenabschluss verhindern, wenn unvollständige Todos in der Todo-Liste vorhanden sind", "settings.vsCodeLmModelSelector.description": "Einstellungen für die VSCode-Sprachmodell-API", "settings.vsCodeLmModelSelector.vendor.description": "Der Anbieter des Sprachmodells (z.B. copilot)", "settings.vsCodeLmModelSelector.family.description": "Die Familie des Sprachmodells (z.B. gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Pfad zu einer RooCode-Konfigurationsdatei, die beim Start der Erweiterung automatisch importiert wird. Unterstützt absolute Pfade und Pfade relativ zum Home-Verzeichnis (z.B. '~/Documents/roo-code-settings.json'). Leer lassen, um den automatischen Import zu deaktivieren.", "settings.useAgentRules.description": "Aktiviert das Laden von AGENTS.md-Dateien für agentenspezifische Regeln (siehe https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Maximale Wartezeit in Sekunden auf API-Antworten (0 = kein Timeout, 1-3600s, Standard: 600s). Höhere Werte werden für lokale Anbieter wie LM Studio und Ollama empfohlen, die möglicherweise mehr Verarbeitungszeit benötigen.", + "settings.newTaskRequireTodos.description": "Todos-Parameter beim Erstellen neuer Aufgaben mit dem new_task-Tool erfordern", "settings.codeIndex.embeddingBatchSize.description": "Die Batch-Größe für Embedding-Operationen während der Code-Indexierung. Passe dies an die Limits deines API-Anbieters an. Standard ist 60." } diff --git a/src/package.nls.es.json b/src/package.nls.es.json index 95029057a9d..000b353550c 100644 --- a/src/package.nls.es.json +++ b/src/package.nls.es.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Corregir Este Comando", "command.terminal.explainCommand.title": "Explicar Este Comando", "command.acceptInput.title": "Aceptar Entrada/Sugerencia", + "command.toggleAutoApprove.title": "Alternar Auto-Aprobación", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Prefijos de comandos que serán automáticamente denegados sin solicitar aprobación. En caso de conflictos con comandos permitidos, la coincidencia de prefijo más larga tiene prioridad. Añade * para denegar todos los comandos.", "commands.commandExecutionTimeout.description": "Tiempo máximo en segundos para esperar que se complete la ejecución del comando antes de que expire (0 = sin tiempo límite, 1-600s, predeterminado: 0s)", "commands.commandTimeoutAllowlist.description": "Prefijos de comandos que están excluidos del tiempo límite de ejecución de comandos. Los comandos que coincidan con estos prefijos se ejecutarán sin restricciones de tiempo límite.", + "commands.preventCompletionWithOpenTodos.description": "Prevenir la finalización de tareas cuando hay todos incompletos en la lista de todos", "settings.vsCodeLmModelSelector.description": "Configuración para la API del modelo de lenguaje VSCode", "settings.vsCodeLmModelSelector.vendor.description": "El proveedor del modelo de lenguaje (ej. copilot)", "settings.vsCodeLmModelSelector.family.description": "La familia del modelo de lenguaje (ej. gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Ruta a un archivo de configuración de RooCode para importar automáticamente al iniciar la extensión. Admite rutas absolutas y rutas relativas al directorio de inicio (por ejemplo, '~/Documents/roo-code-settings.json'). Dejar vacío para desactivar la importación automática.", "settings.useAgentRules.description": "Habilita la carga de archivos AGENTS.md para reglas específicas del agente (ver https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Tiempo máximo en segundos de espera para las respuestas de la API (0 = sin tiempo de espera, 1-3600s, por defecto: 600s). Se recomiendan valores más altos para proveedores locales como LM Studio y Ollama que puedan necesitar más tiempo de procesamiento.", + "settings.newTaskRequireTodos.description": "Requerir el parámetro todos al crear nuevas tareas con la herramienta new_task", "settings.codeIndex.embeddingBatchSize.description": "El tamaño del lote para operaciones de embedding durante la indexación de código. Ajusta esto según los límites de tu proveedor de API. Por defecto es 60." } diff --git a/src/package.nls.fr.json b/src/package.nls.fr.json index 3939451d673..0ba6ddeb8fc 100644 --- a/src/package.nls.fr.json +++ b/src/package.nls.fr.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Corriger cette Commande", "command.terminal.explainCommand.title": "Expliquer cette Commande", "command.acceptInput.title": "Accepter l'Entrée/Suggestion", + "command.toggleAutoApprove.title": "Basculer Auto-Approbation", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Préfixes de commandes qui seront automatiquement refusés sans demander d'approbation. En cas de conflit avec les commandes autorisées, la correspondance de préfixe la plus longue a la priorité. Ajouter * pour refuser toutes les commandes.", "commands.commandExecutionTimeout.description": "Temps maximum en secondes pour attendre que l'exécution de la commande se termine avant expiration (0 = pas de délai, 1-600s, défaut : 0s)", "commands.commandTimeoutAllowlist.description": "Préfixes de commandes qui sont exclus du délai d'exécution des commandes. Les commandes correspondant à ces préfixes s'exécuteront sans restrictions de délai.", + "commands.preventCompletionWithOpenTodos.description": "Empêcher l'achèvement des tâches lorsqu'il y a des todos incomplets dans la liste de todos", "settings.vsCodeLmModelSelector.description": "Paramètres pour l'API du modèle de langage VSCode", "settings.vsCodeLmModelSelector.vendor.description": "Le fournisseur du modèle de langage (ex: copilot)", "settings.vsCodeLmModelSelector.family.description": "La famille du modèle de langage (ex: gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Chemin d'accès à un fichier de configuration RooCode à importer automatiquement au démarrage de l'extension. Prend en charge les chemins absolus et les chemins relatifs au répertoire de base (par exemple, '~/Documents/roo-code-settings.json'). Laisser vide pour désactiver l'importation automatique.", "settings.useAgentRules.description": "Activer le chargement des fichiers AGENTS.md pour les règles spécifiques à l'agent (voir https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Temps maximum en secondes d'attente pour les réponses de l'API (0 = pas de timeout, 1-3600s, par défaut : 600s). Des valeurs plus élevées sont recommandées pour les fournisseurs locaux comme LM Studio et Ollama qui peuvent nécessiter plus de temps de traitement.", + "settings.newTaskRequireTodos.description": "Exiger le paramètre todos lors de la création de nouvelles tâches avec l'outil new_task", "settings.codeIndex.embeddingBatchSize.description": "La taille du lot pour les opérations d'embedding lors de l'indexation du code. Ajustez ceci selon les limites de votre fournisseur d'API. Par défaut, c'est 60." } diff --git a/src/package.nls.hi.json b/src/package.nls.hi.json index 25481f425fa..d4b4bb1cd01 100644 --- a/src/package.nls.hi.json +++ b/src/package.nls.hi.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "यह कमांड ठीक करें", "command.terminal.explainCommand.title": "यह कमांड समझाएं", "command.acceptInput.title": "इनपुट/सुझाव स्वीकारें", + "command.toggleAutoApprove.title": "ऑटो-अनुमोदन टॉगल करें", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "कमांड प्रीफिक्स जो स्वचालित रूप से अस्वीकार कर दिए जाएंगे बिना अनुमोदन मांगे। अनुमतित कमांड के साथ संघर्ष की स्थिति में, सबसे लंबा प्रीफिक्स मैच प्राथमिकता लेता है। सभी कमांड को अस्वीकार करने के लिए * जोड़ें।", "commands.commandExecutionTimeout.description": "कमांड निष्पादन पूरा होने का इंतजार करने के लिए अधिकतम समय सेकंड में, समय समाप्त होने से पहले (0 = कोई समय सीमा नहीं, 1-600s, डिफ़ॉल्ट: 0s)", "commands.commandTimeoutAllowlist.description": "कमांड प्रीफिक्स जो कमांड निष्पादन टाइमआउट से बाहर रखे गए हैं। इन प्रीफिक्स से मेल खाने वाले कमांड बिना टाइमआउट प्रतिबंधों के चलेंगे।", + "commands.preventCompletionWithOpenTodos.description": "जब टूडू सूची में अधूरे टूडू हों तो कार्य पूर्णता को रोकें", "settings.vsCodeLmModelSelector.description": "VSCode भाषा मॉडल API के लिए सेटिंग्स", "settings.vsCodeLmModelSelector.vendor.description": "भाषा मॉडल का विक्रेता (उदा. copilot)", "settings.vsCodeLmModelSelector.family.description": "भाषा मॉडल का परिवार (उदा. gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "RooCode कॉन्फ़िगरेशन फ़ाइल का पथ जिसे एक्सटेंशन स्टार्टअप पर स्वचालित रूप से आयात किया जाएगा। होम डायरेक्टरी के सापेक्ष पूर्ण पथ और पथों का समर्थन करता है (उदाहरण के लिए '~/Documents/roo-code-settings.json')। ऑटो-इंपोर्ट को अक्षम करने के लिए खाली छोड़ दें।", "settings.useAgentRules.description": "एजेंट-विशिष्ट नियमों के लिए AGENTS.md फ़ाइलों को लोड करना सक्षम करें (देखें https://agent-rules.org/)", "settings.apiRequestTimeout.description": "एपीआई प्रतिक्रियाओं की प्रतीक्षा करने के लिए सेकंड में अधिकतम समय (0 = कोई टाइमआउट नहीं, 1-3600s, डिफ़ॉल्ट: 600s)। एलएम स्टूडियो और ओलामा जैसे स्थानीय प्रदाताओं के लिए उच्च मानों की सिफारिश की जाती है जिन्हें अधिक प्रसंस्करण समय की आवश्यकता हो सकती है।", + "settings.newTaskRequireTodos.description": "new_task टूल के साथ नए कार्य बनाते समय टूडू पैरामीटर की आवश्यकता होती है", "settings.codeIndex.embeddingBatchSize.description": "कोड इंडेक्सिंग के दौरान एम्बेडिंग ऑपरेशन के लिए बैच साइज़। इसे अपने API प्रदाता की सीमाओं के अनुसार समायोजित करें। डिफ़ॉल्ट 60 है।" } diff --git a/src/package.nls.id.json b/src/package.nls.id.json index 0c69028e917..eb361a1ef70 100644 --- a/src/package.nls.id.json +++ b/src/package.nls.id.json @@ -26,11 +26,13 @@ "command.terminal.fixCommand.title": "Perbaiki Perintah Ini", "command.terminal.explainCommand.title": "Jelaskan Perintah Ini", "command.acceptInput.title": "Terima Input/Saran", + "command.toggleAutoApprove.title": "Alihkan Persetujuan Otomatis", "configuration.title": "Roo Code", "commands.allowedCommands.description": "Perintah yang dapat dijalankan secara otomatis ketika 'Selalu setujui operasi eksekusi' diaktifkan", "commands.deniedCommands.description": "Awalan perintah yang akan otomatis ditolak tanpa meminta persetujuan. Jika terjadi konflik dengan perintah yang diizinkan, pencocokan awalan terpanjang akan diprioritaskan. Tambahkan * untuk menolak semua perintah.", "commands.commandExecutionTimeout.description": "Waktu maksimum dalam detik untuk menunggu eksekusi perintah selesai sebelum timeout (0 = tanpa timeout, 1-600s, default: 0s)", "commands.commandTimeoutAllowlist.description": "Awalan perintah yang dikecualikan dari timeout eksekusi perintah. Perintah yang cocok dengan awalan ini akan berjalan tanpa batasan timeout.", + "commands.preventCompletionWithOpenTodos.description": "Mencegah penyelesaian tugas ketika ada todos yang belum selesai dalam daftar todos", "settings.vsCodeLmModelSelector.description": "Pengaturan untuk API Model Bahasa VSCode", "settings.vsCodeLmModelSelector.vendor.description": "Vendor dari model bahasa (misalnya copilot)", "settings.vsCodeLmModelSelector.family.description": "Keluarga dari model bahasa (misalnya gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Path ke file konfigurasi RooCode untuk diimpor secara otomatis saat ekstensi dimulai. Mendukung path absolut dan path relatif terhadap direktori home (misalnya '~/Documents/roo-code-settings.json'). Biarkan kosong untuk menonaktifkan impor otomatis.", "settings.useAgentRules.description": "Aktifkan pemuatan file AGENTS.md untuk aturan khusus agen (lihat https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Waktu maksimum dalam detik untuk menunggu respons API (0 = tidak ada batas waktu, 1-3600s, default: 600s). Nilai yang lebih tinggi disarankan untuk penyedia lokal seperti LM Studio dan Ollama yang mungkin memerlukan lebih banyak waktu pemrosesan.", + "settings.newTaskRequireTodos.description": "Memerlukan parameter todos saat membuat tugas baru dengan alat new_task", "settings.codeIndex.embeddingBatchSize.description": "Ukuran batch untuk operasi embedding selama pengindeksan kode. Sesuaikan ini berdasarkan batas penyedia API kamu. Default adalah 60." } diff --git a/src/package.nls.it.json b/src/package.nls.it.json index 5ce3a765668..78989df6fe7 100644 --- a/src/package.nls.it.json +++ b/src/package.nls.it.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Correggi Questo Comando", "command.terminal.explainCommand.title": "Spiega Questo Comando", "command.acceptInput.title": "Accetta Input/Suggerimento", + "command.toggleAutoApprove.title": "Attiva/Disattiva Auto-Approvazione", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Prefissi di comandi che verranno automaticamente rifiutati senza richiedere approvazione. In caso di conflitti con comandi consentiti, la corrispondenza del prefisso più lungo ha la precedenza. Aggiungi * per rifiutare tutti i comandi.", "commands.commandExecutionTimeout.description": "Tempo massimo in secondi per attendere il completamento dell'esecuzione del comando prima del timeout (0 = nessun timeout, 1-600s, predefinito: 0s)", "commands.commandTimeoutAllowlist.description": "Prefissi di comandi che sono esclusi dal timeout di esecuzione dei comandi. I comandi che corrispondono a questi prefissi verranno eseguiti senza restrizioni di timeout.", + "commands.preventCompletionWithOpenTodos.description": "Impedire il completamento delle attività quando ci sono todos incompleti nella lista dei todos", "settings.vsCodeLmModelSelector.description": "Impostazioni per l'API del modello linguistico VSCode", "settings.vsCodeLmModelSelector.vendor.description": "Il fornitore del modello linguistico (es. copilot)", "settings.vsCodeLmModelSelector.family.description": "La famiglia del modello linguistico (es. gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Percorso di un file di configurazione di RooCode da importare automaticamente all'avvio dell'estensione. Supporta percorsi assoluti e percorsi relativi alla directory home (ad es. '~/Documents/roo-code-settings.json'). Lasciare vuoto per disabilitare l'importazione automatica.", "settings.useAgentRules.description": "Abilita il caricamento dei file AGENTS.md per regole specifiche dell'agente (vedi https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Tempo massimo in secondi di attesa per le risposte API (0 = nessun timeout, 1-3600s, predefinito: 600s). Valori più alti sono consigliati per provider locali come LM Studio e Ollama che potrebbero richiedere più tempo di elaborazione.", + "settings.newTaskRequireTodos.description": "Richiedere il parametro todos quando si creano nuove attività con lo strumento new_task", "settings.codeIndex.embeddingBatchSize.description": "La dimensione del batch per le operazioni di embedding durante l'indicizzazione del codice. Regola questo in base ai limiti del tuo provider API. Il valore predefinito è 60." } diff --git a/src/package.nls.ja.json b/src/package.nls.ja.json index b53b94e6ee4..3eb059cbd9a 100644 --- a/src/package.nls.ja.json +++ b/src/package.nls.ja.json @@ -26,11 +26,13 @@ "command.terminal.fixCommand.title": "このコマンドを修正", "command.terminal.explainCommand.title": "このコマンドを説明", "command.acceptInput.title": "入力/提案を承認", + "command.toggleAutoApprove.title": "自動承認を切替", "configuration.title": "Roo Code", "commands.allowedCommands.description": "'常に実行操作を承認する'が有効な場合に自動実行できるコマンド", "commands.deniedCommands.description": "承認を求めずに自動的に拒否されるコマンドプレフィックス。許可されたコマンドとの競合がある場合、最長プレフィックスマッチが優先されます。すべてのコマンドを拒否するには * を追加してください。", "commands.commandExecutionTimeout.description": "コマンド実行の完了を待つ最大時間(秒)、タイムアウトまで(0 = タイムアウトなし、1-600秒、デフォルト: 0秒)", "commands.commandTimeoutAllowlist.description": "コマンド実行タイムアウトから除外されるコマンドプレフィックス。これらのプレフィックスに一致するコマンドは、タイムアウト制限なしで実行されます。", + "commands.preventCompletionWithOpenTodos.description": "TODOリストに未完了のTODOがある場合にタスクの完了を防ぐ", "settings.vsCodeLmModelSelector.description": "VSCode 言語モデル API の設定", "settings.vsCodeLmModelSelector.vendor.description": "言語モデルのベンダー(例:copilot)", "settings.vsCodeLmModelSelector.family.description": "言語モデルのファミリー(例:gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "拡張機能の起動時に自動的にインポートするRooCode設定ファイルへのパス。絶対パスとホームディレクトリからの相対パスをサポートします(例:'~/Documents/roo-code-settings.json')。自動インポートを無効にするには、空のままにします。", "settings.useAgentRules.description": "エージェント固有のルールのためにAGENTS.mdファイルの読み込みを有効にします(参照:https://agent-rules.org/)", "settings.apiRequestTimeout.description": "API応答を待機する最大時間(秒)(0 = タイムアウトなし、1-3600秒、デフォルト: 600秒)。LM StudioやOllamaのような、より多くの処理時間を必要とする可能性のあるローカルプロバイダーには、より高い値が推奨されます。", + "settings.newTaskRequireTodos.description": "new_taskツールで新しいタスクを作成する際にtodosパラメータを必須にする", "settings.codeIndex.embeddingBatchSize.description": "コードインデックス作成中のエンベディング操作のバッチサイズ。APIプロバイダーの制限に基づいてこれを調整してください。デフォルトは60です。" } diff --git a/src/package.nls.json b/src/package.nls.json index b0b7f401f85..1db69777ac1 100644 --- a/src/package.nls.json +++ b/src/package.nls.json @@ -26,6 +26,7 @@ "command.terminal.fixCommand.title": "Fix This Command", "command.terminal.explainCommand.title": "Explain This Command", "command.acceptInput.title": "Accept Input/Suggestion", + "command.toggleAutoApprove.title": "Toggle Auto-Approve", "configuration.title": "Roo Code", "commands.allowedCommands.description": "Commands that can be auto-executed when 'Always approve execute operations' is enabled", "commands.deniedCommands.description": "Command prefixes that will be automatically denied without asking for approval. In case of conflicts with allowed commands, the longest prefix match takes precedence. Add * to deny all commands.", diff --git a/src/package.nls.ko.json b/src/package.nls.ko.json index bd03331d4ec..a566b2a038c 100644 --- a/src/package.nls.ko.json +++ b/src/package.nls.ko.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "이 명령어 수정", "command.terminal.explainCommand.title": "이 명령어 설명", "command.acceptInput.title": "입력/제안 수락", + "command.toggleAutoApprove.title": "자동 승인 전환", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "승인을 요청하지 않고 자동으로 거부될 명령어 접두사. 허용된 명령어와 충돌하는 경우 가장 긴 접두사 일치가 우선됩니다. 모든 명령어를 거부하려면 *를 추가하세요.", "commands.commandExecutionTimeout.description": "명령어 실행이 완료되기를 기다리는 최대 시간(초), 타임아웃 전까지 (0 = 타임아웃 없음, 1-600초, 기본값: 0초)", "commands.commandTimeoutAllowlist.description": "명령어 실행 타임아웃에서 제외되는 명령어 접두사. 이러한 접두사와 일치하는 명령어는 타임아웃 제한 없이 실행됩니다.", + "commands.preventCompletionWithOpenTodos.description": "할 일 목록에 미완료 할 일이 있을 때 작업 완료를 방지", "settings.vsCodeLmModelSelector.description": "VSCode 언어 모델 API 설정", "settings.vsCodeLmModelSelector.vendor.description": "언어 모델 공급자 (예: copilot)", "settings.vsCodeLmModelSelector.family.description": "언어 모델 계열 (예: gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "확장 프로그램 시작 시 자동으로 가져올 RooCode 구성 파일의 경로입니다. 절대 경로 및 홈 디렉토리에 대한 상대 경로를 지원합니다(예: '~/Documents/roo-code-settings.json'). 자동 가져오기를 비활성화하려면 비워 둡니다.", "settings.useAgentRules.description": "에이전트별 규칙에 대한 AGENTS.md 파일 로드를 활성화합니다 (참조: https://agent-rules.org/)", "settings.apiRequestTimeout.description": "API 응답을 기다리는 최대 시간(초) (0 = 시간 초과 없음, 1-3600초, 기본값: 600초). 더 많은 처리 시간이 필요할 수 있는 LM Studio 및 Ollama와 같은 로컬 공급자에게는 더 높은 값을 사용하는 것이 좋습니다.", + "settings.newTaskRequireTodos.description": "new_task 도구로 새 작업을 생성할 때 todos 매개변수 필요", "settings.codeIndex.embeddingBatchSize.description": "코드 인덱싱 중 임베딩 작업의 배치 크기입니다. API 공급자의 제한에 따라 이를 조정하세요. 기본값은 60입니다." } diff --git a/src/package.nls.nl.json b/src/package.nls.nl.json index 683a096c122..006725326b7 100644 --- a/src/package.nls.nl.json +++ b/src/package.nls.nl.json @@ -26,11 +26,13 @@ "command.terminal.fixCommand.title": "Repareer Dit Commando", "command.terminal.explainCommand.title": "Leg Dit Commando Uit", "command.acceptInput.title": "Invoer/Suggestie Accepteren", + "command.toggleAutoApprove.title": "Auto-Goedkeuring Schakelen", "configuration.title": "Roo Code", "commands.allowedCommands.description": "Commando's die automatisch kunnen worden uitgevoerd wanneer 'Altijd goedkeuren uitvoerbewerkingen' is ingeschakeld", "commands.deniedCommands.description": "Commando-prefixen die automatisch worden geweigerd zonder om goedkeuring te vragen. Bij conflicten met toegestane commando's heeft de langste prefix-match voorrang. Voeg * toe om alle commando's te weigeren.", "commands.commandExecutionTimeout.description": "Maximale tijd in seconden om te wachten tot commando-uitvoering voltooid is voordat er een timeout optreedt (0 = geen timeout, 1-600s, standaard: 0s)", "commands.commandTimeoutAllowlist.description": "Commando-prefixen die zijn uitgesloten van de commando-uitvoering timeout. Commando's die overeenkomen met deze prefixen worden uitgevoerd zonder timeout-beperkingen.", + "commands.preventCompletionWithOpenTodos.description": "Taakvoltooiing voorkomen wanneer er onvolledige todos in de todo-lijst staan", "settings.vsCodeLmModelSelector.description": "Instellingen voor VSCode Language Model API", "settings.vsCodeLmModelSelector.vendor.description": "De leverancier van het taalmodel (bijv. copilot)", "settings.vsCodeLmModelSelector.family.description": "De familie van het taalmodel (bijv. gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Pad naar een RooCode-configuratiebestand om automatisch te importeren bij het opstarten van de extensie. Ondersteunt absolute paden en paden ten opzichte van de thuismap (bijv. '~/Documents/roo-code-settings.json'). Laat leeg om automatisch importeren uit te schakelen.", "settings.useAgentRules.description": "Laden van AGENTS.md-bestanden voor agentspecifieke regels inschakelen (zie https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Maximale tijd in seconden om te wachten op API-reacties (0 = geen time-out, 1-3600s, standaard: 600s). Hogere waarden worden aanbevolen voor lokale providers zoals LM Studio en Ollama die mogelijk meer verwerkingstijd nodig hebben.", + "settings.newTaskRequireTodos.description": "Todos-parameter vereisen bij het maken van nieuwe taken met de new_task tool", "settings.codeIndex.embeddingBatchSize.description": "De batchgrootte voor embedding-operaties tijdens code-indexering. Pas dit aan op basis van de limieten van je API-provider. Standaard is 60." } diff --git a/src/package.nls.pl.json b/src/package.nls.pl.json index 76c10ddfe00..bcf80f72306 100644 --- a/src/package.nls.pl.json +++ b/src/package.nls.pl.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Napraw tę Komendę", "command.terminal.explainCommand.title": "Wyjaśnij tę Komendę", "command.acceptInput.title": "Akceptuj Wprowadzanie/Sugestię", + "command.toggleAutoApprove.title": "Przełącz Auto-Zatwierdzanie", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Prefiksy poleceń, które będą automatycznie odrzucane bez pytania o zatwierdzenie. W przypadku konfliktów z dozwolonymi poleceniami, najdłuższe dopasowanie prefiksu ma pierwszeństwo. Dodaj * aby odrzucić wszystkie polecenia.", "commands.commandExecutionTimeout.description": "Maksymalny czas w sekundach oczekiwania na zakończenie wykonania polecenia przed przekroczeniem limitu czasu (0 = brak limitu czasu, 1-600s, domyślnie: 0s)", "commands.commandTimeoutAllowlist.description": "Prefiksy poleceń, które są wykluczone z limitu czasu wykonania poleceń. Polecenia pasujące do tych prefiksów będą wykonywane bez ograniczeń czasowych.", + "commands.preventCompletionWithOpenTodos.description": "Zapobiegaj ukończeniu zadania gdy na liście zadań są niekompletne todos", "settings.vsCodeLmModelSelector.description": "Ustawienia dla API modelu językowego VSCode", "settings.vsCodeLmModelSelector.vendor.description": "Dostawca modelu językowego (np. copilot)", "settings.vsCodeLmModelSelector.family.description": "Rodzina modelu językowego (np. gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Ścieżka do pliku konfiguracyjnego RooCode, który ma być automatycznie importowany podczas uruchamiania rozszerzenia. Obsługuje ścieżki bezwzględne i ścieżki względne do katalogu domowego (np. '~/Documents/roo-code-settings.json'). Pozostaw puste, aby wyłączyć automatyczne importowanie.", "settings.useAgentRules.description": "Włącz wczytywanie plików AGENTS.md dla reguł specyficznych dla agenta (zobacz https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Maksymalny czas w sekundach oczekiwania na odpowiedzi API (0 = brak limitu czasu, 1-3600s, domyślnie: 600s). Wyższe wartości są zalecane dla lokalnych dostawców, takich jak LM Studio i Ollama, którzy mogą potrzebować więcej czasu na przetwarzanie.", + "settings.newTaskRequireTodos.description": "Wymagaj parametru todos podczas tworzenia nowych zadań za pomocą narzędzia new_task", "settings.codeIndex.embeddingBatchSize.description": "Rozmiar partii dla operacji osadzania podczas indeksowania kodu. Dostosuj to w oparciu o limity twojego dostawcy API. Domyślnie to 60." } diff --git a/src/package.nls.pt-BR.json b/src/package.nls.pt-BR.json index 85cea4d8700..1843bc476b3 100644 --- a/src/package.nls.pt-BR.json +++ b/src/package.nls.pt-BR.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Corrigir Este Comando", "command.terminal.explainCommand.title": "Explicar Este Comando", "command.acceptInput.title": "Aceitar Entrada/Sugestão", + "command.toggleAutoApprove.title": "Alternar Auto-Aprovação", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Prefixos de comandos que serão automaticamente negados sem solicitar aprovação. Em caso de conflitos com comandos permitidos, a correspondência de prefixo mais longa tem precedência. Adicione * para negar todos os comandos.", "commands.commandExecutionTimeout.description": "Tempo máximo em segundos para aguardar a conclusão da execução do comando antes do timeout (0 = sem timeout, 1-600s, padrão: 0s)", "commands.commandTimeoutAllowlist.description": "Prefixos de comandos que são excluídos do timeout de execução de comandos. Comandos que correspondem a esses prefixos serão executados sem restrições de timeout.", + "commands.preventCompletionWithOpenTodos.description": "Impedir a conclusão de tarefas quando há todos incompletos na lista de todos", "settings.vsCodeLmModelSelector.description": "Configurações para a API do modelo de linguagem do VSCode", "settings.vsCodeLmModelSelector.vendor.description": "O fornecedor do modelo de linguagem (ex: copilot)", "settings.vsCodeLmModelSelector.family.description": "A família do modelo de linguagem (ex: gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Caminho para um arquivo de configuração do RooCode para importar automaticamente na inicialização da extensão. Suporta caminhos absolutos e caminhos relativos ao diretório inicial (por exemplo, '~/Documents/roo-code-settings.json'). Deixe em branco para desativar a importação automática.", "settings.useAgentRules.description": "Habilita o carregamento de arquivos AGENTS.md para regras específicas do agente (consulte https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Tempo máximo em segundos de espera pelas respostas da API (0 = sem tempo limite, 1-3600s, padrão: 600s). Valores mais altos são recomendados para provedores locais como LM Studio e Ollama que podem precisar de mais tempo de processamento.", + "settings.newTaskRequireTodos.description": "Exigir parâmetro todos ao criar novas tarefas com a ferramenta new_task", "settings.codeIndex.embeddingBatchSize.description": "O tamanho do lote para operações de embedding durante a indexação de código. Ajuste isso com base nos limites do seu provedor de API. O padrão é 60." } diff --git a/src/package.nls.ru.json b/src/package.nls.ru.json index 83f32373a91..8a50af73894 100644 --- a/src/package.nls.ru.json +++ b/src/package.nls.ru.json @@ -26,11 +26,13 @@ "command.terminal.fixCommand.title": "Исправить эту команду", "command.terminal.explainCommand.title": "Объяснить эту команду", "command.acceptInput.title": "Принять ввод/предложение", + "command.toggleAutoApprove.title": "Переключить Авто-Подтверждение", "configuration.title": "Roo Code", "commands.allowedCommands.description": "Команды, которые могут быть автоматически выполнены, когда включена опция 'Всегда подтверждать операции выполнения'", "commands.deniedCommands.description": "Префиксы команд, которые будут автоматически отклонены без запроса подтверждения. В случае конфликтов с разрешенными командами приоритет имеет самое длинное совпадение префикса. Добавьте * чтобы отклонить все команды.", "commands.commandExecutionTimeout.description": "Максимальное время в секундах для ожидания завершения выполнения команды до истечения времени ожидания (0 = без тайм-аута, 1-600с, по умолчанию: 0с)", "commands.commandTimeoutAllowlist.description": "Префиксы команд, которые исключены из тайм-аута выполнения команд. Команды, соответствующие этим префиксам, будут выполняться без ограничений по времени.", + "commands.preventCompletionWithOpenTodos.description": "Предотвращать завершение задачи при наличии незавершенных задач в списке задач", "settings.vsCodeLmModelSelector.description": "Настройки для VSCode Language Model API", "settings.vsCodeLmModelSelector.vendor.description": "Поставщик языковой модели (например, copilot)", "settings.vsCodeLmModelSelector.family.description": "Семейство языковой модели (например, gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Путь к файлу конфигурации RooCode для автоматического импорта при запуске расширения. Поддерживает абсолютные пути и пути относительно домашнего каталога (например, '~/Documents/roo-code-settings.json'). Оставьте пустым, чтобы отключить автоматический импорт.", "settings.useAgentRules.description": "Включить загрузку файлов AGENTS.md для специфичных для агента правил (см. https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Максимальное время в секундах для ожидания ответов API (0 = нет тайм-аута, 1-3600 с, по умолчанию: 600 с). Рекомендуются более высокие значения для локальных провайдеров, таких как LM Studio и Ollama, которым может потребоваться больше времени на обработку.", + "settings.newTaskRequireTodos.description": "Требовать параметр todos при создании новых задач с помощью инструмента new_task", "settings.codeIndex.embeddingBatchSize.description": "Размер пакета для операций встраивания во время индексации кода. Настройте это в соответствии с ограничениями вашего API-провайдера. По умолчанию 60." } diff --git a/src/package.nls.tr.json b/src/package.nls.tr.json index faf520c0d26..4eec2c70a02 100644 --- a/src/package.nls.tr.json +++ b/src/package.nls.tr.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Bu Komutu Düzelt", "command.terminal.explainCommand.title": "Bu Komutu Açıkla", "command.acceptInput.title": "Girişi/Öneriyi Kabul Et", + "command.toggleAutoApprove.title": "Otomatik Onayı Değiştir", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Onay istenmeden otomatik olarak reddedilecek komut önekleri. İzin verilen komutlarla çakışma durumunda en uzun önek eşleşmesi öncelik alır. Tüm komutları reddetmek için * ekleyin.", "commands.commandExecutionTimeout.description": "Komut yürütmesinin tamamlanmasını beklemek için maksimum süre (saniye), zaman aşımından önce (0 = zaman aşımı yok, 1-600s, varsayılan: 0s)", "commands.commandTimeoutAllowlist.description": "Komut yürütme zaman aşımından hariç tutulan komut önekleri. Bu öneklerle eşleşen komutlar zaman aşımı kısıtlamaları olmadan çalışacaktır.", + "commands.preventCompletionWithOpenTodos.description": "Todo listesinde tamamlanmamış todolar olduğunda görev tamamlanmasını engelle", "settings.vsCodeLmModelSelector.description": "VSCode dil modeli API'si için ayarlar", "settings.vsCodeLmModelSelector.vendor.description": "Dil modelinin sağlayıcısı (örn: copilot)", "settings.vsCodeLmModelSelector.family.description": "Dil modelinin ailesi (örn: gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Uzantı başlangıcında otomatik olarak içe aktarılacak bir RooCode yapılandırma dosyasının yolu. Mutlak yolları ve ana dizine göreli yolları destekler (ör. '~/Documents/roo-code-settings.json'). Otomatik içe aktarmayı devre dışı bırakmak için boş bırakın.", "settings.useAgentRules.description": "Aracıya özgü kurallar için AGENTS.md dosyalarının yüklenmesini etkinleştirin (bkz. https://agent-rules.org/)", "settings.apiRequestTimeout.description": "API yanıtları için beklenecek maksimum süre (saniye cinsinden) (0 = zaman aşımı yok, 1-3600s, varsayılan: 600s). LM Studio ve Ollama gibi daha fazla işlem süresi gerektirebilecek yerel sağlayıcılar için daha yüksek değerler önerilir.", + "settings.newTaskRequireTodos.description": "new_task aracıyla yeni görevler oluştururken todos parametresini gerekli kıl", "settings.codeIndex.embeddingBatchSize.description": "Kod indeksleme sırasında gömme işlemleri için toplu iş boyutu. Bunu API sağlayıcınızın sınırlarına göre ayarlayın. Varsayılan 60'tır." } diff --git a/src/package.nls.vi.json b/src/package.nls.vi.json index 672707a111e..a0c9614dd2f 100644 --- a/src/package.nls.vi.json +++ b/src/package.nls.vi.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "Sửa Lệnh Này", "command.terminal.explainCommand.title": "Giải Thích Lệnh Này", "command.acceptInput.title": "Chấp Nhận Đầu Vào/Gợi Ý", + "command.toggleAutoApprove.title": "Bật/Tắt Tự Động Phê Duyệt", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "Các tiền tố lệnh sẽ được tự động từ chối mà không yêu cầu phê duyệt. Trong trường hợp xung đột với các lệnh được phép, việc khớp tiền tố dài nhất sẽ được ưu tiên. Thêm * để từ chối tất cả các lệnh.", "commands.commandExecutionTimeout.description": "Thời gian tối đa tính bằng giây để chờ việc thực thi lệnh hoàn thành trước khi hết thời gian chờ (0 = không có thời gian chờ, 1-600s, mặc định: 0s)", "commands.commandTimeoutAllowlist.description": "Các tiền tố lệnh được loại trừ khỏi thời gian chờ thực thi lệnh. Các lệnh khớp với những tiền tố này sẽ chạy mà không có giới hạn thời gian chờ.", + "commands.preventCompletionWithOpenTodos.description": "Ngăn hoàn thành nhiệm vụ khi có các todos chưa hoàn thành trong danh sách todos", "settings.vsCodeLmModelSelector.description": "Cài đặt cho API mô hình ngôn ngữ VSCode", "settings.vsCodeLmModelSelector.vendor.description": "Nhà cung cấp mô hình ngôn ngữ (ví dụ: copilot)", "settings.vsCodeLmModelSelector.family.description": "Họ mô hình ngôn ngữ (ví dụ: gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "Đường dẫn đến tệp cấu hình RooCode để tự động nhập khi khởi động tiện ích mở rộng. Hỗ trợ đường dẫn tuyệt đối và đường dẫn tương đối đến thư mục chính (ví dụ: '~/Documents/roo-code-settings.json'). Để trống để tắt tính năng tự động nhập.", "settings.useAgentRules.description": "Bật tải tệp AGENTS.md cho các quy tắc dành riêng cho tác nhân (xem https://agent-rules.org/)", "settings.apiRequestTimeout.description": "Thời gian tối đa tính bằng giây để đợi phản hồi API (0 = không có thời gian chờ, 1-3600 giây, mặc định: 600 giây). Nên sử dụng các giá trị cao hơn cho các nhà cung cấp cục bộ như LM Studio và Ollama có thể cần thêm thời gian xử lý.", + "settings.newTaskRequireTodos.description": "Yêu cầu tham số todos khi tạo nhiệm vụ mới với công cụ new_task", "settings.codeIndex.embeddingBatchSize.description": "Kích thước lô cho các hoạt động nhúng trong quá trình lập chỉ mục mã. Điều chỉnh điều này dựa trên giới hạn của nhà cung cấp API của bạn. Mặc định là 60." } diff --git a/src/package.nls.zh-CN.json b/src/package.nls.zh-CN.json index 94d0ed6c747..caab1a633d7 100644 --- a/src/package.nls.zh-CN.json +++ b/src/package.nls.zh-CN.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "修复此命令", "command.terminal.explainCommand.title": "解释此命令", "command.acceptInput.title": "接受输入/建议", + "command.toggleAutoApprove.title": "切换自动批准", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "将自动拒绝而无需请求批准的命令前缀。与允许命令冲突时,最长前缀匹配优先。添加 * 拒绝所有命令。", "commands.commandExecutionTimeout.description": "等待命令执行完成的最大时间(秒),超时前(0 = 无超时,1-600秒,默认:0秒)", "commands.commandTimeoutAllowlist.description": "从命令执行超时中排除的命令前缀。匹配这些前缀的命令将在没有超时限制的情况下运行。", + "commands.preventCompletionWithOpenTodos.description": "当待办事项列表中有未完成的待办事项时阻止任务完成", "settings.vsCodeLmModelSelector.description": "VSCode 语言模型 API 的设置", "settings.vsCodeLmModelSelector.vendor.description": "语言模型的供应商(例如:copilot)", "settings.vsCodeLmModelSelector.family.description": "语言模型的系列(例如:gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "RooCode 配置文件的路径,用于在扩展启动时自动导入。支持绝对路径和相对于主目录的路径(例如 '~/Documents/roo-code-settings.json')。留空以禁用自动导入。", "settings.useAgentRules.description": "为特定于代理的规则启用 AGENTS.md 文件的加载(请参阅 https://agent-rules.org/)", "settings.apiRequestTimeout.description": "等待 API 响应的最长时间(秒)(0 = 无超时,1-3600秒,默认值:600秒)。对于像 LM Studio 和 Ollama 这样可能需要更多处理时间的本地提供商,建议使用更高的值。", + "settings.newTaskRequireTodos.description": "使用 new_task 工具创建新任务时需要 todos 参数", "settings.codeIndex.embeddingBatchSize.description": "代码索引期间嵌入操作的批处理大小。根据 API 提供商的限制调整此设置。默认值为 60。" } diff --git a/src/package.nls.zh-TW.json b/src/package.nls.zh-TW.json index b4fd9e3cc7c..8ad1011bb48 100644 --- a/src/package.nls.zh-TW.json +++ b/src/package.nls.zh-TW.json @@ -14,6 +14,7 @@ "command.terminal.fixCommand.title": "修復此命令", "command.terminal.explainCommand.title": "解釋此命令", "command.acceptInput.title": "接受輸入/建議", + "command.toggleAutoApprove.title": "切換自動批准", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", @@ -31,6 +32,7 @@ "commands.deniedCommands.description": "將自動拒絕而無需請求批准的命令前綴。與允許命令衝突時,最長前綴匹配優先。新增 * 拒絕所有命令。", "commands.commandExecutionTimeout.description": "等待命令執行完成的最大時間(秒),逾時前(0 = 無逾時,1-600秒,預設:0秒)", "commands.commandTimeoutAllowlist.description": "從命令執行逾時中排除的命令前綴。符合這些前綴的命令將在沒有逾時限制的情況下執行。", + "commands.preventCompletionWithOpenTodos.description": "當待辦事項清單中有未完成的待辦事項時阻止工作完成", "settings.vsCodeLmModelSelector.description": "VSCode 語言模型 API 的設定", "settings.vsCodeLmModelSelector.vendor.description": "語言模型供應商(例如:copilot)", "settings.vsCodeLmModelSelector.family.description": "語言模型系列(例如:gpt-4)", @@ -39,5 +41,6 @@ "settings.autoImportSettingsPath.description": "RooCode 設定檔案的路徑,用於在擴充功能啟動時自動匯入。支援絕對路徑和相對於主目錄的路徑(例如 '~/Documents/roo-code-settings.json')。留空以停用自動匯入。", "settings.useAgentRules.description": "為特定於代理的規則啟用 AGENTS.md 檔案的載入(請參閱 https://agent-rules.org/)", "settings.apiRequestTimeout.description": "等待 API 回應的最長時間(秒)(0 = 無超時,1-3600秒,預設值:600秒)。對於像 LM Studio 和 Ollama 這樣可能需要更多處理時間的本地提供商,建議使用更高的值。", + "settings.newTaskRequireTodos.description": "使用 new_task 工具建立新工作時需要 todos 參數", "settings.codeIndex.embeddingBatchSize.description": "程式碼索引期間嵌入操作的批次大小。根據 API 提供商的限制調整此設定。預設值為 60。" } diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index aaddc520cb9..66f389f81c1 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -10,6 +10,7 @@ import type { MarketplaceItem, TodoItem, CloudUserInfo, + CloudOrganizationMembership, OrganizationAllowList, ShareVisibility, QueuedMessage, @@ -124,6 +125,7 @@ export interface ExtensionMessage { | "commands" | "insertTextIntoTextarea" | "dismissedUpsells" + | "organizationSwitchResult" text?: string payload?: any // Add a generic payload for now, can refine later action?: @@ -137,6 +139,7 @@ export interface ExtensionMessage { | "didBecomeVisible" | "focusInput" | "switchTab" + | "toggleAutoApprove" invoke?: "newChat" | "sendMessage" | "primaryButtonClick" | "secondaryButtonClick" | "setChatBoxMessage" state?: ExtensionState images?: string[] @@ -201,6 +204,7 @@ export interface ExtensionMessage { commands?: Command[] queuedMessages?: QueuedMessage[] list?: string[] // For dismissedUpsells + organizationId?: string | null // For organizationSwitchResult } export type ExtensionState = Pick< @@ -283,6 +287,7 @@ export type ExtensionState = Pick< | "maxDiagnosticMessages" | "openRouterImageGenerationSelectedModel" | "includeTaskHistoryInEnhance" + | "reasoningBlockCollapsed" > & { version: string clineMessages: ClineMessage[] @@ -326,6 +331,7 @@ export type ExtensionState = Pick< cloudUserInfo: CloudUserInfo | null cloudIsAuthenticated: boolean cloudApiUrl?: string + cloudOrganizations?: CloudOrganizationMembership[] sharingEnabled: boolean organizationAllowList: OrganizationAllowList organizationSettingsVersion?: number diff --git a/src/shared/ProfileValidator.ts b/src/shared/ProfileValidator.ts index 78ff6ed9fe1..c76b12d47bf 100644 --- a/src/shared/ProfileValidator.ts +++ b/src/shared/ProfileValidator.ts @@ -59,6 +59,7 @@ export class ProfileValidator { return profile.openAiModelId case "anthropic": case "openai-native": + case "openai-native-codex": case "bedrock": case "vertex": case "gemini": diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 93d0b9bc452..d43a2fce043 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -102,6 +102,7 @@ export interface WebviewMessage { | "browserViewportSize" | "screenshotQuality" | "remoteBrowserHost" + | "openKeyboardShortcuts" | "openMcpSettings" | "openProjectMcpSettings" | "restartMcpServer" @@ -180,8 +181,10 @@ export interface WebviewMessage { | "hasOpenedModeSelector" | "cloudButtonClicked" | "rooCloudSignIn" + | "cloudLandingPageSignIn" | "rooCloudSignOut" | "rooCloudManualUrl" + | "switchOrganization" | "condenseTaskContextRequest" | "requestIndexingStatus" | "startIndexing" @@ -191,6 +194,7 @@ export interface WebviewMessage { | "focusPanelRequest" | "profileThresholds" | "setHistoryPreviewCollapsed" + | "setReasoningBlockCollapsed" | "openExternal" | "filterMarketplaceItems" | "marketplaceButtonClicked" @@ -272,6 +276,7 @@ export interface WebviewMessage { checkOnly?: boolean // For deleteCustomMode check upsellId?: string // For dismissUpsell list?: string[] // For dismissedUpsells response + organizationId?: string | null // For organization switching codeIndexSettings?: { // Global state settings codebaseIndexEnabled: boolean diff --git a/src/shared/__tests__/ProfileValidator.spec.ts b/src/shared/__tests__/ProfileValidator.spec.ts index 5cfe7a720bf..84df41ac552 100644 --- a/src/shared/__tests__/ProfileValidator.spec.ts +++ b/src/shared/__tests__/ProfileValidator.spec.ts @@ -184,6 +184,7 @@ describe("ProfileValidator", () => { const apiModelProviders = [ "anthropic", "openai-native", + "openai-native-codex", "bedrock", "vertex", "gemini", diff --git a/src/shared/__tests__/checkExistApiConfig.spec.ts b/src/shared/__tests__/checkExistApiConfig.spec.ts index 7696f00cc0c..05ac8081b0b 100644 --- a/src/shared/__tests__/checkExistApiConfig.spec.ts +++ b/src/shared/__tests__/checkExistApiConfig.spec.ts @@ -61,4 +61,11 @@ describe("checkExistKey", () => { } expect(checkExistKey(config)).toBe(false) }) + + it("should treat openai-native-codex as configured even without oauth path", () => { + const config: ProviderSettings = { + apiProvider: "openai-native-codex", + } + expect(checkExistKey(config)).toBe(true) + }) }) diff --git a/src/shared/api.ts b/src/shared/api.ts index 13b66611193..79001cb0ad0 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -18,6 +18,12 @@ export type ApiHandlerOptions = Omit & { * Defaults to true; set to false to disable summaries. */ enableGpt5ReasoningSummary?: boolean + /** + * Optional override for Ollama's num_ctx parameter. + * When set, this value will be used in Ollama chat requests. + * When undefined, Ollama will use the model's default num_ctx from the Modelfile. + */ + ollamaNumCtx?: number } // RouterName diff --git a/src/shared/checkExistApiConfig.ts b/src/shared/checkExistApiConfig.ts index 4b9af08d5af..99f1c7261a5 100644 --- a/src/shared/checkExistApiConfig.ts +++ b/src/shared/checkExistApiConfig.ts @@ -8,7 +8,9 @@ export function checkExistKey(config: ProviderSettings | undefined) { // Special case for human-relay, fake-ai, claude-code, qwen-code, and roo providers which don't need any configuration. if ( config.apiProvider && - ["human-relay", "fake-ai", "claude-code", "qwen-code", "roo"].includes(config.apiProvider) + ["human-relay", "fake-ai", "claude-code", "qwen-code", "roo", "openai-native-codex"].includes( + config.apiProvider, + ) ) { return true } @@ -25,6 +27,7 @@ export function checkExistKey(config: ProviderSettings | undefined) { config.ollamaModelId, config.lmStudioModelId, config.vsCodeLmModelSelector, + config.openAiNativeCodexOauthPath, ].some((value) => value !== undefined) return hasSecretKey || hasOtherConfig diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index fa38a566e74..220c8cf3af2 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -76,6 +76,7 @@ const App = () => { cloudUserInfo, cloudIsAuthenticated, cloudApiUrl, + cloudOrganizations, renderContext, mdmCompliant, } = useExtensionState() @@ -267,6 +268,7 @@ const App = () => { userInfo={cloudUserInfo} isAuthenticated={cloudIsAuthenticated} cloudApiUrl={cloudApiUrl} + organizations={cloudOrganizations} onDone={() => switchTab("chat")} /> )} diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index 8c52c41e42f..cfe41340bc9 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -6,12 +6,9 @@ import { Package } from "@roo/package" import { useAppTranslation } from "@src/i18n/TranslationContext" import { useExtensionState } from "@src/context/ExtensionStateContext" import { vscode } from "@src/utils/vscode" -import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@src/components/ui" +import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@src/components/ui" import { Button } from "@src/components/ui" -// Define the production URL constant locally to avoid importing from cloud package in webview -const PRODUCTION_ROO_CODE_API_URL = "https://app.roocode.com" - interface AnnouncementProps { hideAnnouncement: () => void } @@ -28,8 +25,7 @@ interface AnnouncementProps { const Announcement = ({ hideAnnouncement }: AnnouncementProps) => { const { t } = useAppTranslation() const [open, setOpen] = useState(true) - const { cloudApiUrl } = useExtensionState() - const cloudUrl = cloudApiUrl || PRODUCTION_ROO_CODE_API_URL + const { cloudIsAuthenticated } = useExtensionState() return ( { {t("chat:announcement.title", { version: Package.version })} - - , - }} - /> -
    -
      -
    • - •{" "} - , - }} - /> -
    • -
    • - •{" "} - , - }} - /> -
    • -
    - -
    +
    { - e.preventDefault() - window.postMessage( - { - type: "action", - action: "openExternal", - data: { - url: "https://docs.roocode.com/update-notes/v3.28.0#task-sync--roomote-control", - }, - }, - "*", - ) - }} - /> - ), + bold: , }} />
    +

    + {t("chat:announcement.stealthModel.note")} +

    +
    - + {!cloudIsAuthenticated ? ( + + ) : ( + <> +

    + , + }} + /> +

    + + + )}
    @@ -132,7 +114,7 @@ const XLink = () => ( href="https://x.com/roo_code" onClick={(e) => { e.preventDefault() - window.postMessage({ type: "action", action: "openExternal", data: { url: "https://x.com/roo_code" } }, "*") + vscode.postMessage({ type: "openExternal", url: "https://x.com/roo_code" }) }}> X @@ -143,10 +125,7 @@ const DiscordLink = () => ( href="https://discord.gg/rCQcvT7Fnt" onClick={(e) => { e.preventDefault() - window.postMessage( - { type: "action", action: "openExternal", data: { url: "https://discord.gg/rCQcvT7Fnt" } }, - "*", - ) + vscode.postMessage({ type: "openExternal", url: "https://discord.gg/rCQcvT7Fnt" }) }}> Discord @@ -157,10 +136,7 @@ const RedditLink = () => ( href="https://www.reddit.com/r/RooCode/" onClick={(e) => { e.preventDefault() - window.postMessage( - { type: "action", action: "openExternal", data: { url: "https://www.reddit.com/r/RooCode/" } }, - "*", - ) + vscode.postMessage({ type: "openExternal", url: "https://www.reddit.com/r/RooCode/" }) }}> r/RooCode diff --git a/webview-ui/src/components/chat/BrowserSessionRow.tsx b/webview-ui/src/components/chat/BrowserSessionRow.tsx index cdb15315dd4..c23b79f568a 100644 --- a/webview-ui/src/components/chat/BrowserSessionRow.tsx +++ b/webview-ui/src/components/chat/BrowserSessionRow.tsx @@ -14,6 +14,7 @@ import { useExtensionState } from "@src/context/ExtensionStateContext" import CodeBlock, { CODE_BLOCK_BG_COLOR } from "../common/CodeBlock" import { ChatRowContent } from "./ChatRow" import { ProgressIndicator } from "./ProgressIndicator" +import { Globe, Pointer, SquareTerminal } from "lucide-react" interface BrowserSessionRowProps { messages: ClineMessage[] @@ -237,51 +238,42 @@ const BrowserSessionRow = memo((props: BrowserSessionRowProps) => { const [browserSessionRow, { height: rowHeight }] = useSize(
    - {isBrowsing ? ( - - ) : ( - - )} + {isBrowsing ? : } <>{t("chat:browser.rooWantsToUse")}
    {/* URL Bar */}
    + {displayState.url || "http"}
    @@ -289,6 +281,7 @@ const BrowserSessionRow = memo((props: BrowserSessionRowProps) => { {/* Screenshot Area */}
    { )}
    -
    -
    { - setConsoleLogsExpanded(!consoleLogsExpanded) - }} - style={{ - display: "flex", - alignItems: "center", - gap: "4px", - width: "100%", - justifyContent: "flex-start", - cursor: "pointer", - padding: `9px 8px ${consoleLogsExpanded ? 0 : 8}px 8px`, - }}> - - {t("chat:browser.consoleLogs")} -
    - {consoleLogsExpanded && ( - - )} + {/* Console Logs Accordion */} +
    { + setConsoleLogsExpanded(!consoleLogsExpanded) + }} + className="flex items-center justify-between gap-2 text-vscode-editor-foreground/50 hover:text-vscode-editor-foreground transition-colors" + style={{ + width: "100%", + cursor: "pointer", + padding: `9px 10px ${consoleLogsExpanded ? 0 : 8}px 10px`, + }}> + + {t("chat:browser.consoleLogs")} +
    + {consoleLogsExpanded && ( + + )}
    {/* Action content with min height */} diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 23ec50af37d..f1dfd9115b6 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -2,7 +2,7 @@ import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from " import { useSize } from "react-use" import { useTranslation, Trans } from "react-i18next" import deepEqual from "fast-deep-equal" -import { VSCodeBadge, VSCodeButton } from "@vscode/webview-ui-toolkit/react" +import { VSCodeBadge } from "@vscode/webview-ui-toolkit/react" import type { ClineMessage, FollowUpData, SuggestionItem } from "@roo-code/types" import { Mode } from "@roo/modes" @@ -11,22 +11,20 @@ import { ClineApiReqInfo, ClineAskUseMcpServer, ClineSayTool } from "@roo/Extens import { COMMAND_OUTPUT_STRING } from "@roo/combineCommandSequences" import { safeJsonParse } from "@roo/safeJsonParse" -import { useCopyToClipboard } from "@src/utils/clipboard" import { useExtensionState } from "@src/context/ExtensionStateContext" import { findMatchingResourceOrTemplate } from "@src/utils/mcp" import { vscode } from "@src/utils/vscode" import { removeLeadingNonAlphanumeric } from "@src/utils/removeLeadingNonAlphanumeric" import { getLanguageFromPath } from "@src/utils/getLanguageFromPath" -import { Button } from "@src/components/ui" import { ToolUseBlock, ToolUseBlockHeader } from "../common/ToolUseBlock" import UpdateTodoListToolBlock from "./UpdateTodoListToolBlock" import CodeAccordian from "../common/CodeAccordian" -import CodeBlock from "../common/CodeBlock" import MarkdownBlock from "../common/MarkdownBlock" import { ReasoningBlock } from "./ReasoningBlock" import Thumbnails from "../common/Thumbnails" import ImageBlock from "../common/ImageBlock" +import ErrorRow from "./ErrorRow" import McpResourceRow from "../mcp/McpResourceRow" @@ -47,6 +45,24 @@ import { McpExecution } from "./McpExecution" import { ChatTextArea } from "./ChatTextArea" import { MAX_IMAGES_PER_MESSAGE } from "./ChatView" import { useSelectedModel } from "../ui/hooks/useSelectedModel" +import { + ChevronRight, + ChevronDown, + Eye, + FileDiff, + ListTree, + User, + Edit, + Trash2, + MessageCircleQuestionMark, + SquareArrowOutUpRight, + FileCode2, + PocketKnife, + FolderTree, + TerminalSquare, + MessageCircle, +} from "lucide-react" +import { cn } from "@/lib/utils" interface ChatRowProps { message: ClineMessage @@ -118,13 +134,10 @@ export const ChatRowContent = ({ const { mcpServers, alwaysAllowMcp, currentCheckpoint, mode, apiConfiguration } = useExtensionState() const { info: model } = useSelectedModel(apiConfiguration) - const [isDiffErrorExpanded, setIsDiffErrorExpanded] = useState(false) - const [showCopySuccess, setShowCopySuccess] = useState(false) const [isEditing, setIsEditing] = useState(false) const [editedContent, setEditedContent] = useState("") const [editMode, setEditMode] = useState(mode || "code") const [editImages, setEditImages] = useState([]) - const { copyWithFeedback } = useCopyToClipboard() // Handle message events for image selection during edit mode useEffect(() => { @@ -211,29 +224,18 @@ export const ChatRowContent = ({ const [icon, title] = useMemo(() => { switch (type) { case "error": - return [ - , - {t("chat:error")}, - ] case "mistake_limit_reached": - return [ - , - {t("chat:troubleMessage")}, - ] + return [null, null] // These will be handled by ErrorRow component case "command": return [ isCommandExecuting ? ( ) : ( - + ), - {t("chat:runCommand.title")}:, + + {t("chat:commandExecution.running")} + , ] case "use_mcp_server": const mcpServerUse = safeJsonParse(message.text) @@ -287,7 +289,11 @@ export const ChatRowContent = ({ getIconSpan("error", errorColor) ) ) : cost !== null && cost !== undefined ? ( - getIconSpan("check", successColor) + isExpanded ? ( + + ) : ( + + ) ) : apiRequestFailedMessage ? ( getIconSpan("error", errorColor) ) : ( @@ -304,25 +310,32 @@ export const ChatRowContent = ({ ) ) : cost !== null && cost !== undefined ? ( - {t("chat:apiRequest.title")} + {t("chat:apiRequest.title")} ) : apiRequestFailedMessage ? ( - {t("chat:apiRequest.failed")} + {t("chat:apiRequest.failed")} ) : ( - {t("chat:apiRequest.streaming")} + {t("chat:apiRequest.streaming")} ), ] case "followup": return [ - , + , {t("chat:questions.hasQuestion")}, ] default: return [null, null] } - }, [type, isCommandExecuting, message, isMcpServerResponding, apiReqCancelReason, cost, apiRequestFailedMessage, t]) + }, [ + type, + isCommandExecuting, + message, + isMcpServerResponding, + apiReqCancelReason, + cost, + apiRequestFailedMessage, + t, + isExpanded, + ]) const headerStyle: React.CSSProperties = { display: "flex", @@ -332,13 +345,6 @@ export const ChatRowContent = ({ wordBreak: "break-word", } - const pStyle: React.CSSProperties = { - margin: 0, - whiteSpace: "pre-wrap", - wordBreak: "break-word", - overflowWrap: "anywhere", - } - const tool = useMemo( () => (message.ask === "tool" ? safeJsonParse(message.text) : null), [message.ask, message.text], @@ -366,7 +372,7 @@ export const ChatRowContent = ({ return ( <>
    - {toolIcon("diff")} + {t("chat:fileOperations.wantsToApplyBatchChanges")} @@ -396,15 +402,17 @@ export const ChatRowContent = ({ : t("chat:fileOperations.wantsToEdit")}
    - +
    + +
    ) case "insertContent": @@ -431,15 +439,17 @@ export const ChatRowContent = ({ })}
    - +
    + +
    ) case "searchAndReplace": @@ -462,15 +472,17 @@ export const ChatRowContent = ({ : t("chat:fileOperations.didSearchReplace")}
    - +
    + +
    ) case "codebaseSearch": { @@ -528,15 +540,17 @@ export const ChatRowContent = ({ : t("chat:fileOperations.wantsToCreate")}
    - vscode.postMessage({ type: "openFile", text: "./" + tool.path })} - /> +
    + vscode.postMessage({ type: "openFile", text: "./" + tool.path })} + /> +
    ) case "readFile": @@ -547,7 +561,7 @@ export const ChatRowContent = ({ return ( <>
    - {toolIcon("files")} + {t("chat:fileOperations.wantsToReadMultiple")} @@ -567,7 +581,7 @@ export const ChatRowContent = ({ return ( <>
    - {toolIcon("file-code")} + {message.type === "ask" ? tool.isOutsideWorkspace @@ -580,21 +594,24 @@ export const ChatRowContent = ({ : t("chat:fileOperations.didRead")}
    - - vscode.postMessage({ type: "openFile", text: tool.content })}> - {tool.path?.startsWith(".") && .} - - {removeLeadingNonAlphanumeric(tool.path ?? "") + "\u200E"} - {tool.reason} - -
    - -
    -
    +
    + + vscode.postMessage({ type: "openFile", text: tool.content })}> + {tool.path?.startsWith(".") && .} + + {removeLeadingNonAlphanumeric(tool.path ?? "") + "\u200E"} + {tool.reason} + +
    + +
    +
    +
    ) case "fetchInstructions": @@ -604,20 +621,22 @@ export const ChatRowContent = ({ {toolIcon("file-code")} {t("chat:instructions.wantsToFetch")}
    - +
    + +
    ) case "listFilesTopLevel": return ( <>
    - {toolIcon("folder-opened")} + {message.type === "ask" ? tool.isOutsideWorkspace @@ -628,20 +647,22 @@ export const ChatRowContent = ({ : t("chat:directoryOperations.didViewTopLevel")}
    - +
    + +
    ) case "listFilesRecursive": return ( <>
    - {toolIcon("folder-opened")} + {message.type === "ask" ? tool.isOutsideWorkspace @@ -652,13 +673,15 @@ export const ChatRowContent = ({ : t("chat:directoryOperations.didViewRecursive")}
    - +
    + +
    ) case "listCodeDefinitionNames": @@ -676,13 +699,15 @@ export const ChatRowContent = ({ : t("chat:directoryOperations.didViewDefinitions")}
    - +
    + +
    ) case "searchFiles": @@ -698,7 +723,7 @@ export const ChatRowContent = ({ ? "chat:directoryOperations.wantsToSearchOutsideWorkspace" : "chat:directoryOperations.wantsToSearch" } - components={{ code: {tool.regex} }} + components={{ code: {tool.regex} }} values={{ regex: tool.regex }} /> ) : ( @@ -708,39 +733,41 @@ export const ChatRowContent = ({ ? "chat:directoryOperations.didSearchOutsideWorkspace" : "chat:directoryOperations.didSearch" } - components={{ code: {tool.regex} }} + components={{ code: {tool.regex} }} values={{ regex: tool.regex }} /> )}
    - +
    + +
    ) case "switchMode": return ( <>
    - {toolIcon("symbol-enum")} + {message.type === "ask" ? ( <> {tool.reason ? ( {tool.mode} }} + components={{ code: {tool.mode} }} values={{ mode: tool.mode, reason: tool.reason }} /> ) : ( {tool.mode} }} + components={{ code: {tool.mode} }} values={{ mode: tool.mode }} /> )} @@ -750,13 +777,13 @@ export const ChatRowContent = ({ {tool.reason ? ( {tool.mode} }} + components={{ code: {tool.mode} }} values={{ mode: tool.mode, reason: tool.reason }} /> ) : ( {tool.mode} }} + components={{ code: {tool.mode} }} values={{ mode: tool.mode }} /> )} @@ -869,6 +896,7 @@ export const ChatRowContent = ({ }} onClick={handleToggleExpand}> )}
    - + {isExpanded && (slashCommandInfo.args || slashCommandInfo.description) && (
    {message.type === "ask" && ( - +
    + +
    )} ) @@ -958,92 +989,12 @@ export const ChatRowContent = ({ switch (message.say) { case "diff_error": return ( -
    -
    -
    setIsDiffErrorExpanded(!isDiffErrorExpanded)}> -
    - - {t("chat:diffError.title")} -
    -
    - { - e.stopPropagation() - - // Call copyWithFeedback and handle the Promise - copyWithFeedback(message.text || "").then((success) => { - if (success) { - // Show checkmark - setShowCopySuccess(true) - - // Reset after a brief delay - setTimeout(() => { - setShowCopySuccess(false) - }, 1000) - } - }) - }}> - - - -
    -
    - {isDiffErrorExpanded && ( -
    - -
    - )} -
    -
    + ) case "subtask_result": return ( @@ -1093,9 +1044,16 @@ export const ChatRowContent = ({ /> ) case "api_req_started": + // Determine if the API request is in progress + const isApiRequestInProgress = + apiReqCancelReason === undefined && apiRequestFailedMessage === undefined && cost === undefined + return ( <>
    {icon} {title} - 0 ? 1 : 0 }}> - ${Number(cost || 0)?.toFixed(4)} -
    - +
    0 ? 1 : 0 }}> + ${Number(cost || 0)?.toFixed(4)} +
    {(((cost === null || cost === undefined) && apiRequestFailedMessage) || apiReqStreamingFailedMessage) && ( - <> -

    - {apiRequestFailedMessage || apiReqStreamingFailedMessage} - {apiRequestFailedMessage?.toLowerCase().includes("powershell") && ( +

    @@ -1138,13 +1097,13 @@ export const ChatRowContent = ({ . - )} -

    - + ) : undefined + } + /> )} {isExpanded && ( -
    +
    (message.text)?.request} language="markdown" @@ -1160,82 +1119,95 @@ export const ChatRowContent = ({ case "text": return (
    - - {message.images && message.images.length > 0 && ( -
    - {message.images.map((image, index) => ( - - ))} -
    - )} +
    + + {t("chat:text.rooSaid")} +
    +
    + + {message.images && message.images.length > 0 && ( +
    + {message.images.map((image, index) => ( + + ))} +
    + )} +
    ) case "user_feedback": return ( -
    - {isEditing ? ( -
    - -
    - ) : ( -
    -
    { - e.stopPropagation() - if (!isStreaming) { - handleEditClick() - } - }} - title={t("chat:queuedMessages.clickToEdit")}> - +
    +
    + + {t("chat:feedback.youSaid")} +
    +
    + {isEditing ? ( +
    +
    -
    - - + if (!isStreaming) { + handleEditClick() + } + }} + title={t("chat:queuedMessages.clickToEdit")}> + +
    +
    +
    { + e.stopPropagation() + handleEditClick() + }}> + +
    +
    { + e.stopPropagation() + vscode.postMessage({ type: "deleteMessage", value: message.ts }) + }}> + +
    +
    -
    - )} - {!isEditing && message.images && message.images.length > 0 && ( - - )} + )} + {!isEditing && message.images && message.images.length > 0 && ( + + )} +
    ) case "user_feedback_diff": @@ -1252,17 +1224,7 @@ export const ChatRowContent = ({
    ) case "error": - return ( - <> - {title && ( -
    - {icon} - {title} -
    - )} -

    {message.text}

    - - ) + return case "completion_result": return ( <> @@ -1270,7 +1232,7 @@ export const ChatRowContent = ({ {icon} {title}
    -
    +
    @@ -1344,55 +1306,60 @@ export const ChatRowContent = ({ }}> {t("chat:slashCommand.didRun")}
    - - -
    + + - - /{slashCommandInfo.command} - - {slashCommandInfo.args && ( +
    - {slashCommandInfo.args} + /{slashCommandInfo.command} - )} -
    - {slashCommandInfo.description && ( -
    - {slashCommandInfo.description} + {slashCommandInfo.args && ( + + {slashCommandInfo.args} + + )}
    - )} - {slashCommandInfo.source && ( -
    - - {slashCommandInfo.source} - -
    - )} -
    -
    + {slashCommandInfo.description && ( +
    + {slashCommandInfo.description} +
    + )} + {slashCommandInfo.source && ( +
    + + {slashCommandInfo.source} + +
    + )} + + +
    ) } @@ -1428,15 +1395,7 @@ export const ChatRowContent = ({ case "ask": switch (message.ask) { case "mistake_limit_reached": - return ( - <> -
    - {icon} - {title} -
    -

    {message.text}

    - - ) + return case "command": return ( )} -
    +
    +
    - ) case "auto_approval_max_req_reached": { diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index fb105056b55..993912f240e 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -31,6 +31,7 @@ import { MAX_IMAGES_PER_MESSAGE } from "./ChatView" import ContextMenu from "./ContextMenu" import { IndexingStatusBadge } from "./IndexingStatusBadge" import { usePromptHistory } from "./hooks/usePromptHistory" +import { CloudAccountSwitcher } from "../cloud/CloudAccountSwitcher" interface ChatTextAreaProps { inputValue: string @@ -87,6 +88,7 @@ export const ChatTextArea = forwardRef( taskHistory, clineMessages, commands, + cloudUserInfo, } = useExtensionState() // Find the ID and display text for the currently selected API configuration. @@ -1232,7 +1234,11 @@ export const ChatTextArea = forwardRef( />
    -
    +
    {isTtsPlaying && (
    diff --git a/webview-ui/src/components/chat/CommandExecution.tsx b/webview-ui/src/components/chat/CommandExecution.tsx index c5844bd542e..ca51a9d26e4 100644 --- a/webview-ui/src/components/chat/CommandExecution.tsx +++ b/webview-ui/src/components/chat/CommandExecution.tsx @@ -1,6 +1,6 @@ import { useCallback, useState, memo, useMemo } from "react" import { useEvent } from "react-use" -import { ChevronDown, Skull } from "lucide-react" +import { ChevronDown, OctagonX } from "lucide-react" import { CommandExecutionStatus, commandExecutionStatusSchema } from "@roo-code/types" @@ -12,11 +12,12 @@ import { COMMAND_OUTPUT_STRING } from "@roo/combineCommandSequences" import { vscode } from "@src/utils/vscode" import { useExtensionState } from "@src/context/ExtensionStateContext" import { cn } from "@src/lib/utils" -import { Button } from "@src/components/ui" +import { Button, StandardTooltip } from "@src/components/ui" import CodeBlock from "../common/CodeBlock" import { CommandPatternSelector } from "./CommandPatternSelector" import { parseCommand } from "../../utils/command-validation" import { extractPatternsFromCommand } from "../../utils/command-parser" +import { t } from "i18next" interface CommandPattern { pattern: string @@ -140,44 +141,50 @@ export const CommandExecution = ({ executionId, text, icon, title }: CommandExec return ( <>
    -
    +
    {icon} {title} + {status?.status === "exited" && ( +
    + +
    + +
    + )}
    -
    +
    {status?.status === "started" && (
    -
    -
    Running
    {status.pid &&
    (PID: {status.pid})
    } - -
    - )} - {status?.status === "exited" && ( -
    -
    -
    Exited ({status.exitCode})
    + + +
    )} {output.length > 0 && ( )} @@ -185,7 +192,7 @@ export const CommandExecution = ({ executionId, text, icon, title }: CommandExec
    -
    +
    diff --git a/webview-ui/src/components/chat/CommandPatternSelector.tsx b/webview-ui/src/components/chat/CommandPatternSelector.tsx index 5910b3ce777..dc9e517dc73 100644 --- a/webview-ui/src/components/chat/CommandPatternSelector.tsx +++ b/webview-ui/src/components/chat/CommandPatternSelector.tsx @@ -1,8 +1,7 @@ import React, { useState, useMemo } from "react" -import { Check, ChevronDown, Info, X } from "lucide-react" +import { Check, CheckCheck, ChevronUp, X } from "lucide-react" import { cn } from "../../lib/utils" -import { useTranslation, Trans } from "react-i18next" -import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" +import { useTranslation } from "react-i18next" import { StandardTooltip } from "../ui/standard-tooltip" interface CommandPattern { @@ -29,10 +28,6 @@ export const CommandPatternSelector: React.FC = ({ const [isExpanded, setIsExpanded] = useState(false) const [editingStates, setEditingStates] = useState>({}) - const handleOpenSettings = () => { - window.postMessage({ type: "action", action: "settingsButtonClicked", values: { section: "autoApprove" } }) - } - // Create a combined list with full command first, then patterns const allPatterns = useMemo(() => { // Create a set to track unique patterns we've already seen @@ -68,50 +63,36 @@ export const CommandPatternSelector: React.FC = ({ } return ( -
    +
    {isExpanded && ( -
    +
    {allPatterns.map((item) => { const editState = getEditState(item.pattern) const status = getPatternStatus(editState.value) return ( -
    +
    {editState.isEditing ? ( = ({ )}
    - - + + - - + +
    ) diff --git a/webview-ui/src/components/chat/ErrorRow.tsx b/webview-ui/src/components/chat/ErrorRow.tsx new file mode 100644 index 00000000000..59c35a7faa4 --- /dev/null +++ b/webview-ui/src/components/chat/ErrorRow.tsx @@ -0,0 +1,139 @@ +import React, { useState, useCallback, memo } from "react" +import { useTranslation } from "react-i18next" +import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" +import { MessageCircleWarning } from "lucide-react" +import { useCopyToClipboard } from "@src/utils/clipboard" +import CodeBlock from "../common/CodeBlock" + +export interface ErrorRowProps { + type: "error" | "mistake_limit" | "api_failure" | "diff_error" | "streaming_failed" | "cancelled" + title?: string + message: string + showCopyButton?: boolean + expandable?: boolean + defaultExpanded?: boolean + additionalContent?: React.ReactNode + headerClassName?: string + messageClassName?: string +} + +/** + * Unified error display component for all error types in the chat + */ +export const ErrorRow = memo( + ({ + type, + title, + message, + showCopyButton = false, + expandable = false, + defaultExpanded = false, + additionalContent, + headerClassName, + messageClassName, + }: ErrorRowProps) => { + const { t } = useTranslation() + const [isExpanded, setIsExpanded] = useState(defaultExpanded) + const [showCopySuccess, setShowCopySuccess] = useState(false) + const { copyWithFeedback } = useCopyToClipboard() + + // Default titles for different error types + const getDefaultTitle = () => { + if (title) return title + + switch (type) { + case "error": + return t("chat:error") + case "mistake_limit": + return t("chat:troubleMessage") + case "api_failure": + return t("chat:apiRequest.failed") + case "streaming_failed": + return t("chat:apiRequest.streamingFailed") + case "cancelled": + return t("chat:apiRequest.cancelled") + case "diff_error": + return t("chat:diffError.title") + default: + return null + } + } + + const handleToggleExpand = useCallback(() => { + if (expandable) { + setIsExpanded(!isExpanded) + } + }, [expandable, isExpanded]) + + const handleCopy = useCallback( + async (e: React.MouseEvent) => { + e.stopPropagation() + const success = await copyWithFeedback(message) + if (success) { + setShowCopySuccess(true) + setTimeout(() => { + setShowCopySuccess(false) + }, 1000) + } + }, + [message, copyWithFeedback], + ) + + const errorTitle = getDefaultTitle() + + // For diff_error type with expandable content + if (type === "diff_error" && expandable) { + return ( +
    +
    +
    + + {errorTitle} +
    +
    + {showCopyButton && ( + + + + )} + +
    +
    + {isExpanded && ( +
    + +
    + )} +
    + ) + } + + // Standard error display + return ( + <> + {errorTitle && ( +
    + + {errorTitle} +
    + )} +

    + {message} +

    + {additionalContent} + + ) + }, +) + +export default ErrorRow diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index 3f5bc3a0171..d18ccc25173 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from "react" -import { Edit } from "lucide-react" +import { ClipboardCopy } from "lucide-react" import { Button, StandardTooltip } from "@/components/ui" @@ -108,10 +108,12 @@ export const FollowUpSuggest = ({ const isFirstSuggestion = index === 0 return ( -
    +
    +
    diff --git a/webview-ui/src/components/chat/ReasoningBlock.tsx b/webview-ui/src/components/chat/ReasoningBlock.tsx index 3c981126ef9..1fd0c770a08 100644 --- a/webview-ui/src/components/chat/ReasoningBlock.tsx +++ b/webview-ui/src/components/chat/ReasoningBlock.tsx @@ -1,8 +1,10 @@ -import React, { useEffect, useRef, useState } from "react" +import { useEffect, useRef, useState } from "react" import { useTranslation } from "react-i18next" +import { useExtensionState } from "@src/context/ExtensionStateContext" import MarkdownBlock from "../common/MarkdownBlock" -import { Clock, Lightbulb } from "lucide-react" +import { Lightbulb, ChevronUp } from "lucide-react" +import { cn } from "@/lib/utils" interface ReasoningBlockProps { content: string @@ -12,18 +14,20 @@ interface ReasoningBlockProps { metadata?: any } -/** - * Render reasoning with a heading and a simple timer. - * - Heading uses i18n key chat:reasoning.thinking - * - Timer runs while reasoning is active (no persistence) - */ export const ReasoningBlock = ({ content, isStreaming, isLast }: ReasoningBlockProps) => { const { t } = useTranslation() + const { reasoningBlockCollapsed } = useExtensionState() + + const [isCollapsed, setIsCollapsed] = useState(reasoningBlockCollapsed) const startTimeRef = useRef(Date.now()) const [elapsed, setElapsed] = useState(0) + const contentRef = useRef(null) + + useEffect(() => { + setIsCollapsed(reasoningBlockCollapsed) + }, [reasoningBlockCollapsed]) - // Simple timer that runs while streaming useEffect(() => { if (isLast && isStreaming) { const tick = () => setElapsed(Date.now() - startTimeRef.current) @@ -36,22 +40,35 @@ export const ReasoningBlock = ({ content, isStreaming, isLast }: ReasoningBlockP const seconds = Math.floor(elapsed / 1000) const secondsLabel = t("chat:reasoning.seconds", { count: seconds }) + const handleToggle = () => { + setIsCollapsed(!isCollapsed) + } + return ( -
    -
    +
    +
    {t("chat:reasoning.thinking")} + {elapsed > 0 && ( + {secondsLabel} + )} +
    +
    +
    - {elapsed > 0 && ( - - - {secondsLabel} - - )}
    - {(content?.trim()?.length ?? 0) > 0 && ( -
    + {(content?.trim()?.length ?? 0) > 0 && !isCollapsed && ( +
    )} diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 61642947225..aef0bc5eee9 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -115,7 +115,8 @@ const TaskHeader = ({ "px-2.5 pt-2.5 pb-2 flex flex-col gap-1.5 relative z-1 cursor-pointer", "bg-vscode-input-background hover:bg-vscode-input-background/90", "text-vscode-foreground/80 hover:text-vscode-foreground", - hasTodos ? "rounded-t-xs border-b-0" : "rounded-xs", + "shadow-sm shadow-black/30 rounded-md", + hasTodos && "border-b-0", )} onClick={(e) => { // Don't expand if clicking on buttons or interactive elements diff --git a/webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx b/webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx index 373148016f4..15bf24414f8 100644 --- a/webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx @@ -1,5 +1,5 @@ import React from "react" -import { render, screen, fireEvent } from "@testing-library/react" +import { render, screen, fireEvent, within } from "@testing-library/react" import { CommandPatternSelector } from "../CommandPatternSelector" import { TooltipProvider } from "../../../components/ui/tooltip" @@ -58,13 +58,23 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns. It's the next sibling of the button's parent div. + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText } = within(patternsContainer) // Check that the patterns are shown - expect(screen.getByText("npm install express")).toBeInTheDocument() - expect(screen.getByText("- Full command")).toBeInTheDocument() + expect(getByText("npm install express")).toBeInTheDocument() + expect(getByText("- Full command")).toBeInTheDocument() }) it("should show extracted patterns when expanded", () => { @@ -74,15 +84,25 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns. It's the next sibling of the button's parent div. + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText } = within(patternsContainer) // Check that patterns are shown - expect(screen.getByText("npm install")).toBeInTheDocument() - expect(screen.getByText("- Install npm packages")).toBeInTheDocument() - expect(screen.getByText("npm *")).toBeInTheDocument() - expect(screen.getByText("- Any npm command")).toBeInTheDocument() + expect(getByText("npm install")).toBeInTheDocument() + expect(getByText("- Install npm packages")).toBeInTheDocument() + expect(getByText("npm *")).toBeInTheDocument() + expect(getByText("- Any npm command")).toBeInTheDocument() }) it("should allow editing patterns when clicked", () => { @@ -92,16 +112,26 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns. It's the next sibling of the button's parent div. + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText, getByDisplayValue } = within(patternsContainer) // Click on a pattern - const patternDiv = screen.getByText("npm install express").closest("div") + const patternDiv = getByText("npm install express").closest("div") fireEvent.click(patternDiv!) // An input should appear - const input = screen.getByDisplayValue("npm install express") as HTMLInputElement + const input = getByDisplayValue("npm install express") as HTMLInputElement expect(input).toBeInTheDocument() // Change the value @@ -116,12 +146,23 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText } = within(patternsContainer) // Find the npm install pattern row - const npmInstallPattern = screen.getByText("npm install").closest(".ml-5") + const npmInstallText = getByText("npm install") + const npmInstallPattern = npmInstallText.closest(".flex")?.parentElement // The allow button should have the active styling (we can check by aria-label) const allowButton = npmInstallPattern?.querySelector('button[aria-label*="removeFromAllowed"]') @@ -140,12 +181,23 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText } = within(patternsContainer) // Find the git push pattern row - const gitPushPattern = screen.getByText("git push").closest(".ml-5") + const gitPushText = getByText("git push") + const gitPushPattern = gitPushText.closest(".flex")?.parentElement // The deny button should have the active styling (we can check by aria-label) const denyButton = gitPushPattern?.querySelector('button[aria-label*="removeFromDenied"]') @@ -165,12 +217,23 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText } = within(patternsContainer) // Find a pattern row and click allow - const patternRow = screen.getByText("npm install express").closest(".ml-5") + const patternText = getByText("npm install express") + const patternRow = patternText.closest(".flex")?.parentElement const allowButton = patternRow?.querySelector('button[aria-label*="addToAllowed"]') fireEvent.click(allowButton!) @@ -191,12 +254,23 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText } = within(patternsContainer) // Find a pattern row and click deny - const patternRow = screen.getByText("npm install express").closest(".ml-5") + const patternText = getByText("npm install express") + const patternRow = patternText.closest(".flex")?.parentElement const denyButton = patternRow?.querySelector('button[aria-label*="addToDenied"]') fireEvent.click(denyButton!) @@ -217,23 +291,33 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText, getByDisplayValue } = within(patternsContainer) // Click on a pattern to edit - const patternDiv = screen.getByText("npm install express").closest("div") + const patternDiv = getByText("npm install express").closest("div") fireEvent.click(patternDiv!) // Edit the pattern - const input = screen.getByDisplayValue("npm install express") as HTMLInputElement + const input = getByDisplayValue("npm install express") as HTMLInputElement fireEvent.change(input, { target: { value: "npm install react" } }) // Don't press Enter or blur - just click the button while still editing // This simulates the user clicking the button while the input is still focused // Find the allow button in the same row as the input - const patternRow = input.closest(".ml-5") + const patternRow = input.closest(".flex")?.parentElement const allowButton = patternRow?.querySelector('button[aria-label*="addToAllowed"]') expect(allowButton).toBeInTheDocument() @@ -251,23 +335,33 @@ describe("CommandPatternSelector", () => { , ) + // Find the button that expands the section + const manageCommandsButton = screen.getByText("chat:commandExecution.manageCommands").closest("button") + expect(manageCommandsButton).toBeInTheDocument() + // Click to expand the component - const expandButton = screen.getByRole("button") - fireEvent.click(expandButton) + fireEvent.click(manageCommandsButton!) + + // Find the container for the patterns + const patternsContainer = manageCommandsButton?.nextElementSibling as HTMLElement + expect(patternsContainer).toBeInTheDocument() + + // Use within to query elements inside the patterns container + const { getByText, getByDisplayValue, queryByDisplayValue } = within(patternsContainer) // Click on a pattern to edit - const patternDiv = screen.getByText("npm install express").closest("div") + const patternDiv = getByText("npm install express").closest("div") fireEvent.click(patternDiv!) // Edit the pattern - const input = screen.getByDisplayValue("npm install express") as HTMLInputElement + const input = getByDisplayValue("npm install express") as HTMLInputElement fireEvent.change(input, { target: { value: "npm install react" } }) // Press Escape to cancel fireEvent.keyDown(input, { key: "Escape" }) // The original value should be restored - expect(screen.getByText("npm install express")).toBeInTheDocument() - expect(screen.queryByDisplayValue("npm install react")).not.toBeInTheDocument() + expect(getByText("npm install express")).toBeInTheDocument() + expect(queryByDisplayValue("npm install react")).not.toBeInTheDocument() }) }) diff --git a/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx b/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx index eba47699abc..d2fb8606681 100644 --- a/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx +++ b/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx @@ -8,16 +8,32 @@ import { useRooPortal } from "@/components/ui/hooks" import { vscode } from "@src/utils/vscode" import { Checkpoint } from "./schema" -type CheckpointMenuProps = { +type CheckpointMenuBaseProps = { ts: number commitHash: string currentHash?: string checkpoint: Checkpoint } +type CheckpointMenuControlledProps = { + open: boolean + onOpenChange: (open: boolean) => void +} +type CheckpointMenuUncontrolledProps = { + open?: undefined + onOpenChange?: undefined +} +type CheckpointMenuProps = CheckpointMenuBaseProps & (CheckpointMenuControlledProps | CheckpointMenuUncontrolledProps) -export const CheckpointMenu = ({ ts, commitHash, currentHash, checkpoint }: CheckpointMenuProps) => { +export const CheckpointMenu = ({ + ts, + commitHash, + currentHash, + checkpoint, + open, + onOpenChange, +}: CheckpointMenuProps) => { const { t } = useTranslation() - const [isOpen, setIsOpen] = useState(false) + const [internalOpen, setInternalOpen] = useState(false) const [isConfirming, setIsConfirming] = useState(false) const portalContainer = useRooPortal("roo-portal") @@ -25,6 +41,9 @@ export const CheckpointMenu = ({ ts, commitHash, currentHash, checkpoint }: Chec const previousCommitHash = checkpoint?.from + const isOpen = open ?? internalOpen + const setOpen = onOpenChange ?? setInternalOpen + const onCheckpointDiff = useCallback(() => { vscode.postMessage({ type: "checkpointDiff", @@ -34,13 +53,23 @@ export const CheckpointMenu = ({ ts, commitHash, currentHash, checkpoint }: Chec const onPreview = useCallback(() => { vscode.postMessage({ type: "checkpointRestore", payload: { ts, commitHash, mode: "preview" } }) - setIsOpen(false) - }, [ts, commitHash]) + setOpen(false) + }, [ts, commitHash, setOpen]) const onRestore = useCallback(() => { vscode.postMessage({ type: "checkpointRestore", payload: { ts, commitHash, mode: "restore" } }) - setIsOpen(false) - }, [ts, commitHash]) + setOpen(false) + }, [ts, commitHash, setOpen]) + + const handleOpenChange = useCallback( + (open: boolean) => { + setOpen(open) + if (!open) { + setIsConfirming(false) + } + }, + [setOpen], + ) return (
    @@ -49,15 +78,10 @@ export const CheckpointMenu = ({ ts, commitHash, currentHash, checkpoint }: Chec - { - setIsOpen(open) - setIsConfirming(false) - }}> + - @@ -66,7 +90,7 @@ export const CheckpointMenu = ({ ts, commitHash, currentHash, checkpoint }: Chec
    {!isCurrent && (
    -
    @@ -74,39 +98,50 @@ export const CheckpointMenu = ({ ts, commitHash, currentHash, checkpoint }: Chec
    )} -
    + {!isCurrent && (
    - {!isConfirming ? ( - - ) : ( - <> - - - - )} - {isConfirming ? ( -
    - {t("chat:checkpoint.menu.cannotUndo")} -
    - ) : ( -
    - {t("chat:checkpoint.menu.restoreFilesAndTaskDescription")} -
    - )} + ) : ( + <> + + + + )} + {isConfirming ? ( +
    + {t("chat:checkpoint.menu.cannotUndo")} +
    + ) : ( +
    + {t("chat:checkpoint.menu.restoreFilesAndTaskDescription")} +
    + )} +
    -
    + )}
    diff --git a/webview-ui/src/components/chat/checkpoints/CheckpointSaved.tsx b/webview-ui/src/components/chat/checkpoints/CheckpointSaved.tsx index 12ff65c86aa..da16904e4c0 100644 --- a/webview-ui/src/components/chat/checkpoints/CheckpointSaved.tsx +++ b/webview-ui/src/components/chat/checkpoints/CheckpointSaved.tsx @@ -1,8 +1,10 @@ -import { useMemo } from "react" +import { useMemo, useRef, useState, useEffect } from "react" import { useTranslation } from "react-i18next" +import { cn } from "@/lib/utils" import { CheckpointMenu } from "./CheckpointMenu" import { checkpointSchema } from "./schema" +import { GitCommitVertical } from "lucide-react" type CheckpointSavedProps = { ts: number @@ -14,6 +16,37 @@ type CheckpointSavedProps = { export const CheckpointSaved = ({ checkpoint, ...props }: CheckpointSavedProps) => { const { t } = useTranslation() const isCurrent = props.currentHash === props.commitHash + const [isPopoverOpen, setIsPopoverOpen] = useState(false) + const [isClosing, setIsClosing] = useState(false) + const closeTimer = useRef(null) + + useEffect(() => { + return () => { + if (closeTimer.current) { + window.clearTimeout(closeTimer.current) + closeTimer.current = null + } + } + }, []) + + const handlePopoverOpenChange = (open: boolean) => { + setIsPopoverOpen(open) + if (open) { + setIsClosing(false) + if (closeTimer.current) { + window.clearTimeout(closeTimer.current) + closeTimer.current = null + } + } else { + setIsClosing(true) + closeTimer.current = window.setTimeout(() => { + setIsClosing(false) + closeTimer.current = null + }, 200) // keep menu visible briefly to avoid popover jump + } + } + + const menuVisible = isPopoverOpen || isClosing const metadata = useMemo(() => { if (!checkpoint) { @@ -34,13 +67,30 @@ export const CheckpointSaved = ({ checkpoint, ...props }: CheckpointSavedProps) } return ( -
    -
    - - {t("chat:checkpoint.regular")} - {isCurrent && {t("chat:checkpoint.current")}} +
    +
    + + {t("chat:checkpoint.regular")} + {isCurrent && ({t("chat:checkpoint.current")})} +
    + + + {/* Keep menu visible while popover is open or briefly after close to prevent jump */} +
    +
    -
    ) } diff --git a/webview-ui/src/components/chat/checkpoints/__tests__/CheckpointSaved.spec.tsx b/webview-ui/src/components/chat/checkpoints/__tests__/CheckpointSaved.spec.tsx new file mode 100644 index 00000000000..3e1cd2a4652 --- /dev/null +++ b/webview-ui/src/components/chat/checkpoints/__tests__/CheckpointSaved.spec.tsx @@ -0,0 +1,141 @@ +// npx vitest run src/components/chat/checkpoints/__tests__/CheckpointSaved.spec.tsx + +vi.mock("@/components/ui", () => { + // Minimal UI primitives to ensure deterministic behavior in tests + return { + Button: ({ children, ...rest }: any) => , + StandardTooltip: ({ children }: any) => <>{children}, + Popover: ({ children, onOpenChange, open }: any) => { + lastOnOpenChange = onOpenChange + return ( +
    + {children} +
    + ) + }, + PopoverTrigger: ({ children }: any) =>
    {children}
    , + PopoverContent: ({ children }: any) =>
    {children}
    , + } +}) + +import { render, waitFor, screen } from "@/utils/test-utils" +import React from "react" +import userEvent from "@testing-library/user-event" +import { CheckpointSaved } from "../CheckpointSaved" + +// Capture onOpenChange from Popover to control open/close in tests +let lastOnOpenChange: ((open: boolean) => void) | undefined + +const waitForOpenHandler = async () => { + await waitFor(() => { + // ensure Popover mock captured the onOpenChange handler before using it + expect(lastOnOpenChange).toBeTruthy() + }) +} + +describe("CheckpointSaved popover visibility", () => { + // Timers are controlled per-test to avoid interfering with i18n init + const baseProps = { + ts: 123, + commitHash: "abc123", + currentHash: "zzz999", + checkpoint: { from: "prev123", to: "abc123" } as Record, + } + + it("shows menu while popover is open and hides when closed", async () => { + const { getByTestId } = render() + + const getMenu = () => getByTestId("checkpoint-menu-container") as HTMLElement + + // Initially hidden (relies on group-hover) + expect(getMenu()).toBeTruthy() + expect(getMenu().className).toContain("hidden") + + // Open via captured handler + await waitForOpenHandler() + lastOnOpenChange?.(true) + + await waitFor(() => { + expect(getMenu().className).toContain("block") + expect(getMenu().className).not.toContain("hidden") + }) + + // Close via captured handler — menu remains visible briefly, then hides + lastOnOpenChange?.(false) + + await waitFor(() => { + expect(getMenu().className).toContain("block") + }) + + await waitFor(() => { + expect(getMenu().className).toContain("hidden") + }) + }) + + it("resets confirm state when popover closes", async () => { + const { getByTestId } = render() + + // Open the popover + await waitForOpenHandler() + lastOnOpenChange?.(true) + + // Enter confirm state + const restoreFilesAndTaskBtn = await waitFor(() => getByTestId("restore-files-and-task-btn")) + await userEvent.click(restoreFilesAndTaskBtn) + + // Confirm warning should be visible + expect(getByTestId("checkpoint-confirm-warning")).toBeTruthy() + + // Close popover -> confirm state should reset + lastOnOpenChange?.(false) + + // Reopen + lastOnOpenChange?.(true) + + // Confirm warning should be gone after reopening + await waitFor(() => { + expect(screen.queryByTestId("checkpoint-confirm-warning")).toBeNull() + }) + }) + + it("closes popover after preview and after confirm restore", async () => { + const { getByTestId } = render() + + const popoverRoot = () => getByTestId("popover-root") + const menuContainer = () => getByTestId("checkpoint-menu-container") + + // Open + await waitForOpenHandler() + lastOnOpenChange?.(true) + await waitFor(() => { + expect(popoverRoot().getAttribute("data-open")).toBe("true") + expect(menuContainer().className).toContain("block") + }) + + // Click preview -> popover closes; menu remains briefly visible, then hides + await userEvent.click(getByTestId("restore-files-btn")) + await waitFor(() => { + expect(popoverRoot().getAttribute("data-open")).toBe("false") + expect(menuContainer().className).toContain("block") + }) + await waitFor(() => { + expect(menuContainer().className).toContain("hidden") + }) + + // Reopen + lastOnOpenChange?.(true) + await waitFor(() => { + expect(popoverRoot().getAttribute("data-open")).toBe("true") + }) + + // Enter confirm and confirm restore -> popover closes; menu then hides + await userEvent.click(getByTestId("restore-files-and-task-btn")) + await userEvent.click(getByTestId("confirm-restore-btn")) + await waitFor(() => { + expect(popoverRoot().getAttribute("data-open")).toBe("false") + }) + await waitFor(() => { + expect(menuContainer().className).toContain("hidden") + }) + }) +}) diff --git a/webview-ui/src/components/cloud/CloudAccountSwitcher.tsx b/webview-ui/src/components/cloud/CloudAccountSwitcher.tsx new file mode 100644 index 00000000000..0d46f0f5f55 --- /dev/null +++ b/webview-ui/src/components/cloud/CloudAccountSwitcher.tsx @@ -0,0 +1,168 @@ +import { useState, useEffect } from "react" +import { Building2, Plus } from "lucide-react" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectSeparator } from "@/components/ui/select" +import { useAppTranslation } from "@src/i18n/TranslationContext" +import { vscode } from "@src/utils/vscode" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { cn } from "@src/lib/utils" + +export const CloudAccountSwitcher = () => { + const { t } = useAppTranslation() + const { cloudUserInfo, cloudOrganizations = [], cloudApiUrl } = useExtensionState() + const [selectedOrgId, setSelectedOrgId] = useState(cloudUserInfo?.organizationId || null) + const [isLoading, setIsLoading] = useState(false) + + // Update selected org when userInfo changes + useEffect(() => { + setSelectedOrgId(cloudUserInfo?.organizationId || null) + }, [cloudUserInfo?.organizationId]) + + // Show the switcher whenever user is authenticated + if (!cloudUserInfo) { + return null + } + + const handleOrganizationChange = async (value: string) => { + // Handle "Create Team Account" option + if (value === "create-team") { + if (cloudApiUrl) { + const billingUrl = `${cloudApiUrl}/billing` + vscode.postMessage({ type: "openExternal", url: billingUrl }) + } + return + } + + const newOrgId = value === "personal" ? null : value + + // Don't do anything if selecting the same organization + if (newOrgId === selectedOrgId) { + return + } + + setIsLoading(true) + + // Send message to switch organization + vscode.postMessage({ + type: "switchOrganization", + organizationId: newOrgId, + }) + + // Update local state optimistically + setSelectedOrgId(newOrgId) + + // Reset loading state after a delay + setTimeout(() => { + setIsLoading(false) + }, 1000) + } + + const currentValue = selectedOrgId || "personal" + const currentOrg = cloudOrganizations.find((org) => org.organization.id === selectedOrgId) + + // Render the account icon based on current context + const renderAccountIcon = () => { + if (selectedOrgId && currentOrg?.organization.image_url) { + // Organization with logo + return ( + {currentOrg.organization.name} + ) + } else if (selectedOrgId) { + // Organization without logo + return + } else if (cloudUserInfo.picture) { + // Personal account with avatar + return ( + {cloudUserInfo.name + ) + } else { + // Personal account without avatar - show initials + const initial = cloudUserInfo.name?.charAt(0) || cloudUserInfo.email?.charAt(0) || "?" + return ( +
    + {initial} +
    + ) + } + } + + return ( +
    + +
    + ) +} diff --git a/webview-ui/src/components/cloud/CloudView.tsx b/webview-ui/src/components/cloud/CloudView.tsx index 78dfba7494a..de5fdd003b1 100644 --- a/webview-ui/src/components/cloud/CloudView.tsx +++ b/webview-ui/src/components/cloud/CloudView.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from "react" import { VSCodeButton, VSCodeProgressRing, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" -import { type CloudUserInfo, TelemetryEventName } from "@roo-code/types" +import { type CloudUserInfo, type CloudOrganizationMembership, TelemetryEventName } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { useExtensionState } from "@src/context/ExtensionStateContext" @@ -9,10 +9,12 @@ import { vscode } from "@src/utils/vscode" import { telemetryClient } from "@src/utils/TelemetryClient" import { ToggleSwitch } from "@/components/ui/toggle-switch" import { renderCloudBenefitsContent } from "./CloudUpsellDialog" -import { TriangleAlert } from "lucide-react" +import { CircleAlert, Info, Lock, TriangleAlert } from "lucide-react" import { cn } from "@/lib/utils" import { Tab, TabContent, TabHeader } from "../common/Tab" import { Button } from "@/components/ui/button" +import { OrganizationSwitcher } from "./OrganizationSwitcher" +import { StandardTooltip } from "../ui" // Define the production URL constant locally to avoid importing from cloud package in tests const PRODUCTION_ROO_CODE_API_URL = "https://app.roocode.com" @@ -22,9 +24,10 @@ type CloudViewProps = { isAuthenticated: boolean cloudApiUrl?: string onDone: () => void + organizations?: CloudOrganizationMembership[] } -export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: CloudViewProps) => { +export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone, organizations = [] }: CloudViewProps) => { const { t } = useAppTranslation() const { remoteControlEnabled, @@ -161,11 +164,11 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl - + {isAuthenticated ? ( <> {userInfo && ( -
    +
    {userInfo?.picture ? ( {userInfo?.email}

    )} - {userInfo?.organizationName && ( -
    - {userInfo.organizationImageUrl && ( - {userInfo.organizationName} - )} - {userInfo.organizationName} -
    - )} + + {/* Organization Switcher - moved below email */} +
    + +
    )} {/* Task Sync Toggle - Always shown when authenticated */} -
    +
    - {t("cloud:taskSync")} + + {t("cloud:taskSync")} + {userInfo?.organizationId && ( + +
    + +
    +
    + )} +
    -
    +
    {t("cloud:taskSyncDescription")}
    - {userInfo?.organizationId && ( -
    - {t("cloud:taskSyncManagedByOrganization")} -
    - )} {/* Remote Control Toggle - Only shown when both extensionBridgeEnabled and featureRoomoteControlEnabled are true */} {userInfo?.extensionBridgeEnabled && featureRoomoteControlEnabled && ( <> -
    +
    -
    +
    {t("cloud:remoteControlDescription")} {!taskSyncEnabled && ( -
    +
    + {t("cloud:remoteControlRequiresTaskSync")}
    )}
    )} +
    - {/* Info text about usage metrics */} -
    - {t("cloud:usageMetricsAlwaysReported")} -
    - -
    +
    + + {t("cloud:usageMetricsAlwaysReported")}
    -
    - +
    + {t("cloud:visitCloudWebsite")} - + {t("cloud:logOut")}
    ) : ( <> -
    +
    {renderCloudBenefitsContent(t)}
    {!authInProgress && ( @@ -323,10 +332,10 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl )} {cloudApiUrl && cloudApiUrl !== PRODUCTION_ROO_CODE_API_URL && ( -
    +
    - - {t("cloud:cloudUrlPillLabel")}: + + {t("cloud:cloudUrlPillLabel")} - {didRefetch && ( -
    - {t("settings:providers.refreshModels.hint")} -
    - )} { const { apiConfiguration, currentApiConfigName, setApiConfiguration, uriScheme, machineId } = useExtensionState() const { t } = useAppTranslation() const [errorMessage, setErrorMessage] = useState(undefined) + const [showRooProvider, setShowRooProvider] = useState(false) + + // Check PostHog feature flag for Roo provider + useEffect(() => { + posthog.onFeatureFlags(function () { + setShowRooProvider(posthog?.getFeatureFlag("roo-provider-featured") === "test") + }) + }, []) // Memoize the setApiConfigurationField function to pass to ApiOptions const setApiConfigurationFieldForApiOptions = useCallback( @@ -30,7 +41,11 @@ const WelcomeView = () => { ) const handleSubmit = useCallback(() => { - const error = apiConfiguration ? validateApiConfiguration(apiConfiguration) : undefined + const effectiveConfiguration: ProviderSettings = { + ...apiConfiguration, + } + + const error = validateApiConfiguration(effectiveConfiguration) if (error) { setErrorMessage(error) @@ -38,7 +53,14 @@ const WelcomeView = () => { } setErrorMessage(undefined) - vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration }) + + const targetConfigName = currentApiConfigName?.trim() ? currentApiConfigName : "default" + + vscode.postMessage({ + type: "upsertApiConfiguration", + text: targetConfigName, + apiConfiguration: effectiveConfiguration, + }) }, [apiConfiguration, currentApiConfigName]) // Using a lazy initializer so it reads once at mount @@ -69,7 +91,7 @@ const WelcomeView = () => { {/* Define the providers */} {(() => { // Provider card configuration - const providers = [ + const baseProviders = [ { slug: "requesty", name: "Requesty", @@ -85,6 +107,20 @@ const WelcomeView = () => { }, ] + // Conditionally add Roo provider based on feature flag + const providers = showRooProvider + ? [ + ...baseProviders, + { + slug: "roo", + name: "Roo Code Cloud", + description: t("welcome:routers.roo.description"), + incentive: t("welcome:routers.roo.incentive"), + authUrl: "#", // Placeholder since onClick handler will prevent default + }, + ] + : baseProviders + // Shuffle providers based on machine ID (will be consistent for the same machine) const orderedProviders = [...providers] knuthShuffle(orderedProviders, (machineId as any) || Date.now()) @@ -94,9 +130,41 @@ const WelcomeView = () => { + rel="noopener noreferrer" + onClick={(e) => { + // Track telemetry for featured provider click + telemetryClient.capture(TelemetryEventName.FEATURED_PROVIDER_CLICKED, { + provider: provider.slug, + }) + + // Special handling for Roo provider + if (provider.slug === "roo") { + e.preventDefault() + + // Set the Roo provider configuration + const rooConfig: ProviderSettings = { + apiProvider: "roo", + } + + // Save the Roo provider configuration + vscode.postMessage({ + type: "upsertApiConfiguration", + text: currentApiConfigName, + apiConfiguration: rooConfig, + }) + + // Then trigger cloud sign-in + vscode.postMessage({ type: "rooCloudSignIn" }) + } + // For other providers, let the default link behavior work + }}> + {provider.incentive && ( +
    + {provider.incentive} +
    + )}
    {
    {provider.name}
    -
    -
    - {provider.description} -
    - {provider.incentive && ( -
    {provider.incentive}
    - )} +
    + {provider.description}
    diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 5534686db66..7567c0b66bf 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -9,6 +9,7 @@ import { type TodoItem, type TelemetrySetting, type OrganizationAllowList, + type CloudOrganizationMembership, ORGANIZATION_ALLOW_ALL, } from "@roo-code/types" @@ -39,6 +40,7 @@ export interface ExtensionStateContextType extends ExtensionState { organizationAllowList: OrganizationAllowList organizationSettingsVersion: number cloudIsAuthenticated: boolean + cloudOrganizations?: CloudOrganizationMembership[] sharingEnabled: boolean maxConcurrentFileReads?: number mdmCompliant?: boolean @@ -142,6 +144,7 @@ export interface ExtensionStateContextType extends ExtensionState { terminalCompressProgressBar?: boolean setTerminalCompressProgressBar: (value: boolean) => void setHistoryPreviewCollapsed: (value: boolean) => void + setReasoningBlockCollapsed: (value: boolean) => void autoCondenseContext: boolean setAutoCondenseContext: (value: boolean) => void autoCondenseContextPercent: number @@ -238,8 +241,10 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode terminalZdotdir: false, // Default ZDOTDIR handling setting terminalCompressProgressBar: true, // Default to compress progress bar output historyPreviewCollapsed: false, // Initialize the new state (default to expanded) + reasoningBlockCollapsed: false, // Default to expanded so reasoning is visible cloudUserInfo: null, cloudIsAuthenticated: false, + cloudOrganizations: [], sharingEnabled: false, organizationAllowList: ORGANIZATION_ALLOW_ALL, organizationSettingsVersion: -1, @@ -326,6 +331,18 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode } break } + case "action": { + if (message.action === "toggleAutoApprove") { + // Toggle the auto-approval state + setState((prevState) => { + const newValue = !(prevState.autoApprovalEnabled ?? false) + // Also send the update to the extension + vscode.postMessage({ type: "autoApprovalEnabled", bool: newValue }) + return { ...prevState, autoApprovalEnabled: newValue } + }) + } + break + } case "theme": { if (message.text) { setTheme(convertTextMateToHljs(JSON.parse(message.text))) @@ -401,6 +418,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode const contextValue: ExtensionStateContextType = { ...state, + reasoningBlockCollapsed: state.reasoningBlockCollapsed ?? true, didHydrateState, showWelcome, theme, @@ -416,6 +434,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode screenshotQuality: state.screenshotQuality, routerModels: extensionRouterModels, cloudIsAuthenticated: state.cloudIsAuthenticated ?? false, + cloudOrganizations: state.cloudOrganizations ?? [], organizationSettingsVersion: state.organizationSettingsVersion ?? -1, marketplaceItems, marketplaceInstalledMetadata, @@ -516,6 +535,8 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode }), setHistoryPreviewCollapsed: (value) => setState((prevState) => ({ ...prevState, historyPreviewCollapsed: value })), + setReasoningBlockCollapsed: (value) => + setState((prevState) => ({ ...prevState, reasoningBlockCollapsed: value })), setHasOpenedModeSelector: (value) => setState((prevState) => ({ ...prevState, hasOpenedModeSelector: value })), setAutoCondenseContext: (value) => setState((prevState) => ({ ...prevState, autoCondenseContext: value })), setAutoCondenseContextPercent: (value) => diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 96b5dacfce7..65ffdfa0151 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -61,7 +61,7 @@ "tooltip": "Aprova aquesta acció" }, "runCommand": { - "title": "Executar ordre", + "title": "Ordre", "tooltip": "Executa aquesta ordre" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Cerca modes...", "noResults": "No s'han trobat resultats" }, - "errorReadingFile": "Error en llegir el fitxer:", + "errorReadingFile": "Error en llegir el fitxer", "noValidImages": "No s'ha processat cap imatge vàlida", "separator": "Separador", "edit": "Edita...", @@ -163,66 +163,72 @@ "wantsToFetch": "Roo vol obtenir instruccions detallades per ajudar amb la tasca actual." }, "fileOperations": { - "wantsToRead": "Roo vol llegir aquest fitxer:", - "wantsToReadOutsideWorkspace": "Roo vol llegir aquest fitxer fora de l'espai de treball:", - "didRead": "Roo ha llegit aquest fitxer:", - "wantsToEdit": "Roo vol editar aquest fitxer:", - "wantsToEditOutsideWorkspace": "Roo vol editar aquest fitxer fora de l'espai de treball:", - "wantsToEditProtected": "Roo vol editar un fitxer de configuració protegit:", - "wantsToCreate": "Roo vol crear un nou fitxer:", - "wantsToSearchReplace": "Roo vol realitzar cerca i substitució en aquest fitxer:", - "didSearchReplace": "Roo ha realitzat cerca i substitució en aquest fitxer:", - "wantsToInsert": "Roo vol inserir contingut en aquest fitxer:", - "wantsToInsertWithLineNumber": "Roo vol inserir contingut a la línia {{lineNumber}} d'aquest fitxer:", - "wantsToInsertAtEnd": "Roo vol afegir contingut al final d'aquest fitxer:", - "wantsToReadAndXMore": "En Roo vol llegir aquest fitxer i {{count}} més:", - "wantsToReadMultiple": "Roo vol llegir diversos fitxers:", - "wantsToApplyBatchChanges": "Roo vol aplicar canvis a múltiples fitxers:", - "wantsToGenerateImage": "Roo vol generar una imatge:", - "wantsToGenerateImageOutsideWorkspace": "Roo vol generar una imatge fora de l'espai de treball:", - "wantsToGenerateImageProtected": "Roo vol generar una imatge en una ubicació protegida:", - "didGenerateImage": "Roo ha generat una imatge:" + "wantsToRead": "Roo vol llegir aquest fitxer", + "wantsToReadOutsideWorkspace": "Roo vol llegir aquest fitxer fora de l'espai de treball", + "didRead": "Roo ha llegit aquest fitxer", + "wantsToEdit": "Roo vol editar aquest fitxer", + "wantsToEditOutsideWorkspace": "Roo vol editar aquest fitxer fora de l'espai de treball", + "wantsToEditProtected": "Roo vol editar un fitxer de configuració protegit", + "wantsToCreate": "Roo vol crear un nou fitxer", + "wantsToSearchReplace": "Roo vol realitzar cerca i substitució en aquest fitxer", + "didSearchReplace": "Roo ha realitzat cerca i substitució en aquest fitxer", + "wantsToInsert": "Roo vol inserir contingut en aquest fitxer", + "wantsToInsertWithLineNumber": "Roo vol inserir contingut a la línia {{lineNumber}} d'aquest fitxer", + "wantsToInsertAtEnd": "Roo vol afegir contingut al final d'aquest fitxer", + "wantsToReadAndXMore": "En Roo vol llegir aquest fitxer i {{count}} més", + "wantsToReadMultiple": "Roo vol llegir diversos fitxers", + "wantsToApplyBatchChanges": "Roo vol aplicar canvis a múltiples fitxers", + "wantsToGenerateImage": "Roo vol generar una imatge", + "wantsToGenerateImageOutsideWorkspace": "Roo vol generar una imatge fora de l'espai de treball", + "wantsToGenerateImageProtected": "Roo vol generar una imatge en una ubicació protegida", + "didGenerateImage": "Roo ha generat una imatge" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo vol veure els fitxers de nivell superior en aquest directori:", - "didViewTopLevel": "Roo ha vist els fitxers de nivell superior en aquest directori:", - "wantsToViewRecursive": "Roo vol veure recursivament tots els fitxers en aquest directori:", - "didViewRecursive": "Roo ha vist recursivament tots els fitxers en aquest directori:", - "wantsToViewDefinitions": "Roo vol veure noms de definicions de codi font utilitzats en aquest directori:", - "didViewDefinitions": "Roo ha vist noms de definicions de codi font utilitzats en aquest directori:", - "wantsToSearch": "Roo vol cercar en aquest directori {{regex}}:", - "didSearch": "Roo ha cercat en aquest directori {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo vol cercar en aquest directori (fora de l'espai de treball) {{regex}}:", - "didSearchOutsideWorkspace": "Roo ha cercat en aquest directori (fora de l'espai de treball) {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo vol veure els fitxers de nivell superior en aquest directori (fora de l'espai de treball):", - "didViewTopLevelOutsideWorkspace": "Roo ha vist els fitxers de nivell superior en aquest directori (fora de l'espai de treball):", - "wantsToViewRecursiveOutsideWorkspace": "Roo vol veure recursivament tots els fitxers en aquest directori (fora de l'espai de treball):", - "didViewRecursiveOutsideWorkspace": "Roo ha vist recursivament tots els fitxers en aquest directori (fora de l'espai de treball):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo vol veure noms de definicions de codi font utilitzats en aquest directori (fora de l'espai de treball):", - "didViewDefinitionsOutsideWorkspace": "Roo ha vist noms de definicions de codi font utilitzats en aquest directori (fora de l'espai de treball):" - }, - "commandOutput": "Sortida de l'ordre", + "wantsToViewTopLevel": "Roo vol veure els fitxers de nivell superior en aquest directori", + "didViewTopLevel": "Roo ha vist els fitxers de nivell superior en aquest directori", + "wantsToViewRecursive": "Roo vol veure recursivament tots els fitxers en aquest directori", + "didViewRecursive": "Roo ha vist recursivament tots els fitxers en aquest directori", + "wantsToViewDefinitions": "Roo vol veure noms de definicions de codi font utilitzats en aquest directori", + "didViewDefinitions": "Roo ha vist noms de definicions de codi font utilitzats en aquest directori", + "wantsToSearch": "Roo vol cercar en aquest directori {{regex}}", + "didSearch": "Roo ha cercat en aquest directori {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo vol cercar en aquest directori (fora de l'espai de treball) {{regex}}", + "didSearchOutsideWorkspace": "Roo ha cercat en aquest directori (fora de l'espai de treball) {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo vol veure els fitxers de nivell superior en aquest directori (fora de l'espai de treball)", + "didViewTopLevelOutsideWorkspace": "Roo ha vist els fitxers de nivell superior en aquest directori (fora de l'espai de treball)", + "wantsToViewRecursiveOutsideWorkspace": "Roo vol veure recursivament tots els fitxers en aquest directori (fora de l'espai de treball)", + "didViewRecursiveOutsideWorkspace": "Roo ha vist recursivament tots els fitxers en aquest directori (fora de l'espai de treball)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo vol veure noms de definicions de codi font utilitzats en aquest directori (fora de l'espai de treball)", + "didViewDefinitionsOutsideWorkspace": "Roo ha vist noms de definicions de codi font utilitzats en aquest directori (fora de l'espai de treball)" + }, + "commandOutput": "Sortida de la comanda", "commandExecution": { - "running": "Executant", + "abort": "Avortar", + "running": "En execució", "pid": "PID: {{pid}}", - "exited": "Finalitzat ({{exitCode}})", - "manageCommands": "Gestiona els permisos de les ordres", - "commandManagementDescription": "Gestiona els permisos de les ordres: Fes clic a ✓ per permetre l'execució automàtica, ✗ per denegar l'execució. Els patrons es poden activar/desactivar o eliminar de les llistes. Mostra tots els paràmetres", - "addToAllowed": "Afegeix a la llista de permesos", - "removeFromAllowed": "Elimina de la llista de permesos", - "addToDenied": "Afegeix a la llista de denegats", - "removeFromDenied": "Elimina de la llista de denegats", - "abortCommand": "Interromp l'execució de l'ordre", + "exitStatus": "S'ha sortit amb l'estat {{exitCode}}", + "manageCommands": "Comandes aprovades automàticament", + "addToAllowed": "Afegeix a la llista permesa", + "removeFromAllowed": "Elimina de la llista permesa", + "addToDenied": "Afegeix a la llista denegada", + "removeFromDenied": "Elimina de la llista denegada", + "abortCommand": "Interrompre l'execució de l'ordre", "expandOutput": "Amplia la sortida", "collapseOutput": "Redueix la sortida", - "expandManagement": "Amplia la secció de gestió d'ordres", - "collapseManagement": "Redueix la secció de gestió d'ordres" + "expandManagement": "Amplia la secció de gestió de comandaments", + "collapseManagement": "Redueix la secció de gestió de comandaments" }, "response": "Resposta", "arguments": "Arguments", + "text": { + "rooSaid": "En Roo ha dit" + }, + "feedback": { + "youSaid": "Has dit" + }, "mcp": { - "wantsToUseTool": "Roo vol utilitzar una eina al servidor MCP {{serverName}}:", - "wantsToAccessResource": "Roo vol accedir a un recurs al servidor MCP {{serverName}}:" + "wantsToUseTool": "Roo vol utilitzar una eina al servidor MCP {{serverName}}", + "wantsToAccessResource": "Roo vol accedir a un recurs al servidor MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo vol canviar a mode {{mode}}", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo ha canviat a mode {{mode}} perquè: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo vol crear una nova subtasca en mode {{mode}}:", + "wantsToCreate": "Roo vol crear una nova subtasca en mode {{mode}}", "wantsToFinish": "Roo vol finalitzar aquesta subtasca", "newTaskContent": "Instruccions de la subtasca", "completionContent": "Subtasca completada", @@ -240,7 +246,7 @@ "completionInstructions": "Subtasca completada! Pots revisar els resultats i suggerir correccions o següents passos. Si tot sembla correcte, confirma per tornar el resultat a la tasca principal." }, "questions": { - "hasQuestion": "Roo té una pregunta:" + "hasQuestion": "Roo té una pregunta" }, "taskCompleted": "Tasca completada", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "Gestiona la configuració d'aprovació automàtica", "tooltipStatus": "Aprovació automàtica activada per a: {{toggles}}", "title": "Aprovació automàtica", + "toggle": "Commuta l'aprovació automàtica", "all": "Tot", "none": "Cap", "description": "Executa aquestes accions sense demanar permís. Activa-ho només per a accions de confiança.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} Llançat", - "description": "Presentem Roo Code Cloud: Portant el poder de Roo més enllà de l'IDE", - "feature1": "Segueix el progrés de les tasques des de qualsevol lloc (Gratuït): Obté actualitzacions en temps real de tasques de llarga durada sense quedar-te atrapat a la teva IDE", - "feature2": "Controla l'Extensió Roo remotament (Pro): Inicia, atura i interactua amb tasques des d'una interfície de navegador basada en xat.", - "learnMore": "Llest per prendre el control? Aprèn més aquí.", - "visitCloudButton": "Visita Roo Code Cloud", - "socialLinks": "Uneix-te a nosaltres a X, Discord, o r/RooCode" + "stealthModel": { + "feature": "Model stealth GRATUÏT per temps limitat - Code Supernova: Un model de codificació agèntica versàtil que suporta entrades d'imatges, disponible a través de Roo Code Cloud.", + "note": "(Nota: els prompts i completacions són registrats pel creador del model i utilitzats per millorar-lo)", + "connectButton": "Connectar a Roo Code Cloud", + "selectModel": "Selecciona roo/code-supernova del proveïdor Roo Code Cloud a Configuració per començar.", + "goToSettingsButton": "Anar a Configuració" + }, + "socialLinks": "Uneix-te a nosaltres a X, Discord, o r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo vol utilitzar el navegador:", + "rooWantsToUse": "Roo vol utilitzar el navegador", "consoleLogs": "Registres de consola", "noNewLogs": "(Cap registre nou)", "screenshot": "Captura de pantalla del navegador", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Expandir bloc de codi", "collapse": "Contraure bloc de codi", - "enable_wrap": "Activar ajustament de línia", - "disable_wrap": "Desactivar ajustament de línia", "copy_code": "Copiar codi" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo vol cercar a la base de codi {{query}}:", - "wantsToSearchWithPath": "Roo vol cercar a la base de codi {{query}} a {{path}}:", + "wantsToSearch": "Roo vol cercar a la base de codi {{query}}", + "wantsToSearchWithPath": "Roo vol cercar a la base de codi {{query}} a {{path}}", "didSearch_one": "S'ha trobat 1 resultat", "didSearch_other": "S'han trobat {{count}} resultats", "resultTooltip": "Puntuació de similitud: {{score}} (fes clic per obrir el fitxer)" @@ -393,29 +400,17 @@ } }, "queuedMessages": { - "title": "Missatges en cua:", + "title": "Missatges en cua", "clickToEdit": "Feu clic per editar el missatge" }, "slashCommand": { - "wantsToRun": "Roo vol executar una comanda slash:", - "didRun": "Roo ha executat una comanda slash:" + "wantsToRun": "Roo vol executar una comanda slash", + "didRun": "Roo ha executat una comanda slash" }, "contextMenu": { "noResults": "Sense resultats", "problems": "Problemes", "terminal": "Terminal", "url": "Enganxa la URL per obtenir-ne el contingut" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "S'ha assolit el límit de sol·licituds aprovades automàticament", - "description": "Roo ha assolit el límit d'aprovació automàtica de {{count}} sol·licitud(s) d'API. Vols restablir el comptador i continuar amb la tasca?", - "button": "Restableix i Continua" - }, - "autoApprovedCostLimitReached": { - "title": "S'ha assolit el límit de cost aprovat automàticament", - "description": "Roo ha assolit el límit de cost d'aprovació automàtica de ${{count}}. Vols restablir el cost i continuar amb la tasca?", - "button": "Restableix i Continua" - } } } diff --git a/webview-ui/src/i18n/locales/ca/cloud.json b/webview-ui/src/i18n/locales/ca/cloud.json index ec2a989ae71..e255a4e95db 100644 --- a/webview-ui/src/i18n/locales/ca/cloud.json +++ b/webview-ui/src/i18n/locales/ca/cloud.json @@ -23,6 +23,9 @@ "havingTrouble": "Tens problemes?", "pasteCallbackUrl": "Copia l'URL de redirect del teu navegador i enganxa-la aquí:", "startOver": "Torna a començar", + "personalAccount": "Compte Personal", + "createTeamAccount": "Crear Compte d'Equip", + "switchAccount": "Canviar Compte de Roo Code Cloud", "upsell": { "autoApprovePowerUser": "Donant-li una mica d'independència a Roo? Controla'l des de qualsevol lloc amb Roo Code Cloud. Més informació.", "longRunningTask": "Això pot trigar una estona. Continua des de qualsevol lloc amb Cloud.", diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 4f3e4d99249..ccfd88638dc 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Comandes de barra", "prompts": "Indicacions", + "ui": "UI", "experimental": "Experimental", "language": "Idioma", "about": "Sobre Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Restablir al valor per defecte" }, "autoApprove": { + "toggleShortcut": "Pots configurar una drecera global per a aquesta configuració a les preferències del teu IDE.", "description": "Permet que Roo realitzi operacions automàticament sense requerir aprovació. Activeu aquesta configuració només si confieu plenament en la IA i enteneu els riscos de seguretat associats.", "enabled": "Auto-aprovació activada", "toggleAriaLabel": "Commuta l'aprovació automàtica", @@ -380,6 +382,8 @@ "modelId": "ID del model", "apiKey": "Clau API d'Ollama", "apiKeyHelp": "Clau API opcional per a instàncies d'Ollama autenticades o serveis al núvol. Deixa-ho buit per a instal·lacions locals.", + "numCtx": "Mida de la finestra de context (num_ctx)", + "numCtxHelp": "Sobreescriu la mida de la finestra de context per defecte del model. Deixeu-ho en blanc per utilitzar la configuració del Modelfile del model. El valor mínim és 128.", "description": "Ollama permet executar models localment al vostre ordinador. Per a instruccions sobre com començar, consulteu la Guia d'inici ràpid.", "warning": "Nota: Roo Code utilitza prompts complexos i funciona millor amb models Claude. Els models menys capaços poden no funcionar com s'espera." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Autenticat de forma segura a través del teu compte de Roo Code Cloud.", "connectButton": "Connecta amb Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Ruta de credencials OAuth", + "oauthPathDescription": "Ruta a les teves credencials auth.json de ChatGPT Codex. Per defecte {{defaultPath}} si es deixa buit (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex utilitza les teves credencials web de ChatGPT a través de la CLI oficial de Codex. Autentica't amb la CLI de Codex perquè es creï auth.json. Si utilitzes una ubicació personalitzada, estableix aquí la ruta completa del fitxer.", + "oauthConnectDescription": "Després de l'autenticació, Roo llegirà el token d'accés des d'auth.json i es connectarà a ChatGPT Responses (Codex).", + "learnMoreLinkText": "Aprèn més sobre ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Encaminament de Proveïdors d'OpenRouter", @@ -823,7 +834,8 @@ "providerNotAllowed": "El proveïdor '{{provider}}' no està permès per la vostra organització", "modelNotAllowed": "El model '{{model}}' no està permès per al proveïdor '{{provider}}' per la vostra organització", "profileInvalid": "Aquest perfil conté un proveïdor o model que no està permès per la vostra organització", - "qwenCodeOauthPath": "Has de proporcionar una ruta vàlida de credencials OAuth" + "qwenCodeOauthPath": "Has de proporcionar una ruta vàlida de credencials OAuth", + "openAiNativeCodexOauthPath": "Opcional: Camí a l'auth.json de ChatGPT Codex. Quan estigui buit, per defecte és ~/.codex/auth.json." }, "placeholders": { "apiKey": "Introduïu la clau API...", @@ -876,5 +888,11 @@ "output": "Sortida", "cacheReads": "Lectures de memòria cau" } + }, + "ui": { + "collapseThinking": { + "label": "Replega els missatges de pensament per defecte", + "description": "Quan estigui activat, els blocs de pensament es replegaran per defecte fins que interactuïs amb ells" + } } } diff --git a/webview-ui/src/i18n/locales/ca/welcome.json b/webview-ui/src/i18n/locales/ca/welcome.json index 4b3e75a3e16..c819a48a19d 100644 --- a/webview-ui/src/i18n/locales/ca/welcome.json +++ b/webview-ui/src/i18n/locales/ca/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Una interfície unificada per a LLMs" + }, + "roo": { + "description": "Els millors models gratuïts per començar", + "incentive": "Prova Roo gratis" } }, "chooseProvider": "Per fer la seva màgia, Roo necessita una clau API.", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 4af514b5836..a68bc69b932 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -61,7 +61,7 @@ "tooltip": "Diese Aktion genehmigen" }, "runCommand": { - "title": "Befehl ausführen", + "title": "Befehl", "tooltip": "Diesen Befehl ausführen" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Modi suchen...", "noResults": "Keine Ergebnisse gefunden" }, - "errorReadingFile": "Fehler beim Lesen der Datei:", + "errorReadingFile": "Fehler beim Lesen der Datei", "noValidImages": "Keine gültigen Bilder wurden verarbeitet", "separator": "Trennlinie", "edit": "Bearbeiten...", @@ -163,66 +163,72 @@ "wantsToFetch": "Roo möchte detaillierte Anweisungen abrufen, um bei der aktuellen Aufgabe zu helfen" }, "fileOperations": { - "wantsToRead": "Roo möchte diese Datei lesen:", - "wantsToReadAndXMore": "Roo möchte diese Datei und {{count}} weitere lesen:", - "wantsToReadOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs lesen:", - "didRead": "Roo hat diese Datei gelesen:", - "wantsToEdit": "Roo möchte diese Datei bearbeiten:", - "wantsToEditOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs bearbeiten:", - "wantsToEditProtected": "Roo möchte eine geschützte Konfigurationsdatei bearbeiten:", - "wantsToCreate": "Roo möchte eine neue Datei erstellen:", - "wantsToSearchReplace": "Roo möchte in dieser Datei suchen und ersetzen:", - "didSearchReplace": "Roo hat Suchen und Ersetzen in dieser Datei durchgeführt:", - "wantsToInsert": "Roo möchte Inhalte in diese Datei einfügen:", - "wantsToInsertWithLineNumber": "Roo möchte Inhalte in diese Datei in Zeile {{lineNumber}} einfügen:", - "wantsToInsertAtEnd": "Roo möchte Inhalte am Ende dieser Datei anhängen:", - "wantsToReadMultiple": "Roo möchte mehrere Dateien lesen:", - "wantsToApplyBatchChanges": "Roo möchte Änderungen an mehreren Dateien vornehmen:", - "wantsToGenerateImage": "Roo möchte ein Bild generieren:", - "wantsToGenerateImageOutsideWorkspace": "Roo möchte ein Bild außerhalb des Arbeitsbereichs generieren:", - "wantsToGenerateImageProtected": "Roo möchte ein Bild an einem geschützten Ort generieren:", - "didGenerateImage": "Roo hat ein Bild generiert:" + "wantsToRead": "Roo möchte diese Datei lesen", + "wantsToReadAndXMore": "Roo möchte diese Datei und {{count}} weitere lesen", + "wantsToReadOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs lesen", + "didRead": "Roo hat diese Datei gelesen", + "wantsToEdit": "Roo möchte diese Datei bearbeiten", + "wantsToEditOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs bearbeiten", + "wantsToEditProtected": "Roo möchte eine geschützte Konfigurationsdatei bearbeiten", + "wantsToCreate": "Roo möchte eine neue Datei erstellen", + "wantsToSearchReplace": "Roo möchte in dieser Datei suchen und ersetzen", + "didSearchReplace": "Roo hat Suchen und Ersetzen in dieser Datei durchgeführt", + "wantsToInsert": "Roo möchte Inhalte in diese Datei einfügen", + "wantsToInsertWithLineNumber": "Roo möchte Inhalte in diese Datei in Zeile {{lineNumber}} einfügen", + "wantsToInsertAtEnd": "Roo möchte Inhalte am Ende dieser Datei anhängen", + "wantsToReadMultiple": "Roo möchte mehrere Dateien lesen", + "wantsToApplyBatchChanges": "Roo möchte Änderungen an mehreren Dateien vornehmen", + "wantsToGenerateImage": "Roo möchte ein Bild generieren", + "wantsToGenerateImageOutsideWorkspace": "Roo möchte ein Bild außerhalb des Arbeitsbereichs generieren", + "wantsToGenerateImageProtected": "Roo möchte ein Bild an einem geschützten Ort generieren", + "didGenerateImage": "Roo hat ein Bild generiert" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo möchte die Dateien auf oberster Ebene in diesem Verzeichnis anzeigen:", - "didViewTopLevel": "Roo hat die Dateien auf oberster Ebene in diesem Verzeichnis angezeigt:", - "wantsToViewRecursive": "Roo möchte rekursiv alle Dateien in diesem Verzeichnis anzeigen:", - "didViewRecursive": "Roo hat rekursiv alle Dateien in diesem Verzeichnis angezeigt:", - "wantsToViewDefinitions": "Roo möchte Quellcode-Definitionsnamen in diesem Verzeichnis anzeigen:", - "didViewDefinitions": "Roo hat Quellcode-Definitionsnamen in diesem Verzeichnis angezeigt:", - "wantsToSearch": "Roo möchte dieses Verzeichnis nach {{regex}} durchsuchen:", - "didSearch": "Roo hat dieses Verzeichnis nach {{regex}} durchsucht:", - "wantsToSearchOutsideWorkspace": "Roo möchte dieses Verzeichnis (außerhalb des Arbeitsbereichs) nach {{regex}} durchsuchen:", - "didSearchOutsideWorkspace": "Roo hat dieses Verzeichnis (außerhalb des Arbeitsbereichs) nach {{regex}} durchsucht:", - "wantsToViewTopLevelOutsideWorkspace": "Roo möchte die Dateien auf oberster Ebene in diesem Verzeichnis (außerhalb des Arbeitsbereichs) anzeigen:", - "didViewTopLevelOutsideWorkspace": "Roo hat die Dateien auf oberster Ebene in diesem Verzeichnis (außerhalb des Arbeitsbereichs) angezeigt:", - "wantsToViewRecursiveOutsideWorkspace": "Roo möchte rekursiv alle Dateien in diesem Verzeichnis (außerhalb des Arbeitsbereichs) anzeigen:", - "didViewRecursiveOutsideWorkspace": "Roo hat rekursiv alle Dateien in diesem Verzeichnis (außerhalb des Arbeitsbereichs) angezeigt:", - "wantsToViewDefinitionsOutsideWorkspace": "Roo möchte Quellcode-Definitionsnamen in diesem Verzeichnis (außerhalb des Arbeitsbereichs) anzeigen:", - "didViewDefinitionsOutsideWorkspace": "Roo hat Quellcode-Definitionsnamen in diesem Verzeichnis (außerhalb des Arbeitsbereichs) angezeigt:" + "wantsToViewTopLevel": "Roo möchte die Dateien auf oberster Ebene in diesem Verzeichnis anzeigen", + "didViewTopLevel": "Roo hat die Dateien auf oberster Ebene in diesem Verzeichnis angezeigt", + "wantsToViewRecursive": "Roo möchte rekursiv alle Dateien in diesem Verzeichnis anzeigen", + "didViewRecursive": "Roo hat rekursiv alle Dateien in diesem Verzeichnis angezeigt", + "wantsToViewDefinitions": "Roo möchte Quellcode-Definitionsnamen in diesem Verzeichnis anzeigen", + "didViewDefinitions": "Roo hat Quellcode-Definitionsnamen in diesem Verzeichnis angezeigt", + "wantsToSearch": "Roo möchte dieses Verzeichnis nach {{regex}} durchsuchen", + "didSearch": "Roo hat dieses Verzeichnis nach {{regex}} durchsucht", + "wantsToSearchOutsideWorkspace": "Roo möchte dieses Verzeichnis (außerhalb des Arbeitsbereichs) nach {{regex}} durchsuchen", + "didSearchOutsideWorkspace": "Roo hat dieses Verzeichnis (außerhalb des Arbeitsbereichs) nach {{regex}} durchsucht", + "wantsToViewTopLevelOutsideWorkspace": "Roo möchte die Dateien auf oberster Ebene in diesem Verzeichnis (außerhalb des Arbeitsbereichs) anzeigen", + "didViewTopLevelOutsideWorkspace": "Roo hat die Dateien auf oberster Ebene in diesem Verzeichnis (außerhalb des Arbeitsbereichs) angezeigt", + "wantsToViewRecursiveOutsideWorkspace": "Roo möchte rekursiv alle Dateien in diesem Verzeichnis (außerhalb des Arbeitsbereichs) anzeigen", + "didViewRecursiveOutsideWorkspace": "Roo hat rekursiv alle Dateien in diesem Verzeichnis (außerhalb des Arbeitsbereichs) angezeigt", + "wantsToViewDefinitionsOutsideWorkspace": "Roo möchte Quellcode-Definitionsnamen in diesem Verzeichnis (außerhalb des Arbeitsbereichs) anzeigen", + "didViewDefinitionsOutsideWorkspace": "Roo hat Quellcode-Definitionsnamen in diesem Verzeichnis (außerhalb des Arbeitsbereichs) angezeigt" }, "commandOutput": "Befehlsausgabe", "commandExecution": { + "abort": "Abbrechen", "running": "Wird ausgeführt", "pid": "PID: {{pid}}", - "exited": "Beendet ({{exitCode}})", - "manageCommands": "Befehlsberechtigungen verwalten", - "commandManagementDescription": "Befehlsberechtigungen verwalten: Klicke auf ✓, um die automatische Ausführung zu erlauben, ✗, um die Ausführung zu verweigern. Muster können ein-/ausgeschaltet oder aus Listen entfernt werden. Alle Einstellungen anzeigen", - "addToAllowed": "Zur Liste der erlaubten Befehle hinzufügen", - "removeFromAllowed": "Von der Liste der erlaubten Befehle entfernen", - "addToDenied": "Zur Liste der verweigerten Befehle hinzufügen", - "removeFromDenied": "Von der Liste der verweigerten Befehle entfernen", + "exitStatus": "Beendet mit Status {{exitCode}}", + "manageCommands": "Automatisch genehmigte Befehle", + "addToAllowed": "Zur erlaubten Liste hinzufügen", + "removeFromAllowed": "Von der erlaubten Liste entfernen", + "addToDenied": "Zur verweigerten Liste hinzufügen", + "removeFromDenied": "Von der verweigerten Liste entfernen", "abortCommand": "Befehlsausführung abbrechen", "expandOutput": "Ausgabe erweitern", - "collapseOutput": "Ausgabe einklappen", + "collapseOutput": "Ausgabe reduzieren", "expandManagement": "Befehlsverwaltungsbereich erweitern", - "collapseManagement": "Befehlsverwaltungsbereich einklappen" + "collapseManagement": "Befehlsverwaltungsbereich reduzieren" }, "response": "Antwort", "arguments": "Argumente", + "text": { + "rooSaid": "Roo hat gesagt" + }, + "feedback": { + "youSaid": "Du hast gesagt" + }, "mcp": { - "wantsToUseTool": "Roo möchte ein Tool auf dem {{serverName}} MCP-Server verwenden:", - "wantsToAccessResource": "Roo möchte auf eine Ressource auf dem {{serverName}} MCP-Server zugreifen:" + "wantsToUseTool": "Roo möchte ein Tool auf dem {{serverName}} MCP-Server verwenden", + "wantsToAccessResource": "Roo möchte auf eine Ressource auf dem {{serverName}} MCP-Server zugreifen" }, "modes": { "wantsToSwitch": "Roo möchte zum {{mode}}-Modus wechseln", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo hat zum {{mode}}-Modus gewechselt, weil: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo möchte eine neue Teilaufgabe im {{mode}}-Modus erstellen:", + "wantsToCreate": "Roo möchte eine neue Teilaufgabe im {{mode}}-Modus erstellen", "wantsToFinish": "Roo möchte diese Teilaufgabe abschließen", "newTaskContent": "Teilaufgabenanweisungen", "completionContent": "Teilaufgabe abgeschlossen", @@ -240,7 +246,7 @@ "completionInstructions": "Teilaufgabe abgeschlossen! Du kannst die Ergebnisse überprüfen und Korrekturen oder nächste Schritte vorschlagen. Wenn alles gut aussieht, bestätige, um das Ergebnis an die übergeordnete Aufgabe zurückzugeben." }, "questions": { - "hasQuestion": "Roo hat eine Frage:" + "hasQuestion": "Roo hat eine Frage" }, "taskCompleted": "Aufgabe abgeschlossen", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "Einstellungen für die automatische Genehmigung verwalten", "tooltipStatus": "Automatische Genehmigung aktiviert für: {{toggles}}", "title": "Automatische Genehmigung", + "toggle": "Automatische Genehmigung umschalten", "all": "Alle", "none": "Keine", "description": "Führe diese Aktionen aus, ohne um Erlaubnis zu fragen. Aktiviere dies nur für Aktionen, denen du voll vertraust.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} veröffentlicht", - "description": "Wir stellen vor: Roo Code Cloud: Die Macht von Roo über die IDE hinaus bringen", - "feature1": "Aufgabenfortschritt von überall verfolgen (Kostenlos): Erhalte Echtzeit-Updates zu lang laufenden Aufgaben, ohne in deiner IDE festzustecken", - "feature2": "Die Roo-Erweiterung fernsteuern (Pro): Starte, stoppe und interagiere mit Aufgaben über eine chat-basierte Browser-Oberfläche.", - "learnMore": "Bereit, die Kontrolle zu übernehmen? Erfahre mehr hier.", - "visitCloudButton": "Roo Code Cloud besuchen", - "socialLinks": "Folge uns auf X, Discord oder r/RooCode" + "stealthModel": { + "feature": "Zeitlich begrenztes KOSTENLOSES Stealth-Modell - Code Supernova: Ein vielseitiges agentisches Coding-Modell, das Bildeingaben unterstützt und über Roo Code Cloud zugänglich ist.", + "note": "(Hinweis: Prompts und Vervollständigungen werden vom Modellersteller protokolliert und zur Verbesserung des Modells verwendet)", + "connectButton": "Mit Roo Code Cloud verbinden", + "selectModel": "Wähle roo/code-supernova vom Roo Code Cloud-Provider in den Einstellungen aus, um zu beginnen.", + "goToSettingsButton": "Zu den Einstellungen" + }, + "socialLinks": "Folge uns auf X, Discord oder r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo möchte den Browser verwenden:", + "rooWantsToUse": "Roo möchte den Browser verwenden", "consoleLogs": "Konsolenprotokolle", "noNewLogs": "(Keine neuen Protokolle)", "screenshot": "Browser-Screenshot", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Code-Block erweitern", "collapse": "Code-Block reduzieren", - "enable_wrap": "Zeilenumbruch aktivieren", - "disable_wrap": "Zeilenumbruch deaktivieren", "copy_code": "Code kopieren" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo möchte den Codebase nach {{query}} durchsuchen:", - "wantsToSearchWithPath": "Roo möchte den Codebase nach {{query}} in {{path}} durchsuchen:", + "wantsToSearch": "Roo möchte den Codebase nach {{query}} durchsuchen", + "wantsToSearchWithPath": "Roo möchte den Codebase nach {{query}} in {{path}} durchsuchen", "didSearch_one": "1 Ergebnis gefunden", "didSearch_other": "{{count}} Ergebnisse gefunden", "resultTooltip": "Ähnlichkeitswert: {{score}} (klicken zum Öffnen der Datei)" @@ -399,23 +406,11 @@ "url": "URL einfügen, um Inhalte abzurufen" }, "queuedMessages": { - "title": "Warteschlange Nachrichten:", + "title": "Warteschlange Nachrichten", "clickToEdit": "Klicken zum Bearbeiten der Nachricht" }, "slashCommand": { - "wantsToRun": "Roo möchte einen Slash-Befehl ausführen:", - "didRun": "Roo hat einen Slash-Befehl ausgeführt:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Limit für automatisch genehmigte Anfragen erreicht", - "description": "Roo hat das Limit von {{count}} automatisch genehmigten API-Anfrage(n) erreicht. Möchtest du den Zähler zurücksetzen und mit der Aufgabe fortfahren?", - "button": "Zurücksetzen und fortfahren" - }, - "autoApprovedCostLimitReached": { - "title": "Automatisch genehmigtes Kostenlimit erreicht", - "description": "Roo hat das automatisch genehmigte Kostenlimit von ${{count}} erreicht. Möchtest du die Kosten zurücksetzen und mit der Aufgabe fortfahren?", - "button": "Zurücksetzen und fortfahren" - } + "wantsToRun": "Roo möchte einen Slash-Befehl ausführen", + "didRun": "Roo hat einen Slash-Befehl ausgeführt" } } diff --git a/webview-ui/src/i18n/locales/de/cloud.json b/webview-ui/src/i18n/locales/de/cloud.json index 1f83e70badd..2a3a3b1ea4f 100644 --- a/webview-ui/src/i18n/locales/de/cloud.json +++ b/webview-ui/src/i18n/locales/de/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Probleme?", "pasteCallbackUrl": "Kopiere die Redirect-URL aus deinem Browser und füge sie hier ein:", "startOver": "Von vorne beginnen", + "personalAccount": "Persönliches Konto", + "switchAccount": "Roo Code Cloud Konto wechseln", + "createTeamAccount": "Team-Konto erstellen", "cloudUrlPillLabel": "Roo Code Cloud URL", "upsell": { "autoApprovePowerUser": "Roo etwas Unabhängigkeit geben? Kontrolliere es von überall mit Roo Code Cloud. Mehr erfahren.", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 4e75f6af2a0..b371440b7bb 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Slash-Befehle", "prompts": "Eingabeaufforderungen", + "ui": "UI", "experimental": "Experimentell", "language": "Sprache", "about": "Über Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Auf Standard zurücksetzen" }, "autoApprove": { + "toggleShortcut": "Du kannst in deinen IDE-Einstellungen einen globalen Shortcut für diese Einstellung konfigurieren.", "description": "Erlaubt Roo, Operationen automatisch ohne Genehmigung durchzuführen. Aktiviere diese Einstellungen nur, wenn du der KI vollständig vertraust und die damit verbundenen Sicherheitsrisiken verstehst.", "enabled": "Auto-Genehmigung aktiviert", "toggleAriaLabel": "Automatische Genehmigung umschalten", @@ -380,6 +382,8 @@ "modelId": "Modell-ID", "apiKey": "Ollama API-Schlüssel", "apiKeyHelp": "Optionaler API-Schlüssel für authentifizierte Ollama-Instanzen oder Cloud-Services. Leer lassen für lokale Installationen.", + "numCtx": "Kontextfenstergröße (num_ctx)", + "numCtxHelp": "Überschreibt die Standard-Kontextfenstergröße des Modells. Lassen Sie das Feld leer, um die Modelfile-Konfiguration des Modells zu verwenden. Der Mindestwert ist 128.", "description": "Ollama ermöglicht es dir, Modelle lokal auf deinem Computer auszuführen. Eine Anleitung zum Einstieg findest du im Schnellstart-Guide.", "warning": "Hinweis: Roo Code verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Sicher authentifiziert über dein Roo Code Cloud-Konto.", "connectButton": "Mit Roo Code Cloud verbinden" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth-Anmeldedaten-Pfad", + "oauthPathDescription": "Pfad zu deinen ChatGPT Codex auth.json-Anmeldedaten. Standardmäßig {{defaultPath}}, wenn leer gelassen (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex verwendet deine ChatGPT-Web-Anmeldedaten über die offizielle Codex CLI. Authentifiziere dich mit der Codex CLI, damit auth.json erstellt wird. Wenn du einen benutzerdefinierten Speicherort verwendest, gib hier den vollständigen Dateipfad an.", + "oauthConnectDescription": "Nach der Authentifizierung liest Roo das Zugriffstoken aus auth.json und verbindet sich mit ChatGPT Responses (Codex).", + "learnMoreLinkText": "Mehr über ChatGPT erfahren" + }, "openRouter": { "providerRouting": { "title": "OpenRouter Anbieter-Routing", @@ -823,7 +834,8 @@ "providerNotAllowed": "Anbieter '{{provider}}' ist von deiner Organisation nicht erlaubt", "modelNotAllowed": "Modell '{{model}}' ist für Anbieter '{{provider}}' von deiner Organisation nicht erlaubt", "profileInvalid": "Dieses Profil enthält einen Anbieter oder ein Modell, das von deiner Organisation nicht erlaubt ist", - "qwenCodeOauthPath": "Du musst einen gültigen OAuth-Anmeldedaten-Pfad angeben" + "qwenCodeOauthPath": "Du musst einen gültigen OAuth-Anmeldedaten-Pfad angeben", + "openAiNativeCodexOauthPath": "Optional: Pfad zur ChatGPT Codex auth.json. Wenn leer, wird standardmäßig ~/.codex/auth.json verwendet." }, "placeholders": { "apiKey": "API-Schlüssel eingeben...", @@ -876,5 +888,11 @@ "output": "Ausgabe", "cacheReads": "Cache-Lesevorgänge" } + }, + "ui": { + "collapseThinking": { + "label": "Gedankenblöcke standardmäßig ausblenden", + "description": "Wenn aktiviert, werden Gedankenblöcke standardmäßig ausgeblendet, bis du mit ihnen interagierst" + } } } diff --git a/webview-ui/src/i18n/locales/de/welcome.json b/webview-ui/src/i18n/locales/de/welcome.json index 13cf9f8687f..a95ff103739 100644 --- a/webview-ui/src/i18n/locales/de/welcome.json +++ b/webview-ui/src/i18n/locales/de/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Eine einheitliche Schnittstelle für LLMs" + }, + "roo": { + "description": "Die besten kostenlosen Modelle für den Einstieg", + "incentive": "Probier Roo kostenlos aus" } }, "chooseProvider": "Um seine Magie zu entfalten, benötigt Roo einen API-Schlüssel.", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index d6fb807888c..7bd0cde9d34 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -69,7 +69,7 @@ } }, "runCommand": { - "title": "Run Command", + "title": "Run", "tooltip": "Execute this command" }, "proceedWhileRunning": { @@ -136,7 +136,7 @@ "addContext": "@ to add context, / for commands", "dragFiles": "hold shift to drag in files", "dragFilesImages": "hold shift to drag in files/images", - "errorReadingFile": "Error reading file:", + "errorReadingFile": "Error reading file", "noValidImages": "No valid images were processed", "separator": "Separator", "edit": "Edit...", @@ -175,58 +175,58 @@ "wantsToFetch": "Roo wants to fetch detailed instructions to assist with the current task" }, "fileOperations": { - "wantsToRead": "Roo wants to read this file:", - "wantsToReadMultiple": "Roo wants to read multiple files:", - "wantsToReadAndXMore": "Roo wants to read this file and {{count}} more:", - "wantsToReadOutsideWorkspace": "Roo wants to read this file outside of the workspace:", - "didRead": "Roo read this file:", - "wantsToEdit": "Roo wants to edit this file:", - "wantsToEditOutsideWorkspace": "Roo wants to edit this file outside of the workspace:", - "wantsToEditProtected": "Roo wants to edit a protected configuration file:", - "wantsToApplyBatchChanges": "Roo wants to apply changes to multiple files:", - "wantsToGenerateImage": "Roo wants to generate an image:", - "wantsToGenerateImageOutsideWorkspace": "Roo wants to generate an image outside of the workspace:", - "wantsToGenerateImageProtected": "Roo wants to generate an image in a protected location:", - "didGenerateImage": "Roo generated an image:", - "wantsToCreate": "Roo wants to create a new file:", - "wantsToSearchReplace": "Roo wants to search and replace in this file:", - "didSearchReplace": "Roo performed search and replace on this file:", - "wantsToInsert": "Roo wants to insert content into this file:", - "wantsToInsertWithLineNumber": "Roo wants to insert content into this file at line {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo wants to append content to the end of this file:" + "wantsToRead": "Roo wants to read this file", + "wantsToReadMultiple": "Roo wants to read multiple files", + "wantsToReadAndXMore": "Roo wants to read this file and {{count}} more", + "wantsToReadOutsideWorkspace": "Roo wants to read this file outside of the workspace", + "didRead": "Roo read this file", + "wantsToEdit": "Roo wants to edit this file", + "wantsToEditOutsideWorkspace": "Roo wants to edit this file outside of the workspace", + "wantsToEditProtected": "Roo wants to edit a protected configuration file", + "wantsToApplyBatchChanges": "Roo wants to apply changes to multiple files", + "wantsToGenerateImage": "Roo wants to generate an image", + "wantsToGenerateImageOutsideWorkspace": "Roo wants to generate an image outside of the workspace", + "wantsToGenerateImageProtected": "Roo wants to generate an image in a protected location", + "didGenerateImage": "Roo generated an image", + "wantsToCreate": "Roo wants to create a new file", + "wantsToSearchReplace": "Roo wants to search and replace in this file", + "didSearchReplace": "Roo performed search and replace on this file", + "wantsToInsert": "Roo wants to insert content into this file", + "wantsToInsertWithLineNumber": "Roo wants to insert content into this file at line {{lineNumber}}", + "wantsToInsertAtEnd": "Roo wants to append content to the end of this file" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo wants to view the top level files in this directory:", - "didViewTopLevel": "Roo viewed the top level files in this directory:", - "wantsToViewTopLevelOutsideWorkspace": "Roo wants to view the top level files in this directory (outside workspace):", - "didViewTopLevelOutsideWorkspace": "Roo viewed the top level files in this directory (outside workspace):", - "wantsToViewRecursive": "Roo wants to recursively view all files in this directory:", - "didViewRecursive": "Roo recursively viewed all files in this directory:", - "wantsToViewRecursiveOutsideWorkspace": "Roo wants to recursively view all files in this directory (outside workspace):", - "didViewRecursiveOutsideWorkspace": "Roo recursively viewed all files in this directory (outside workspace):", - "wantsToViewDefinitions": "Roo wants to view source code definition names used in this directory:", - "didViewDefinitions": "Roo viewed source code definition names used in this directory:", - "wantsToViewDefinitionsOutsideWorkspace": "Roo wants to view source code definition names used in this directory (outside workspace):", - "didViewDefinitionsOutsideWorkspace": "Roo viewed source code definition names used in this directory (outside workspace):", - "wantsToSearch": "Roo wants to search this directory for {{regex}}:", - "didSearch": "Roo searched this directory for {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo wants to search this directory (outside workspace) for {{regex}}:", - "didSearchOutsideWorkspace": "Roo searched this directory (outside workspace) for {{regex}}:" + "wantsToViewTopLevel": "Roo wants to view the top level files in this directory", + "didViewTopLevel": "Roo viewed the top level files in this directory", + "wantsToViewTopLevelOutsideWorkspace": "Roo wants to view the top level files in this directory (outside workspace)", + "didViewTopLevelOutsideWorkspace": "Roo viewed the top level files in this directory (outside workspace)", + "wantsToViewRecursive": "Roo wants to recursively view all files in this directory", + "didViewRecursive": "Roo recursively viewed all files in this directory", + "wantsToViewRecursiveOutsideWorkspace": "Roo wants to recursively view all files in this directory (outside workspace)", + "didViewRecursiveOutsideWorkspace": "Roo recursively viewed all files in this directory (outside workspace)", + "wantsToViewDefinitions": "Roo wants to view source code definition names used in this directory", + "didViewDefinitions": "Roo viewed source code definition names used in this directory", + "wantsToViewDefinitionsOutsideWorkspace": "Roo wants to view source code definition names used in this directory (outside workspace)", + "didViewDefinitionsOutsideWorkspace": "Roo viewed source code definition names used in this directory (outside workspace)", + "wantsToSearch": "Roo wants to search this directory for {{regex}}", + "didSearch": "Roo searched this directory for {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo wants to search this directory (outside workspace) for {{regex}}", + "didSearchOutsideWorkspace": "Roo searched this directory (outside workspace) for {{regex}}" }, "codebaseSearch": { - "wantsToSearch": "Roo wants to search the codebase for {{query}}:", - "wantsToSearchWithPath": "Roo wants to search the codebase for {{query}} in {{path}}:", + "wantsToSearch": "Roo wants to search the codebase for {{query}}", + "wantsToSearchWithPath": "Roo wants to search the codebase for {{query}} in {{path}}", "didSearch_one": "Found 1 result", "didSearch_other": "Found {{count}} results", "resultTooltip": "Similarity score: {{score}} (click to open file)" }, "commandOutput": "Command Output", "commandExecution": { + "abort": "Abort", "running": "Running", "pid": "PID: {{pid}}", - "exited": "Exited ({{exitCode}})", - "manageCommands": "Manage Command Permissions", - "commandManagementDescription": "Manage command permissions: Click ✓ to allow auto-execution, ✗ to deny execution. Patterns can be toggled on/off or removed from lists. View all settings", + "exitStatus": "Exited with status {{exitCode}}", + "manageCommands": "Auto-approved commands", "addToAllowed": "Add to allowed list", "removeFromAllowed": "Remove from allowed list", "addToDenied": "Add to denied list", @@ -239,9 +239,15 @@ }, "response": "Response", "arguments": "Arguments", + "text": { + "rooSaid": "Roo said" + }, + "feedback": { + "youSaid": "You said" + }, "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": "Roo wants to use a tool on the {{serverName}} MCP server", + "wantsToAccessResource": "Roo wants to access a resource on the {{serverName}} MCP server" }, "modes": { "wantsToSwitch": "Roo wants to switch to {{mode}} mode", @@ -250,7 +256,7 @@ "didSwitchWithReason": "Roo switched to {{mode}} mode because: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo wants to create a new subtask in {{mode}} mode:", + "wantsToCreate": "Roo wants to create a new subtask in {{mode}} mode", "wantsToFinish": "Roo wants to finish this subtask", "newTaskContent": "Subtask Instructions", "completionContent": "Subtask Completed", @@ -259,7 +265,7 @@ "completionInstructions": "Subtask completed! You can review the results and suggest any corrections or next steps. If everything looks good, confirm to return the result to the parent task." }, "questions": { - "hasQuestion": "Roo has a question:" + "hasQuestion": "Roo has a question" }, "taskCompleted": "Task Completed", "error": "Error", @@ -288,12 +294,14 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} Released", - "description": "Introducing Roo Code Cloud: Bringing the power of Roo beyond the IDE", - "feature1": "Track task progress from anywhere (Free): Get real-time updates on long-running tasks without being stuck in your IDE", - "feature2": "Control the Roo Extension remotely (Pro): Start, stop, and interact with tasks from a chat-based browser interface.", - "learnMore": "Ready to take control? Learn more here.", - "visitCloudButton": "Visit Roo Code Cloud", - "socialLinks": "Join us on X, Discord, or r/RooCode" + "stealthModel": { + "feature": "Limited-time FREE stealth model - Code Supernova: A versatile agentic coding model that supports image inputs, accessible through Roo Code Cloud.", + "note": "(Note: prompts and completions are logged by the model creator and used to improve the model)", + "connectButton": "Connect to Roo Code Cloud", + "selectModel": "Select roo/code-supernova from the Roo Code Cloud provider in Settings to get started.", + "goToSettingsButton": "Go to Settings" + }, + "socialLinks": "Join us on X, Discord, or r/RooCode 🚀" }, "reasoning": { "thinking": "Thinking", @@ -305,7 +313,7 @@ "countdownDisplay": "{{count}}s" }, "browser": { - "rooWantsToUse": "Roo wants to use the browser:", + "rooWantsToUse": "Roo wants to use the browser", "consoleLogs": "Console Logs", "noNewLogs": "(No new logs)", "screenshot": "Browser screenshot", @@ -330,8 +338,6 @@ "tooltips": { "expand": "Expand code block", "collapse": "Collapse code block", - "enable_wrap": "Enable word wrap", - "disable_wrap": "Disable word wrap", "copy_code": "Copy code" } }, @@ -388,11 +394,11 @@ } }, "slashCommand": { - "wantsToRun": "Roo wants to run a slash command:", - "didRun": "Roo ran a slash command:" + "wantsToRun": "Roo wants to run a slash command", + "didRun": "Roo ran a slash command" }, "queuedMessages": { - "title": "Queued Messages:", + "title": "Queued Messages", "clickToEdit": "Click to edit message" }, "contextMenu": { diff --git a/webview-ui/src/i18n/locales/en/cloud.json b/webview-ui/src/i18n/locales/en/cloud.json index b8afcc4db44..05220f83336 100644 --- a/webview-ui/src/i18n/locales/en/cloud.json +++ b/webview-ui/src/i18n/locales/en/cloud.json @@ -23,6 +23,9 @@ "havingTrouble": "Having trouble?", "pasteCallbackUrl": "Copy the redirect URL from your browser and paste it here:", "startOver": "Start over", + "personalAccount": "Personal Account", + "switchAccount": "Switch Roo Code Cloud Account", + "createTeamAccount": "Create Team Account", "upsell": { "autoApprovePowerUser": "Giving Roo some independence? Control it from anywhere with Roo Code Cloud. Learn more.", "longRunningTask": "This might take a while. Continue from anywhere with Cloud.", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 1be824b37e3..b14698eb8de 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Slash Commands", "prompts": "Prompts", + "ui": "UI", "experimental": "Experimental", "language": "Language", "about": "About Roo Code" @@ -37,6 +38,12 @@ "slashCommands": { "description": "Manage your slash commands to quickly execute custom workflows and actions. Learn more" }, + "ui": { + "collapseThinking": { + "label": "Collapse Thinking messages by default", + "description": "When enabled, thinking blocks will be collapsed by default until you interact with them" + } + }, "prompts": { "description": "Configure support prompts that are used for quick actions like enhancing prompts, explaining code, and fixing issues. These prompts help Roo provide better assistance for common development tasks." }, @@ -134,7 +141,8 @@ } }, "autoApprove": { - "description": "Allow Roo to automatically perform operations without requiring approval. Enable these settings only if you fully trust the AI and understand the associated security risks.", + "description": "Run these actions without asking for permission. Only enable for actions you fully trust and if you understand the security risks.", + "toggleShortcut": "You can configure a keyboard shortcut for this setting in your IDE preferences.", "enabled": "Auto-Approve Enabled", "readOnly": { "label": "Read", @@ -379,6 +387,8 @@ "modelId": "Model ID", "apiKey": "Ollama API Key", "apiKeyHelp": "Optional API key for authenticated Ollama instances or cloud services. Leave empty for local installations.", + "numCtx": "Context Window Size (num_ctx)", + "numCtxHelp": "Override the model's default context window size. Leave empty to use the model's Modelfile configuration. Minimum value is 128.", "description": "Ollama allows you to run models locally on your computer. For instructions on how to get started, see their quickstart guide.", "warning": "Note: Roo Code uses complex prompts and works best with Claude models. Less capable models may not work as expected." }, @@ -394,6 +404,13 @@ "authenticatedMessage": "Securely authenticated through your Roo Code Cloud account.", "connectButton": "Connect to Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth Credentials Path", + "oauthPathDescription": "Path to your ChatGPT Codex auth.json credentials. Defaults to {{defaultPath}} if left empty (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex uses your ChatGPT web credentials via the official Codex CLI. Authenticate with the Codex CLI so that auth.json is created. If you use a custom location, set the full file path here.", + "oauthConnectDescription": "After authentication, Roo will read the access token from auth.json and connect to ChatGPT Responses (Codex).", + "learnMoreLinkText": "Learn more about ChatGPT" + }, "openRouter": { "providerRouting": { "title": "OpenRouter Provider Routing", @@ -822,7 +839,8 @@ "providerNotAllowed": "Provider '{{provider}}' is not allowed by your organization", "modelNotAllowed": "Model '{{model}}' is not allowed for provider '{{provider}}' by your organization", "profileInvalid": "This profile contains a provider or model that is not allowed by your organization", - "qwenCodeOauthPath": "You must provide a valid OAuth credentials path." + "qwenCodeOauthPath": "You must provide a valid OAuth credentials path.", + "openAiNativeCodexOauthPath": "Optional: Path to ChatGPT Codex auth.json. When empty, defaults to ~/.codex/auth.json." }, "placeholders": { "apiKey": "Enter API Key...", diff --git a/webview-ui/src/i18n/locales/en/welcome.json b/webview-ui/src/i18n/locales/en/welcome.json index b19245fa8e1..5cb9b488dc3 100644 --- a/webview-ui/src/i18n/locales/en/welcome.json +++ b/webview-ui/src/i18n/locales/en/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "A unified interface for LLMs" + }, + "roo": { + "description": "The best free models to get started", + "incentive": "Try Roo out for free" } }, "chooseProvider": "To do its magic, Roo needs an API key.", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 6dc17706e34..20de4dcaba6 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -61,7 +61,7 @@ "tooltip": "Aprobar esta acción" }, "runCommand": { - "title": "Ejecutar comando", + "title": "Comando", "tooltip": "Ejecutar este comando" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Buscar modos...", "noResults": "No se encontraron resultados" }, - "errorReadingFile": "Error al leer el archivo:", + "errorReadingFile": "Error al leer el archivo", "noValidImages": "No se procesaron imágenes válidas", "separator": "Separador", "edit": "Editar...", @@ -163,66 +163,72 @@ "wantsToFetch": "Roo quiere obtener instrucciones detalladas para ayudar con la tarea actual" }, "fileOperations": { - "wantsToRead": "Roo quiere leer este archivo:", - "wantsToReadOutsideWorkspace": "Roo quiere leer este archivo fuera del espacio de trabajo:", - "didRead": "Roo leyó este archivo:", - "wantsToEdit": "Roo quiere editar este archivo:", - "wantsToEditOutsideWorkspace": "Roo quiere editar este archivo fuera del espacio de trabajo:", - "wantsToEditProtected": "Roo quiere editar un archivo de configuración protegido:", - "wantsToCreate": "Roo quiere crear un nuevo archivo:", - "wantsToSearchReplace": "Roo quiere realizar búsqueda y reemplazo en este archivo:", - "didSearchReplace": "Roo realizó búsqueda y reemplazo en este archivo:", - "wantsToInsert": "Roo quiere insertar contenido en este archivo:", - "wantsToInsertWithLineNumber": "Roo quiere insertar contenido en este archivo en la línea {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo quiere añadir contenido al final de este archivo:", - "wantsToReadAndXMore": "Roo quiere leer este archivo y {{count}} más:", - "wantsToReadMultiple": "Roo quiere leer varios archivos:", - "wantsToApplyBatchChanges": "Roo quiere aplicar cambios a múltiples archivos:", - "wantsToGenerateImage": "Roo quiere generar una imagen:", - "wantsToGenerateImageOutsideWorkspace": "Roo quiere generar una imagen fuera del espacio de trabajo:", - "wantsToGenerateImageProtected": "Roo quiere generar una imagen en una ubicación protegida:", - "didGenerateImage": "Roo generó una imagen:" + "wantsToRead": "Roo quiere leer este archivo", + "wantsToReadOutsideWorkspace": "Roo quiere leer este archivo fuera del espacio de trabajo", + "didRead": "Roo leyó este archivo", + "wantsToEdit": "Roo quiere editar este archivo", + "wantsToEditOutsideWorkspace": "Roo quiere editar este archivo fuera del espacio de trabajo", + "wantsToEditProtected": "Roo quiere editar un archivo de configuración protegido", + "wantsToCreate": "Roo quiere crear un nuevo archivo", + "wantsToSearchReplace": "Roo quiere realizar búsqueda y reemplazo en este archivo", + "didSearchReplace": "Roo realizó búsqueda y reemplazo en este archivo", + "wantsToInsert": "Roo quiere insertar contenido en este archivo", + "wantsToInsertWithLineNumber": "Roo quiere insertar contenido en este archivo en la línea {{lineNumber}}", + "wantsToInsertAtEnd": "Roo quiere añadir contenido al final de este archivo", + "wantsToReadAndXMore": "Roo quiere leer este archivo y {{count}} más", + "wantsToReadMultiple": "Roo quiere leer varios archivos", + "wantsToApplyBatchChanges": "Roo quiere aplicar cambios a múltiples archivos", + "wantsToGenerateImage": "Roo quiere generar una imagen", + "wantsToGenerateImageOutsideWorkspace": "Roo quiere generar una imagen fuera del espacio de trabajo", + "wantsToGenerateImageProtected": "Roo quiere generar una imagen en una ubicación protegida", + "didGenerateImage": "Roo generó una imagen" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo quiere ver los archivos de nivel superior en este directorio:", - "didViewTopLevel": "Roo vio los archivos de nivel superior en este directorio:", - "wantsToViewRecursive": "Roo quiere ver recursivamente todos los archivos en este directorio:", - "didViewRecursive": "Roo vio recursivamente todos los archivos en este directorio:", - "wantsToViewDefinitions": "Roo quiere ver nombres de definiciones de código fuente utilizados en este directorio:", - "didViewDefinitions": "Roo vio nombres de definiciones de código fuente utilizados en este directorio:", - "wantsToSearch": "Roo quiere buscar en este directorio {{regex}}:", - "didSearch": "Roo buscó en este directorio {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo quiere buscar en este directorio (fuera del espacio de trabajo) {{regex}}:", - "didSearchOutsideWorkspace": "Roo buscó en este directorio (fuera del espacio de trabajo) {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo quiere ver los archivos de nivel superior en este directorio (fuera del espacio de trabajo):", - "didViewTopLevelOutsideWorkspace": "Roo vio los archivos de nivel superior en este directorio (fuera del espacio de trabajo):", - "wantsToViewRecursiveOutsideWorkspace": "Roo quiere ver recursivamente todos los archivos en este directorio (fuera del espacio de trabajo):", - "didViewRecursiveOutsideWorkspace": "Roo vio recursivamente todos los archivos en este directorio (fuera del espacio de trabajo):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo quiere ver nombres de definiciones de código fuente utilizados en este directorio (fuera del espacio de trabajo):", - "didViewDefinitionsOutsideWorkspace": "Roo vio nombres de definiciones de código fuente utilizados en este directorio (fuera del espacio de trabajo):" + "wantsToViewTopLevel": "Roo quiere ver los archivos de nivel superior en este directorio", + "didViewTopLevel": "Roo vio los archivos de nivel superior en este directorio", + "wantsToViewRecursive": "Roo quiere ver recursivamente todos los archivos en este directorio", + "didViewRecursive": "Roo vio recursivamente todos los archivos en este directorio", + "wantsToViewDefinitions": "Roo quiere ver nombres de definiciones de código fuente utilizados en este directorio", + "didViewDefinitions": "Roo vio nombres de definiciones de código fuente utilizados en este directorio", + "wantsToSearch": "Roo quiere buscar en este directorio {{regex}}", + "didSearch": "Roo buscó en este directorio {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo quiere buscar en este directorio (fuera del espacio de trabajo) {{regex}}", + "didSearchOutsideWorkspace": "Roo buscó en este directorio (fuera del espacio de trabajo) {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo quiere ver los archivos de nivel superior en este directorio (fuera del espacio de trabajo)", + "didViewTopLevelOutsideWorkspace": "Roo vio los archivos de nivel superior en este directorio (fuera del espacio de trabajo)", + "wantsToViewRecursiveOutsideWorkspace": "Roo quiere ver recursivamente todos los archivos en este directorio (fuera del espacio de trabajo)", + "didViewRecursiveOutsideWorkspace": "Roo vio recursivamente todos los archivos en este directorio (fuera del espacio de trabajo)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo quiere ver nombres de definiciones de código fuente utilizados en este directorio (fuera del espacio de trabajo)", + "didViewDefinitionsOutsideWorkspace": "Roo vio nombres de definiciones de código fuente utilizados en este directorio (fuera del espacio de trabajo)" }, "commandOutput": "Salida del comando", "commandExecution": { + "abort": "Abortar", "running": "Ejecutando", "pid": "PID: {{pid}}", - "exited": "Finalizado ({{exitCode}})", - "manageCommands": "Gestionar permisos de comandos", - "commandManagementDescription": "Gestionar permisos de comandos: Haz clic en ✓ para permitir la ejecución automática, ✗ para denegar la ejecución. Los patrones se pueden activar/desactivar o eliminar de las listas. Ver todos los ajustes", - "addToAllowed": "Añadir a la lista de permitidos", + "exitStatus": "Salió con el estado {{exitCode}}", + "manageCommands": "Comandos aprobados automáticamente", + "addToAllowed": "Agregar a la lista de permitidos", "removeFromAllowed": "Eliminar de la lista de permitidos", - "addToDenied": "Añadir a la lista de denegados", + "addToDenied": "Agregar a la lista de denegados", "removeFromDenied": "Eliminar de la lista de denegados", - "abortCommand": "Abortar ejecución del comando", + "abortCommand": "Abortar la ejecución del comando", "expandOutput": "Expandir salida", - "collapseOutput": "Contraer salida", - "expandManagement": "Expandir sección de gestión de comandos", - "collapseManagement": "Contraer sección de gestión de comandos" + "collapseOutput": "Colapsar salida", + "expandManagement": "Expandir la sección de administración de comandos", + "collapseManagement": "Colapsar la sección de administración de comandos" }, "response": "Respuesta", "arguments": "Argumentos", + "text": { + "rooSaid": "Roo ha dicho" + }, + "feedback": { + "youSaid": "Has dicho" + }, "mcp": { - "wantsToUseTool": "Roo quiere usar una herramienta en el servidor MCP {{serverName}}:", - "wantsToAccessResource": "Roo quiere acceder a un recurso en el servidor MCP {{serverName}}:" + "wantsToUseTool": "Roo quiere usar una herramienta en el servidor MCP {{serverName}}", + "wantsToAccessResource": "Roo quiere acceder a un recurso en el servidor MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo quiere cambiar a modo {{mode}}", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo cambió a modo {{mode}} porque: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo quiere crear una nueva subtarea en modo {{mode}}:", + "wantsToCreate": "Roo quiere crear una nueva subtarea en modo {{mode}}", "wantsToFinish": "Roo quiere finalizar esta subtarea", "newTaskContent": "Instrucciones de la subtarea", "completionContent": "Subtarea completada", @@ -240,7 +246,7 @@ "completionInstructions": "¡Subtarea completada! Puedes revisar los resultados y sugerir correcciones o próximos pasos. Si todo se ve bien, confirma para devolver el resultado a la tarea principal." }, "questions": { - "hasQuestion": "Roo tiene una pregunta:" + "hasQuestion": "Roo tiene una pregunta" }, "taskCompleted": "Tarea completada", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "Administrar la configuración de aprobación automática", "tooltipStatus": "Aprobación automática habilitada para: {{toggles}}", "title": "Aprobación automática", + "toggle": "Alternar aprobación automática", "all": "Todo", "none": "Ninguno", "description": "Ejecuta estas acciones sin pedir permiso. Habilita esto solo para acciones en las que confíes plenamente.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} publicado", - "description": "Presentamos Roo Code Cloud: Llevando el poder de Roo más allá del IDE", - "feature1": "Seguir el progreso de las tareas desde cualquier lugar (Gratis): Obtén actualizaciones en tiempo real de tareas de larga duración sin estar atrapado en tu IDE", - "feature2": "Controlar la extensión Roo remotamente (Pro): Inicia, detén e interactúa con tareas desde una interfaz de navegador basada en chat.", - "learnMore": "¿Listo para tomar el control? Aprende más aquí.", - "visitCloudButton": "Visitar Roo Code Cloud", - "socialLinks": "Únete a nosotros en X, Discord, o r/RooCode" + "stealthModel": { + "feature": "Modelo stealth GRATUITO por tiempo limitado - Code Supernova: Un modelo de codificación agéntica versátil que soporta entradas de imágenes, accesible a través de Roo Code Cloud.", + "note": "(Nota: los prompts y completaciones son registrados por el creador del modelo y utilizados para mejorarlo)", + "connectButton": "Conectar a Roo Code Cloud", + "selectModel": "Selecciona roo/code-supernova del proveedor Roo Code Cloud en Configuración para comenzar.", + "goToSettingsButton": "Ir a Configuración" + }, + "socialLinks": "Únete a nosotros en X, Discord, o r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo quiere usar el navegador:", + "rooWantsToUse": "Roo quiere usar el navegador", "consoleLogs": "Registros de la consola", "noNewLogs": "(No hay nuevos registros)", "screenshot": "Captura de pantalla del navegador", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Expandir bloque de código", "collapse": "Contraer bloque de código", - "enable_wrap": "Activar ajuste de línea", - "disable_wrap": "Desactivar ajuste de línea", "copy_code": "Copiar código" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo quiere buscar en la base de código {{query}}:", - "wantsToSearchWithPath": "Roo quiere buscar en la base de código {{query}} en {{path}}:", + "wantsToSearch": "Roo quiere buscar en la base de código {{query}}", + "wantsToSearchWithPath": "Roo quiere buscar en la base de código {{query}} en {{path}}", "didSearch_one": "Se encontró 1 resultado", "didSearch_other": "Se encontraron {{count}} resultados", "resultTooltip": "Puntuación de similitud: {{score}} (haz clic para abrir el archivo)" @@ -399,23 +406,11 @@ "url": "Pega la URL para obtener el contenido" }, "queuedMessages": { - "title": "Mensajes en cola:", + "title": "Mensajes en cola", "clickToEdit": "Haz clic para editar el mensaje" }, "slashCommand": { - "wantsToRun": "Roo quiere ejecutar un comando slash:", - "didRun": "Roo ejecutó un comando slash:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Límite de solicitudes aprobadas automáticamente alcanzado", - "description": "Roo ha alcanzado el límite de aprobación automática de {{count}} solicitud(es) de API. ¿Te gustaría restablecer el contador y continuar con la tarea?", - "button": "Restablecer y continuar" - }, - "autoApprovedCostLimitReached": { - "title": "Límite de costo de aprobación automática alcanzado", - "description": "Roo ha alcanzado el límite de costo de aprobación automática de ${{count}}. ¿Te gustaría restablecer el costo y continuar con la tarea?", - "button": "Restablecer y continuar" - } + "wantsToRun": "Roo quiere ejecutar un comando slash", + "didRun": "Roo ejecutó un comando slash" } } diff --git a/webview-ui/src/i18n/locales/es/cloud.json b/webview-ui/src/i18n/locales/es/cloud.json index 80d0dc47058..9d5830d2393 100644 --- a/webview-ui/src/i18n/locales/es/cloud.json +++ b/webview-ui/src/i18n/locales/es/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "¿Tienes problemas?", "pasteCallbackUrl": "Copia la URL de redirect desde tu navegador y pégala aquí:", "startOver": "Empezar de nuevo", + "personalAccount": "Cuenta Personal", + "switchAccount": "Cambiar Cuenta de Roo Code Cloud", + "createTeamAccount": "Crear Cuenta de Equipo", "cloudUrlPillLabel": "URL de Roo Code Cloud", "upsell": { "autoApprovePowerUser": "¿Dándole a Roo un poco de independencia? Contrólalo desde cualquier lugar con Roo Code Cloud. Saber más.", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index deb2bc7a227..645549c1280 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Comandos de Barra", "prompts": "Indicaciones", + "ui": "UI", "experimental": "Experimental", "language": "Idioma", "about": "Acerca de Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Restablecer al valor predeterminado" }, "autoApprove": { + "toggleShortcut": "Puedes configurar un atajo global para esta configuración en las preferencias de tu IDE.", "description": "Permitir que Roo realice operaciones automáticamente sin requerir aprobación. Habilite esta configuración solo si confía plenamente en la IA y comprende los riesgos de seguridad asociados.", "enabled": "Auto-aprobación habilitada", "toggleAriaLabel": "Alternar aprobación automática", @@ -380,6 +382,8 @@ "modelId": "ID del modelo", "apiKey": "Clave API de Ollama", "apiKeyHelp": "Clave API opcional para instancias de Ollama autenticadas o servicios en la nube. Deja vacío para instalaciones locales.", + "numCtx": "Tamaño de la ventana de contexto (num_ctx)", + "numCtxHelp": "Sobrescribe el tamaño de la ventana de contexto predeterminado del modelo. Déjelo vacío para usar la configuración del Modelfile del modelo. El valor mínimo es 128.", "description": "Ollama le permite ejecutar modelos localmente en su computadora. Para obtener instrucciones sobre cómo comenzar, consulte la guía de inicio rápido.", "warning": "Nota: Roo Code utiliza prompts complejos y funciona mejor con modelos Claude. Los modelos menos capaces pueden no funcionar como se espera." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Autenticado de forma segura a través de tu cuenta de Roo Code Cloud.", "connectButton": "Conectar a Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Ruta de credenciales OAuth", + "oauthPathDescription": "Ruta a tus credenciales auth.json de ChatGPT Codex. Por defecto {{defaultPath}} si se deja vacío (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex usa tus credenciales web de ChatGPT a través del CLI oficial de Codex. Autentícate con el CLI de Codex para que se cree auth.json. Si usas una ubicación personalizada, establece aquí la ruta completa del archivo.", + "oauthConnectDescription": "Después de la autenticación, Roo leerá el token de acceso desde auth.json y se conectará a ChatGPT Responses (Codex).", + "learnMoreLinkText": "Aprende más sobre ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Enrutamiento de Proveedores de OpenRouter", @@ -823,7 +834,8 @@ "providerNotAllowed": "El proveedor '{{provider}}' no está permitido por su organización", "modelNotAllowed": "El modelo '{{model}}' no está permitido para el proveedor '{{provider}}' por su organización", "profileInvalid": "Este perfil contiene un proveedor o modelo que no está permitido por su organización", - "qwenCodeOauthPath": "Debes proporcionar una ruta válida de credenciales OAuth" + "qwenCodeOauthPath": "Debes proporcionar una ruta válida de credenciales OAuth", + "openAiNativeCodexOauthPath": "Opcional: Ruta al auth.json de ChatGPT Codex. Cuando esté vacío, por defecto es ~/.codex/auth.json." }, "placeholders": { "apiKey": "Ingrese clave API...", @@ -876,5 +888,11 @@ "output": "Salida", "cacheReads": "Lecturas de caché" } + }, + "ui": { + "collapseThinking": { + "label": "Colapsar mensajes de pensamiento por defecto", + "description": "Cuando está activado, los bloques de pensamiento se colapsarán por defecto hasta que interactúes con ellos" + } } } diff --git a/webview-ui/src/i18n/locales/es/welcome.json b/webview-ui/src/i18n/locales/es/welcome.json index 2a3a80751a2..2f7217d4f3e 100644 --- a/webview-ui/src/i18n/locales/es/welcome.json +++ b/webview-ui/src/i18n/locales/es/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Una interfaz unificada para LLMs" + }, + "roo": { + "description": "Los mejores modelos gratuitos para empezar", + "incentive": "Prueba Roo gratis" } }, "chooseProvider": "Para hacer su magia, Roo necesita una clave API.", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 053ebdcae11..4d31f328ad3 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -61,7 +61,7 @@ "tooltip": "Approuver cette action" }, "runCommand": { - "title": "Exécuter la commande", + "title": "Commande", "tooltip": "Exécuter cette commande" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Rechercher des modes...", "noResults": "Aucun résultat trouvé" }, - "errorReadingFile": "Erreur lors de la lecture du fichier :", + "errorReadingFile": "Erreur lors de la lecture du fichier", "noValidImages": "Aucune image valide n'a été traitée", "separator": "Séparateur", "edit": "Éditer...", @@ -160,54 +160,54 @@ "current": "Actuel" }, "fileOperations": { - "wantsToRead": "Roo veut lire ce fichier :", - "wantsToReadOutsideWorkspace": "Roo veut lire ce fichier en dehors de l'espace de travail :", - "didRead": "Roo a lu ce fichier :", - "wantsToEdit": "Roo veut éditer ce fichier :", - "wantsToEditOutsideWorkspace": "Roo veut éditer ce fichier en dehors de l'espace de travail :", - "wantsToEditProtected": "Roo veut éditer un fichier de configuration protégé :", - "wantsToCreate": "Roo veut créer un nouveau fichier :", - "wantsToSearchReplace": "Roo veut effectuer une recherche et remplacement sur ce fichier :", - "didSearchReplace": "Roo a effectué une recherche et remplacement sur ce fichier :", - "wantsToInsert": "Roo veut insérer du contenu dans ce fichier :", - "wantsToInsertWithLineNumber": "Roo veut insérer du contenu dans ce fichier à la ligne {{lineNumber}} :", - "wantsToInsertAtEnd": "Roo veut ajouter du contenu à la fin de ce fichier :", - "wantsToReadAndXMore": "Roo veut lire ce fichier et {{count}} de plus :", - "wantsToReadMultiple": "Roo souhaite lire plusieurs fichiers :", - "wantsToApplyBatchChanges": "Roo veut appliquer des modifications à plusieurs fichiers :", - "wantsToGenerateImage": "Roo veut générer une image :", - "wantsToGenerateImageOutsideWorkspace": "Roo veut générer une image en dehors de l'espace de travail :", - "wantsToGenerateImageProtected": "Roo veut générer une image dans un emplacement protégé :", - "didGenerateImage": "Roo a généré une image :" + "wantsToRead": "Roo veut lire ce fichier", + "wantsToReadOutsideWorkspace": "Roo veut lire ce fichier en dehors de l'espace de travail", + "didRead": "Roo a lu ce fichier", + "wantsToEdit": "Roo veut éditer ce fichier", + "wantsToEditOutsideWorkspace": "Roo veut éditer ce fichier en dehors de l'espace de travail", + "wantsToEditProtected": "Roo veut éditer un fichier de configuration protégé", + "wantsToCreate": "Roo veut créer un nouveau fichier", + "wantsToSearchReplace": "Roo veut effectuer une recherche et remplacement sur ce fichier", + "didSearchReplace": "Roo a effectué une recherche et remplacement sur ce fichier", + "wantsToInsert": "Roo veut insérer du contenu dans ce fichier", + "wantsToInsertWithLineNumber": "Roo veut insérer du contenu dans ce fichier à la ligne {{lineNumber}}", + "wantsToInsertAtEnd": "Roo veut ajouter du contenu à la fin de ce fichier", + "wantsToReadAndXMore": "Roo veut lire ce fichier et {{count}} de plus", + "wantsToReadMultiple": "Roo souhaite lire plusieurs fichiers", + "wantsToApplyBatchChanges": "Roo veut appliquer des modifications à plusieurs fichiers", + "wantsToGenerateImage": "Roo veut générer une image", + "wantsToGenerateImageOutsideWorkspace": "Roo veut générer une image en dehors de l'espace de travail", + "wantsToGenerateImageProtected": "Roo veut générer une image dans un emplacement protégé", + "didGenerateImage": "Roo a généré une image" }, "instructions": { "wantsToFetch": "Roo veut récupérer des instructions détaillées pour aider à la tâche actuelle" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo veut voir les fichiers de premier niveau dans ce répertoire :", - "didViewTopLevel": "Roo a vu les fichiers de premier niveau dans ce répertoire :", - "wantsToViewRecursive": "Roo veut voir récursivement tous les fichiers dans ce répertoire :", - "didViewRecursive": "Roo a vu récursivement tous les fichiers dans ce répertoire :", - "wantsToViewDefinitions": "Roo veut voir les noms de définitions de code source utilisés dans ce répertoire :", - "didViewDefinitions": "Roo a vu les noms de définitions de code source utilisés dans ce répertoire :", - "wantsToSearch": "Roo veut rechercher dans ce répertoire {{regex}} :", - "didSearch": "Roo a recherché dans ce répertoire {{regex}} :", - "wantsToSearchOutsideWorkspace": "Roo veut rechercher dans ce répertoire (hors espace de travail) {{regex}} :", - "didSearchOutsideWorkspace": "Roo a recherché dans ce répertoire (hors espace de travail) {{regex}} :", - "wantsToViewTopLevelOutsideWorkspace": "Roo veut voir les fichiers de premier niveau dans ce répertoire (hors espace de travail) :", - "didViewTopLevelOutsideWorkspace": "Roo a vu les fichiers de premier niveau dans ce répertoire (hors espace de travail) :", - "wantsToViewRecursiveOutsideWorkspace": "Roo veut voir récursivement tous les fichiers dans ce répertoire (hors espace de travail) :", - "didViewRecursiveOutsideWorkspace": "Roo a vu récursivement tous les fichiers dans ce répertoire (hors espace de travail) :", - "wantsToViewDefinitionsOutsideWorkspace": "Roo veut voir les noms de définitions de code source utilisés dans ce répertoire (hors espace de travail) :", - "didViewDefinitionsOutsideWorkspace": "Roo a vu les noms de définitions de code source utilisés dans ce répertoire (hors espace de travail) :" - }, - "commandOutput": "Sortie de commande", + "wantsToViewTopLevel": "Roo veut voir les fichiers de premier niveau dans ce répertoire", + "didViewTopLevel": "Roo a vu les fichiers de premier niveau dans ce répertoire", + "wantsToViewRecursive": "Roo veut voir récursivement tous les fichiers dans ce répertoire", + "didViewRecursive": "Roo a vu récursivement tous les fichiers dans ce répertoire", + "wantsToViewDefinitions": "Roo veut voir les noms de définitions de code source utilisés dans ce répertoire", + "didViewDefinitions": "Roo a vu les noms de définitions de code source utilisés dans ce répertoire", + "wantsToSearch": "Roo veut rechercher dans ce répertoire {{regex}}", + "didSearch": "Roo a recherché dans ce répertoire {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo veut rechercher dans ce répertoire (hors espace de travail) {{regex}}", + "didSearchOutsideWorkspace": "Roo a recherché dans ce répertoire (hors espace de travail) {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo veut voir les fichiers de premier niveau dans ce répertoire (hors espace de travail)", + "didViewTopLevelOutsideWorkspace": "Roo a vu les fichiers de premier niveau dans ce répertoire (hors espace de travail)", + "wantsToViewRecursiveOutsideWorkspace": "Roo veut voir récursivement tous les fichiers dans ce répertoire (hors espace de travail)", + "didViewRecursiveOutsideWorkspace": "Roo a vu récursivement tous les fichiers dans ce répertoire (hors espace de travail)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo veut voir les noms de définitions de code source utilisés dans ce répertoire (hors espace de travail)", + "didViewDefinitionsOutsideWorkspace": "Roo a vu les noms de définitions de code source utilisés dans ce répertoire (hors espace de travail)" + }, + "commandOutput": "Sortie de la Commande", "commandExecution": { + "abort": "Abandonner", "running": "En cours d'exécution", "pid": "PID : {{pid}}", - "exited": "Terminé ({{exitCode}})", - "manageCommands": "Gérer les autorisations de commande", - "commandManagementDescription": "Gérer les autorisations de commande : Cliquez sur ✓ pour autoriser l'exécution automatique, ✗ pour refuser l'exécution. Les modèles peuvent être activés/désactivés ou supprimés des listes. Voir tous les paramètres", + "exitStatus": "Terminé avec le statut {{exitCode}}", + "manageCommands": "Commandes approuvées automatiquement", "addToAllowed": "Ajouter à la liste autorisée", "removeFromAllowed": "Retirer de la liste autorisée", "addToDenied": "Ajouter à la liste refusée", @@ -220,9 +220,15 @@ }, "response": "Réponse", "arguments": "Arguments", + "text": { + "rooSaid": "Roo a dit" + }, + "feedback": { + "youSaid": "Tu as dit" + }, "mcp": { - "wantsToUseTool": "Roo veut utiliser un outil sur le serveur MCP {{serverName}} :", - "wantsToAccessResource": "Roo veut accéder à une ressource sur le serveur MCP {{serverName}} :" + "wantsToUseTool": "Roo veut utiliser un outil sur le serveur MCP {{serverName}}", + "wantsToAccessResource": "Roo veut accéder à une ressource sur le serveur MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo veut passer au mode {{mode}}", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo est passé au mode {{mode}} car : {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo veut créer une nouvelle sous-tâche en mode {{mode}} :", + "wantsToCreate": "Roo veut créer une nouvelle sous-tâche en mode {{mode}}", "wantsToFinish": "Roo veut terminer cette sous-tâche", "newTaskContent": "Instructions de la sous-tâche", "completionContent": "Sous-tâche terminée", @@ -240,7 +246,7 @@ "completionInstructions": "Sous-tâche terminée ! Vous pouvez examiner les résultats et suggérer des corrections ou les prochaines étapes. Si tout semble bon, confirmez pour retourner le résultat à la tâche parente." }, "questions": { - "hasQuestion": "Roo a une question :" + "hasQuestion": "Roo a une question" }, "taskCompleted": "Tâche terminée", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "Gérer les paramètres d'approbation automatique", "tooltipStatus": "Approbation automatique activée pour : {{toggles}}", "title": "Approbation automatique", + "toggle": "Basculer l'approbation automatique", "all": "Tout", "none": "Aucun", "description": "Exécutez ces actions sans demander la permission. N'activez cette option que pour les actions en lesquelles vous avez entièrement confiance.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} est sortie", - "description": "Présentation de Roo Code Cloud : Apporter la puissance de Roo au-delà de l'IDE", - "feature1": "Suivre le progrès des tâches depuis n'importe où (Gratuit) : Obtenir des mises à jour en temps réel sur les tâches de longue durée sans être bloqué dans ton IDE", - "feature2": "Contrôler l'extension Roo à distance (Pro) : Démarre, arrête et interagis avec les tâches depuis une interface de navigateur basée sur le chat.", - "learnMore": "Prêt à prendre le contrôle ? En savoir plus ici.", - "visitCloudButton": "Visiter Roo Code Cloud", - "socialLinks": "Rejoins-nous sur X, Discord, ou r/RooCode" + "stealthModel": { + "feature": "Modèle stealth GRATUIT pour une durée limitée - Code Supernova : Un modèle de codage agentique polyvalent qui prend en charge les entrées d'images, accessible via Roo Code Cloud.", + "note": "(Note : les prompts et complétions sont enregistrés par le créateur du modèle et utilisés pour l'améliorer)", + "connectButton": "Se connecter à Roo Code Cloud", + "selectModel": "Sélectionnez roo/code-supernova du fournisseur Roo Code Cloud dans Paramètres pour commencer.", + "goToSettingsButton": "Aller aux Paramètres" + }, + "socialLinks": "Rejoins-nous sur X, Discord, ou r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo veut utiliser le navigateur :", + "rooWantsToUse": "Roo veut utiliser le navigateur", "consoleLogs": "Journaux de console", "noNewLogs": "(Pas de nouveaux journaux)", "screenshot": "Capture d'écran du navigateur", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Développer le bloc de code", "collapse": "Réduire le bloc de code", - "enable_wrap": "Activer le retour à la ligne", - "disable_wrap": "Désactiver le retour à la ligne", "copy_code": "Copier le code" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo veut rechercher dans la base de code {{query}} :", - "wantsToSearchWithPath": "Roo veut rechercher dans la base de code {{query}} dans {{path}} :", + "wantsToSearch": "Roo veut rechercher dans la base de code {{query}}", + "wantsToSearchWithPath": "Roo veut rechercher dans la base de code {{query}} dans {{path}}", "didSearch_one": "1 résultat trouvé", "didSearch_other": "{{count}} résultats trouvés", "resultTooltip": "Score de similarité : {{score}} (cliquer pour ouvrir le fichier)" @@ -399,23 +406,11 @@ "url": "Coller l'URL pour récupérer le contenu" }, "queuedMessages": { - "title": "Messages en file d'attente :", + "title": "Messages en file d'attente", "clickToEdit": "Cliquez pour modifier le message" }, "slashCommand": { - "wantsToRun": "Roo veut exécuter une commande slash:", - "didRun": "Roo a exécuté une commande slash:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Limite de requêtes auto-approuvées atteinte", - "description": "Roo a atteint la limite de {{count}} requête(s) API auto-approuvée(s). Souhaitez-vous réinitialiser le compteur et poursuivre la tâche ?", - "button": "Réinitialiser et continuer" - }, - "autoApprovedCostLimitReached": { - "title": "Limite de coût auto-approuvé atteinte", - "description": "Roo a atteint la limite de coût auto-approuvé de ${{count}}. Souhaitez-vous réinitialiser le coût et poursuivre la tâche ?", - "button": "Réinitialiser et continuer" - } + "wantsToRun": "Roo veut exécuter une commande slash", + "didRun": "Roo a exécuté une commande slash" } } diff --git a/webview-ui/src/i18n/locales/fr/cloud.json b/webview-ui/src/i18n/locales/fr/cloud.json index 8f32a2628d8..e6e6912be2a 100644 --- a/webview-ui/src/i18n/locales/fr/cloud.json +++ b/webview-ui/src/i18n/locales/fr/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Des difficultés ?", "pasteCallbackUrl": "Copie l'URL de redirect depuis ton navigateur et colle-la ici :", "startOver": "Recommencer", + "personalAccount": "Compte Personnel", + "switchAccount": "Changer de Compte Roo Code Cloud", + "createTeamAccount": "Créer un Compte d'Équipe", "cloudUrlPillLabel": "URL de Roo Code Cloud", "upsell": { "autoApprovePowerUser": "Donner à Roo un peu d'indépendance ? Contrôlez-le de n'importe où avec Roo Code Cloud. En savoir plus.", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index ccb8e61d7a0..4ce7f930f53 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Commandes Slash", "prompts": "Invites", + "ui": "UI", "experimental": "Expérimental", "language": "Langue", "about": "À propos de Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Réinitialiser par défaut" }, "autoApprove": { + "toggleShortcut": "Vous pouvez configurer un raccourci global pour ce paramètre dans les préférences de votre IDE.", "description": "Permettre à Roo d'effectuer automatiquement des opérations sans requérir d'approbation. Activez ces paramètres uniquement si vous faites entièrement confiance à l'IA et que vous comprenez les risques de sécurité associés.", "enabled": "Auto-approbation activée", "toggleAriaLabel": "Activer/désactiver l'approbation automatique", @@ -380,6 +382,8 @@ "modelId": "ID du modèle", "apiKey": "Clé API Ollama", "apiKeyHelp": "Clé API optionnelle pour les instances Ollama authentifiées ou les services cloud. Laissez vide pour les installations locales.", + "numCtx": "Taille de la fenêtre de contexte (num_ctx)", + "numCtxHelp": "Remplace la taille de la fenêtre de contexte par défaut du modèle. Laissez vide pour utiliser la configuration du Modelfile du modèle. La valeur minimale est 128.", "description": "Ollama vous permet d'exécuter des modèles localement sur votre ordinateur. Pour obtenir des instructions sur la mise en route, consultez le guide de démarrage rapide.", "warning": "Remarque : Roo Code utilise des prompts complexes et fonctionne mieux avec les modèles Claude. Les modèles moins performants peuvent ne pas fonctionner comme prévu." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Authentifié de manière sécurisée via ton compte Roo Code Cloud.", "connectButton": "Se connecter à Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Chemin des identifiants OAuth", + "oauthPathDescription": "Chemin vers vos identifiants auth.json de ChatGPT Codex. Par défaut {{defaultPath}} si laissé vide (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex utilise vos identifiants web ChatGPT via le CLI officiel Codex. Authentifiez-vous avec le CLI Codex pour que auth.json soit créé. Si vous utilisez un emplacement personnalisé, définissez ici le chemin complet du fichier.", + "oauthConnectDescription": "Après l'authentification, Roo lira le token d'accès depuis auth.json et se connectera à ChatGPT Responses (Codex).", + "learnMoreLinkText": "En savoir plus sur ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Routage des fournisseurs OpenRouter", @@ -823,7 +834,8 @@ "providerNotAllowed": "Le fournisseur '{{provider}}' n'est pas autorisé par votre organisation", "modelNotAllowed": "Le modèle '{{model}}' n'est pas autorisé pour le fournisseur '{{provider}}' par votre organisation", "profileInvalid": "Ce profil contient un fournisseur ou un modèle qui n'est pas autorisé par votre organisation", - "qwenCodeOauthPath": "Tu dois fournir un chemin valide pour les identifiants OAuth" + "qwenCodeOauthPath": "Tu dois fournir un chemin valide pour les identifiants OAuth", + "openAiNativeCodexOauthPath": "Optionnel : Chemin vers l'auth.json de ChatGPT Codex. Quand vide, par défaut ~/.codex/auth.json." }, "placeholders": { "apiKey": "Saisissez la clé API...", @@ -876,5 +888,11 @@ "output": "Sortie", "cacheReads": "Lectures du cache" } + }, + "ui": { + "collapseThinking": { + "label": "Réduire les messages de réflexion par défaut", + "description": "Si activé, les blocs de réflexion seront réduits par défaut jusqu'à ce que vous interagissiez avec eux" + } } } diff --git a/webview-ui/src/i18n/locales/fr/welcome.json b/webview-ui/src/i18n/locales/fr/welcome.json index 7c3ce18d651..a1e692bb844 100644 --- a/webview-ui/src/i18n/locales/fr/welcome.json +++ b/webview-ui/src/i18n/locales/fr/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Une interface unifiée pour les LLMs" + }, + "roo": { + "description": "Les meilleurs modèles gratuits pour commencer", + "incentive": "Essayez Roo gratuitement" } }, "chooseProvider": "Pour faire sa magie, Roo a besoin d'une clé API.", diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index a82ad90585c..17b5ceef01d 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -61,7 +61,7 @@ "tooltip": "इस क्रिया को स्वीकृत करें" }, "runCommand": { - "title": "कमांड चलाएँ", + "title": "कमांड", "tooltip": "इस कमांड को निष्पादित करें" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "मोड खोजें...", "noResults": "कोई परिणाम नहीं मिला" }, - "errorReadingFile": "फ़ाइल पढ़ने में त्रुटि:", + "errorReadingFile": "फ़ाइल पढ़ने में त्रुटि", "noValidImages": "कोई मान्य चित्र प्रोसेस नहीं किया गया", "separator": "विभाजक", "edit": "संपादित करें...", @@ -163,55 +163,55 @@ "wantsToFetch": "Roo को वर्तमान कार्य में सहायता के लिए विस्तृत निर्देश प्राप्त करना है" }, "fileOperations": { - "wantsToRead": "Roo इस फ़ाइल को पढ़ना चाहता है:", - "wantsToReadOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को पढ़ना चाहता है:", - "didRead": "Roo ने इस फ़ाइल को पढ़ा:", - "wantsToEdit": "Roo इस फ़ाइल को संपादित करना चाहता है:", - "wantsToEditOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को संपादित करना चाहता है:", - "wantsToEditProtected": "Roo एक सुरक्षित कॉन्फ़िगरेशन फ़ाइल को संपादित करना चाहता है:", - "wantsToCreate": "Roo एक नई फ़ाइल बनाना चाहता है:", - "wantsToSearchReplace": "Roo इस फ़ाइल में खोज और प्रतिस्थापन करना चाहता है:", - "didSearchReplace": "Roo ने इस फ़ाइल में खोज और प्रतिस्थापन किया:", - "wantsToInsert": "Roo इस फ़ाइल में सामग्री डालना चाहता है:", - "wantsToInsertWithLineNumber": "Roo इस फ़ाइल की {{lineNumber}} लाइन पर सामग्री डालना चाहता है:", - "wantsToInsertAtEnd": "Roo इस फ़ाइल के अंत में सामग्री जोड़ना चाहता है:", - "wantsToReadAndXMore": "रू इस फ़ाइल को और {{count}} अन्य को पढ़ना चाहता है:", - "wantsToReadMultiple": "Roo कई फ़ाइलें पढ़ना चाहता है:", - "wantsToApplyBatchChanges": "Roo कई फ़ाइलों में परिवर्तन लागू करना चाहता है:", - "wantsToGenerateImage": "Roo एक छवि बनाना चाहता है:", - "wantsToGenerateImageOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर एक छवि बनाना चाहता है:", - "wantsToGenerateImageProtected": "Roo एक संरक्षित स्थान पर छवि बनाना चाहता है:", - "didGenerateImage": "Roo ने एक छवि बनाई:" + "wantsToRead": "Roo इस फ़ाइल को पढ़ना चाहता है", + "wantsToReadOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को पढ़ना चाहता है", + "didRead": "Roo ने इस फ़ाइल को पढ़ा", + "wantsToEdit": "Roo इस फ़ाइल को संपादित करना चाहता है", + "wantsToEditOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को संपादित करना चाहता है", + "wantsToEditProtected": "Roo एक सुरक्षित कॉन्फ़िगरेशन फ़ाइल को संपादित करना चाहता है", + "wantsToCreate": "Roo एक नई फ़ाइल बनाना चाहता है", + "wantsToSearchReplace": "Roo इस फ़ाइल में खोज और प्रतिस्थापन करना चाहता है", + "didSearchReplace": "Roo ने इस फ़ाइल में खोज और प्रतिस्थापन किया", + "wantsToInsert": "Roo इस फ़ाइल में सामग्री डालना चाहता है", + "wantsToInsertWithLineNumber": "Roo इस फ़ाइल की {{lineNumber}} लाइन पर सामग्री डालना चाहता है", + "wantsToInsertAtEnd": "Roo इस फ़ाइल के अंत में सामग्री जोड़ना चाहता है", + "wantsToReadAndXMore": "रू इस फ़ाइल को और {{count}} अन्य को पढ़ना चाहता है", + "wantsToReadMultiple": "Roo कई फ़ाइलें पढ़ना चाहता है", + "wantsToApplyBatchChanges": "Roo कई फ़ाइलों में परिवर्तन लागू करना चाहता है", + "wantsToGenerateImage": "Roo एक छवि बनाना चाहता है", + "wantsToGenerateImageOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर एक छवि बनाना चाहता है", + "wantsToGenerateImageProtected": "Roo एक संरक्षित स्थान पर छवि बनाना चाहता है", + "didGenerateImage": "Roo ने एक छवि बनाई" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo इस निर्देशिका में शीर्ष स्तर की फ़ाइलें देखना चाहता है:", - "didViewTopLevel": "Roo ने इस निर्देशिका में शीर्ष स्तर की फ़ाइलें देखीं:", - "wantsToViewRecursive": "Roo इस निर्देशिका में सभी फ़ाइलों को पुनरावर्ती रूप से देखना चाहता है:", - "didViewRecursive": "Roo ने इस निर्देशिका में सभी फ़ाइलों को पुनरावर्ती रूप से देखा:", - "wantsToViewDefinitions": "Roo इस निर्देशिका में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखना चाहता है:", - "didViewDefinitions": "Roo ने इस निर्देशिका में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखा:", - "wantsToSearch": "Roo इस निर्देशिका में {{regex}} के लिए खोज करना चाहता है:", - "didSearch": "Roo ने इस निर्देशिका में {{regex}} के लिए खोज की:", - "wantsToSearchOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में {{regex}} के लिए खोज करना चाहता है:", - "didSearchOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में {{regex}} के लिए खोज की:", - "wantsToViewTopLevelOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में शीर्ष स्तर की फ़ाइलें देखना चाहता है:", - "didViewTopLevelOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में शीर्ष स्तर की फ़ाइलें देखीं:", - "wantsToViewRecursiveOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में सभी फ़ाइलों को पुनरावर्ती रूप से देखना चाहता है:", - "didViewRecursiveOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में सभी फ़ाइलों को पुनरावर्ती रूप से देखा:", - "wantsToViewDefinitionsOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखना चाहता है:", - "didViewDefinitionsOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखा:" + "wantsToViewTopLevel": "Roo इस निर्देशिका में शीर्ष स्तर की फ़ाइलें देखना चाहता है", + "didViewTopLevel": "Roo ने इस निर्देशिका में शीर्ष स्तर की फ़ाइलें देखीं", + "wantsToViewRecursive": "Roo इस निर्देशिका में सभी फ़ाइलों को पुनरावर्ती रूप से देखना चाहता है", + "didViewRecursive": "Roo ने इस निर्देशिका में सभी फ़ाइलों को पुनरावर्ती रूप से देखा", + "wantsToViewDefinitions": "Roo इस निर्देशिका में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखना चाहता है", + "didViewDefinitions": "Roo ने इस निर्देशिका में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखा", + "wantsToSearch": "Roo इस निर्देशिका में {{regex}} के लिए खोज करना चाहता है", + "didSearch": "Roo ने इस निर्देशिका में {{regex}} के लिए खोज की", + "wantsToSearchOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में {{regex}} के लिए खोज करना चाहता है", + "didSearchOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में {{regex}} के लिए खोज की", + "wantsToViewTopLevelOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में शीर्ष स्तर की फ़ाइलें देखना चाहता है", + "didViewTopLevelOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में शीर्ष स्तर की फ़ाइलें देखीं", + "wantsToViewRecursiveOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में सभी फ़ाइलों को पुनरावर्ती रूप से देखना चाहता है", + "didViewRecursiveOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में सभी फ़ाइलों को पुनरावर्ती रूप से देखा", + "wantsToViewDefinitionsOutsideWorkspace": "Roo इस निर्देशिका (कार्यक्षेत्र के बाहर) में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखना चाहता है", + "didViewDefinitionsOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखा" }, "commandOutput": "कमांड आउटपुट", "commandExecution": { - "running": "चलाया जा रहा है", + "abort": "रद्द करें", + "running": "चल रहा है", "pid": "पीआईडी: {{pid}}", - "exited": "बाहर निकल गया ({{exitCode}})", - "manageCommands": "कमांड अनुमतियाँ प्रबंधित करें", - "commandManagementDescription": "कमांड अनुमतियों का प्रबंधन करें: स्वतः-निष्पादन की अनुमति देने के लिए ✓ पर क्लिक करें, निष्पादन से इनकार करने के लिए ✗ पर क्लिक करें। पैटर्न को चालू/बंद किया जा सकता है या सूचियों से हटाया जा सकता है। सभी सेटिंग्स देखें", + "exitStatus": "{{exitCode}} स्थिति के साथ बाहर निकल गया", + "manageCommands": "स्वतः-अनुमोदित कमांड", "addToAllowed": "अनुमत सूची में जोड़ें", - "removeFromAllowed": "अनुमत सूची से हटाएं", + "removeFromAllowed": "अनुमत सूची से हटाएँ", "addToDenied": "अस्वीकृत सूची में जोड़ें", - "removeFromDenied": "अस्वीकृत सूची से हटाएं", + "removeFromDenied": "अस्वीकृत सूची से हटाएँ", "abortCommand": "कमांड निष्पादन रद्द करें", "expandOutput": "आउटपुट का विस्तार करें", "collapseOutput": "आउटपुट संक्षिप्त करें", @@ -220,9 +220,15 @@ }, "response": "प्रतिक्रिया", "arguments": "आर्ग्युमेंट्स", + "text": { + "rooSaid": "रू ने कहा" + }, + "feedback": { + "youSaid": "आपने कहा" + }, "mcp": { - "wantsToUseTool": "Roo {{serverName}} MCP सर्वर पर एक टूल का उपयोग करना चाहता है:", - "wantsToAccessResource": "Roo {{serverName}} MCP सर्वर पर एक संसाधन का उपयोग करना चाहता है:" + "wantsToUseTool": "Roo {{serverName}} MCP सर्वर पर एक टूल का उपयोग करना चाहता है", + "wantsToAccessResource": "Roo {{serverName}} MCP सर्वर पर एक संसाधन का उपयोग करना चाहता है" }, "modes": { "wantsToSwitch": "Roo {{mode}} मोड में स्विच करना चाहता है", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo {{mode}} मोड में स्विच कर गया क्योंकि: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo {{mode}} मोड में एक नया उपकार्य बनाना चाहता है:", + "wantsToCreate": "Roo {{mode}} मोड में एक नया उपकार्य बनाना चाहता है", "wantsToFinish": "Roo इस उपकार्य को समाप्त करना चाहता है", "newTaskContent": "उपकार्य निर्देश", "completionContent": "उपकार्य पूर्ण", @@ -240,7 +246,7 @@ "completionInstructions": "उपकार्य पूर्ण! आप परिणामों की समीक्षा कर सकते हैं और सुधार या अगले चरण सुझा सकते हैं। यदि सब कुछ ठीक लगता है, तो मुख्य कार्य को परिणाम वापस करने के लिए पुष्टि करें।" }, "questions": { - "hasQuestion": "Roo का एक प्रश्न है:" + "hasQuestion": "Roo का एक प्रश्न है" }, "taskCompleted": "कार्य पूरा हुआ", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "स्वतः-अनुमोदन सेटिंग्स प्रबंधित करें", "tooltipStatus": "स्वतः-अनुमोदन इनके लिए सक्षम है: {{toggles}}", "title": "स्वतः-अनुमोदन", + "toggle": "स्वतः-अनुमोदन टॉगल करें", "all": "सभी", "none": "कोई नहीं", "description": "अनुमति मांगे बिना इन क्रियाओं को चलाएं। इसे केवल उन क्रियाओं के लिए सक्षम करें जिन पर आपको पूरा भरोसा है।", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} रिलीज़ हुआ", - "description": "Roo Code Cloud का परिचय: Roo की शक्ति को IDE से आगे ले जाना", - "feature1": "कहीं से भी कार्य प्रगति ट्रैक करें (निःशुल्क): लंबे समय तक चलने वाले कार्यों के लिए रीयल-टाइम अपडेट प्राप्त करें बिना अपने IDE में फंसे", - "feature2": "Roo एक्सटेंशन को दूर से नियंत्रित करें (Pro): चैट-आधारित ब्राउज़र इंटरफ़ेस से कार्य शुरू करें, रोकें और बातचीत करें।", - "learnMore": "नियंत्रण लेने के लिए तैयार हैं? यहां और जानें।", - "visitCloudButton": "Roo Code Cloud पर जाएं", - "socialLinks": "X, Discord, या r/RooCode पर हमसे जुड़ें" + "stealthModel": { + "feature": "सीमित समय के लिए मुफ़्त स्टेल्थ मॉडल - Code Supernova: एक बहुमुखी एजेंटिक कोडिंग मॉडल जो छवि इनपुट का समर्थन करता है, Roo Code Cloud के माध्यम से उपलब्ध।", + "note": "(नोट: प्रॉम्प्ट्स और कम्प्लीशन्स मॉडल निर्माता द्वारा लॉग किए जाते हैं और मॉडल को बेहतर बनाने के लिए उपयोग किए जाते हैं)", + "connectButton": "Roo Code Cloud से कनेक्ट करें", + "selectModel": "आरंभ करने के लिए सेटिंग्स में Roo Code Cloud प्रोवाइडर से roo/code-supernova चुनें।", + "goToSettingsButton": "सेटिंग्स पर जाएं" + }, + "socialLinks": "X, Discord, या r/RooCode पर हमसे जुड़ें 🚀" }, "browser": { - "rooWantsToUse": "Roo ब्राउज़र का उपयोग करना चाहता है:", + "rooWantsToUse": "Roo ब्राउज़र का उपयोग करना चाहता है", "consoleLogs": "कंसोल लॉग", "noNewLogs": "(कोई नया लॉग नहीं)", "screenshot": "ब्राउज़र स्क्रीनशॉट", @@ -312,8 +321,6 @@ "tooltips": { "expand": "कोड ब्लॉक का विस्तार करें", "collapse": "कोड ब्लॉक को संकुचित करें", - "enable_wrap": "वर्ड रैप सक्षम करें", - "disable_wrap": "वर्ड रैप अक्षम करें", "copy_code": "कोड कॉपी करें" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo कोडबेस में {{query}} खोजना चाहता है:", - "wantsToSearchWithPath": "Roo {{path}} में कोडबेस में {{query}} खोजना चाहता है:", + "wantsToSearch": "Roo कोडबेस में {{query}} खोजना चाहता है", + "wantsToSearchWithPath": "Roo {{path}} में कोडबेस में {{query}} खोजना चाहता है", "didSearch_one": "1 परिणाम मिला", "didSearch_other": "{{count}} परिणाम मिले", "resultTooltip": "समानता स्कोर: {{score}} (फ़ाइल खोलने के लिए क्लिक करें)" @@ -399,23 +406,11 @@ "url": "सामग्री लाने के लिए URL पेस्ट करें" }, "queuedMessages": { - "title": "कतार में संदेश:", + "title": "कतार में संदेश", "clickToEdit": "संदेश संपादित करने के लिए क्लिक करें" }, "slashCommand": { - "wantsToRun": "Roo एक स्लैश कमांड चलाना चाहता है:", - "didRun": "Roo ने एक स्लैश कमांड चलाया:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "स्वतः-अनुमोदित अनुरोध सीमा तक पहुंच गया", - "description": "रू ने {{count}} एपीआई अनुरोध (नों) की स्वतः-अनुमोदित सीमा तक पहुंच गया है। क्या आप गिनती रीसेट करना और कार्य के साथ आगे बढ़ना चाहेंगे?", - "button": "रीसेट करें और जारी रखें" - }, - "autoApprovedCostLimitReached": { - "title": "स्वतः-स्वीकृत लागत सीमा तक पहुंच गया", - "description": "रू ने ${{count}} की स्वतः-अनुमोदित लागत सीमा तक पहुंच गया है। क्या आप लागत को रीसेट करना और कार्य के साथ आगे बढ़ना चाहेंगे?", - "button": "रीसेट करें और जारी रखें" - } + "wantsToRun": "Roo एक स्लैश कमांड चलाना चाहता है", + "didRun": "Roo ने एक स्लैश कमांड चलाया" } } diff --git a/webview-ui/src/i18n/locales/hi/cloud.json b/webview-ui/src/i18n/locales/hi/cloud.json index 2d896575bb8..dd1b1ebca5a 100644 --- a/webview-ui/src/i18n/locales/hi/cloud.json +++ b/webview-ui/src/i18n/locales/hi/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "समस्या हो रही है?", "pasteCallbackUrl": "अपने ब्राउज़र से redirect URL कॉपी करें और यहाँ पेस्ट करें:", "startOver": "फिर से शुरू करें", + "personalAccount": "व्यक्तिगत खाता", + "switchAccount": "Roo Code Cloud खाता बदलें", + "createTeamAccount": "टीम खाता बनाएं", "cloudUrlPillLabel": "Roo Code Cloud URL", "upsell": { "autoApprovePowerUser": "रू को थोड़ी स्वतंत्रता दे रहे हैं? रू कोड क्लाउड के साथ इसे कहीं से भी नियंत्रित करें। और जानें।", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 3d879e2ca74..aee5c979d56 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -30,6 +30,7 @@ "terminal": "टर्मिनल", "slashCommands": "स्लैश कमांड", "prompts": "प्रॉम्प्ट्स", + "ui": "UI", "experimental": "प्रायोगिक", "language": "भाषा", "about": "परिचय" @@ -134,6 +135,7 @@ "resetToDefault": "डिफ़ॉल्ट पर रीसेट करें" }, "autoApprove": { + "toggleShortcut": "आप अपनी आईडीई वरीयताओं में इस सेटिंग के लिए एक वैश्विक शॉर्टकट कॉन्फ़िगर कर सकते हैं।", "description": "Roo को अनुमोदन की आवश्यकता के बिना स्वचालित रूप से ऑपरेशन करने की अनुमति दें। इन सेटिंग्स को केवल तभी सक्षम करें जब आप AI पर पूरी तरह से भरोसा करते हों और संबंधित सुरक्षा जोखिमों को समझते हों।", "enabled": "स्वत:-अनुमोदन सक्षम", "toggleAriaLabel": "स्वतः-अनुमोदन टॉगल करें", @@ -380,6 +382,8 @@ "modelId": "मॉडल ID", "apiKey": "Ollama API Key", "apiKeyHelp": "प्रमाणित Ollama इंस्टेंसेस या क्लाउड सेवाओं के लिए वैकल्पिक API key। स्थानीय इंस्टॉलेशन के लिए खाली छोड़ें।", + "numCtx": "संदर्भ विंडो आकार (num_ctx)", + "numCtxHelp": "मॉडल के डिफ़ॉल्ट संदर्भ विंडो आकार को ओवरराइड करें। मॉडल की मॉडलफ़ाइल कॉन्फ़िगरेशन का उपयोग करने के लिए खाली छोड़ दें। न्यूनतम मान 128 है।", "description": "Ollama आपको अपने कंप्यूटर पर स्थानीय रूप से मॉडल चलाने की अनुमति देता है। आरंभ करने के निर्देशों के लिए, उनकी क्विकस्टार्ट गाइड देखें।", "warning": "नोट: Roo Code जटिल प्रॉम्प्ट्स का उपयोग करता है और Claude मॉडल के साथ सबसे अच्छा काम करता है। कम क्षमता वाले मॉडल अपेक्षित रूप से काम नहीं कर सकते हैं।" }, @@ -395,6 +399,13 @@ "authenticatedMessage": "आपके Roo Code Cloud खाते के माध्यम से सुरक्षित रूप से प्रमाणित।", "connectButton": "Roo Code Cloud से कनेक्ट करें" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth क्रेडेंशियल पथ", + "oauthPathDescription": "आपके ChatGPT Codex auth.json क्रेडेंशियल का पथ। यदि खाली छोड़ा जाए तो डिफ़ॉल्ट {{defaultPath}} (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json)।", + "oauthCliDescription": "ChatGPT Codex आधिकारिक Codex CLI के माध्यम से आपके ChatGPT वेब क्रेडेंशियल का उपयोग करता है। Codex CLI के साथ प्रमाणित करें ताकि auth.json बनाया जा सके। यदि आप कस्टम स्थान का उपयोग करते हैं, तो यहाँ पूरा फ़ाइल पथ सेट करें।", + "oauthConnectDescription": "प्रमाणीकरण के बाद, Roo auth.json से एक्सेस टोकन पढ़ेगा और ChatGPT Responses (Codex) से कनेक्ट होगा।", + "learnMoreLinkText": "ChatGPT के बारे में और जानें" + }, "openRouter": { "providerRouting": { "title": "OpenRouter प्रदाता रूटिंग", @@ -824,7 +835,8 @@ "providerNotAllowed": "प्रदाता '{{provider}}' आपके संगठन द्वारा अनुमत नहीं है", "modelNotAllowed": "मॉडल '{{model}}' प्रदाता '{{provider}}' के लिए आपके संगठन द्वारा अनुमत नहीं है", "profileInvalid": "इस प्रोफ़ाइल में एक प्रदाता या मॉडल शामिल है जो आपके संगठन द्वारा अनुमत नहीं है", - "qwenCodeOauthPath": "आपको एक वैध OAuth क्रेडेंशियल पथ प्रदान करना होगा" + "qwenCodeOauthPath": "आपको एक वैध OAuth क्रेडेंशियल पथ प्रदान करना होगा", + "openAiNativeCodexOauthPath": "वैकल्पिक: ChatGPT Codex auth.json का पथ। जब खाली हो, तो डिफ़ॉल्ट ~/.codex/auth.json है।" }, "placeholders": { "apiKey": "API कुंजी दर्ज करें...", @@ -877,5 +889,11 @@ "output": "आउटपुट", "cacheReads": "कैश रीड" } + }, + "ui": { + "collapseThinking": { + "label": "सोच संदेशों को डिफ़ॉल्ट रूप से संक्षिप्त करें", + "description": "सक्षम होने पर, सोच ब्लॉक आपके द्वारा उनके साथ इंटरैक्ट करने तक डिफ़ॉल्ट रूप से संक्षिप्त रहेंगे" + } } } diff --git a/webview-ui/src/i18n/locales/hi/welcome.json b/webview-ui/src/i18n/locales/hi/welcome.json index 03dffc9052f..279f588d706 100644 --- a/webview-ui/src/i18n/locales/hi/welcome.json +++ b/webview-ui/src/i18n/locales/hi/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "LLMs के लिए एक एकीकृत इंटरफेस" + }, + "roo": { + "description": "शुरू करने के लिए सर्वोत्तम निःशुल्क मॉडल", + "incentive": "Roo को निःशुल्क आज़माएं" } }, "chooseProvider": "अपना जादू दिखाने के लिए, Roo को एक API कुंजी की आवश्यकता है।", diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index 6c6d59474ec..532ab413031 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -75,8 +75,8 @@ } }, "runCommand": { - "title": "Jalankan Perintah", - "tooltip": "Eksekusi perintah ini" + "title": "Perintah", + "tooltip": "Jalankan perintah ini" }, "proceedWhileRunning": { "title": "Lanjutkan Saat Berjalan", @@ -139,7 +139,7 @@ "addContext": "@ untuk menambah konteks, / untuk perintah", "dragFiles": "tahan shift untuk drag file", "dragFilesImages": "tahan shift untuk drag file/gambar", - "errorReadingFile": "Error membaca file:", + "errorReadingFile": "Error membaca file", "noValidImages": "Tidak ada gambar valid yang diproses", "separator": "Pemisah", "edit": "Edit...", @@ -178,73 +178,79 @@ "wantsToFetch": "Roo ingin mengambil instruksi detail untuk membantu tugas saat ini" }, "fileOperations": { - "wantsToRead": "Roo ingin membaca file ini:", - "wantsToReadMultiple": "Roo ingin membaca beberapa file:", - "wantsToReadAndXMore": "Roo ingin membaca file ini dan {{count}} lainnya:", - "wantsToReadOutsideWorkspace": "Roo ingin membaca file ini di luar workspace:", - "didRead": "Roo membaca file ini:", - "wantsToEdit": "Roo ingin mengedit file ini:", - "wantsToEditOutsideWorkspace": "Roo ingin mengedit file ini di luar workspace:", - "wantsToEditProtected": "Roo ingin mengedit file konfigurasi yang dilindungi:", - "wantsToApplyBatchChanges": "Roo ingin menerapkan perubahan ke beberapa file:", - "wantsToGenerateImage": "Roo ingin menghasilkan gambar:", - "wantsToGenerateImageOutsideWorkspace": "Roo ingin menghasilkan gambar di luar workspace:", - "wantsToGenerateImageProtected": "Roo ingin menghasilkan gambar di lokasi yang dilindungi:", - "didGenerateImage": "Roo telah menghasilkan gambar:", - "wantsToCreate": "Roo ingin membuat file baru:", - "wantsToSearchReplace": "Roo ingin mencari dan mengganti di file ini:", - "didSearchReplace": "Roo melakukan pencarian dan penggantian pada file ini:", - "wantsToInsert": "Roo ingin menyisipkan konten ke file ini:", - "wantsToInsertWithLineNumber": "Roo ingin menyisipkan konten ke file ini di baris {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo ingin menambahkan konten ke akhir file ini:" + "wantsToRead": "Roo ingin membaca file ini", + "wantsToReadMultiple": "Roo ingin membaca beberapa file", + "wantsToReadAndXMore": "Roo ingin membaca file ini dan {{count}} lainnya", + "wantsToReadOutsideWorkspace": "Roo ingin membaca file ini di luar workspace", + "didRead": "Roo membaca file ini", + "wantsToEdit": "Roo ingin mengedit file ini", + "wantsToEditOutsideWorkspace": "Roo ingin mengedit file ini di luar workspace", + "wantsToEditProtected": "Roo ingin mengedit file konfigurasi yang dilindungi", + "wantsToApplyBatchChanges": "Roo ingin menerapkan perubahan ke beberapa file", + "wantsToGenerateImage": "Roo ingin menghasilkan gambar", + "wantsToGenerateImageOutsideWorkspace": "Roo ingin menghasilkan gambar di luar workspace", + "wantsToGenerateImageProtected": "Roo ingin menghasilkan gambar di lokasi yang dilindungi", + "didGenerateImage": "Roo telah menghasilkan gambar", + "wantsToCreate": "Roo ingin membuat file baru", + "wantsToSearchReplace": "Roo ingin mencari dan mengganti di file ini", + "didSearchReplace": "Roo melakukan pencarian dan penggantian pada file ini", + "wantsToInsert": "Roo ingin menyisipkan konten ke file ini", + "wantsToInsertWithLineNumber": "Roo ingin menyisipkan konten ke file ini di baris {{lineNumber}}", + "wantsToInsertAtEnd": "Roo ingin menambahkan konten ke akhir file ini" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo ingin melihat file tingkat atas di direktori ini:", - "didViewTopLevel": "Roo melihat file tingkat atas di direktori ini:", - "wantsToViewRecursive": "Roo ingin melihat semua file secara rekursif di direktori ini:", - "didViewRecursive": "Roo melihat semua file secara rekursif di direktori ini:", - "wantsToViewDefinitions": "Roo ingin melihat nama definisi source code yang digunakan di direktori ini:", - "didViewDefinitions": "Roo melihat nama definisi source code yang digunakan di direktori ini:", - "wantsToSearch": "Roo ingin mencari direktori ini untuk {{regex}}:", - "didSearch": "Roo mencari direktori ini untuk {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo ingin mencari direktori ini (di luar workspace) untuk {{regex}}:", - "didSearchOutsideWorkspace": "Roo mencari direktori ini (di luar workspace) untuk {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo ingin melihat file tingkat atas di direktori ini (di luar workspace):", - "didViewTopLevelOutsideWorkspace": "Roo melihat file tingkat atas di direktori ini (di luar workspace):", - "wantsToViewRecursiveOutsideWorkspace": "Roo ingin melihat semua file secara rekursif di direktori ini (di luar workspace):", - "didViewRecursiveOutsideWorkspace": "Roo melihat semua file secara rekursif di direktori ini (di luar workspace):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo ingin melihat nama definisi source code yang digunakan di direktori ini (di luar workspace):", - "didViewDefinitionsOutsideWorkspace": "Roo melihat nama definisi source code yang digunakan di direktori ini (di luar workspace):" + "wantsToViewTopLevel": "Roo ingin melihat file tingkat atas di direktori ini", + "didViewTopLevel": "Roo melihat file tingkat atas di direktori ini", + "wantsToViewRecursive": "Roo ingin melihat semua file secara rekursif di direktori ini", + "didViewRecursive": "Roo melihat semua file secara rekursif di direktori ini", + "wantsToViewDefinitions": "Roo ingin melihat nama definisi source code yang digunakan di direktori ini", + "didViewDefinitions": "Roo melihat nama definisi source code yang digunakan di direktori ini", + "wantsToSearch": "Roo ingin mencari direktori ini untuk {{regex}}", + "didSearch": "Roo mencari direktori ini untuk {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo ingin mencari direktori ini (di luar workspace) untuk {{regex}}", + "didSearchOutsideWorkspace": "Roo mencari direktori ini (di luar workspace) untuk {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo ingin melihat file tingkat atas di direktori ini (di luar workspace)", + "didViewTopLevelOutsideWorkspace": "Roo melihat file tingkat atas di direktori ini (di luar workspace)", + "wantsToViewRecursiveOutsideWorkspace": "Roo ingin melihat semua file secara rekursif di direktori ini (di luar workspace)", + "didViewRecursiveOutsideWorkspace": "Roo melihat semua file secara rekursif di direktori ini (di luar workspace)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo ingin melihat nama definisi source code yang digunakan di direktori ini (di luar workspace)", + "didViewDefinitionsOutsideWorkspace": "Roo melihat nama definisi source code yang digunakan di direktori ini (di luar workspace)" }, "codebaseSearch": { - "wantsToSearch": "Roo ingin mencari codebase untuk {{query}}:", - "wantsToSearchWithPath": "Roo ingin mencari codebase untuk {{query}} di {{path}}:", + "wantsToSearch": "Roo ingin mencari codebase untuk {{query}}", + "wantsToSearchWithPath": "Roo ingin mencari codebase untuk {{query}} di {{path}}", "didSearch_one": "Ditemukan 1 hasil", "didSearch_other": "Ditemukan {{count}} hasil", "resultTooltip": "Skor kemiripan: {{score}} (klik untuk membuka file)" }, - "commandOutput": "Output Perintah", + "commandOutput": "Keluaran Perintah", "commandExecution": { + "abort": "Batalkan", "running": "Menjalankan", "pid": "PID: {{pid}}", - "exited": "Keluar ({{exitCode}})", - "manageCommands": "Kelola Izin Perintah", - "commandManagementDescription": "Kelola izin perintah: Klik ✓ untuk mengizinkan eksekusi otomatis, ✗ untuk menolak eksekusi. Pola dapat diaktifkan/dinonaktifkan atau dihapus dari daftar. Lihat semua pengaturan", + "exitStatus": "Keluar dengan status {{exitCode}}", + "manageCommands": "Perintah yang disetujui secara otomatis", "addToAllowed": "Tambahkan ke daftar yang diizinkan", "removeFromAllowed": "Hapus dari daftar yang diizinkan", "addToDenied": "Tambahkan ke daftar yang ditolak", "removeFromDenied": "Hapus dari daftar yang ditolak", "abortCommand": "Batalkan eksekusi perintah", - "expandOutput": "Perluas output", - "collapseOutput": "Ciutkan output", + "expandOutput": "Perluas keluaran", + "collapseOutput": "Ciutkan keluaran", "expandManagement": "Perluas bagian manajemen perintah", "collapseManagement": "Ciutkan bagian manajemen perintah" }, "response": "Respons", "arguments": "Argumen", + "text": { + "rooSaid": "Roo berkata" + }, + "feedback": { + "youSaid": "Anda bilang" + }, "mcp": { - "wantsToUseTool": "Roo ingin menggunakan tool di server MCP {{serverName}}:", - "wantsToAccessResource": "Roo ingin mengakses resource di server MCP {{serverName}}:" + "wantsToUseTool": "Roo ingin menggunakan tool di server MCP {{serverName}}", + "wantsToAccessResource": "Roo ingin mengakses resource di server MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo ingin beralih ke mode {{mode}}", @@ -253,7 +259,7 @@ "didSwitchWithReason": "Roo beralih ke mode {{mode}} karena: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo ingin membuat subtugas baru dalam mode {{mode}}:", + "wantsToCreate": "Roo ingin membuat subtugas baru dalam mode {{mode}}", "wantsToFinish": "Roo ingin menyelesaikan subtugas ini", "newTaskContent": "Instruksi Subtugas", "completionContent": "Subtugas Selesai", @@ -262,7 +268,7 @@ "completionInstructions": "Subtugas selesai! Kamu bisa meninjau hasilnya dan menyarankan koreksi atau langkah selanjutnya. Jika semuanya terlihat baik, konfirmasi untuk mengembalikan hasil ke tugas induk." }, "questions": { - "hasQuestion": "Roo punya pertanyaan:" + "hasQuestion": "Roo punya pertanyaan" }, "taskCompleted": "Tugas Selesai", "error": "Error", @@ -277,6 +283,7 @@ "tooltipManage": "Kelola pengaturan persetujuan otomatis", "tooltipStatus": "Persetujuan otomatis diaktifkan untuk: {{toggles}}", "title": "Setujui Otomatis", + "toggle": "Beralih persetujuan otomatis", "all": "Semua", "none": "Tidak ada", "description": "Jalankan tindakan ini tanpa meminta izin. Hanya aktifkan untuk tindakan yang Anda percayai sepenuhnya.", @@ -291,12 +298,14 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} Dirilis", - "description": "Memperkenalkan Roo Code Cloud: Membawa kekuatan Roo melampaui IDE", - "feature1": "Lacak kemajuan tugas dari mana saja (Gratis): Dapatkan pembaruan real-time tentang tugas yang berjalan lama tanpa terjebak di IDE Anda", - "feature2": "Kontrol Ekstensi Roo dari jarak jauh (Pro): Mulai, hentikan, dan berinteraksi dengan tugas dari antarmuka browser berbasis chat.", - "learnMore": "Siap mengambil kontrol? Pelajari lebih lanjut di sini.", - "visitCloudButton": "Kunjungi Roo Code Cloud", - "socialLinks": "Bergabunglah dengan kami di X, Discord, atau r/RooCode" + "stealthModel": { + "feature": "Model stealth GRATIS waktu terbatas - Code Supernova: Model coding agentik serbaguna yang mendukung input gambar, tersedia melalui Roo Code Cloud.", + "note": "(Catatan: prompt dan completion dicatat oleh pembuat model dan digunakan untuk meningkatkan model)", + "connectButton": "Hubungkan ke Roo Code Cloud", + "selectModel": "Pilih roo/code-supernova dari penyedia Roo Code Cloud di Pengaturan untuk memulai.", + "goToSettingsButton": "Pergi ke Pengaturan" + }, + "socialLinks": "Bergabunglah dengan kami di X, Discord, atau r/RooCode 🚀" }, "reasoning": { "thinking": "Berpikir", @@ -308,7 +317,7 @@ "countdownDisplay": "{{count}}dtk" }, "browser": { - "rooWantsToUse": "Roo ingin menggunakan browser:", + "rooWantsToUse": "Roo ingin menggunakan browser", "consoleLogs": "Log Konsol", "noNewLogs": "(Tidak ada log baru)", "screenshot": "Screenshot browser", @@ -333,8 +342,6 @@ "tooltips": { "expand": "Perluas blok kode", "collapse": "Tutup blok kode", - "enable_wrap": "Aktifkan word wrap", - "disable_wrap": "Nonaktifkan word wrap", "copy_code": "Salin kode" } }, @@ -405,23 +412,11 @@ "url": "Tempel URL untuk mengambil konten" }, "queuedMessages": { - "title": "Pesan Antrian:", + "title": "Pesan Antrian", "clickToEdit": "Klik untuk mengedit pesan" }, "slashCommand": { - "wantsToRun": "Roo ingin menjalankan perintah slash:", - "didRun": "Roo telah menjalankan perintah slash:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Batas Permintaan yang Disetujui Otomatis Tercapai", - "description": "Roo telah mencapai batas {{count}} permintaan API yang disetujui otomatis. Apakah Anda ingin mengatur ulang hitungan dan melanjutkan tugas?", - "button": "Setel Ulang dan Lanjutkan" - }, - "autoApprovedCostLimitReached": { - "title": "Batas Biaya yang Disetujui Otomatis Tercapai", - "description": "Roo telah mencapai batas biaya yang disetujui otomatis sebesar ${{count}}. Apakah Anda ingin mengatur ulang biaya dan melanjutkan tugas?", - "button": "Setel Ulang dan Lanjutkan" - } + "wantsToRun": "Roo ingin menjalankan perintah slash", + "didRun": "Roo telah menjalankan perintah slash" } } diff --git a/webview-ui/src/i18n/locales/id/cloud.json b/webview-ui/src/i18n/locales/id/cloud.json index 8af9b197ede..40d4c1e7b3e 100644 --- a/webview-ui/src/i18n/locales/id/cloud.json +++ b/webview-ui/src/i18n/locales/id/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Ada masalah?", "pasteCallbackUrl": "Salin URL redirect dari browser dan tempel di sini:", "startOver": "Mulai dari awal", + "personalAccount": "Akun Pribadi", + "switchAccount": "Ganti Akun Roo Code Cloud", + "createTeamAccount": "Buat Akun Tim", "cloudUrlPillLabel": "URL Roo Code Cloud", "upsell": { "autoApprovePowerUser": "Memberi Roo sedikit kebebasan? Kendalikan dari mana saja dengan Roo Code Cloud. Pelajari lebih lanjut.", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 8138726c335..e24d2f57ebc 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Perintah Slash", "prompts": "Prompt", + "ui": "UI", "experimental": "Eksperimental", "language": "Bahasa", "about": "Tentang Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Reset ke default" }, "autoApprove": { + "toggleShortcut": "Anda dapat mengonfigurasi pintasan global untuk pengaturan ini di preferensi IDE Anda.", "description": "Izinkan Roo untuk secara otomatis melakukan operasi tanpa memerlukan persetujuan. Aktifkan pengaturan ini hanya jika kamu sepenuhnya mempercayai AI dan memahami risiko keamanan yang terkait.", "enabled": "Auto-Approve Diaktifkan", "toggleAriaLabel": "Beralih persetujuan otomatis", @@ -384,6 +386,8 @@ "modelId": "Model ID", "apiKey": "Ollama API Key", "apiKeyHelp": "API key opsional untuk instance Ollama yang terautentikasi atau layanan cloud. Biarkan kosong untuk instalasi lokal.", + "numCtx": "Ukuran Jendela Konteks (num_ctx)", + "numCtxHelp": "Ganti ukuran jendela konteks default model. Biarkan kosong untuk menggunakan konfigurasi Modelfile model. Nilai minimum adalah 128.", "description": "Ollama memungkinkan kamu menjalankan model secara lokal di komputer. Untuk instruksi cara memulai, lihat panduan quickstart mereka.", "warning": "Catatan: Roo Code menggunakan prompt kompleks dan bekerja terbaik dengan model Claude. Model yang kurang mampu mungkin tidak bekerja seperti yang diharapkan." }, @@ -399,6 +403,13 @@ "authenticatedMessage": "Terautentikasi dengan aman melalui akun Roo Code Cloud Anda.", "connectButton": "Hubungkan ke Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Jalur Kredensial OAuth", + "oauthPathDescription": "Jalur ke kredensial auth.json ChatGPT Codex Anda. Default ke {{defaultPath}} jika dibiarkan kosong (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex menggunakan kredensial web ChatGPT Anda melalui CLI Codex resmi. Autentikasi dengan CLI Codex agar auth.json dibuat. Jika Anda menggunakan lokasi kustom, atur jalur file lengkap di sini.", + "oauthConnectDescription": "Setelah autentikasi, Roo akan membaca token akses dari auth.json dan terhubung ke ChatGPT Responses (Codex).", + "learnMoreLinkText": "Pelajari lebih lanjut tentang ChatGPT" + }, "openRouter": { "providerRouting": { "title": "OpenRouter Provider Routing", @@ -853,7 +864,8 @@ "providerNotAllowed": "Provider '{{provider}}' tidak diizinkan oleh organisasi kamu", "modelNotAllowed": "Model '{{model}}' tidak diizinkan untuk provider '{{provider}}' oleh organisasi kamu", "profileInvalid": "Profil ini berisi provider atau model yang tidak diizinkan oleh organisasi kamu", - "qwenCodeOauthPath": "Kamu harus memberikan jalur kredensial OAuth yang valid" + "qwenCodeOauthPath": "Kamu harus memberikan jalur kredensial OAuth yang valid", + "openAiNativeCodexOauthPath": "Opsional: Jalur ke auth.json ChatGPT Codex. Ketika kosong, default ke ~/.codex/auth.json." }, "placeholders": { "apiKey": "Masukkan API Key...", @@ -906,5 +918,11 @@ "output": "Output", "cacheReads": "Pembacaan cache" } + }, + "ui": { + "collapseThinking": { + "label": "Ciutkan pesan Berpikir secara default", + "description": "Jika diaktifkan, blok berpikir akan diciutkan secara default sampai Anda berinteraksi dengannya" + } } } diff --git a/webview-ui/src/i18n/locales/id/welcome.json b/webview-ui/src/i18n/locales/id/welcome.json index 49efa819e2f..73eacc3b1e0 100644 --- a/webview-ui/src/i18n/locales/id/welcome.json +++ b/webview-ui/src/i18n/locales/id/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Interface terpadu untuk LLM" + }, + "roo": { + "description": "Model gratis terbaik untuk memulai", + "incentive": "Coba Roo gratis" } }, "chooseProvider": "Untuk melakukan keajaibannya, Roo membutuhkan API key.", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 9ec5df2a769..fd3bf967d32 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -61,7 +61,7 @@ "tooltip": "Approva questa azione" }, "runCommand": { - "title": "Esegui comando", + "title": "Comando", "tooltip": "Esegui questo comando" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Cerca modalità...", "noResults": "Nessun risultato trovato" }, - "errorReadingFile": "Errore nella lettura del file:", + "errorReadingFile": "Errore nella lettura del file", "noValidImages": "Nessuna immagine valida è stata elaborata", "separator": "Separatore", "edit": "Modifica...", @@ -163,66 +163,72 @@ "current": "Corrente" }, "fileOperations": { - "wantsToRead": "Roo vuole leggere questo file:", - "wantsToReadOutsideWorkspace": "Roo vuole leggere questo file al di fuori dell'area di lavoro:", - "didRead": "Roo ha letto questo file:", - "wantsToEdit": "Roo vuole modificare questo file:", - "wantsToEditOutsideWorkspace": "Roo vuole modificare questo file al di fuori dell'area di lavoro:", - "wantsToEditProtected": "Roo vuole modificare un file di configurazione protetto:", - "wantsToCreate": "Roo vuole creare un nuovo file:", - "wantsToSearchReplace": "Roo vuole eseguire ricerca e sostituzione in questo file:", - "didSearchReplace": "Roo ha eseguito ricerca e sostituzione in questo file:", - "wantsToInsert": "Roo vuole inserire contenuto in questo file:", - "wantsToInsertWithLineNumber": "Roo vuole inserire contenuto in questo file alla riga {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo vuole aggiungere contenuto alla fine di questo file:", - "wantsToReadAndXMore": "Roo vuole leggere questo file e altri {{count}}:", - "wantsToReadMultiple": "Roo vuole leggere più file:", - "wantsToApplyBatchChanges": "Roo vuole applicare modifiche a più file:", - "wantsToGenerateImage": "Roo vuole generare un'immagine:", - "wantsToGenerateImageOutsideWorkspace": "Roo vuole generare un'immagine fuori dall'area di lavoro:", - "wantsToGenerateImageProtected": "Roo vuole generare un'immagine in una posizione protetta:", - "didGenerateImage": "Roo ha generato un'immagine:" + "wantsToRead": "Roo vuole leggere questo file", + "wantsToReadOutsideWorkspace": "Roo vuole leggere questo file al di fuori dell'area di lavoro", + "didRead": "Roo ha letto questo file", + "wantsToEdit": "Roo vuole modificare questo file", + "wantsToEditOutsideWorkspace": "Roo vuole modificare questo file al di fuori dell'area di lavoro", + "wantsToEditProtected": "Roo vuole modificare un file di configurazione protetto", + "wantsToCreate": "Roo vuole creare un nuovo file", + "wantsToSearchReplace": "Roo vuole eseguire ricerca e sostituzione in questo file", + "didSearchReplace": "Roo ha eseguito ricerca e sostituzione in questo file", + "wantsToInsert": "Roo vuole inserire contenuto in questo file", + "wantsToInsertWithLineNumber": "Roo vuole inserire contenuto in questo file alla riga {{lineNumber}}", + "wantsToInsertAtEnd": "Roo vuole aggiungere contenuto alla fine di questo file", + "wantsToReadAndXMore": "Roo vuole leggere questo file e altri {{count}}", + "wantsToReadMultiple": "Roo vuole leggere più file", + "wantsToApplyBatchChanges": "Roo vuole applicare modifiche a più file", + "wantsToGenerateImage": "Roo vuole generare un'immagine", + "wantsToGenerateImageOutsideWorkspace": "Roo vuole generare un'immagine fuori dall'area di lavoro", + "wantsToGenerateImageProtected": "Roo vuole generare un'immagine in una posizione protetta", + "didGenerateImage": "Roo ha generato un'immagine" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo vuole visualizzare i file di primo livello in questa directory:", - "didViewTopLevel": "Roo ha visualizzato i file di primo livello in questa directory:", - "wantsToViewRecursive": "Roo vuole visualizzare ricorsivamente tutti i file in questa directory:", - "didViewRecursive": "Roo ha visualizzato ricorsivamente tutti i file in questa directory:", - "wantsToViewDefinitions": "Roo vuole visualizzare i nomi delle definizioni di codice sorgente utilizzate in questa directory:", - "didViewDefinitions": "Roo ha visualizzato i nomi delle definizioni di codice sorgente utilizzate in questa directory:", - "wantsToSearch": "Roo vuole cercare in questa directory {{regex}}:", - "didSearch": "Roo ha cercato in questa directory {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo vuole cercare in questa directory (fuori dall'area di lavoro) {{regex}}:", - "didSearchOutsideWorkspace": "Roo ha cercato in questa directory (fuori dall'area di lavoro) {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo vuole visualizzare i file di primo livello in questa directory (fuori dall'area di lavoro):", - "didViewTopLevelOutsideWorkspace": "Roo ha visualizzato i file di primo livello in questa directory (fuori dall'area di lavoro):", - "wantsToViewRecursiveOutsideWorkspace": "Roo vuole visualizzare ricorsivamente tutti i file in questa directory (fuori dall'area di lavoro):", - "didViewRecursiveOutsideWorkspace": "Roo ha visualizzato ricorsivamente tutti i file in questa directory (fuori dall'area di lavoro):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo vuole visualizzare i nomi delle definizioni di codice sorgente utilizzate in questa directory (fuori dall'area di lavoro):", - "didViewDefinitionsOutsideWorkspace": "Roo ha visualizzato i nomi delle definizioni di codice sorgente utilizzate in questa directory (fuori dall'area di lavoro):" - }, - "commandOutput": "Output del comando", + "wantsToViewTopLevel": "Roo vuole visualizzare i file di primo livello in questa directory", + "didViewTopLevel": "Roo ha visualizzato i file di primo livello in questa directory", + "wantsToViewRecursive": "Roo vuole visualizzare ricorsivamente tutti i file in questa directory", + "didViewRecursive": "Roo ha visualizzato ricorsivamente tutti i file in questa directory", + "wantsToViewDefinitions": "Roo vuole visualizzare i nomi delle definizioni di codice sorgente utilizzate in questa directory", + "didViewDefinitions": "Roo ha visualizzato i nomi delle definizioni di codice sorgente utilizzate in questa directory", + "wantsToSearch": "Roo vuole cercare in questa directory {{regex}}", + "didSearch": "Roo ha cercato in questa directory {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo vuole cercare in questa directory (fuori dall'area di lavoro) {{regex}}", + "didSearchOutsideWorkspace": "Roo ha cercato in questa directory (fuori dall'area di lavoro) {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo vuole visualizzare i file di primo livello in questa directory (fuori dall'area di lavoro)", + "didViewTopLevelOutsideWorkspace": "Roo ha visualizzato i file di primo livello in questa directory (fuori dall'area di lavoro)", + "wantsToViewRecursiveOutsideWorkspace": "Roo vuole visualizzare ricorsivamente tutti i file in questa directory (fuori dall'area di lavoro)", + "didViewRecursiveOutsideWorkspace": "Roo ha visualizzato ricorsivamente tutti i file in questa directory (fuori dall'area di lavoro)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo vuole visualizzare i nomi delle definizioni di codice sorgente utilizzate in questa directory (fuori dall'area di lavoro)", + "didViewDefinitionsOutsideWorkspace": "Roo ha visualizzato i nomi delle definizioni di codice sorgente utilizzate in questa directory (fuori dall'area di lavoro)" + }, + "commandOutput": "Output del Comando", "commandExecution": { + "abort": "Interrompi", "running": "In esecuzione", "pid": "PID: {{pid}}", - "exited": "Terminato ({{exitCode}})", - "manageCommands": "Gestisci autorizzazioni comandi", - "commandManagementDescription": "Gestisci le autorizzazioni dei comandi: fai clic su ✓ per consentire l'esecuzione automatica, ✗ per negare l'esecuzione. I pattern possono essere attivati/disattivati o rimossi dagli elenchi. Visualizza tutte le impostazioni", - "addToAllowed": "Aggiungi all'elenco consentiti", - "removeFromAllowed": "Rimuovi dall'elenco consentiti", - "addToDenied": "Aggiungi all'elenco negati", - "removeFromDenied": "Rimuovi dall'elenco negati", - "abortCommand": "Interrompi esecuzione comando", + "exitStatus": "Uscito con stato {{exitCode}}", + "manageCommands": "Comandi approvati automaticamente", + "addToAllowed": "Aggiungi alla lista dei permessi", + "removeFromAllowed": "Rimuovi dalla lista dei permessi", + "addToDenied": "Aggiungi alla lista dei negati", + "removeFromDenied": "Rimuovi dalla lista dei negati", + "abortCommand": "Interrompi esecuzione del comando", "expandOutput": "Espandi output", "collapseOutput": "Comprimi output", - "expandManagement": "Espandi la sezione di gestione dei comandi", - "collapseManagement": "Comprimi la sezione di gestione dei comandi" + "expandManagement": "Espandi sezione gestione comandi", + "collapseManagement": "Comprimi sezione gestione comandi" }, "response": "Risposta", "arguments": "Argomenti", + "text": { + "rooSaid": "Roo ha detto" + }, + "feedback": { + "youSaid": "Hai detto" + }, "mcp": { - "wantsToUseTool": "Roo vuole utilizzare uno strumento sul server MCP {{serverName}}:", - "wantsToAccessResource": "Roo vuole accedere a una risorsa sul server MCP {{serverName}}:" + "wantsToUseTool": "Roo vuole utilizzare uno strumento sul server MCP {{serverName}}", + "wantsToAccessResource": "Roo vuole accedere a una risorsa sul server MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo vuole passare alla modalità {{mode}}", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo è passato alla modalità {{mode}} perché: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo vuole creare una nuova sottoattività in modalità {{mode}}:", + "wantsToCreate": "Roo vuole creare una nuova sottoattività in modalità {{mode}}", "wantsToFinish": "Roo vuole completare questa sottoattività", "newTaskContent": "Istruzioni sottoattività", "completionContent": "Sottoattività completata", @@ -240,7 +246,7 @@ "completionInstructions": "Sottoattività completata! Puoi rivedere i risultati e suggerire correzioni o prossimi passi. Se tutto sembra a posto, conferma per restituire il risultato all'attività principale." }, "questions": { - "hasQuestion": "Roo ha una domanda:" + "hasQuestion": "Roo ha una domanda" }, "taskCompleted": "Attività completata", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "Gestisci impostazioni di approvazione automatica", "tooltipStatus": "Approvazione automatica abilitata per: {{toggles}}", "title": "Approvazione Automatica", + "toggle": "Attiva/disattiva approvazione automatica", "all": "Tutti", "none": "Nessuno", "description": "Esegui queste azioni senza chiedere il permesso. Abilita solo per azioni di cui ti fidi completamente.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Rilasciato Roo Code {{version}}", - "description": "Presentazione di Roo Code Cloud: Portare la potenza di Roo oltre l'IDE", - "feature1": "Traccia il progresso delle attività ovunque (Gratuito): Ricevi aggiornamenti in tempo reale su attività di lunga durata senza rimanere bloccato nel tuo IDE", - "feature2": "Controlla l'estensione Roo da remoto (Pro): Avvia, ferma e interagisci con le attività da un'interfaccia browser basata su chat.", - "learnMore": "Pronto a prendere il controllo? Scopri di più qui.", - "visitCloudButton": "Visita Roo Code Cloud", - "socialLinks": "Unisciti a noi su X, Discord, o r/RooCode" + "stealthModel": { + "feature": "Modello stealth GRATUITO per tempo limitato - Code Supernova: Un modello di codificazione agentiva versatile che supporta input di immagini, accessibile tramite Roo Code Cloud.", + "note": "(Nota: i prompt e le completazioni vengono registrati dal creatore del modello e utilizzati per migliorarlo)", + "connectButton": "Connetti a Roo Code Cloud", + "selectModel": "Seleziona roo/code-supernova dal provider Roo Code Cloud nelle Impostazioni per iniziare.", + "goToSettingsButton": "Vai alle Impostazioni" + }, + "socialLinks": "Unisciti a noi su X, Discord, o r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo vuole utilizzare il browser:", + "rooWantsToUse": "Roo vuole utilizzare il browser", "consoleLogs": "Log della console", "noNewLogs": "(Nessun nuovo log)", "screenshot": "Screenshot del browser", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Espandi blocco di codice", "collapse": "Comprimi blocco di codice", - "enable_wrap": "Attiva a capo automatico", - "disable_wrap": "Disattiva a capo automatico", "copy_code": "Copia codice" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo vuole cercare nella base di codice {{query}}:", - "wantsToSearchWithPath": "Roo vuole cercare nella base di codice {{query}} in {{path}}:", + "wantsToSearch": "Roo vuole cercare nella base di codice {{query}}", + "wantsToSearchWithPath": "Roo vuole cercare nella base di codice {{query}} in {{path}}", "didSearch_one": "Trovato 1 risultato", "didSearch_other": "Trovati {{count}} risultati", "resultTooltip": "Punteggio di somiglianza: {{score}} (clicca per aprire il file)" @@ -399,23 +406,11 @@ "url": "Incolla l'URL per recuperare i contenuti" }, "queuedMessages": { - "title": "Messaggi in coda:", + "title": "Messaggi in coda", "clickToEdit": "Clicca per modificare il messaggio" }, "slashCommand": { - "wantsToRun": "Roo vuole eseguire un comando slash:", - "didRun": "Roo ha eseguito un comando slash:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Limite Richieste Approvate Automaticamente Raggiunto", - "description": "Roo ha raggiunto il limite di {{count}} richiesta/e API approvata/e automaticamente. Vuoi reimpostare il contatore e procedere con l'attività?", - "button": "Reimposta e Continua" - }, - "autoApprovedCostLimitReached": { - "title": "Limite di Costo Approvato Automaticamente Raggiunto", - "description": "Roo ha raggiunto il limite di costo approvato automaticamente di ${{count}}. Vuoi reimpostare il costo e procedere con l'attività?", - "button": "Reimposta e Continua" - } + "wantsToRun": "Roo vuole eseguire un comando slash", + "didRun": "Roo ha eseguito un comando slash" } } diff --git a/webview-ui/src/i18n/locales/it/cloud.json b/webview-ui/src/i18n/locales/it/cloud.json index 422a1a688bd..944e4dd2d4b 100644 --- a/webview-ui/src/i18n/locales/it/cloud.json +++ b/webview-ui/src/i18n/locales/it/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Hai problemi?", "pasteCallbackUrl": "Copia l'URL di redirect dal tuo browser e incollalo qui:", "startOver": "Ricomincia", + "personalAccount": "Account Personale", + "switchAccount": "Cambia Account Roo Code Cloud", + "createTeamAccount": "Crea Account del Team", "cloudUrlPillLabel": "URL di Roo Code Cloud", "upsell": { "autoApprovePowerUser": "Vuoi dare un po' di indipendenza a Roo? Controllalo da qualsiasi luogo con Roo Code Cloud. Scopri di più.", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 80ff0f8a718..966a4f4e3e9 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Comandi Slash", "prompts": "Prompt", + "ui": "UI", "experimental": "Sperimentale", "language": "Lingua", "about": "Informazioni su Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Ripristina al valore predefinito" }, "autoApprove": { + "toggleShortcut": "Puoi configurare una scorciatoia globale per questa impostazione nelle preferenze del tuo IDE.", "description": "Permetti a Roo di eseguire automaticamente operazioni senza richiedere approvazione. Abilita queste impostazioni solo se ti fidi completamente dell'IA e comprendi i rischi di sicurezza associati.", "enabled": "Auto-approvazione abilitata", "toggleAriaLabel": "Attiva/disattiva approvazione automatica", @@ -380,8 +382,10 @@ "modelId": "ID modello", "apiKey": "Chiave API Ollama", "apiKeyHelp": "Chiave API opzionale per istanze Ollama autenticate o servizi cloud. Lascia vuoto per installazioni locali.", + "numCtx": "Dimensione della finestra di contesto (num_ctx)", + "numCtxHelp": "Sovrascrive la dimensione predefinita della finestra di contesto del modello. Lasciare vuoto per utilizzare la configurazione del Modelfile del modello. Il valore minimo è 128.", "description": "Ollama ti permette di eseguire modelli localmente sul tuo computer. Per iniziare, consulta la guida rapida.", - "warning": "Nota: Roo Code utilizza prompt complessi e funziona meglio con i modelli Claude. I modelli con capacità inferiori potrebbero non funzionare come previsto." + "warning": "Nota: Roo Code utiliza prompt complessi e funziona meglio con i modelli Claude. I modelli con capacità inferiori potrebbero non funzionare come previsto." }, "unboundApiKey": "Chiave API Unbound", "getUnboundApiKey": "Ottieni chiave API Unbound", @@ -395,6 +399,13 @@ "authenticatedMessage": "Autenticato in modo sicuro tramite il tuo account Roo Code Cloud.", "connectButton": "Connetti a Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Percorso credenziali OAuth", + "oauthPathDescription": "Percorso alle tue credenziali auth.json di ChatGPT Codex. Predefinito {{defaultPath}} se lasciato vuoto (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex utilizza le tue credenziali web ChatGPT tramite la CLI ufficiale Codex. Autenticati con la CLI Codex in modo che venga creato auth.json. Se usi una posizione personalizzata, imposta qui il percorso completo del file.", + "oauthConnectDescription": "Dopo l'autenticazione, Roo leggerà il token di accesso da auth.json e si connetterà a ChatGPT Responses (Codex).", + "learnMoreLinkText": "Scopri di più su ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Routing dei fornitori OpenRouter", @@ -824,7 +835,8 @@ "providerNotAllowed": "Il fornitore '{{provider}}' non è consentito dalla tua organizzazione", "modelNotAllowed": "Il modello '{{model}}' non è consentito per il fornitore '{{provider}}' dalla tua organizzazione.", "profileInvalid": "Questo profilo contiene un fornitore o un modello non consentito dalla tua organizzazione.", - "qwenCodeOauthPath": "Devi fornire un percorso valido per le credenziali OAuth" + "qwenCodeOauthPath": "Devi fornire un percorso valido per le credenziali OAuth", + "openAiNativeCodexOauthPath": "Opzionale: Percorso all'auth.json di ChatGPT Codex. Quando vuoto, predefinito a ~/.codex/auth.json." }, "placeholders": { "apiKey": "Inserisci chiave API...", @@ -877,5 +889,11 @@ "output": "Output", "cacheReads": "Letture cache" } + }, + "ui": { + "collapseThinking": { + "label": "Comprimi i messaggi di pensiero per impostazione predefinita", + "description": "Se abilitato, i blocchi di pensiero verranno compressi per impostazione predefinita finché non interagisci con essi" + } } } diff --git a/webview-ui/src/i18n/locales/it/welcome.json b/webview-ui/src/i18n/locales/it/welcome.json index 5bc96b045f4..46efe5ef625 100644 --- a/webview-ui/src/i18n/locales/it/welcome.json +++ b/webview-ui/src/i18n/locales/it/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Un'interfaccia unificata per LLMs" + }, + "roo": { + "description": "I migliori modelli gratuiti per iniziare", + "incentive": "Prova Roo gratuitamente" } }, "chooseProvider": "Per fare la sua magia, Roo ha bisogno di una chiave API.", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 4354772c6f3..52e633b3ef5 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -61,7 +61,7 @@ "tooltip": "このアクションを承認" }, "runCommand": { - "title": "コマンド実行", + "title": "コマンド", "tooltip": "このコマンドを実行" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "モードを検索...", "noResults": "結果が見つかりません" }, - "errorReadingFile": "ファイル読み込みエラー:", + "errorReadingFile": "ファイル読み込みエラー", "noValidImages": "有効な画像が処理されませんでした", "separator": "区切り", "edit": "編集...", @@ -163,51 +163,51 @@ "wantsToFetch": "Rooは現在のタスクを支援するための詳細な指示を取得したい" }, "fileOperations": { - "wantsToRead": "Rooはこのファイルを読みたい:", - "wantsToReadOutsideWorkspace": "Rooはワークスペース外のこのファイルを読みたい:", - "didRead": "Rooはこのファイルを読みました:", - "wantsToEdit": "Rooはこのファイルを編集したい:", - "wantsToEditOutsideWorkspace": "Rooはワークスペース外のこのファイルを編集したい:", - "wantsToEditProtected": "Rooは保護された設定ファイルを編集したい:", - "wantsToCreate": "Rooは新しいファイルを作成したい:", - "wantsToSearchReplace": "Rooはこのファイルで検索と置換を行う:", - "didSearchReplace": "Rooはこのファイルで検索と置換を実行しました:", - "wantsToInsert": "Rooはこのファイルにコンテンツを挿入したい:", - "wantsToInsertWithLineNumber": "Rooはこのファイルの{{lineNumber}}行目にコンテンツを挿入したい:", - "wantsToInsertAtEnd": "Rooはこのファイルの末尾にコンテンツを追加したい:", - "wantsToReadAndXMore": "Roo はこのファイルと他に {{count}} 個のファイルを読み込もうとしています:", - "wantsToReadMultiple": "Rooは複数のファイルを読み取ろうとしています:", - "wantsToApplyBatchChanges": "Rooは複数のファイルに変更を適用したい:", - "wantsToGenerateImage": "Rooは画像を生成したい:", - "wantsToGenerateImageOutsideWorkspace": "Rooはワークスペース外で画像を生成したい:", - "wantsToGenerateImageProtected": "Rooは保護された場所で画像を生成したい:", - "didGenerateImage": "Rooは画像を生成しました:" + "wantsToRead": "Rooはこのファイルを読みたい", + "wantsToReadOutsideWorkspace": "Rooはワークスペース外のこのファイルを読みたい", + "didRead": "Rooはこのファイルを読みました", + "wantsToEdit": "Rooはこのファイルを編集したい", + "wantsToEditOutsideWorkspace": "Rooはワークスペース外のこのファイルを編集したい", + "wantsToEditProtected": "Rooは保護された設定ファイルを編集したい", + "wantsToCreate": "Rooは新しいファイルを作成したい", + "wantsToSearchReplace": "Rooはこのファイルで検索と置換を行う", + "didSearchReplace": "Rooはこのファイルで検索と置換を実行しました", + "wantsToInsert": "Rooはこのファイルにコンテンツを挿入したい", + "wantsToInsertWithLineNumber": "Rooはこのファイルの{{lineNumber}}行目にコンテンツを挿入したい", + "wantsToInsertAtEnd": "Rooはこのファイルの末尾にコンテンツを追加したい", + "wantsToReadAndXMore": "Roo はこのファイルと他に {{count}} 個のファイルを読み込もうとしています", + "wantsToReadMultiple": "Rooは複数のファイルを読み取ろうとしています", + "wantsToApplyBatchChanges": "Rooは複数のファイルに変更を適用したい", + "wantsToGenerateImage": "Rooは画像を生成したい", + "wantsToGenerateImageOutsideWorkspace": "Rooはワークスペース外で画像を生成したい", + "wantsToGenerateImageProtected": "Rooは保護された場所で画像を生成したい", + "didGenerateImage": "Rooは画像を生成しました" }, "directoryOperations": { - "wantsToViewTopLevel": "Rooはこのディレクトリのトップレベルファイルを表示したい:", - "didViewTopLevel": "Rooはこのディレクトリのトップレベルファイルを表示しました:", - "wantsToViewRecursive": "Rooはこのディレクトリのすべてのファイルを再帰的に表示したい:", - "didViewRecursive": "Rooはこのディレクトリのすべてのファイルを再帰的に表示しました:", - "wantsToViewDefinitions": "Rooはこのディレクトリで使用されているソースコード定義名を表示したい:", - "didViewDefinitions": "Rooはこのディレクトリで使用されているソースコード定義名を表示しました:", - "wantsToSearch": "Rooはこのディレクトリで {{regex}} を検索したい:", - "didSearch": "Rooはこのディレクトリで {{regex}} を検索しました:", - "wantsToSearchOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で {{regex}} を検索したい:", - "didSearchOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で {{regex}} を検索しました:", - "wantsToViewTopLevelOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のトップレベルファイルを表示したい:", - "didViewTopLevelOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のトップレベルファイルを表示しました:", - "wantsToViewRecursiveOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のすべてのファイルを再帰的に表示したい:", - "didViewRecursiveOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のすべてのファイルを再帰的に表示しました:", - "wantsToViewDefinitionsOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で使用されているソースコード定義名を表示したい:", - "didViewDefinitionsOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で使用されているソースコード定義名を表示しました:" + "wantsToViewTopLevel": "Rooはこのディレクトリのトップレベルファイルを表示したい", + "didViewTopLevel": "Rooはこのディレクトリのトップレベルファイルを表示しました", + "wantsToViewRecursive": "Rooはこのディレクトリのすべてのファイルを再帰的に表示したい", + "didViewRecursive": "Rooはこのディレクトリのすべてのファイルを再帰的に表示しました", + "wantsToViewDefinitions": "Rooはこのディレクトリで使用されているソースコード定義名を表示したい", + "didViewDefinitions": "Rooはこのディレクトリで使用されているソースコード定義名を表示しました", + "wantsToSearch": "Rooはこのディレクトリで {{regex}} を検索したい", + "didSearch": "Rooはこのディレクトリで {{regex}} を検索しました", + "wantsToSearchOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で {{regex}} を検索したい", + "didSearchOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で {{regex}} を検索しました", + "wantsToViewTopLevelOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のトップレベルファイルを表示したい", + "didViewTopLevelOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のトップレベルファイルを表示しました", + "wantsToViewRecursiveOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のすべてのファイルを再帰的に表示したい", + "didViewRecursiveOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)のすべてのファイルを再帰的に表示しました", + "wantsToViewDefinitionsOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で使用されているソースコード定義名を表示したい", + "didViewDefinitionsOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で使用されているソースコード定義名を表示しました" }, "commandOutput": "コマンド出力", "commandExecution": { + "abort": "中止", "running": "実行中", "pid": "PID: {{pid}}", - "exited": "終了しました ({{exitCode}})", - "manageCommands": "コマンド権限の管理", - "commandManagementDescription": "コマンドの権限を管理します:✓ をクリックして自動実行を許可し、✗ をクリックして実行を拒否します。パターンはオン/オフの切り替えやリストからの削除が可能です。すべての設定を表示", + "exitStatus": "ステータス {{exitCode}} で終了しました", + "manageCommands": "自動承認されたコマンド", "addToAllowed": "許可リストに追加", "removeFromAllowed": "許可リストから削除", "addToDenied": "拒否リストに追加", @@ -220,9 +220,15 @@ }, "response": "応答", "arguments": "引数", + "text": { + "rooSaid": "Rooの発言" + }, + "feedback": { + "youSaid": "あなたの発言" + }, "mcp": { - "wantsToUseTool": "RooはMCPサーバー{{serverName}}でツールを使用したい:", - "wantsToAccessResource": "RooはMCPサーバー{{serverName}}のリソースにアクセスしたい:" + "wantsToUseTool": "RooはMCPサーバー{{serverName}}でツールを使用したい", + "wantsToAccessResource": "RooはMCPサーバー{{serverName}}のリソースにアクセスしたい" }, "modes": { "wantsToSwitch": "Rooは{{mode}}モードに切り替えたい", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Rooは次の理由で{{mode}}モードに切り替えました: {{reason}}" }, "subtasks": { - "wantsToCreate": "Rooは{{mode}}モードで新しいサブタスクを作成したい:", + "wantsToCreate": "Rooは{{mode}}モードで新しいサブタスクを作成したい", "wantsToFinish": "Rooはこのサブタスクを終了したい", "newTaskContent": "サブタスク指示", "completionContent": "サブタスク完了", @@ -240,7 +246,7 @@ "completionInstructions": "サブタスク完了!結果を確認し、修正や次のステップを提案できます。問題なければ、親タスクに結果を返すために確認してください。" }, "questions": { - "hasQuestion": "Rooは質問があります:" + "hasQuestion": "Rooは質問があります" }, "taskCompleted": "タスク完了", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "自動承認設定を管理する", "tooltipStatus": "自動承認が有効です: {{toggles}}", "title": "自動承認", + "toggle": "自動承認を切り替える", "all": "すべて", "none": "なし", "description": "許可を求めずにこれらのアクションを実行します。完全に信頼するアクションに対してのみ有効にしてください。", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} リリース", - "description": "Roo Code Cloudのご紹介:RooのパワーをIDEを超えて", - "feature1": "どこからでもタスクの進行状況を追跡(無料):IDEに縛られることなく、長時間実行タスクのリアルタイム更新を取得", - "feature2": "Roo拡張機能をリモート制御(Pro):チャットベースのブラウザインターフェースからタスクを開始、停止、操作。", - "learnMore": "制御を取る準備はできましたか?詳細はこちら。", - "visitCloudButton": "Roo Code Cloudを訪問", - "socialLinks": "XDiscord、またはr/RooCodeでフォローしてください" + "stealthModel": { + "feature": "期間限定無料ステルスモデル - Code Supernova:画像入力をサポートする多目的エージェントコーディングモデル、Roo Code Cloud 経由で利用可能。", + "note": "(注意:プロンプトと補完はモデル作成者によってログに記録され、モデルの改善に使用されます)", + "connectButton": "Roo Code Cloud に接続", + "selectModel": "設定で Roo Code Cloud プロバイダーから roo/code-supernova を選択して開始してください。", + "goToSettingsButton": "設定に移動" + }, + "socialLinks": "XDiscord、またはr/RooCodeでフォローしてください 🚀" }, "browser": { - "rooWantsToUse": "Rooはブラウザを使用したい:", + "rooWantsToUse": "Rooはブラウザを使用したい", "consoleLogs": "コンソールログ", "noNewLogs": "(新しいログはありません)", "screenshot": "ブラウザのスクリーンショット", @@ -312,8 +321,6 @@ "tooltips": { "expand": "コードブロックを展開", "collapse": "コードブロックを折りたたむ", - "enable_wrap": "折り返しを有効化", - "disable_wrap": "折り返しを無効化", "copy_code": "コードをコピー" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Rooはコードベースで {{query}} を検索したい:", - "wantsToSearchWithPath": "Rooは {{path}} 内のコードベースで {{query}} を検索したい:", + "wantsToSearch": "Rooはコードベースで {{query}} を検索したい", + "wantsToSearchWithPath": "Rooは {{path}} 内のコードベースで {{query}} を検索したい", "didSearch_one": "1件の結果が見つかりました", "didSearch_other": "{{count}}件の結果が見つかりました", "resultTooltip": "類似度スコア: {{score}} (クリックしてファイルを開く)" @@ -399,23 +406,11 @@ "url": "URLを貼り付けてコンテンツを取得" }, "queuedMessages": { - "title": "キューメッセージ:", + "title": "キューメッセージ", "clickToEdit": "クリックしてメッセージを編集" }, "slashCommand": { - "wantsToRun": "Rooはスラッシュコマンドを実行したい:", - "didRun": "Rooはスラッシュコマンドを実行しました:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "自動承認されたリクエストの上限に達しました", - "description": "Rooは自動承認されたAPIリクエストの上限{{count}}件に達しました。カウントをリセットしてタスクを続行しますか?", - "button": "リセットして続行" - }, - "autoApprovedCostLimitReached": { - "title": "自動承認されたコスト制限に達しました", - "description": "Rooは自動承認されたコスト制限の${{count}}に達しました。コストをリセットしてタスクを続行しますか?", - "button": "リセットして続行" - } + "wantsToRun": "Rooはスラッシュコマンドを実行したい", + "didRun": "Rooはスラッシュコマンドを実行しました" } } diff --git a/webview-ui/src/i18n/locales/ja/cloud.json b/webview-ui/src/i18n/locales/ja/cloud.json index 4988d2dee9f..6959602b174 100644 --- a/webview-ui/src/i18n/locales/ja/cloud.json +++ b/webview-ui/src/i18n/locales/ja/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "問題が発生していますか?", "pasteCallbackUrl": "ブラウザからリダイレクトURLをコピーし、ここに貼り付けてください:", "startOver": "最初からやり直す", + "personalAccount": "個人アカウント", + "switchAccount": "Roo Code Cloud アカウントを切り替え", + "createTeamAccount": "チームアカウントを作成", "cloudUrlPillLabel": "Roo Code Cloud URL", "upsell": { "autoApprovePowerUser": "Rooに少し独立性を与えませんか?Roo Code Cloudでどこからでもコントロールできます。詳細。", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 264d774473b..f6428310df9 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -30,6 +30,7 @@ "terminal": "ターミナル", "slashCommands": "スラッシュコマンド", "prompts": "プロンプト", + "ui": "UI", "experimental": "実験的", "language": "言語", "about": "Roo Codeについて" @@ -134,6 +135,7 @@ "resetToDefault": "デフォルトにリセット" }, "autoApprove": { + "toggleShortcut": "IDEの環境設定で、この設定のグローバルショートカットを設定できます。", "description": "Rooが承認なしで自動的に操作を実行できるようにします。AIを完全に信頼し、関連するセキュリティリスクを理解している場合にのみ、これらの設定を有効にしてください。", "enabled": "自動承認が有効", "toggleAriaLabel": "自動承認の切り替え", @@ -380,6 +382,8 @@ "modelId": "モデルID", "apiKey": "Ollama APIキー", "apiKeyHelp": "認証されたOllamaインスタンスやクラウドサービス用のオプションAPIキー。ローカルインストールの場合は空のままにしてください。", + "numCtx": "コンテキストウィンドウサイズ (num_ctx)", + "numCtxHelp": "モデルのデフォルトのコンテキストウィンドウサイズを上書きします。モデルのModelfile構成を使用するには、空のままにします。最小値は128です。", "description": "Ollamaを使用すると、ローカルコンピューターでモデルを実行できます。始め方については、クイックスタートガイドをご覧ください。", "warning": "注意:Roo Codeは複雑なプロンプトを使用し、Claudeモデルで最適に動作します。能力の低いモデルは期待通りに動作しない場合があります。" }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Roo Code Cloudアカウントを通じて安全に認証されています。", "connectButton": "Roo Code Cloudに接続" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth認証情報パス", + "oauthPathDescription": "ChatGPT Codex auth.json認証情報へのパス。空の場合は{{defaultPath}}がデフォルト(Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json)。", + "oauthCliDescription": "ChatGPT Codexは公式Codex CLIを介してChatGPTウェブ認証情報を使用します。auth.jsonが作成されるようにCodex CLIで認証してください。カスタムの場所を使用する場合は、ここに完全なファイルパスを設定してください。", + "oauthConnectDescription": "認証後、Rooはauth.jsonからアクセストークンを読み取り、ChatGPT Responses(Codex)に接続します。", + "learnMoreLinkText": "ChatGPTについて詳しく学ぶ" + }, "openRouter": { "providerRouting": { "title": "OpenRouterプロバイダールーティング", @@ -824,7 +835,8 @@ "providerNotAllowed": "プロバイダー「{{provider}}」は組織によって許可されていません", "modelNotAllowed": "モデル「{{model}}」はプロバイダー「{{provider}}」に対して組織によって許可されていません", "profileInvalid": "このプロファイルには、組織によって許可されていないプロバイダーまたはモデルが含まれています", - "qwenCodeOauthPath": "有効なOAuth認証情報のパスを提供する必要があります" + "qwenCodeOauthPath": "有効なOAuth認証情報のパスを提供する必要があります", + "openAiNativeCodexOauthPath": "オプション: ChatGPT Codex auth.jsonへのパス。空の場合、デフォルトは ~/.codex/auth.json です。" }, "placeholders": { "apiKey": "API キーを入力...", @@ -877,5 +889,11 @@ "output": "出力", "cacheReads": "キャッシュ読み取り" } + }, + "ui": { + "collapseThinking": { + "label": "デフォルトで思考メッセージを折りたたむ", + "description": "有効にすると、操作するまで思考ブロックがデフォルトで折りたたまれます" + } } } diff --git a/webview-ui/src/i18n/locales/ja/welcome.json b/webview-ui/src/i18n/locales/ja/welcome.json index a1a13015b8c..946f6f23226 100644 --- a/webview-ui/src/i18n/locales/ja/welcome.json +++ b/webview-ui/src/i18n/locales/ja/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "LLMsのための統一インターフェース" + }, + "roo": { + "description": "始めるための最高の無料モデル", + "incentive": "Rooを無料で試す" } }, "chooseProvider": "Rooが機能するには、APIキーが必要です。", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 3b695f8fba9..991955f1e8a 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -61,7 +61,7 @@ "tooltip": "이 작업 승인" }, "runCommand": { - "title": "명령 실행", + "title": "명령", "tooltip": "이 명령 실행" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "모드 검색...", "noResults": "결과를 찾을 수 없습니다" }, - "errorReadingFile": "파일 읽기 오류:", + "errorReadingFile": "파일 읽기 오류", "noValidImages": "처리된 유효한 이미지가 없습니다", "separator": "구분자", "edit": "편집...", @@ -163,51 +163,51 @@ "wantsToFetch": "Roo는 현재 작업을 지원하기 위해 자세한 지침을 가져오려고 합니다" }, "fileOperations": { - "wantsToRead": "Roo가 이 파일을 읽고 싶어합니다:", - "wantsToReadOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 읽고 싶어합니다:", - "didRead": "Roo가 이 파일을 읽었습니다:", - "wantsToEdit": "Roo가 이 파일을 편집하고 싶어합니다:", - "wantsToEditOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 편집하고 싶어합니다:", - "wantsToEditProtected": "Roo가 보호된 설정 파일을 편집하고 싶어합니다:", - "wantsToCreate": "Roo가 새 파일을 만들고 싶어합니다:", - "wantsToSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행하고 싶어합니다:", - "didSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행했습니다:", - "wantsToInsert": "Roo가 이 파일에 내용을 삽입하고 싶어합니다:", - "wantsToInsertWithLineNumber": "Roo가 이 파일의 {{lineNumber}}번 줄에 내용을 삽입하고 싶어합니다:", - "wantsToInsertAtEnd": "Roo가 이 파일의 끝에 내용을 추가하고 싶어합니다:", - "wantsToReadAndXMore": "Roo가 이 파일과 {{count}}개의 파일을 더 읽으려고 합니다:", - "wantsToReadMultiple": "Roo가 여러 파일을 읽으려고 합니다:", - "wantsToApplyBatchChanges": "Roo가 여러 파일에 변경 사항을 적용하고 싶어합니다:", - "wantsToGenerateImage": "Roo가 이미지를 생성하고 싶어합니다:", - "wantsToGenerateImageOutsideWorkspace": "Roo가 워크스페이스 외부에서 이미지를 생성하고 싶어합니다:", - "wantsToGenerateImageProtected": "Roo가 보호된 위치에서 이미지를 생성하고 싶어합니다:", - "didGenerateImage": "Roo가 이미지를 생성했습니다:" + "wantsToRead": "Roo가 이 파일을 읽고 싶어합니다", + "wantsToReadOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 읽고 싶어합니다", + "didRead": "Roo가 이 파일을 읽었습니다", + "wantsToEdit": "Roo가 이 파일을 편집하고 싶어합니다", + "wantsToEditOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 편집하고 싶어합니다", + "wantsToEditProtected": "Roo가 보호된 설정 파일을 편집하고 싶어합니다", + "wantsToCreate": "Roo가 새 파일을 만들고 싶어합니다", + "wantsToSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행하고 싶어합니다", + "didSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행했습니다", + "wantsToInsert": "Roo가 이 파일에 내용을 삽입하고 싶어합니다", + "wantsToInsertWithLineNumber": "Roo가 이 파일의 {{lineNumber}}번 줄에 내용을 삽입하고 싶어합니다", + "wantsToInsertAtEnd": "Roo가 이 파일의 끝에 내용을 추가하고 싶어합니다", + "wantsToReadAndXMore": "Roo가 이 파일과 {{count}}개의 파일을 더 읽으려고 합니다", + "wantsToReadMultiple": "Roo가 여러 파일을 읽으려고 합니다", + "wantsToApplyBatchChanges": "Roo가 여러 파일에 변경 사항을 적용하고 싶어합니다", + "wantsToGenerateImage": "Roo가 이미지를 생성하고 싶어합니다", + "wantsToGenerateImageOutsideWorkspace": "Roo가 워크스페이스 외부에서 이미지를 생성하고 싶어합니다", + "wantsToGenerateImageProtected": "Roo가 보호된 위치에서 이미지를 생성하고 싶어합니다", + "didGenerateImage": "Roo가 이미지를 생성했습니다" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo가 이 디렉토리의 최상위 파일을 보고 싶어합니다:", - "didViewTopLevel": "Roo가 이 디렉토리의 최상위 파일을 보았습니다:", - "wantsToViewRecursive": "Roo가 이 디렉토리의 모든 파일을 재귀적으로 보고 싶어합니다:", - "didViewRecursive": "Roo가 이 디렉토리의 모든 파일을 재귀적으로 보았습니다:", - "wantsToViewDefinitions": "Roo가 이 디렉토리에서 사용된 소스 코드 정의 이름을 보고 싶어합니다:", - "didViewDefinitions": "Roo가 이 디렉토리에서 사용된 소스 코드 정의 이름을 보았습니다:", - "wantsToSearch": "Roo가 이 디렉토리에서 {{regex}}을(를) 검색하고 싶어합니다:", - "didSearch": "Roo가 이 디렉토리에서 {{regex}}을(를) 검색했습니다:", - "wantsToSearchOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 {{regex}}을(를) 검색하고 싶어합니다:", - "didSearchOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 {{regex}}을(를) 검색했습니다:", - "wantsToViewTopLevelOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 최상위 파일을 보고 싶어합니다:", - "didViewTopLevelOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 최상위 파일을 보았습니다:", - "wantsToViewRecursiveOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 모든 파일을 재귀적으로 보고 싶어합니다:", - "didViewRecursiveOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 모든 파일을 재귀적으로 보았습니다:", - "wantsToViewDefinitionsOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 사용된 소스 코드 정의 이름을 보고 싶어합니다:", - "didViewDefinitionsOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 사용된 소스 코드 정의 이름을 보았습니다:" + "wantsToViewTopLevel": "Roo가 이 디렉토리의 최상위 파일을 보고 싶어합니다", + "didViewTopLevel": "Roo가 이 디렉토리의 최상위 파일을 보았습니다", + "wantsToViewRecursive": "Roo가 이 디렉토리의 모든 파일을 재귀적으로 보고 싶어합니다", + "didViewRecursive": "Roo가 이 디렉토리의 모든 파일을 재귀적으로 보았습니다", + "wantsToViewDefinitions": "Roo가 이 디렉토리에서 사용된 소스 코드 정의 이름을 보고 싶어합니다", + "didViewDefinitions": "Roo가 이 디렉토리에서 사용된 소스 코드 정의 이름을 보았습니다", + "wantsToSearch": "Roo가 이 디렉토리에서 {{regex}}을(를) 검색하고 싶어합니다", + "didSearch": "Roo가 이 디렉토리에서 {{regex}}을(를) 검색했습니다", + "wantsToSearchOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 {{regex}}을(를) 검색하고 싶어합니다", + "didSearchOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 {{regex}}을(를) 검색했습니다", + "wantsToViewTopLevelOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 최상위 파일을 보고 싶어합니다", + "didViewTopLevelOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 최상위 파일을 보았습니다", + "wantsToViewRecursiveOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 모든 파일을 재귀적으로 보고 싶어합니다", + "didViewRecursiveOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)의 모든 파일을 재귀적으로 보았습니다", + "wantsToViewDefinitionsOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 사용된 소스 코드 정의 이름을 보고 싶어합니다", + "didViewDefinitionsOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 사용된 소스 코드 정의 이름을 보았습니다" }, "commandOutput": "명령 출력", "commandExecution": { + "abort": "중단", "running": "실행 중", "pid": "PID: {{pid}}", - "exited": "종료됨 ({{exitCode}})", - "manageCommands": "명령 권한 관리", - "commandManagementDescription": "명령 권한 관리: 자동 실행을 허용하려면 ✓를 클릭하고 실행을 거부하려면 ✗를 클릭하십시오. 패턴은 켜거나 끄거나 목록에서 제거할 수 있습니다. 모든 설정 보기", + "exitStatus": "상태 {{exitCode}}(으)로 종료됨", + "manageCommands": "자동 승인된 명령", "addToAllowed": "허용 목록에 추가", "removeFromAllowed": "허용 목록에서 제거", "addToDenied": "거부 목록에 추가", @@ -220,9 +220,15 @@ }, "response": "응답", "arguments": "인수", + "text": { + "rooSaid": "루가 말했다" + }, + "feedback": { + "youSaid": "당신은 말했다" + }, "mcp": { - "wantsToUseTool": "Roo가 {{serverName}} MCP 서버에서 도구를 사용하고 싶어합니다:", - "wantsToAccessResource": "Roo가 {{serverName}} MCP 서버에서 리소스에 접근하고 싶어합니다:" + "wantsToUseTool": "Roo가 {{serverName}} MCP 서버에서 도구를 사용하고 싶어합니다", + "wantsToAccessResource": "Roo가 {{serverName}} MCP 서버에서 리소스에 접근하고 싶어합니다" }, "modes": { "wantsToSwitch": "Roo가 {{mode}} 모드로 전환하고 싶어합니다", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo가 다음 이유로 {{mode}} 모드로 전환했습니다: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo가 {{mode}} 모드에서 새 하위 작업을 만들고 싶어합니다:", + "wantsToCreate": "Roo가 {{mode}} 모드에서 새 하위 작업을 만들고 싶어합니다", "wantsToFinish": "Roo가 이 하위 작업을 완료하고 싶어합니다", "newTaskContent": "하위 작업 지침", "completionContent": "하위 작업 완료", @@ -240,7 +246,7 @@ "completionInstructions": "하위 작업 완료! 결과를 검토하고 수정 사항이나 다음 단계를 제안할 수 있습니다. 모든 것이 괜찮아 보이면, 부모 작업에 결과를 반환하기 위해 확인해주세요." }, "questions": { - "hasQuestion": "Roo에게 질문이 있습니다:" + "hasQuestion": "Roo에게 질문이 있습니다" }, "taskCompleted": "작업 완료", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "자동 승인 설정 관리", "tooltipStatus": "자동 승인 활성화됨: {{toggles}}", "title": "자동 승인", + "toggle": "자동 승인 전환", "all": "모두", "none": "없음", "description": "허가 없이 이러한 작업을 실행합니다. 전적으로 신뢰하는 작업에 대해서만 활성화하십시오.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} 출시", - "description": "Roo Code Cloud 소개: IDE를 넘어 Roo의 힘을 확장", - "feature1": "어디서나 작업 진행상황 추적 (무료): IDE에 갇히지 않고 장시간 실행 작업의 실시간 업데이트를 받아보세요", - "feature2": "원격으로 Roo 확장기능 제어 (Pro): 채팅 기반 브라우저 인터페이스에서 작업을 시작, 중지, 상호작용하세요.", - "learnMore": "제어권을 잡을 준비가 되셨나요? 여기서 자세히 알아보세요.", - "visitCloudButton": "Roo Code Cloud 방문", - "socialLinks": "X, Discord, 또는 r/RooCode에서 만나요" + "stealthModel": { + "feature": "기간 한정 무료 스텔스 모델 - Code Supernova: 이미지 입력을 지원하는 다목적 에이전틱 코딩 모델, Roo Code Cloud를 통해 이용 가능.", + "note": "(참고: 프롬프트와 완성은 모델 제작자에 의해 기록되고 모델 개선에 사용됩니다)", + "connectButton": "Roo Code Cloud에 연결", + "selectModel": "설정에서 Roo Code Cloud 제공업체의 roo/code-supernova를 선택하여 시작하세요.", + "goToSettingsButton": "설정으로 이동" + }, + "socialLinks": "X, Discord, 또는 r/RooCode에서 만나요 🚀" }, "browser": { - "rooWantsToUse": "Roo가 브라우저를 사용하고 싶어합니다:", + "rooWantsToUse": "Roo가 브라우저를 사용하고 싶어합니다", "consoleLogs": "콘솔 로그", "noNewLogs": "(새 로그 없음)", "screenshot": "브라우저 스크린샷", @@ -312,8 +321,6 @@ "tooltips": { "expand": "코드 블록 확장", "collapse": "코드 블록 축소", - "enable_wrap": "자동 줄바꿈 활성화", - "disable_wrap": "자동 줄바꿈 비활성화", "copy_code": "코드 복사" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo가 코드베이스에서 {{query}}을(를) 검색하고 싶어합니다:", - "wantsToSearchWithPath": "Roo가 {{path}}에서 {{query}}을(를) 검색하고 싶어합니다:", + "wantsToSearch": "Roo가 코드베이스에서 {{query}}을(를) 검색하고 싶어합니다", + "wantsToSearchWithPath": "Roo가 {{path}}에서 {{query}}을(를) 검색하고 싶어합니다", "didSearch_one": "1개의 결과를 찾았습니다", "didSearch_other": "{{count}}개의 결과를 찾았습니다", "resultTooltip": "유사도 점수: {{score}} (클릭하여 파일 열기)" @@ -399,23 +406,11 @@ "url": "콘텐츠를 가져올 URL 붙여넣기" }, "queuedMessages": { - "title": "대기열 메시지:", + "title": "대기열 메시지", "clickToEdit": "클릭하여 메시지 편집" }, "slashCommand": { - "wantsToRun": "Roo가 슬래시 명령어를 실행하려고 합니다:", - "didRun": "Roo가 슬래시 명령어를 실행했습니다:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "자동 승인 요청 한도에 도달했습니다", - "description": "Roo가 자동 승인된 API 요청 한도인 {{count}}개에 도달했습니다. 카운트를 재설정하고 작업을 계속하시겠습니까?", - "button": "재설정하고 계속하기" - }, - "autoApprovedCostLimitReached": { - "title": "자동 승인 비용 한도에 도달했습니다", - "description": "Roo가 자동 승인 비용 한도인 ${{count}}에 도달했습니다. 비용을 재설정하고 작업을 계속하시겠습니까?", - "button": "재설정하고 계속" - } + "wantsToRun": "Roo가 슬래시 명령어를 실행하려고 합니다", + "didRun": "Roo가 슬래시 명령어를 실행했습니다" } } diff --git a/webview-ui/src/i18n/locales/ko/cloud.json b/webview-ui/src/i18n/locales/ko/cloud.json index 763947da3ef..962d5e872ab 100644 --- a/webview-ui/src/i18n/locales/ko/cloud.json +++ b/webview-ui/src/i18n/locales/ko/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "문제가 있나요?", "pasteCallbackUrl": "브라우저에서 리다이렉트 URL을 복사하여 여기에 붙여넣으세요:", "startOver": "다시 시작", + "personalAccount": "개인 계정", + "switchAccount": "Roo Code Cloud 계정 전환", + "createTeamAccount": "팀 계정 만들기", "cloudUrlPillLabel": "Roo Code Cloud URL", "upsell": { "autoApprovePowerUser": "Roo에게 약간의 독립성을 부여하시겠습니까? Roo Code Cloud로 어디서든 제어하세요. 더 알아보기.", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index e490e31f78e..7f1b15976ac 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -30,6 +30,7 @@ "terminal": "터미널", "slashCommands": "슬래시 명령", "prompts": "프롬프트", + "ui": "UI", "experimental": "실험적", "language": "언어", "about": "Roo Code 정보" @@ -134,6 +135,7 @@ "resetToDefault": "기본값으로 재설정" }, "autoApprove": { + "toggleShortcut": "IDE 환경 설정에서 이 설정에 대한 전역 바로 가기를 구성할 수 있습니다.", "description": "Roo가 승인 없이 자동으로 작업을 수행할 수 있도록 허용합니다. AI를 완전히 신뢰하고 관련 보안 위험을 이해하는 경우에만 이러한 설정을 활성화하세요.", "enabled": "자동 승인 활성화됨", "toggleAriaLabel": "자동 승인 전환", @@ -380,6 +382,8 @@ "modelId": "모델 ID", "apiKey": "Ollama API 키", "apiKeyHelp": "인증된 Ollama 인스턴스나 클라우드 서비스용 선택적 API 키. 로컬 설치의 경우 비워두세요.", + "numCtx": "컨텍스트 창 크기(num_ctx)", + "numCtxHelp": "모델의 기본 컨텍스트 창 크기를 재정의합니다. 모델의 Modelfile 구성을 사용하려면 비워 둡니다. 최소값은 128입니다.", "description": "Ollama를 사용하면 컴퓨터에서 로컬로 모델을 실행할 수 있습니다. 시작하는 방법은 빠른 시작 가이드를 참조하세요.", "warning": "참고: Roo Code는 복잡한 프롬프트를 사용하며 Claude 모델에서 가장 잘 작동합니다. 덜 강력한 모델은 예상대로 작동하지 않을 수 있습니다." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Roo Code Cloud 계정을 통해 안전하게 인증되었습니다.", "connectButton": "Roo Code Cloud에 연결" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth 자격 증명 경로", + "oauthPathDescription": "ChatGPT Codex auth.json 자격 증명 경로입니다. 비어있으면 기본값 {{defaultPath}}를 사용합니다 (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex는 공식 Codex CLI를 통해 ChatGPT 웹 자격 증명을 사용합니다. auth.json이 생성되도록 Codex CLI로 인증하세요. 사용자 정의 위치를 사용하는 경우 여기에 전체 파일 경로를 설정하세요.", + "oauthConnectDescription": "인증 후 Roo는 auth.json에서 액세스 토큰을 읽고 ChatGPT Responses (Codex)에 연결합니다.", + "learnMoreLinkText": "ChatGPT에 대해 자세히 알아보기" + }, "openRouter": { "providerRouting": { "title": "OpenRouter 제공자 라우팅", @@ -824,7 +835,8 @@ "providerNotAllowed": "제공자 '{{provider}}'는 조직에서 허용되지 않습니다", "modelNotAllowed": "모델 '{{model}}'은 제공자 '{{provider}}'에 대해 조직에서 허용되지 않습니다", "profileInvalid": "이 프로필에는 조직에서 허용되지 않는 제공자 또는 모델이 포함되어 있습니다", - "qwenCodeOauthPath": "유효한 OAuth 자격 증명 경로를 제공해야 합니다" + "qwenCodeOauthPath": "유효한 OAuth 자격 증명 경로를 제공해야 합니다", + "openAiNativeCodexOauthPath": "선택사항: ChatGPT Codex auth.json 경로. 비어있을 때 기본값은 ~/.codex/auth.json입니다." }, "placeholders": { "apiKey": "API 키 입력...", @@ -877,5 +889,11 @@ "output": "출력", "cacheReads": "캐시 읽기" } + }, + "ui": { + "collapseThinking": { + "label": "기본적으로 생각 메시지 접기", + "description": "활성화하면 상호 작용할 때까지 생각 블록이 기본적으로 접힙니다" + } } } diff --git a/webview-ui/src/i18n/locales/ko/welcome.json b/webview-ui/src/i18n/locales/ko/welcome.json index bd00d8a2aa3..2f65841df47 100644 --- a/webview-ui/src/i18n/locales/ko/welcome.json +++ b/webview-ui/src/i18n/locales/ko/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "LLM을 위한 통합 인터페이스" + }, + "roo": { + "description": "시작하기에 최고의 무료 모델", + "incentive": "Roo를 무료로 체험해보세요" } }, "chooseProvider": "Roo가 작동하려면 API 키가 필요합니다.", diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index c0889a8ca58..e5d779f70c2 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -61,7 +61,7 @@ "tooltip": "Deze actie goedkeuren" }, "runCommand": { - "title": "Commando uitvoeren", + "title": "Commando", "tooltip": "Voer dit commando uit" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "addContext": "@ om context toe te voegen, / voor commando's", "dragFiles": "houd shift ingedrukt om bestanden te slepen", "dragFilesImages": "houd shift ingedrukt om bestanden/afbeeldingen te slepen", - "errorReadingFile": "Fout bij het lezen van bestand:", + "errorReadingFile": "Fout bij het lezen van bestand", "noValidImages": "Er zijn geen geldige afbeeldingen verwerkt", "separator": "Scheidingsteken", "edit": "Bewerken...", @@ -158,51 +158,51 @@ "wantsToFetch": "Roo wil gedetailleerde instructies ophalen om te helpen met de huidige taak" }, "fileOperations": { - "wantsToRead": "Roo wil dit bestand lezen:", - "wantsToReadOutsideWorkspace": "Roo wil dit bestand buiten de werkruimte lezen:", - "didRead": "Roo heeft dit bestand gelezen:", - "wantsToEdit": "Roo wil dit bestand bewerken:", - "wantsToEditOutsideWorkspace": "Roo wil dit bestand buiten de werkruimte bewerken:", - "wantsToEditProtected": "Roo wil een beveiligd configuratiebestand bewerken:", - "wantsToCreate": "Roo wil een nieuw bestand aanmaken:", - "wantsToSearchReplace": "Roo wil zoeken en vervangen in dit bestand:", - "didSearchReplace": "Roo heeft zoeken en vervangen uitgevoerd op dit bestand:", - "wantsToInsert": "Roo wil inhoud invoegen in dit bestand:", - "wantsToInsertWithLineNumber": "Roo wil inhoud invoegen in dit bestand op regel {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo wil inhoud toevoegen aan het einde van dit bestand:", - "wantsToReadAndXMore": "Roo wil dit bestand en nog {{count}} andere lezen:", - "wantsToReadMultiple": "Roo wil meerdere bestanden lezen:", - "wantsToApplyBatchChanges": "Roo wil wijzigingen toepassen op meerdere bestanden:", - "wantsToGenerateImage": "Roo wil een afbeelding genereren:", - "wantsToGenerateImageOutsideWorkspace": "Roo wil een afbeelding genereren buiten de werkruimte:", - "wantsToGenerateImageProtected": "Roo wil een afbeelding genereren op een beschermde locatie:", - "didGenerateImage": "Roo heeft een afbeelding gegenereerd:" + "wantsToRead": "Roo wil dit bestand lezen", + "wantsToReadOutsideWorkspace": "Roo wil dit bestand buiten de werkruimte lezen", + "didRead": "Roo heeft dit bestand gelezen", + "wantsToEdit": "Roo wil dit bestand bewerken", + "wantsToEditOutsideWorkspace": "Roo wil dit bestand buiten de werkruimte bewerken", + "wantsToEditProtected": "Roo wil een beveiligd configuratiebestand bewerken", + "wantsToCreate": "Roo wil een nieuw bestand aanmaken", + "wantsToSearchReplace": "Roo wil zoeken en vervangen in dit bestand", + "didSearchReplace": "Roo heeft zoeken en vervangen uitgevoerd op dit bestand", + "wantsToInsert": "Roo wil inhoud invoegen in dit bestand", + "wantsToInsertWithLineNumber": "Roo wil inhoud invoegen in dit bestand op regel {{lineNumber}}", + "wantsToInsertAtEnd": "Roo wil inhoud toevoegen aan het einde van dit bestand", + "wantsToReadAndXMore": "Roo wil dit bestand en nog {{count}} andere lezen", + "wantsToReadMultiple": "Roo wil meerdere bestanden lezen", + "wantsToApplyBatchChanges": "Roo wil wijzigingen toepassen op meerdere bestanden", + "wantsToGenerateImage": "Roo wil een afbeelding genereren", + "wantsToGenerateImageOutsideWorkspace": "Roo wil een afbeelding genereren buiten de werkruimte", + "wantsToGenerateImageProtected": "Roo wil een afbeelding genereren op een beschermde locatie", + "didGenerateImage": "Roo heeft een afbeelding gegenereerd" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo wil de bovenliggende bestanden in deze map bekijken:", - "didViewTopLevel": "Roo heeft de bovenliggende bestanden in deze map bekeken:", - "wantsToViewRecursive": "Roo wil alle bestanden in deze map recursief bekijken:", - "didViewRecursive": "Roo heeft alle bestanden in deze map recursief bekeken:", - "wantsToViewDefinitions": "Roo wil broncode-definitienamen bekijken die in deze map worden gebruikt:", - "didViewDefinitions": "Roo heeft broncode-definitienamen bekeken die in deze map worden gebruikt:", - "wantsToSearch": "Roo wil deze map doorzoeken op {{regex}}:", - "didSearch": "Roo heeft deze map doorzocht op {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo wil deze map (buiten werkruimte) doorzoeken op {{regex}}:", - "didSearchOutsideWorkspace": "Roo heeft deze map (buiten werkruimte) doorzocht op {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo wil de bovenliggende bestanden in deze map (buiten werkruimte) bekijken:", - "didViewTopLevelOutsideWorkspace": "Roo heeft de bovenliggende bestanden in deze map (buiten werkruimte) bekeken:", - "wantsToViewRecursiveOutsideWorkspace": "Roo wil alle bestanden in deze map (buiten werkruimte) recursief bekijken:", - "didViewRecursiveOutsideWorkspace": "Roo heeft alle bestanden in deze map (buiten werkruimte) recursief bekeken:", - "wantsToViewDefinitionsOutsideWorkspace": "Roo wil broncode-definitienamen bekijken die in deze map (buiten werkruimte) worden gebruikt:", - "didViewDefinitionsOutsideWorkspace": "Roo heeft broncode-definitienamen bekeken die in deze map (buiten werkruimte) worden gebruikt:" + "wantsToViewTopLevel": "Roo wil de bovenliggende bestanden in deze map bekijken", + "didViewTopLevel": "Roo heeft de bovenliggende bestanden in deze map bekeken", + "wantsToViewRecursive": "Roo wil alle bestanden in deze map recursief bekijken", + "didViewRecursive": "Roo heeft alle bestanden in deze map recursief bekeken", + "wantsToViewDefinitions": "Roo wil broncode-definitienamen bekijken die in deze map worden gebruikt", + "didViewDefinitions": "Roo heeft broncode-definitienamen bekeken die in deze map worden gebruikt", + "wantsToSearch": "Roo wil deze map doorzoeken op {{regex}}", + "didSearch": "Roo heeft deze map doorzocht op {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo wil deze map (buiten werkruimte) doorzoeken op {{regex}}", + "didSearchOutsideWorkspace": "Roo heeft deze map (buiten werkruimte) doorzocht op {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo wil de bovenliggende bestanden in deze map (buiten werkruimte) bekijken", + "didViewTopLevelOutsideWorkspace": "Roo heeft de bovenliggende bestanden in deze map (buiten werkruimte) bekeken", + "wantsToViewRecursiveOutsideWorkspace": "Roo wil alle bestanden in deze map (buiten werkruimte) recursief bekijken", + "didViewRecursiveOutsideWorkspace": "Roo heeft alle bestanden in deze map (buiten werkruimte) recursief bekeken", + "wantsToViewDefinitionsOutsideWorkspace": "Roo wil broncode-definitienamen bekijken die in deze map (buiten werkruimte) worden gebruikt", + "didViewDefinitionsOutsideWorkspace": "Roo heeft broncode-definitienamen bekeken die in deze map (buiten werkruimte) worden gebruikt" }, "commandOutput": "Commando-uitvoer", "commandExecution": { "running": "Lopend", + "abort": "Afbreken", "pid": "PID: {{pid}}", - "exited": "Afgesloten ({{exitCode}})", - "manageCommands": "Beheer Commando Toestemmingen", - "commandManagementDescription": "Beheer commando toestemmingen: Klik op ✓ om automatische uitvoering toe te staan, ✗ om uitvoering te weigeren. Patronen kunnen worden in- of uitgeschakeld of uit lijsten worden verwijderd. Bekijk alle instellingen", + "exitStatus": "Afgesloten met status {{exitCode}}", + "manageCommands": "Automatisch goedgekeurde commando's", "addToAllowed": "Toevoegen aan toegestane lijst", "removeFromAllowed": "Verwijderen van toegestane lijst", "addToDenied": "Toevoegen aan geweigerde lijst", @@ -215,9 +215,15 @@ }, "response": "Antwoord", "arguments": "Argumenten", + "text": { + "rooSaid": "Roo zei" + }, + "feedback": { + "youSaid": "Jij zei" + }, "mcp": { - "wantsToUseTool": "Roo wil een tool gebruiken op de {{serverName}} MCP-server:", - "wantsToAccessResource": "Roo wil een bron benaderen op de {{serverName}} MCP-server:" + "wantsToUseTool": "Roo wil een tool gebruiken op de {{serverName}} MCP-server", + "wantsToAccessResource": "Roo wil een bron benaderen op de {{serverName}} MCP-server" }, "modes": { "wantsToSwitch": "Roo wil overschakelen naar {{mode}} modus", @@ -226,7 +232,7 @@ "didSwitchWithReason": "Roo is overgeschakeld naar {{mode}} modus omdat: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo wil een nieuwe subtaak aanmaken in {{mode}} modus:", + "wantsToCreate": "Roo wil een nieuwe subtaak aanmaken in {{mode}} modus", "wantsToFinish": "Roo wil deze subtaak voltooien", "newTaskContent": "Subtaak-instructies", "completionContent": "Subtaak voltooid", @@ -235,7 +241,7 @@ "completionInstructions": "Subtaak voltooid! Je kunt de resultaten bekijken en eventuele correcties of volgende stappen voorstellen. Als alles goed is, bevestig dan om het resultaat terug te sturen naar de hoofdtaak." }, "questions": { - "hasQuestion": "Roo heeft een vraag:" + "hasQuestion": "Roo heeft een vraag" }, "taskCompleted": "Taak voltooid", "error": "Fout", @@ -250,6 +256,7 @@ "tooltipManage": "Beheer instellingen voor automatische goedkeuring", "tooltipStatus": "Automatische goedkeuring ingeschakeld voor: {{toggles}}", "title": "Automatisch goedkeuren", + "toggle": "Automatisch goedkeuren in-/uitschakelen", "all": "Alles", "none": "Geen", "description": "Voer deze acties uit zonder om toestemming te vragen. Schakel dit alleen in voor acties die je volledig vertrouwt.", @@ -264,12 +271,14 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} uitgebracht", - "description": "Introductie van Roo Code Cloud: De kracht van Roo brengen voorbij de IDE", - "feature1": "Volg taakvoortgang overal (Gratis): Krijg realtime updates van langlopende taken zonder vast te zitten in je IDE", - "feature2": "Bestuur de Roo Extensie op afstand (Pro): Start, stop en interacteer met taken vanuit een chat-gebaseerde browserinterface.", - "learnMore": "Klaar om de controle te nemen? Leer meer hier.", - "visitCloudButton": "Bezoek Roo Code Cloud", - "socialLinks": "Sluit je bij ons aan op X, Discord, of r/RooCode" + "stealthModel": { + "feature": "Beperkt tijd GRATIS stealth model - Code Supernova: Een veelzijdig agentisch codeermodel dat beeldinvoer ondersteunt, beschikbaar via Roo Code Cloud.", + "note": "(Opmerking: prompts en aanvullingen worden gelogd door de modelmaker en gebruikt om het model te verbeteren)", + "connectButton": "Verbinden met Roo Code Cloud", + "selectModel": "Selecteer roo/code-supernova van de Roo Code Cloud provider in Instellingen om te beginnen.", + "goToSettingsButton": "Ga naar Instellingen" + }, + "socialLinks": "Sluit je bij ons aan op X, Discord, of r/RooCode 🚀" }, "reasoning": { "thinking": "Denkt na", @@ -287,7 +296,7 @@ "countdownDisplay": "{{count}}s" }, "browser": { - "rooWantsToUse": "Roo wil de browser gebruiken:", + "rooWantsToUse": "Roo wil de browser gebruiken", "consoleLogs": "Console-logboeken", "noNewLogs": "(Geen nieuwe logboeken)", "screenshot": "Browserschermopname", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Codeblok uitvouwen", "collapse": "Codeblok samenvouwen", - "enable_wrap": "Regelafbreking inschakelen", - "disable_wrap": "Regelafbreking uitschakelen", "copy_code": "Code kopiëren" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo wil de codebase doorzoeken op {{query}}:", - "wantsToSearchWithPath": "Roo wil de codebase doorzoeken op {{query}} in {{path}}:", + "wantsToSearch": "Roo wil de codebase doorzoeken op {{query}}", + "wantsToSearchWithPath": "Roo wil de codebase doorzoeken op {{query}} in {{path}}", "didSearch_one": "1 resultaat gevonden", "didSearch_other": "{{count}} resultaten gevonden", "resultTooltip": "Gelijkenisscore: {{score}} (klik om bestand te openen)" @@ -399,23 +406,11 @@ "url": "Plak URL om inhoud op te halen" }, "queuedMessages": { - "title": "Berichten in wachtrij:", + "title": "Berichten in wachtrij", "clickToEdit": "Klik om bericht te bewerken" }, "slashCommand": { - "wantsToRun": "Roo wil een slash commando uitvoeren:", - "didRun": "Roo heeft een slash commando uitgevoerd:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Limiet voor automatisch goedgekeurde verzoeken bereikt", - "description": "Roo heeft de limiet van {{count}} automatisch goedgekeurde API-verzoek(en) bereikt. Wil je de teller resetten en doorgaan met de taak?", - "button": "Reset en ga door" - }, - "autoApprovedCostLimitReached": { - "title": "Automatisch goedgekeurde kostenlimiet bereikt", - "description": "Roo heeft de automatisch goedgekeurde kostenlimiet van ${{count}} bereikt. Wil je de kosten resetten en doorgaan met de taak?", - "button": "Reset en ga door" - } + "wantsToRun": "Roo wil een slash commando uitvoeren", + "didRun": "Roo heeft een slash commando uitgevoerd" } } diff --git a/webview-ui/src/i18n/locales/nl/cloud.json b/webview-ui/src/i18n/locales/nl/cloud.json index 533237c88c9..dc582e719b7 100644 --- a/webview-ui/src/i18n/locales/nl/cloud.json +++ b/webview-ui/src/i18n/locales/nl/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Problemen?", "pasteCallbackUrl": "Kopieer de redirect-URL uit je browser en plak hem hier:", "startOver": "Opnieuw beginnen", + "personalAccount": "Persoonlijk Account", + "switchAccount": "Wissel van Roo Code Cloud Account", + "createTeamAccount": "Teamaccount aanmaken", "cloudUrlPillLabel": "Roo Code Cloud URL", "upsell": { "autoApprovePowerUser": "Roo wat onafhankelijkheid geven? Bedien het overal met Roo Code Cloud. Meer informatie.", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index ee0ba193e5c..5f419a65806 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Slash-opdrachten", "prompts": "Prompts", + "ui": "UI", "experimental": "Experimenteel", "language": "Taal", "about": "Over Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Reset naar standaard" }, "autoApprove": { + "toggleShortcut": "U kunt een globale sneltoets voor deze instelling configureren in de voorkeuren van uw IDE.", "description": "Sta Roo toe om automatisch handelingen uit te voeren zonder goedkeuring. Schakel deze instellingen alleen in als je de AI volledig vertrouwt en de bijbehorende beveiligingsrisico's begrijpt.", "enabled": "Auto-goedkeuren ingeschakeld", "toggleAriaLabel": "Automatisch goedkeuren in-/uitschakelen", @@ -380,6 +382,8 @@ "modelId": "Model-ID", "apiKey": "Ollama API-sleutel", "apiKeyHelp": "Optionele API-sleutel voor geauthenticeerde Ollama-instanties of cloudservices. Laat leeg voor lokale installaties.", + "numCtx": "Contextvenstergrootte (num_ctx)", + "numCtxHelp": "Overschrijft de standaard contextvenstergrootte van het model. Laat leeg om de Modelfile-configuratie van het model te gebruiken. De minimumwaarde is 128.", "description": "Ollama laat je modellen lokaal op je computer draaien. Zie hun quickstart-gids voor instructies.", "warning": "Let op: Roo Code gebruikt complexe prompts en werkt het beste met Claude-modellen. Minder krachtige modellen werken mogelijk niet zoals verwacht." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Veilig geauthenticeerd via je Roo Code Cloud-account.", "connectButton": "Verbinden met Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth-referentiepad", + "oauthPathDescription": "Pad naar je ChatGPT Codex auth.json-referenties. Standaard {{defaultPath}} als leeg gelaten (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex gebruikt je ChatGPT-webreferenties via de officiële Codex CLI. Authenticeer met de Codex CLI zodat auth.json wordt aangemaakt. Als je een aangepaste locatie gebruikt, stel hier het volledige bestandspad in.", + "oauthConnectDescription": "Na authenticatie zal Roo het toegangstoken uit auth.json lezen en verbinden met ChatGPT Responses (Codex).", + "learnMoreLinkText": "Meer leren over ChatGPT" + }, "openRouter": { "providerRouting": { "title": "OpenRouter-providerroutering", @@ -824,7 +835,8 @@ "providerNotAllowed": "Provider '{{provider}}' is niet toegestaan door je organisatie", "modelNotAllowed": "Model '{{model}}' is niet toegestaan voor provider '{{provider}}' door je organisatie", "profileInvalid": "Dit profiel bevat een provider of model dat niet is toegestaan door je organisatie", - "qwenCodeOauthPath": "Je moet een geldig OAuth-referentiepad opgeven" + "qwenCodeOauthPath": "Je moet een geldig OAuth-referentiepad opgeven", + "openAiNativeCodexOauthPath": "Optioneel: Pad naar ChatGPT Codex auth.json. Wanneer leeg, standaard ~/.codex/auth.json." }, "placeholders": { "apiKey": "Voer API-sleutel in...", @@ -877,5 +889,11 @@ "output": "Uitvoer", "cacheReads": "Cache leest" } + }, + "ui": { + "collapseThinking": { + "label": "Denkberichten standaard samenvouwen", + "description": "Indien ingeschakeld, worden denkblokken standaard samengevouwen totdat je ermee interageert" + } } } diff --git a/webview-ui/src/i18n/locales/nl/welcome.json b/webview-ui/src/i18n/locales/nl/welcome.json index 625122816d2..912b38e3eea 100644 --- a/webview-ui/src/i18n/locales/nl/welcome.json +++ b/webview-ui/src/i18n/locales/nl/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Een uniforme interface voor LLM's" + }, + "roo": { + "description": "De beste gratis modellen om mee te beginnen", + "incentive": "Probeer Roo gratis uit" } }, "chooseProvider": "Om zijn magie te doen, heeft Roo een API-sleutel nodig.", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 3c97c4d7d20..26e8e59e2c6 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -61,7 +61,7 @@ "tooltip": "Zatwierdź tę akcję" }, "runCommand": { - "title": "Uruchom polecenie", + "title": "Polecenie", "tooltip": "Wykonaj to polecenie" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Szukaj trybów...", "noResults": "Nie znaleziono wyników" }, - "errorReadingFile": "Błąd odczytu pliku:", + "errorReadingFile": "Błąd odczytu pliku", "noValidImages": "Nie przetworzono żadnych prawidłowych obrazów", "separator": "Separator", "edit": "Edytuj...", @@ -163,51 +163,51 @@ "wantsToFetch": "Roo chce pobrać szczegółowe instrukcje, aby pomóc w bieżącym zadaniu" }, "fileOperations": { - "wantsToRead": "Roo chce przeczytać ten plik:", - "wantsToReadOutsideWorkspace": "Roo chce przeczytać ten plik poza obszarem roboczym:", - "didRead": "Roo przeczytał ten plik:", - "wantsToEdit": "Roo chce edytować ten plik:", - "wantsToEditOutsideWorkspace": "Roo chce edytować ten plik poza obszarem roboczym:", - "wantsToEditProtected": "Roo chce edytować chroniony plik konfiguracyjny:", - "wantsToCreate": "Roo chce utworzyć nowy plik:", - "wantsToSearchReplace": "Roo chce wykonać wyszukiwanie i zamianę w tym pliku:", - "didSearchReplace": "Roo wykonał wyszukiwanie i zamianę w tym pliku:", - "wantsToInsert": "Roo chce wstawić zawartość do tego pliku:", - "wantsToInsertWithLineNumber": "Roo chce wstawić zawartość do tego pliku w linii {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo chce dodać zawartość na końcu tego pliku:", - "wantsToReadAndXMore": "Roo chce przeczytać ten plik i {{count}} więcej:", - "wantsToReadMultiple": "Roo chce odczytać wiele plików:", - "wantsToApplyBatchChanges": "Roo chce zastosować zmiany do wielu plików:", - "wantsToGenerateImage": "Roo chce wygenerować obraz:", - "wantsToGenerateImageOutsideWorkspace": "Roo chce wygenerować obraz poza obszarem roboczym:", - "wantsToGenerateImageProtected": "Roo chce wygenerować obraz w chronionym miejscu:", - "didGenerateImage": "Roo wygenerował obraz:" + "wantsToRead": "Roo chce przeczytać ten plik", + "wantsToReadOutsideWorkspace": "Roo chce przeczytać ten plik poza obszarem roboczym", + "didRead": "Roo przeczytał ten plik", + "wantsToEdit": "Roo chce edytować ten plik", + "wantsToEditOutsideWorkspace": "Roo chce edytować ten plik poza obszarem roboczym", + "wantsToEditProtected": "Roo chce edytować chroniony plik konfiguracyjny", + "wantsToCreate": "Roo chce utworzyć nowy plik", + "wantsToSearchReplace": "Roo chce wykonać wyszukiwanie i zamianę w tym pliku", + "didSearchReplace": "Roo wykonał wyszukiwanie i zamianę w tym pliku", + "wantsToInsert": "Roo chce wstawić zawartość do tego pliku", + "wantsToInsertWithLineNumber": "Roo chce wstawić zawartość do tego pliku w linii {{lineNumber}}", + "wantsToInsertAtEnd": "Roo chce dodać zawartość na końcu tego pliku", + "wantsToReadAndXMore": "Roo chce przeczytać ten plik i {{count}} więcej", + "wantsToReadMultiple": "Roo chce odczytać wiele plików", + "wantsToApplyBatchChanges": "Roo chce zastosować zmiany do wielu plików", + "wantsToGenerateImage": "Roo chce wygenerować obraz", + "wantsToGenerateImageOutsideWorkspace": "Roo chce wygenerować obraz poza obszarem roboczym", + "wantsToGenerateImageProtected": "Roo chce wygenerować obraz w chronionym miejscu", + "didGenerateImage": "Roo wygenerował obraz" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo chce zobaczyć pliki najwyższego poziomu w tym katalogu:", - "didViewTopLevel": "Roo zobaczył pliki najwyższego poziomu w tym katalogu:", - "wantsToViewRecursive": "Roo chce rekurencyjnie zobaczyć wszystkie pliki w tym katalogu:", - "didViewRecursive": "Roo rekurencyjnie zobaczył wszystkie pliki w tym katalogu:", - "wantsToViewDefinitions": "Roo chce zobaczyć nazwy definicji kodu źródłowego używane w tym katalogu:", - "didViewDefinitions": "Roo zobaczył nazwy definicji kodu źródłowego używane w tym katalogu:", - "wantsToSearch": "Roo chce przeszukać ten katalog w poszukiwaniu {{regex}}:", - "didSearch": "Roo przeszukał ten katalog w poszukiwaniu {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo chce przeszukać ten katalog (poza obszarem roboczym) w poszukiwaniu {{regex}}:", - "didSearchOutsideWorkspace": "Roo przeszukał ten katalog (poza obszarem roboczym) w poszukiwaniu {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo chce zobaczyć pliki najwyższego poziomu w tym katalogu (poza obszarem roboczym):", - "didViewTopLevelOutsideWorkspace": "Roo zobaczył pliki najwyższego poziomu w tym katalogu (poza obszarem roboczym):", - "wantsToViewRecursiveOutsideWorkspace": "Roo chce rekurencyjnie zobaczyć wszystkie pliki w tym katalogu (poza obszarem roboczym):", - "didViewRecursiveOutsideWorkspace": "Roo rekurencyjnie zobaczył wszystkie pliki w tym katalogu (poza obszarem roboczym):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo chce zobaczyć nazwy definicji kodu źródłowego używane w tym katalogu (poza obszarem roboczym):", - "didViewDefinitionsOutsideWorkspace": "Roo zobaczył nazwy definicji kodu źródłowego używane w tym katalogu (poza obszarem roboczym):" + "wantsToViewTopLevel": "Roo chce zobaczyć pliki najwyższego poziomu w tym katalogu", + "didViewTopLevel": "Roo zobaczył pliki najwyższego poziomu w tym katalogu", + "wantsToViewRecursive": "Roo chce rekurencyjnie zobaczyć wszystkie pliki w tym katalogu", + "didViewRecursive": "Roo rekurencyjnie zobaczył wszystkie pliki w tym katalogu", + "wantsToViewDefinitions": "Roo chce zobaczyć nazwy definicji kodu źródłowego używane w tym katalogu", + "didViewDefinitions": "Roo zobaczył nazwy definicji kodu źródłowego używane w tym katalogu", + "wantsToSearch": "Roo chce przeszukać ten katalog w poszukiwaniu {{regex}}", + "didSearch": "Roo przeszukał ten katalog w poszukiwaniu {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo chce przeszukać ten katalog (poza obszarem roboczym) w poszukiwaniu {{regex}}", + "didSearchOutsideWorkspace": "Roo przeszukał ten katalog (poza obszarem roboczym) w poszukiwaniu {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo chce zobaczyć pliki najwyższego poziomu w tym katalogu (poza obszarem roboczym)", + "didViewTopLevelOutsideWorkspace": "Roo zobaczył pliki najwyższego poziomu w tym katalogu (poza obszarem roboczym)", + "wantsToViewRecursiveOutsideWorkspace": "Roo chce rekurencyjnie zobaczyć wszystkie pliki w tym katalogu (poza obszarem roboczym)", + "didViewRecursiveOutsideWorkspace": "Roo rekurencyjnie zobaczył wszystkie pliki w tym katalogu (poza obszarem roboczym)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo chce zobaczyć nazwy definicji kodu źródłowego używane w tym katalogu (poza obszarem roboczym)", + "didViewDefinitionsOutsideWorkspace": "Roo zobaczył nazwy definicji kodu źródłowego używane w tym katalogu (poza obszarem roboczym)" }, "commandOutput": "Wyjście polecenia", "commandExecution": { "running": "Wykonywanie", + "abort": "Przerwij", "pid": "PID: {{pid}}", - "exited": "Zakończono ({{exitCode}})", - "manageCommands": "Zarządzaj uprawnieniami poleceń", - "commandManagementDescription": "Zarządzaj uprawnieniami poleceń: Kliknij ✓, aby zezwolić na automatyczne wykonanie, ✗, aby odmówić wykonania. Wzorce można włączać/wyłączać lub usuwać z listy. Zobacz wszystkie ustawienia", + "exitStatus": "Zakończono ze statusem {{exitCode}}", + "manageCommands": "Polecenia zatwierdzone automatycznie", "addToAllowed": "Dodaj do listy dozwolonych", "removeFromAllowed": "Usuń z listy dozwolonych", "addToDenied": "Dodaj do listy odrzuconych", @@ -220,9 +220,15 @@ }, "response": "Odpowiedź", "arguments": "Argumenty", + "text": { + "rooSaid": "Roo powiedział" + }, + "feedback": { + "youSaid": "Powiedziałeś" + }, "mcp": { - "wantsToUseTool": "Roo chce użyć narzędzia na serwerze MCP {{serverName}}:", - "wantsToAccessResource": "Roo chce uzyskać dostęp do zasobu na serwerze MCP {{serverName}}:" + "wantsToUseTool": "Roo chce użyć narzędzia na serwerze MCP {{serverName}}", + "wantsToAccessResource": "Roo chce uzyskać dostęp do zasobu na serwerze MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo chce przełączyć się na tryb {{mode}}", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo przełączył się na tryb {{mode}} ponieważ: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo chce utworzyć nowe podzadanie w trybie {{mode}}:", + "wantsToCreate": "Roo chce utworzyć nowe podzadanie w trybie {{mode}}", "wantsToFinish": "Roo chce zakończyć to podzadanie", "newTaskContent": "Instrukcje podzadania", "completionContent": "Podzadanie zakończone", @@ -240,7 +246,7 @@ "completionInstructions": "Podzadanie zakończone! Możesz przejrzeć wyniki i zasugerować poprawki lub następne kroki. Jeśli wszystko wygląda dobrze, potwierdź, aby zwrócić wynik do zadania nadrzędnego." }, "questions": { - "hasQuestion": "Roo ma pytanie:" + "hasQuestion": "Roo ma pytanie" }, "taskCompleted": "Zadanie zakończone", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "Zarządzaj ustawieniami automatycznego zatwierdzania", "tooltipStatus": "Automatyczne zatwierdzanie włączone dla: {{toggles}}", "title": "Automatyczne zatwierdzanie", + "toggle": "Przełącz automatyczne zatwierdzanie", "all": "Wszystkie", "none": "Żadne", "description": "Wykonuj te działania bez pytania o zgodę. Włącz tę opcję tylko dla działań, którym w pełni ufasz.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} wydany", - "description": "Przedstawiamy Roo Code Cloud: Przenosimy moc Roo poza IDE", - "feature1": "Śledź postęp zadań z dowolnego miejsca (Bezpłatnie): Otrzymuj aktualizacje w czasie rzeczywistym długotrwałych zadań bez utknięcia w IDE", - "feature2": "Kontroluj rozszerzenie Roo zdalnie (Pro): Uruchamiaj, zatrzymuj i wchodź w interakcje z zadaniami z interfejsu przeglądarki opartego na czacie.", - "learnMore": "Gotowy przejąć kontrolę? Dowiedz się więcej tutaj.", - "visitCloudButton": "Odwiedź Roo Code Cloud", - "socialLinks": "Dołącz do nas na X, Discord, lub r/RooCode" + "stealthModel": { + "feature": "Darmowy model stealth na ograniczony czas - Code Supernova: Wszechstronny model kodowania agentowego, który obsługuje wprowadzanie obrazów, dostępny przez Roo Code Cloud.", + "note": "(Uwaga: prompty i uzupełnienia są rejestrowane przez twórcę modelu i używane do jego ulepszania)", + "connectButton": "Połącz z Roo Code Cloud", + "selectModel": "Wybierz roo/code-supernova od dostawcy Roo Code Cloud w Ustawieniach, aby rozpocząć.", + "goToSettingsButton": "Przejdź do Ustawień" + }, + "socialLinks": "Dołącz do nas na X, Discord, lub r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo chce użyć przeglądarki:", + "rooWantsToUse": "Roo chce użyć przeglądarki", "consoleLogs": "Logi konsoli", "noNewLogs": "(Brak nowych logów)", "screenshot": "Zrzut ekranu przeglądarki", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Rozwiń blok kodu", "collapse": "Zwiń blok kodu", - "enable_wrap": "Włącz zawijanie wierszy", - "disable_wrap": "Wyłącz zawijanie wierszy", "copy_code": "Kopiuj kod" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo chce przeszukać bazę kodu w poszukiwaniu {{query}}:", - "wantsToSearchWithPath": "Roo chce przeszukać bazę kodu w poszukiwaniu {{query}} w {{path}}:", + "wantsToSearch": "Roo chce przeszukać bazę kodu w poszukiwaniu {{query}}", + "wantsToSearchWithPath": "Roo chce przeszukać bazę kodu w poszukiwaniu {{query}} w {{path}}", "didSearch_one": "Znaleziono 1 wynik", "didSearch_other": "Znaleziono {{count}} wyników", "resultTooltip": "Wynik podobieństwa: {{score}} (kliknij, aby otworzyć plik)" @@ -399,23 +406,11 @@ "url": "Wklej adres URL, aby pobrać zawartość" }, "queuedMessages": { - "title": "Wiadomości w kolejce:", + "title": "Wiadomości w kolejce", "clickToEdit": "Kliknij, aby edytować wiadomość" }, "slashCommand": { - "wantsToRun": "Roo chce uruchomić komendę slash:", - "didRun": "Roo uruchomił komendę slash:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Osiągnięto limit automatycznie zatwierdzonych żądań", - "description": "Roo osiągnął automatycznie zatwierdzony limit {{count}} żądania/żądań API. Czy chcesz zresetować licznik i kontynuować zadanie?", - "button": "Zresetuj i kontynuuj" - }, - "autoApprovedCostLimitReached": { - "title": "Osiągnięto limit kosztów z automatycznym zatwierdzaniem", - "description": "Roo osiągnął automatycznie zatwierdzony limit kosztów wynoszący ${{count}}. Czy chcesz zresetować koszt i kontynuować zadanie?", - "button": "Zresetuj i Kontynuuj" - } + "wantsToRun": "Roo chce uruchomić komendę slash", + "didRun": "Roo uruchomił komendę slash" } } diff --git a/webview-ui/src/i18n/locales/pl/cloud.json b/webview-ui/src/i18n/locales/pl/cloud.json index be940d37104..790d2cdf741 100644 --- a/webview-ui/src/i18n/locales/pl/cloud.json +++ b/webview-ui/src/i18n/locales/pl/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Masz problemy?", "pasteCallbackUrl": "Skopiuj URL redirect z przeglądarki i wklej tutaj:", "startOver": "Zacznij od nowa", + "personalAccount": "Konto Osobiste", + "switchAccount": "Przełącz Konto Roo Code Cloud", + "createTeamAccount": "Utwórz Konto Zespołu", "cloudUrlPillLabel": "URL Roo Code Cloud", "upsell": { "autoApprovePowerUser": "Dać Roo trochę niezależności? Kontroluj go z dowolnego miejsca dzięki Roo Code Cloud. Dowiedz się więcej.", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 2d30547d9f4..6a61aef42f3 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Polecenia Slash", "prompts": "Podpowiedzi", + "ui": "UI", "experimental": "Eksperymentalne", "language": "Język", "about": "O Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Przywróć domyślne" }, "autoApprove": { + "toggleShortcut": "Możesz skonfigurować globalny skrót dla tego ustawienia w preferencjach swojego IDE.", "description": "Pozwól Roo na automatyczne wykonywanie operacji bez wymagania zatwierdzenia. Włącz te ustawienia tylko jeśli w pełni ufasz AI i rozumiesz związane z tym zagrożenia bezpieczeństwa.", "enabled": "Auto-zatwierdzanie włączone", "toggleAriaLabel": "Przełącz automatyczne zatwierdzanie", @@ -380,6 +382,8 @@ "modelId": "ID modelu", "apiKey": "Klucz API Ollama", "apiKeyHelp": "Opcjonalny klucz API dla uwierzytelnionych instancji Ollama lub usług chmurowych. Pozostaw puste dla instalacji lokalnych.", + "numCtx": "Rozmiar okna kontekstu (num_ctx)", + "numCtxHelp": "Zastępuje domyślny rozmiar okna kontekstu modelu. Pozostaw puste, aby użyć konfiguracji Modelfile modelu. Minimalna wartość to 128.", "description": "Ollama pozwala na lokalne uruchamianie modeli na twoim komputerze. Aby rozpocząć, zapoznaj się z przewodnikiem szybkiego startu.", "warning": "Uwaga: Roo Code używa złożonych podpowiedzi i działa najlepiej z modelami Claude. Modele o niższych możliwościach mogą nie działać zgodnie z oczekiwaniami." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Bezpiecznie uwierzytelniony przez twoje konto Roo Code Cloud.", "connectButton": "Połącz z Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Ścieżka poświadczeń OAuth", + "oauthPathDescription": "Ścieżka do twoich poświadczeń auth.json ChatGPT Codex. Domyślnie {{defaultPath}} jeśli pozostawione puste (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex używa twoich poświadczeń internetowych ChatGPT przez oficjalne CLI Codex. Uwierzytelnij się za pomocą CLI Codex, aby utworzono auth.json. Jeśli używasz niestandardowej lokalizacji, ustaw tutaj pełną ścieżkę pliku.", + "oauthConnectDescription": "Po uwierzytelnieniu Roo odczyta token dostępu z auth.json i połączy się z ChatGPT Responses (Codex).", + "learnMoreLinkText": "Dowiedz się więcej o ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Routing dostawców OpenRouter", @@ -824,7 +835,8 @@ "providerNotAllowed": "Dostawca '{{provider}}' nie jest dozwolony przez Twoją organizację", "modelNotAllowed": "Model '{{model}}' nie jest dozwolony dla dostawcy '{{provider}}' przez Twoją organizację", "profileInvalid": "Ten profil zawiera dostawcę lub model, który nie jest dozwolony przez Twoją organizację", - "qwenCodeOauthPath": "Musisz podać prawidłową ścieżkę do poświadczeń OAuth" + "qwenCodeOauthPath": "Musisz podać prawidłową ścieżkę do poświadczeń OAuth", + "openAiNativeCodexOauthPath": "Opcjonalne: Ścieżka do auth.json ChatGPT Codex. Gdy puste, domyślnie ~/.codex/auth.json." }, "placeholders": { "apiKey": "Wprowadź klucz API...", @@ -877,5 +889,11 @@ "output": "Wyjście", "cacheReads": "Odczyty z pamięci podręcznej" } + }, + "ui": { + "collapseThinking": { + "label": "Domyślnie zwijaj komunikaty o myśleniu", + "description": "Gdy włączone, bloki myślenia będą domyślnie zwinięte, dopóki nie wejdziesz z nimi w interakcję" + } } } diff --git a/webview-ui/src/i18n/locales/pl/welcome.json b/webview-ui/src/i18n/locales/pl/welcome.json index 7bddbac4cba..8e63cf9d8f5 100644 --- a/webview-ui/src/i18n/locales/pl/welcome.json +++ b/webview-ui/src/i18n/locales/pl/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Ujednolicony interfejs dla LLMs" + }, + "roo": { + "description": "Najlepsze darmowe modele na start", + "incentive": "Wypróbuj Roo za darmo" } }, "chooseProvider": "Aby działać, Roo potrzebuje klucza API.", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index ca9460cc760..b14a1bbaa79 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -61,7 +61,7 @@ "tooltip": "Aprovar esta ação" }, "runCommand": { - "title": "Executar comando", + "title": "Comando", "tooltip": "Executar este comando" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Pesquisar modos...", "noResults": "Nenhum resultado encontrado" }, - "errorReadingFile": "Erro ao ler arquivo:", + "errorReadingFile": "Erro ao ler arquivo", "noValidImages": "Nenhuma imagem válida foi processada", "separator": "Separador", "edit": "Editar...", @@ -163,51 +163,51 @@ "wantsToFetch": "Roo quer buscar instruções detalhadas para ajudar com a tarefa atual" }, "fileOperations": { - "wantsToRead": "Roo quer ler este arquivo:", - "wantsToReadOutsideWorkspace": "Roo quer ler este arquivo fora do espaço de trabalho:", - "didRead": "Roo leu este arquivo:", - "wantsToEdit": "Roo quer editar este arquivo:", - "wantsToEditOutsideWorkspace": "Roo quer editar este arquivo fora do espaço de trabalho:", - "wantsToEditProtected": "Roo quer editar um arquivo de configuração protegido:", - "wantsToCreate": "Roo quer criar um novo arquivo:", - "wantsToSearchReplace": "Roo quer realizar busca e substituição neste arquivo:", - "didSearchReplace": "Roo realizou busca e substituição neste arquivo:", - "wantsToInsert": "Roo quer inserir conteúdo neste arquivo:", - "wantsToInsertWithLineNumber": "Roo quer inserir conteúdo neste arquivo na linha {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo quer adicionar conteúdo ao final deste arquivo:", - "wantsToReadAndXMore": "Roo quer ler este arquivo e mais {{count}}:", - "wantsToReadMultiple": "Roo deseja ler múltiplos arquivos:", - "wantsToApplyBatchChanges": "Roo quer aplicar alterações a múltiplos arquivos:", - "wantsToGenerateImage": "Roo quer gerar uma imagem:", - "wantsToGenerateImageOutsideWorkspace": "Roo quer gerar uma imagem fora do espaço de trabalho:", - "wantsToGenerateImageProtected": "Roo quer gerar uma imagem em um local protegido:", - "didGenerateImage": "Roo gerou uma imagem:" + "wantsToRead": "Roo quer ler este arquivo", + "wantsToReadOutsideWorkspace": "Roo quer ler este arquivo fora do espaço de trabalho", + "didRead": "Roo leu este arquivo", + "wantsToEdit": "Roo quer editar este arquivo", + "wantsToEditOutsideWorkspace": "Roo quer editar este arquivo fora do espaço de trabalho", + "wantsToEditProtected": "Roo quer editar um arquivo de configuração protegido", + "wantsToCreate": "Roo quer criar um novo arquivo", + "wantsToSearchReplace": "Roo quer realizar busca e substituição neste arquivo", + "didSearchReplace": "Roo realizou busca e substituição neste arquivo", + "wantsToInsert": "Roo quer inserir conteúdo neste arquivo", + "wantsToInsertWithLineNumber": "Roo quer inserir conteúdo neste arquivo na linha {{lineNumber}}", + "wantsToInsertAtEnd": "Roo quer adicionar conteúdo ao final deste arquivo", + "wantsToReadAndXMore": "Roo quer ler este arquivo e mais {{count}}", + "wantsToReadMultiple": "Roo deseja ler múltiplos arquivos", + "wantsToApplyBatchChanges": "Roo quer aplicar alterações a múltiplos arquivos", + "wantsToGenerateImage": "Roo quer gerar uma imagem", + "wantsToGenerateImageOutsideWorkspace": "Roo quer gerar uma imagem fora do espaço de trabalho", + "wantsToGenerateImageProtected": "Roo quer gerar uma imagem em um local protegido", + "didGenerateImage": "Roo gerou uma imagem" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo quer visualizar os arquivos de nível superior neste diretório:", - "didViewTopLevel": "Roo visualizou os arquivos de nível superior neste diretório:", - "wantsToViewRecursive": "Roo quer visualizar recursivamente todos os arquivos neste diretório:", - "didViewRecursive": "Roo visualizou recursivamente todos os arquivos neste diretório:", - "wantsToViewDefinitions": "Roo quer visualizar nomes de definição de código-fonte usados neste diretório:", - "didViewDefinitions": "Roo visualizou nomes de definição de código-fonte usados neste diretório:", - "wantsToSearch": "Roo quer pesquisar neste diretório por {{regex}}:", - "didSearch": "Roo pesquisou neste diretório por {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo quer pesquisar neste diretório (fora do espaço de trabalho) por {{regex}}:", - "didSearchOutsideWorkspace": "Roo pesquisou neste diretório (fora do espaço de trabalho) por {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo quer visualizar os arquivos de nível superior neste diretório (fora do espaço de trabalho):", - "didViewTopLevelOutsideWorkspace": "Roo visualizou os arquivos de nível superior neste diretório (fora do espaço de trabalho):", - "wantsToViewRecursiveOutsideWorkspace": "Roo quer visualizar recursivamente todos os arquivos neste diretório (fora do espaço de trabalho):", - "didViewRecursiveOutsideWorkspace": "Roo visualizou recursivamente todos os arquivos neste diretório (fora do espaço de trabalho):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo quer visualizar nomes de definição de código-fonte usados neste diretório (fora do espaço de trabalho):", - "didViewDefinitionsOutsideWorkspace": "Roo visualizou nomes de definição de código-fonte usados neste diretório (fora do espaço de trabalho):" + "wantsToViewTopLevel": "Roo quer visualizar os arquivos de nível superior neste diretório", + "didViewTopLevel": "Roo visualizou os arquivos de nível superior neste diretório", + "wantsToViewRecursive": "Roo quer visualizar recursivamente todos os arquivos neste diretório", + "didViewRecursive": "Roo visualizou recursivamente todos os arquivos neste diretório", + "wantsToViewDefinitions": "Roo quer visualizar nomes de definição de código-fonte usados neste diretório", + "didViewDefinitions": "Roo visualizou nomes de definição de código-fonte usados neste diretório", + "wantsToSearch": "Roo quer pesquisar neste diretório por {{regex}}", + "didSearch": "Roo pesquisou neste diretório por {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo quer pesquisar neste diretório (fora do espaço de trabalho) por {{regex}}", + "didSearchOutsideWorkspace": "Roo pesquisou neste diretório (fora do espaço de trabalho) por {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo quer visualizar os arquivos de nível superior neste diretório (fora do espaço de trabalho)", + "didViewTopLevelOutsideWorkspace": "Roo visualizou os arquivos de nível superior neste diretório (fora do espaço de trabalho)", + "wantsToViewRecursiveOutsideWorkspace": "Roo quer visualizar recursivamente todos os arquivos neste diretório (fora do espaço de trabalho)", + "didViewRecursiveOutsideWorkspace": "Roo visualizou recursivamente todos os arquivos neste diretório (fora do espaço de trabalho)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo quer visualizar nomes de definição de código-fonte usados neste diretório (fora do espaço de trabalho)", + "didViewDefinitionsOutsideWorkspace": "Roo visualizou nomes de definição de código-fonte usados neste diretório (fora do espaço de trabalho)" }, "commandOutput": "Saída do comando", "commandExecution": { "running": "Executando", + "abort": "Interromper", "pid": "PID: {{pid}}", - "exited": "Encerrado ({{exitCode}})", - "manageCommands": "Gerenciar Permissões de Comando", - "commandManagementDescription": "Gerencie as permissões de comando: Clique em ✓ para permitir a execução automática, ✗ para negar a execução. Os padrões podem ser ativados/desativados ou removidos das listas. Ver todas as configurações", + "exitStatus": "Saiu com o status {{exitCode}}", + "manageCommands": "Comandos aprovados automaticamente", "addToAllowed": "Adicionar à lista de permitidos", "removeFromAllowed": "Remover da lista de permitidos", "addToDenied": "Adicionar à lista de negados", @@ -220,9 +220,15 @@ }, "response": "Resposta", "arguments": "Argumentos", + "text": { + "rooSaid": "Roo disse" + }, + "feedback": { + "youSaid": "Você disse" + }, "mcp": { - "wantsToUseTool": "Roo quer usar uma ferramenta no servidor MCP {{serverName}}:", - "wantsToAccessResource": "Roo quer acessar um recurso no servidor MCP {{serverName}}:" + "wantsToUseTool": "Roo quer usar uma ferramenta no servidor MCP {{serverName}}", + "wantsToAccessResource": "Roo quer acessar um recurso no servidor MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo quer mudar para o modo {{mode}}", @@ -231,7 +237,7 @@ "didSwitchWithReason": "Roo mudou para o modo {{mode}} porque: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo quer criar uma nova subtarefa no modo {{mode}}:", + "wantsToCreate": "Roo quer criar uma nova subtarefa no modo {{mode}}", "wantsToFinish": "Roo quer finalizar esta subtarefa", "newTaskContent": "Instruções da subtarefa", "completionContent": "Subtarefa concluída", @@ -240,7 +246,7 @@ "completionInstructions": "Subtarefa concluída! Você pode revisar os resultados e sugerir correções ou próximos passos. Se tudo parecer bom, confirme para retornar o resultado à tarefa principal." }, "questions": { - "hasQuestion": "Roo tem uma pergunta:" + "hasQuestion": "Roo tem uma pergunta" }, "taskCompleted": "Tarefa concluída", "powershell": { @@ -250,6 +256,7 @@ "tooltipManage": "Gerenciar configurações de aprovação automática", "tooltipStatus": "Aprovação automática habilitada para: {{toggles}}", "title": "Aprovação automática", + "toggle": "Alternar aprovação automática", "all": "Todos", "none": "Nenhum", "description": "Execute estas ações sem pedir permissão. Ative isso apenas para ações em que você confia totalmente.", @@ -279,15 +286,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} Lançado", - "description": "Apresentando Roo Code Cloud: Levando o poder do Roo além da IDE", - "feature1": "Acompanhe o progresso das tarefas de qualquer lugar (Grátis): Receba atualizações em tempo real de tarefas de longa duração sem ficar preso na sua IDE", - "feature2": "Controle a Extensão Roo remotamente (Pro): Inicie, pare e interaja com tarefas de uma interface de navegador baseada em chat.", - "learnMore": "Pronto para assumir o controle? Saiba mais aqui.", - "visitCloudButton": "Visite Roo Code Cloud", - "socialLinks": "Junte-se a nós no X, Discord, ou r/RooCode" + "stealthModel": { + "feature": "Modelo stealth GRATUITO por tempo limitado - Code Supernova: Um modelo de codificação agêntica versátil que suporta entradas de imagem, acessível através do Roo Code Cloud.", + "note": "(Nota: prompts e completações são registrados pelo criador do modelo e usados para melhorá-lo)", + "connectButton": "Conectar ao Roo Code Cloud", + "selectModel": "Selecione roo/code-supernova do provedor Roo Code Cloud em Configurações para começar.", + "goToSettingsButton": "Ir para Configurações" + }, + "socialLinks": "Junte-se a nós no X, Discord, ou r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo quer usar o navegador:", + "rooWantsToUse": "Roo quer usar o navegador", "consoleLogs": "Logs do console", "noNewLogs": "(Sem novos logs)", "screenshot": "Captura de tela do navegador", @@ -312,8 +321,6 @@ "tooltips": { "expand": "Expandir bloco de código", "collapse": "Recolher bloco de código", - "enable_wrap": "Ativar quebra de linha", - "disable_wrap": "Desativar quebra de linha", "copy_code": "Copiar código" } }, @@ -337,8 +344,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo quer pesquisar na base de código por {{query}}:", - "wantsToSearchWithPath": "Roo quer pesquisar na base de código por {{query}} em {{path}}:", + "wantsToSearch": "Roo quer pesquisar na base de código por {{query}}", + "wantsToSearchWithPath": "Roo quer pesquisar na base de código por {{query}} em {{path}}", "didSearch_one": "Encontrado 1 resultado", "didSearch_other": "Encontrados {{count}} resultados", "resultTooltip": "Pontuação de similaridade: {{score}} (clique para abrir o arquivo)" @@ -399,23 +406,11 @@ "url": "Cole o URL para buscar o conteúdo" }, "queuedMessages": { - "title": "Mensagens na fila:", + "title": "Mensagens na fila", "clickToEdit": "Clique para editar a mensagem" }, "slashCommand": { - "wantsToRun": "Roo quer executar um comando slash:", - "didRun": "Roo executou um comando slash:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Limite de Solicitações Auto-aprovadas Atingido", - "description": "Roo atingiu o limite auto-aprovado de {{count}} solicitação(ões) de API. Deseja redefinir a contagem e prosseguir com a tarefa?", - "button": "Redefinir e Continuar" - }, - "autoApprovedCostLimitReached": { - "title": "Limite de Custo com Aprovação Automática Atingido", - "description": "Roo atingiu o limite de custo com aprovação automática de US${{count}}. Você gostaria de redefinir o custo e prosseguir com a tarefa?", - "button": "Redefinir e Continuar" - } + "wantsToRun": "Roo quer executar um comando slash", + "didRun": "Roo executou um comando slash" } } diff --git a/webview-ui/src/i18n/locales/pt-BR/cloud.json b/webview-ui/src/i18n/locales/pt-BR/cloud.json index 8511982769c..1d979d46d74 100644 --- a/webview-ui/src/i18n/locales/pt-BR/cloud.json +++ b/webview-ui/src/i18n/locales/pt-BR/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Tendo problemas?", "pasteCallbackUrl": "Copie a URL de redirect do seu navegador e cole aqui:", "startOver": "Recomeçar", + "personalAccount": "Conta Pessoal", + "switchAccount": "Alternar Conta do Roo Code Cloud", + "createTeamAccount": "Criar Conta de Equipe", "cloudUrlPillLabel": "URL do Roo Code Cloud ", "upsell": { "autoApprovePowerUser": "Dando um pouco de independência ao Roo? Controle-o de qualquer lugar com o Roo Code Cloud. Saiba mais.", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 338ab9f6b1f..b9dc2ef0194 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Comandos de Barra", "prompts": "Prompts", + "ui": "UI", "experimental": "Experimental", "language": "Idioma", "about": "Sobre" @@ -134,6 +135,7 @@ "resetToDefault": "Redefinir para o padrão" }, "autoApprove": { + "toggleShortcut": "Você pode configurar um atalho global para esta configuração nas preferências do seu IDE.", "description": "Permitir que o Roo realize operações automaticamente sem exigir aprovação. Ative essas configurações apenas se confiar totalmente na IA e compreender os riscos de segurança associados.", "enabled": "Aprovação automática habilitada", "toggleAriaLabel": "Alternar aprovação automática", @@ -380,6 +382,8 @@ "modelId": "ID do Modelo", "apiKey": "Chave API Ollama", "apiKeyHelp": "Chave API opcional para instâncias Ollama autenticadas ou serviços em nuvem. Deixe vazio para instalações locais.", + "numCtx": "Tamanho da janela de contexto (num_ctx)", + "numCtxHelp": "Substitui o tamanho da janela de contexto padrão do modelo. Deixe em branco para usar a configuração do Modelfile do modelo. O valor mínimo é 128.", "description": "O Ollama permite que você execute modelos localmente em seu computador. Para instruções sobre como começar, veja o guia de início rápido deles.", "warning": "Nota: O Roo Code usa prompts complexos e funciona melhor com modelos Claude. Modelos menos capazes podem não funcionar como esperado." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Autenticado com segurança através da sua conta Roo Code Cloud.", "connectButton": "Conectar ao Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Caminho das credenciais OAuth", + "oauthPathDescription": "Caminho para suas credenciais auth.json do ChatGPT Codex. Padrão {{defaultPath}} se deixado vazio (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex usa suas credenciais web do ChatGPT através da CLI oficial do Codex. Autentique com a CLI do Codex para que auth.json seja criado. Se você usar um local personalizado, defina o caminho completo do arquivo aqui.", + "oauthConnectDescription": "Após a autenticação, Roo lerá o token de acesso do auth.json e se conectará ao ChatGPT Responses (Codex).", + "learnMoreLinkText": "Saiba mais sobre ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Roteamento de Provedores OpenRouter", @@ -824,7 +835,8 @@ "providerNotAllowed": "O provedor '{{provider}}' não é permitido pela sua organização", "modelNotAllowed": "O modelo '{{model}}' não é permitido para o provedor '{{provider}}' pela sua organização", "profileInvalid": "Este perfil contém um provedor ou modelo que não é permitido pela sua organização", - "qwenCodeOauthPath": "Você deve fornecer um caminho válido de credenciais OAuth" + "qwenCodeOauthPath": "Você deve fornecer um caminho válido de credenciais OAuth", + "openAiNativeCodexOauthPath": "Opcional: Caminho para o auth.json do ChatGPT Codex. Quando vazio, padrão é ~/.codex/auth.json." }, "placeholders": { "apiKey": "Digite a chave API...", @@ -877,5 +889,11 @@ "output": "Saída", "cacheReads": "Leituras de cache" } + }, + "ui": { + "collapseThinking": { + "label": "Recolher mensagens de pensamento por padrão", + "description": "Quando ativado, os blocos de pensamento serão recolhidos por padrão até que você interaja com eles" + } } } diff --git a/webview-ui/src/i18n/locales/pt-BR/welcome.json b/webview-ui/src/i18n/locales/pt-BR/welcome.json index fced51060fb..489841a78f5 100644 --- a/webview-ui/src/i18n/locales/pt-BR/welcome.json +++ b/webview-ui/src/i18n/locales/pt-BR/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Uma interface unificada para LLMs" + }, + "roo": { + "description": "Os melhores modelos gratuitos para começar", + "incentive": "Experimente o Roo gratuitamente" } }, "chooseProvider": "Para fazer sua mágica, o Roo precisa de uma chave API.", diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 596c2c8e37f..c5acc9f25a3 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -61,7 +61,7 @@ "tooltip": "Одобрить это действие" }, "runCommand": { - "title": "Выполнить команду", + "title": "Команда", "tooltip": "Выполнить эту команду" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "addContext": "@ для добавления контекста, / для команд", "dragFiles": "удерживайте shift для перетаскивания файлов", "dragFilesImages": "удерживайте shift для перетаскивания файлов/изображений", - "errorReadingFile": "Ошибка чтения файла:", + "errorReadingFile": "Ошибка чтения файла", "noValidImages": "Не удалось обработать ни одно изображение", "separator": "Разделитель", "edit": "Редактировать...", @@ -158,49 +158,50 @@ "wantsToFetch": "Roo хочет получить подробные инструкции для помощи с текущей задачей" }, "fileOperations": { - "wantsToRead": "Roo хочет прочитать этот файл:", - "wantsToReadOutsideWorkspace": "Roo хочет прочитать этот файл вне рабочей области:", - "didRead": "Roo прочитал этот файл:", - "wantsToEdit": "Roo хочет отредактировать этот файл:", - "wantsToEditOutsideWorkspace": "Roo хочет отредактировать этот файл вне рабочей области:", - "wantsToEditProtected": "Roo хочет отредактировать защищённый файл конфигурации:", - "wantsToCreate": "Roo хочет создать новый файл:", - "wantsToSearchReplace": "Roo хочет выполнить поиск и замену в этом файле:", - "didSearchReplace": "Roo выполнил поиск и замену в этом файле:", - "wantsToInsert": "Roo хочет вставить содержимое в этот файл:", - "wantsToInsertWithLineNumber": "Roo хочет вставить содержимое в этот файл на строку {{lineNumber}}:", - "wantsToInsertAtEnd": "Roo хочет добавить содержимое в конец этого файла:", - "wantsToReadAndXMore": "Roo хочет прочитать этот файл и еще {{count}}:", - "wantsToReadMultiple": "Roo хочет прочитать несколько файлов:", - "wantsToApplyBatchChanges": "Roo хочет применить изменения к нескольким файлам:", - "wantsToGenerateImage": "Roo хочет сгенерировать изображение:", - "wantsToGenerateImageOutsideWorkspace": "Roo хочет сгенерировать изображение вне рабочего пространства:", - "wantsToGenerateImageProtected": "Roo хочет сгенерировать изображение в защищённом месте:", - "didGenerateImage": "Roo сгенерировал изображение:" + "wantsToRead": "Roo хочет прочитать этот файл", + "wantsToReadOutsideWorkspace": "Roo хочет прочитать этот файл вне рабочей области", + "didRead": "Roo прочитал этот файл", + "wantsToEdit": "Roo хочет отредактировать этот файл", + "wantsToEditOutsideWorkspace": "Roo хочет отредактировать этот файл вне рабочей области", + "wantsToEditProtected": "Roo хочет отредактировать защищённый файл конфигурации", + "wantsToCreate": "Roo хочет создать новый файл", + "wantsToSearchReplace": "Roo хочет выполнить поиск и замену в этом файле", + "didSearchReplace": "Roo выполнил поиск и замену в этом файле", + "wantsToInsert": "Roo хочет вставить содержимое в этот файл", + "wantsToInsertWithLineNumber": "Roo хочет вставить содержимое в этот файл на строку {{lineNumber}}", + "wantsToInsertAtEnd": "Roo хочет добавить содержимое в конец этого файла", + "wantsToReadAndXMore": "Roo хочет прочитать этот файл и еще {{count}}", + "wantsToReadMultiple": "Roo хочет прочитать несколько файлов", + "wantsToApplyBatchChanges": "Roo хочет применить изменения к нескольким файлам", + "wantsToGenerateImage": "Roo хочет сгенерировать изображение", + "wantsToGenerateImageOutsideWorkspace": "Roo хочет сгенерировать изображение вне рабочего пространства", + "wantsToGenerateImageProtected": "Roo хочет сгенерировать изображение в защищённом месте", + "didGenerateImage": "Roo сгенерировал изображение" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo хочет просмотреть файлы верхнего уровня в этой директории:", - "didViewTopLevel": "Roo просмотрел файлы верхнего уровня в этой директории:", - "wantsToViewRecursive": "Roo хочет рекурсивно просмотреть все файлы в этой директории:", - "didViewRecursive": "Roo рекурсивно просмотрел все файлы в этой директории:", - "wantsToViewDefinitions": "Roo хочет просмотреть имена определений исходного кода в этой директории:", - "didViewDefinitions": "Roo просмотрел имена определений исходного кода в этой директории:", - "wantsToSearch": "Roo хочет выполнить поиск в этой директории по {{regex}}:", - "didSearch": "Roo выполнил поиск в этой директории по {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo хочет выполнить поиск в этой директории (вне рабочего пространства) по {{regex}}:", - "didSearchOutsideWorkspace": "Roo выполнил поиск в этой директории (вне рабочего пространства) по {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo хочет просмотреть файлы верхнего уровня в этой директории (вне рабочего пространства):", - "didViewTopLevelOutsideWorkspace": "Roo просмотрел файлы верхнего уровня в этой директории (вне рабочего пространства):", - "wantsToViewRecursiveOutsideWorkspace": "Roo хочет рекурсивно просмотреть все файлы в этой директории (вне рабочего пространства):", - "didViewRecursiveOutsideWorkspace": "Roo рекурсивно просмотрел все файлы в этой директории (вне рабочего пространства):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo хочет просмотреть имена определений исходного кода в этой директории (вне рабочего пространства):", - "didViewDefinitionsOutsideWorkspace": "Roo просмотрел имена определений исходного кода в этой директории (вне рабочего пространства):" + "wantsToViewTopLevel": "Roo хочет просмотреть файлы верхнего уровня в этой директории", + "didViewTopLevel": "Roo просмотрел файлы верхнего уровня в этой директории", + "wantsToViewRecursive": "Roo хочет рекурсивно просмотреть все файлы в этой директории", + "didViewRecursive": "Roo рекурсивно просмотрел все файлы в этой директории", + "wantsToViewDefinitions": "Roo хочет просмотреть имена определений исходного кода в этой директории", + "didViewDefinitions": "Roo просмотрел имена определений исходного кода в этой директории", + "wantsToSearch": "Roo хочет выполнить поиск в этой директории по {{regex}}", + "didSearch": "Roo выполнил поиск в этой директории по {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo хочет выполнить поиск в этой директории (вне рабочего пространства) по {{regex}}", + "didSearchOutsideWorkspace": "Roo выполнил поиск в этой директории (вне рабочего пространства) по {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo хочет просмотреть файлы верхнего уровня в этой директории (вне рабочего пространства)", + "didViewTopLevelOutsideWorkspace": "Roo просмотрел файлы верхнего уровня в этой директории (вне рабочего пространства)", + "wantsToViewRecursiveOutsideWorkspace": "Roo хочет рекурсивно просмотреть все файлы в этой директории (вне рабочего пространства)", + "didViewRecursiveOutsideWorkspace": "Roo рекурсивно просмотрел все файлы в этой директории (вне рабочего пространства)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo хочет просмотреть имена определений исходного кода в этой директории (вне рабочего пространства)", + "didViewDefinitionsOutsideWorkspace": "Roo просмотрел имена определений исходного кода в этой директории (вне рабочего пространства)" }, "commandOutput": "Вывод команды", "commandExecution": { "running": "Выполняется", + "abort": "Прервать", "pid": "PID: {{pid}}", - "exited": "Завершено ({{exitCode}})", + "exitStatus": "Завершено со статусом {{exitCode}}", "manageCommands": "Управление разрешениями команд", "commandManagementDescription": "Управляйте разрешениями команд: Нажмите ✓, чтобы разрешить автоматическое выполнение, ✗, чтобы запретить выполнение. Шаблоны можно включать/выключать или удалять из списков. Просмотреть все настройки", "addToAllowed": "Добавить в список разрешенных", @@ -215,9 +216,15 @@ }, "response": "Ответ", "arguments": "Аргументы", + "text": { + "rooSaid": "Ру сказал" + }, + "feedback": { + "youSaid": "Вы сказали" + }, "mcp": { - "wantsToUseTool": "Roo хочет использовать инструмент на сервере MCP {{serverName}}:", - "wantsToAccessResource": "Roo хочет получить доступ к ресурсу на сервере MCP {{serverName}}:" + "wantsToUseTool": "Roo хочет использовать инструмент на сервере MCP {{serverName}}", + "wantsToAccessResource": "Roo хочет получить доступ к ресурсу на сервере MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo хочет переключиться в режим {{mode}}", @@ -226,7 +233,7 @@ "didSwitchWithReason": "Roo переключился в режим {{mode}}, потому что: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo хочет создать новую подзадачу в режиме {{mode}}:", + "wantsToCreate": "Roo хочет создать новую подзадачу в режиме {{mode}}", "wantsToFinish": "Roo хочет завершить эту подзадачу", "newTaskContent": "Инструкции по подзадаче", "completionContent": "Подзадача завершена", @@ -235,7 +242,7 @@ "completionInstructions": "Подзадача завершена! Вы можете просмотреть результаты и предложить исправления или следующие шаги. Если всё в порядке, подтвердите для возврата результата в родительскую задачу." }, "questions": { - "hasQuestion": "У Roo есть вопрос:" + "hasQuestion": "У Roo есть вопрос" }, "taskCompleted": "Задача завершена", "error": "Ошибка", @@ -249,7 +256,8 @@ "autoApprove": { "tooltipManage": "Управление настройками автоматического одобрения", "tooltipStatus": "Авто-одобрение включено для: {{toggles}}", - "title": "Авто-утверждение", + "title": "Авто-одобрение", + "toggle": "Переключить авто-утверждение", "all": "Все", "none": "Ни одного", "description": "Выполняйте эти действия, не спрашивая разрешения. Включайте это только для действий, которым вы полностью доверяете.", @@ -264,12 +272,14 @@ }, "announcement": { "title": "🎉 Выпущен Roo Code {{version}}", - "description": "Представляем Roo Code Cloud: Расширяя возможности Roo за пределы IDE", - "feature1": "Отслеживайте прогресс задач из любого места (Бесплатно): Получайте обновления в реальном времени о долгосрочных задачах, не привязываясь к IDE", - "feature2": "Управляйте расширением Roo удаленно (Pro): Запускайте, останавливайте и взаимодействуйте с задачами через браузерный интерфейс на основе чата.", - "learnMore": "Готовы взять контроль в свои руки? Узнайте больше здесь.", - "visitCloudButton": "Посетить Roo Code Cloud", - "socialLinks": "Присоединяйтесь к нам в X, Discord, или r/RooCode" + "stealthModel": { + "feature": "Бесплатная скрытая модель на ограниченное время - Code Supernova: Универсальная модель агентного программирования, поддерживающая ввод изображений, доступная через Roo Code Cloud.", + "note": "(Примечание: промпты и дополнения записываются создателем модели и используются для её улучшения)", + "connectButton": "Подключиться к Roo Code Cloud", + "selectModel": "Выберите roo/code-supernova от провайдера Roo Code Cloud в Настройках для начала работы.", + "goToSettingsButton": "Перейти к Настройкам" + }, + "socialLinks": "Присоединяйтесь к нам в X, Discord, или r/RooCode 🚀" }, "reasoning": { "thinking": "Обдумывание", @@ -287,7 +297,7 @@ "countdownDisplay": "{{count}}с" }, "browser": { - "rooWantsToUse": "Roo хочет использовать браузер:", + "rooWantsToUse": "Roo хочет использовать браузер", "consoleLogs": "Логи консоли", "noNewLogs": "(Новых логов нет)", "screenshot": "Скриншот браузера", @@ -312,8 +322,6 @@ "tooltips": { "expand": "Развернуть блок кода", "collapse": "Свернуть блок кода", - "enable_wrap": "Включить перенос строк", - "disable_wrap": "Отключить перенос строк", "copy_code": "Копировать код" } }, @@ -337,8 +345,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo хочет выполнить поиск в кодовой базе по {{query}}:", - "wantsToSearchWithPath": "Roo хочет выполнить поиск в кодовой базе по {{query}} в {{path}}:", + "wantsToSearch": "Roo хочет выполнить поиск в кодовой базе по {{query}}", + "wantsToSearchWithPath": "Roo хочет выполнить поиск в кодовой базе по {{query}} в {{path}}", "didSearch_one": "Найден 1 результат", "didSearch_other": "Найдено {{count}} результатов", "resultTooltip": "Оценка схожести: {{score}} (нажмите, чтобы открыть файл)" @@ -399,23 +407,11 @@ "url": "Вставьте URL для получения содержимого" }, "queuedMessages": { - "title": "Сообщения в очереди:", + "title": "Сообщения в очереди", "clickToEdit": "Нажмите, чтобы редактировать сообщение" }, "slashCommand": { - "wantsToRun": "Roo хочет выполнить слеш-команду:", - "didRun": "Roo выполнил слеш-команду:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Достигнут лимит автоматически одобренных запросов", - "description": "Roo достиг автоматически одобренного лимита в {{count}} API-запрос(ов). Хотите сбросить счетчик и продолжить задачу?", - "button": "Сбросить и продолжить" - }, - "autoApprovedCostLimitReached": { - "title": "Достигнут лимит автоматически одобряемых расходов", - "description": "Roo достиг автоматически утвержденного лимита расходов в размере ${{count}}. Хотите сбросить расходы и продолжить выполнение задачи?", - "button": "Сбросить и продолжить" - } + "wantsToRun": "Roo хочет выполнить слеш-команду", + "didRun": "Roo выполнил слеш-команду" } } diff --git a/webview-ui/src/i18n/locales/ru/cloud.json b/webview-ui/src/i18n/locales/ru/cloud.json index b2a1aa85fe6..99313da1fcf 100644 --- a/webview-ui/src/i18n/locales/ru/cloud.json +++ b/webview-ui/src/i18n/locales/ru/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Проблемы?", "pasteCallbackUrl": "Скопируй URL перенаправления из браузера и вставь его сюда:", "startOver": "Начать заново", + "personalAccount": "Личный аккаунт", + "switchAccount": "Переключить аккаунт Roo Code Cloud", + "createTeamAccount": "Создать командный аккаунт", "cloudUrlPillLabel": "URL Roo Code Cloud", "upsell": { "autoApprovePowerUser": "Предоставить Roo немного независимости? Управляйте им из любого места с помощью Roo Code Cloud. Узнать больше.", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index be494c571b0..4e7c4d89faa 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -30,6 +30,7 @@ "terminal": "Терминал", "slashCommands": "Слэш-команды", "prompts": "Промпты", + "ui": "UI", "experimental": "Экспериментальное", "language": "Язык", "about": "О Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "Сбросить к значению по умолчанию" }, "autoApprove": { + "toggleShortcut": "Вы можете настроить глобальное сочетание клавиш для этого параметра в настройках вашей IDE.", "description": "Разрешить Roo автоматически выполнять операции без необходимости одобрения. Включайте эти параметры только если полностью доверяете ИИ и понимаете связанные с этим риски безопасности.", "enabled": "Автоодобрение включено", "toggleAriaLabel": "Переключить автоодобрение", @@ -380,6 +382,8 @@ "modelId": "ID модели", "apiKey": "API-ключ Ollama", "apiKeyHelp": "Опциональный API-ключ для аутентифицированных экземпляров Ollama или облачных сервисов. Оставьте пустым для локальных установок.", + "numCtx": "Размер контекстного окна (num_ctx)", + "numCtxHelp": "Переопределяет размер контекстного окна модели по умолчанию. Оставьте пустым, чтобы использовать конфигурацию Modelfile модели. Минимальное значение — 128.", "description": "Ollama позволяет запускать модели локально на вашем компьютере. Для начала ознакомьтесь с кратким руководством.", "warning": "Примечание: Roo Code использует сложные подсказки и лучше всего работает с моделями Claude. Менее мощные модели могут работать некорректно." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Безопасно аутентифицирован через твой аккаунт Roo Code Cloud.", "connectButton": "Подключиться к Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Путь к учетным данным OAuth", + "oauthPathDescription": "Путь к вашим учетным данным auth.json ChatGPT Codex. По умолчанию {{defaultPath}}, если оставлено пустым (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex использует ваши веб-учетные данные ChatGPT через официальный CLI Codex. Аутентифицируйтесь с помощью CLI Codex, чтобы создать auth.json. Если вы используете пользовательское расположение, установите здесь полный путь к файлу.", + "oauthConnectDescription": "После аутентификации Roo прочитает токен доступа из auth.json и подключится к ChatGPT Responses (Codex).", + "learnMoreLinkText": "Узнать больше о ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Маршрутизация провайдера OpenRouter", @@ -824,7 +835,8 @@ "providerNotAllowed": "Провайдер '{{provider}}' не разрешен вашей организацией", "modelNotAllowed": "Модель '{{model}}' не разрешена для провайдера '{{provider}}' вашей организацией", "profileInvalid": "Этот профиль содержит провайдера или модель, которые не разрешены вашей организацией", - "qwenCodeOauthPath": "Вы должны указать допустимый путь к учетным данным OAuth" + "qwenCodeOauthPath": "Вы должны указать допустимый путь к учетным данным OAuth", + "openAiNativeCodexOauthPath": "Необязательно: Путь к auth.json ChatGPT Codex. Когда пусто, по умолчанию ~/.codex/auth.json." }, "placeholders": { "apiKey": "Введите API-ключ...", @@ -877,5 +889,11 @@ "output": "Выход", "cacheReads": "Чтения из кэша" } + }, + "ui": { + "collapseThinking": { + "label": "Сворачивать сообщения о размышлениях по умолчанию", + "description": "Если включено, блоки с размышлениями будут свернуты по умолчанию, пока вы не начнете с ними взаимодействовать" + } } } diff --git a/webview-ui/src/i18n/locales/ru/welcome.json b/webview-ui/src/i18n/locales/ru/welcome.json index b8400444a00..978cfc066ba 100644 --- a/webview-ui/src/i18n/locales/ru/welcome.json +++ b/webview-ui/src/i18n/locales/ru/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Унифицированный интерфейс для LLM" + }, + "roo": { + "description": "Лучшие бесплатные модели для начала работы", + "incentive": "Попробуй Roo бесплатно" } }, "chooseProvider": "Для своей магии Roo нуждается в API-ключе.", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index dddcab46408..8e2a1077dfb 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -61,7 +61,7 @@ "tooltip": "Bu eylemi onayla" }, "runCommand": { - "title": "Komutu Çalıştır", + "title": "Komut", "tooltip": "Bu komutu çalıştır" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Modları ara...", "noResults": "Sonuç bulunamadı" }, - "errorReadingFile": "Dosya okuma hatası:", + "errorReadingFile": "Dosya okuma hatası", "noValidImages": "Hiçbir geçerli resim işlenmedi", "separator": "Ayırıcı", "edit": "Düzenle...", @@ -163,49 +163,50 @@ "wantsToFetch": "Roo mevcut göreve yardımcı olmak için ayrıntılı talimatlar almak istiyor" }, "fileOperations": { - "wantsToRead": "Roo bu dosyayı okumak istiyor:", - "wantsToReadOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı okumak istiyor:", - "didRead": "Roo bu dosyayı okudu:", - "wantsToEdit": "Roo bu dosyayı düzenlemek istiyor:", - "wantsToEditOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı düzenlemek istiyor:", - "wantsToEditProtected": "Roo korumalı bir yapılandırma dosyasını düzenlemek istiyor:", - "wantsToCreate": "Roo yeni bir dosya oluşturmak istiyor:", - "wantsToSearchReplace": "Roo bu dosyada arama ve değiştirme yapmak istiyor:", - "didSearchReplace": "Roo bu dosyada arama ve değiştirme yaptı:", - "wantsToInsert": "Roo bu dosyaya içerik eklemek istiyor:", - "wantsToInsertWithLineNumber": "Roo bu dosyanın {{lineNumber}}. satırına içerik eklemek istiyor:", - "wantsToInsertAtEnd": "Roo bu dosyanın sonuna içerik eklemek istiyor:", - "wantsToReadAndXMore": "Roo bu dosyayı ve {{count}} tane daha okumak istiyor:", - "wantsToReadMultiple": "Roo birden fazla dosya okumak istiyor:", - "wantsToApplyBatchChanges": "Roo birden fazla dosyaya değişiklik uygulamak istiyor:", - "wantsToGenerateImage": "Roo bir görsel oluşturmak istiyor:", - "wantsToGenerateImageOutsideWorkspace": "Roo çalışma alanının dışında bir görsel oluşturmak istiyor:", - "wantsToGenerateImageProtected": "Roo korumalı bir konumda görsel oluşturmak istiyor:", - "didGenerateImage": "Roo bir görsel oluşturdu:" + "wantsToRead": "Roo bu dosyayı okumak istiyor", + "wantsToReadOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı okumak istiyor", + "didRead": "Roo bu dosyayı okudu", + "wantsToEdit": "Roo bu dosyayı düzenlemek istiyor", + "wantsToEditOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı düzenlemek istiyor", + "wantsToEditProtected": "Roo korumalı bir yapılandırma dosyasını düzenlemek istiyor", + "wantsToCreate": "Roo yeni bir dosya oluşturmak istiyor", + "wantsToSearchReplace": "Roo bu dosyada arama ve değiştirme yapmak istiyor", + "didSearchReplace": "Roo bu dosyada arama ve değiştirme yaptı", + "wantsToInsert": "Roo bu dosyaya içerik eklemek istiyor", + "wantsToInsertWithLineNumber": "Roo bu dosyanın {{lineNumber}}. satırına içerik eklemek istiyor", + "wantsToInsertAtEnd": "Roo bu dosyanın sonuna içerik eklemek istiyor", + "wantsToReadAndXMore": "Roo bu dosyayı ve {{count}} tane daha okumak istiyor", + "wantsToReadMultiple": "Roo birden fazla dosya okumak istiyor", + "wantsToApplyBatchChanges": "Roo birden fazla dosyaya değişiklik uygulamak istiyor", + "wantsToGenerateImage": "Roo bir görsel oluşturmak istiyor", + "wantsToGenerateImageOutsideWorkspace": "Roo çalışma alanının dışında bir görsel oluşturmak istiyor", + "wantsToGenerateImageProtected": "Roo korumalı bir konumda görsel oluşturmak istiyor", + "didGenerateImage": "Roo bir görsel oluşturdu" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo bu dizindeki üst düzey dosyaları görüntülemek istiyor:", - "didViewTopLevel": "Roo bu dizindeki üst düzey dosyaları görüntüledi:", - "wantsToViewRecursive": "Roo bu dizindeki tüm dosyaları özyinelemeli olarak görüntülemek istiyor:", - "didViewRecursive": "Roo bu dizindeki tüm dosyaları özyinelemeli olarak görüntüledi:", - "wantsToViewDefinitions": "Roo bu dizinde kullanılan kaynak kod tanımlama isimlerini görüntülemek istiyor:", - "didViewDefinitions": "Roo bu dizinde kullanılan kaynak kod tanımlama isimlerini görüntüledi:", - "wantsToSearch": "Roo bu dizinde {{regex}} için arama yapmak istiyor:", - "didSearch": "Roo bu dizinde {{regex}} için arama yaptı:", - "wantsToSearchOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) {{regex}} için arama yapmak istiyor:", - "didSearchOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) {{regex}} için arama yaptı:", - "wantsToViewTopLevelOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) üst düzey dosyaları görüntülemek istiyor:", - "didViewTopLevelOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) üst düzey dosyaları görüntüledi:", - "wantsToViewRecursiveOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) tüm dosyaları özyinelemeli olarak görüntülemek istiyor:", - "didViewRecursiveOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) tüm dosyaları özyinelemeli olarak görüntüledi:", - "wantsToViewDefinitionsOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) kullanılan kaynak kod tanımlama isimlerini görüntülemek istiyor:", - "didViewDefinitionsOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) kullanılan kaynak kod tanımlama isimlerini görüntüledi:" + "wantsToViewTopLevel": "Roo bu dizindeki üst düzey dosyaları görüntülemek istiyor", + "didViewTopLevel": "Roo bu dizindeki üst düzey dosyaları görüntüledi", + "wantsToViewRecursive": "Roo bu dizindeki tüm dosyaları özyinelemeli olarak görüntülemek istiyor", + "didViewRecursive": "Roo bu dizindeki tüm dosyaları özyinelemeli olarak görüntüledi", + "wantsToViewDefinitions": "Roo bu dizinde kullanılan kaynak kod tanımlama isimlerini görüntülemek istiyor", + "didViewDefinitions": "Roo bu dizinde kullanılan kaynak kod tanımlama isimlerini görüntüledi", + "wantsToSearch": "Roo bu dizinde {{regex}} için arama yapmak istiyor", + "didSearch": "Roo bu dizinde {{regex}} için arama yaptı", + "wantsToSearchOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) {{regex}} için arama yapmak istiyor", + "didSearchOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) {{regex}} için arama yaptı", + "wantsToViewTopLevelOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) üst düzey dosyaları görüntülemek istiyor", + "didViewTopLevelOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) üst düzey dosyaları görüntüledi", + "wantsToViewRecursiveOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) tüm dosyaları özyinelemeli olarak görüntülemek istiyor", + "didViewRecursiveOutsideWorkspace": "Roo bu dizindeki (çalışma alanı dışında) tüm dosyaları özyinelemeli olarak görüntüledi", + "wantsToViewDefinitionsOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) kullanılan kaynak kod tanımlama isimlerini görüntülemek istiyor", + "didViewDefinitionsOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) kullanılan kaynak kod tanımlama isimlerini görüntüledi" }, "commandOutput": "Komut Çıktısı", "commandExecution": { "running": "Çalışıyor", + "abort": "İptal Et", "pid": "PID: {{pid}}", - "exited": "Çıkıldı ({{exitCode}})", + "exitStatus": "{{exitCode}} durumuyla çıkıldı", "manageCommands": "Komut İzinlerini Yönet", "commandManagementDescription": "Komut izinlerini yönetin: Otomatik yürütmeye izin vermek için ✓'e, yürütmeyi reddetmek için ✗'e tıklayın. Desenler açılıp kapatılabilir veya listelerden kaldırılabilir. Tüm ayarları görüntüle", "addToAllowed": "İzin verilenler listesine ekle", @@ -220,9 +221,15 @@ }, "response": "Yanıt", "arguments": "Argümanlar", + "text": { + "rooSaid": "Roo dedi" + }, + "feedback": { + "youSaid": "Dediniz ki" + }, "mcp": { - "wantsToUseTool": "Roo {{serverName}} MCP sunucusunda bir araç kullanmak istiyor:", - "wantsToAccessResource": "Roo {{serverName}} MCP sunucusundaki bir kaynağa erişmek istiyor:" + "wantsToUseTool": "Roo {{serverName}} MCP sunucusunda bir araç kullanmak istiyor", + "wantsToAccessResource": "Roo {{serverName}} MCP sunucusundaki bir kaynağa erişmek istiyor" }, "modes": { "wantsToSwitch": "Roo {{mode}} moduna geçmek istiyor", @@ -231,7 +238,7 @@ "didSwitchWithReason": "Roo {{mode}} moduna geçti çünkü: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo {{mode}} modunda yeni bir alt görev oluşturmak istiyor:", + "wantsToCreate": "Roo {{mode}} modunda yeni bir alt görev oluşturmak istiyor", "wantsToFinish": "Roo bu alt görevi bitirmek istiyor", "newTaskContent": "Alt Görev Talimatları", "completionContent": "Alt Görev Tamamlandı", @@ -240,7 +247,7 @@ "completionInstructions": "Alt görev tamamlandı! Sonuçları inceleyebilir ve düzeltmeler veya sonraki adımlar önerebilirsiniz. Her şey iyi görünüyorsa, sonucu üst göreve döndürmek için onaylayın." }, "questions": { - "hasQuestion": "Roo'nun bir sorusu var:" + "hasQuestion": "Roo'nun bir sorusu var" }, "taskCompleted": "Görev Tamamlandı", "powershell": { @@ -250,6 +257,7 @@ "tooltipManage": "Otomatik onay ayarlarını yönet", "tooltipStatus": "Otomatik onay şunlar için etkinleştirildi: {{toggles}}", "title": "Otomatik onayla", + "toggle": "Otomatik onayı aç/kapat", "all": "Tümü", "none": "Hiçbiri", "description": "İzin istemeden bu eylemleri gerçekleştirin. Bunu yalnızca tamamen güvendiğiniz eylemler için etkinleştirin.", @@ -279,15 +287,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} Yayınlandı", - "description": "Roo Code Cloud Tanıtımı: Roo'nun gücünü IDE'nin ötesine taşıyoruz", - "feature1": "Görev ilerlemesini her yerden takip edin (Ücretsiz): IDE'nizde sıkışıp kalmadan uzun süren görevlerin gerçek zamanlı güncellemelerini alın", - "feature2": "Roo Uzantısını uzaktan kontrol edin (Pro): Sohbet tabanlı tarayıcı arayüzünden görevleri başlatın, durdurun ve etkileşime geçin.", - "learnMore": "Kontrolü ele almaya hazır mısınız? Daha fazlasını buradan öğrenin.", - "visitCloudButton": "Roo Code Cloud'u Ziyaret Et", - "socialLinks": "Bize X, Discord, veya r/RooCode'da katılın" + "stealthModel": { + "feature": "Sınırlı süre ÜCRETSİZ gizli model - Code Supernova: Görüntü girişlerini destekleyen çok amaçlı acentik kodlama modeli, Roo Code Cloud üzerinden kullanılabilir.", + "note": "(Not: istemler ve tamamlamalar model yaratıcısı tarafından kaydedilir ve modeli geliştirmek için kullanılır)", + "connectButton": "Roo Code Cloud'a bağlan", + "selectModel": "Başlamak için Ayarlar'da Roo Code Cloud sağlayıcısından roo/code-supernova'yı seçin.", + "goToSettingsButton": "Ayarlar'a Git" + }, + "socialLinks": "Bize X, Discord, veya r/RooCode'da katılın 🚀" }, "browser": { - "rooWantsToUse": "Roo tarayıcıyı kullanmak istiyor:", + "rooWantsToUse": "Roo tarayıcıyı kullanmak istiyor", "consoleLogs": "Konsol Kayıtları", "noNewLogs": "(Yeni kayıt yok)", "screenshot": "Tarayıcı ekran görüntüsü", @@ -312,8 +322,6 @@ "tooltips": { "expand": "Kod bloğunu genişlet", "collapse": "Kod bloğunu daralt", - "enable_wrap": "Satır kaydırmayı etkinleştir", - "disable_wrap": "Satır kaydırmayı devre dışı bırak", "copy_code": "Kodu kopyala" } }, @@ -337,8 +345,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo kod tabanında {{query}} aramak istiyor:", - "wantsToSearchWithPath": "Roo {{path}} içinde kod tabanında {{query}} aramak istiyor:", + "wantsToSearch": "Roo kod tabanında {{query}} aramak istiyor", + "wantsToSearchWithPath": "Roo {{path}} içinde kod tabanında {{query}} aramak istiyor", "didSearch_one": "1 sonuç bulundu", "didSearch_other": "{{count}} sonuç bulundu", "resultTooltip": "Benzerlik puanı: {{score}} (dosyayı açmak için tıklayın)" @@ -399,23 +407,11 @@ "url": "İçeriği getirmek için URL'yi yapıştırın" }, "queuedMessages": { - "title": "Sıradaki Mesajlar:", + "title": "Sıradaki Mesajlar", "clickToEdit": "Mesajı düzenlemek için tıkla" }, "slashCommand": { - "wantsToRun": "Roo bir slash komutu çalıştırmak istiyor:", - "didRun": "Roo bir slash komutu çalıştırdı:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Otomatik Onaylanan İstek Limiti Aşıldı", - "description": "Roo, {{count}} API isteği/istekleri için otomatik onaylanan limite ulaştı. Sayacı sıfırlamak ve göreve devam etmek istiyor musunuz?", - "button": "Sıfırla ve Devam Et" - }, - "autoApprovedCostLimitReached": { - "title": "Otomatik Onaylanan Maliyet Sınırına Ulaşıldı", - "description": "Roo otomatik olarak onaylanmış ${{count}} maliyet sınırına ulaştı. Maliyeti sıfırlamak ve göreve devam etmek ister misiniz?", - "button": "Sıfırla ve Devam Et" - } + "wantsToRun": "Roo bir slash komutu çalıştırmak istiyor", + "didRun": "Roo bir slash komutu çalıştırdı" } } diff --git a/webview-ui/src/i18n/locales/tr/cloud.json b/webview-ui/src/i18n/locales/tr/cloud.json index e8630c2d9e5..daf90da84d3 100644 --- a/webview-ui/src/i18n/locales/tr/cloud.json +++ b/webview-ui/src/i18n/locales/tr/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Sorun yaşıyor musun?", "pasteCallbackUrl": "Tarayıcından redirect URL'sini kopyala ve buraya yapıştır:", "startOver": "Baştan başla", + "personalAccount": "Kişisel Hesap", + "switchAccount": "Roo Code Cloud Hesabını Değiştir", + "createTeamAccount": "Takım Hesabı Oluştur", "cloudUrlPillLabel": "Roo Code Cloud URL'si", "upsell": { "autoApprovePowerUser": "Roo'ya biraz bağımsızlık mı veriyorsunuz? Roo Code Cloud ile onu her yerden kontrol edin. Daha fazla bilgi edinin.", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index fe4508495ba..a6bfc5ae65e 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Eğik Çizgi Komutları", "prompts": "Promptlar", + "ui": "UI", "experimental": "Deneysel", "language": "Dil", "about": "Roo Code Hakkında" @@ -134,6 +135,7 @@ "resetToDefault": "Varsayılana sıfırla" }, "autoApprove": { + "toggleShortcut": "IDE tercihlerinizde bu ayar için genel bir kısayol yapılandırabilirsiniz.", "description": "Roo'nun onay gerektirmeden otomatik olarak işlemler gerçekleştirmesine izin verin. Bu ayarları yalnızca yapay zekaya tamamen güveniyorsanız ve ilgili güvenlik risklerini anlıyorsanız etkinleştirin.", "enabled": "Oto-onay etkinleştirildi", "toggleAriaLabel": "Otomatik onayı değiştir", @@ -380,6 +382,8 @@ "modelId": "Model Kimliği", "apiKey": "Ollama API Anahtarı", "apiKeyHelp": "Kimlik doğrulamalı Ollama örnekleri veya bulut hizmetleri için isteğe bağlı API anahtarı. Yerel kurulumlar için boş bırakın.", + "numCtx": "Bağlam Penceresi Boyutu (num_ctx)", + "numCtxHelp": "Modelin varsayılan bağlam penceresi boyutunu geçersiz kılar. Modelin Modelfile yapılandırmasını kullanmak için boş bırakın. Minimum değer 128'dir.", "description": "Ollama, modelleri bilgisayarınızda yerel olarak çalıştırmanıza olanak tanır. Başlamak için hızlı başlangıç kılavuzlarına bakın.", "warning": "Not: Roo Code karmaşık istemler kullanır ve Claude modelleriyle en iyi şekilde çalışır. Daha az yetenekli modeller beklendiği gibi çalışmayabilir." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Roo Code Cloud hesabın üzerinden güvenli bir şekilde kimlik doğrulandı.", "connectButton": "Roo Code Cloud'a Bağlan" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth kimlik bilgileri yolu", + "oauthPathDescription": "ChatGPT Codex auth.json kimlik bilgilerinizin yolu. Boş bırakılırsa varsayılan {{defaultPath}} (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex, resmi Codex CLI aracılığıyla ChatGPT web kimlik bilgilerinizi kullanır. auth.json oluşturulması için Codex CLI ile kimlik doğrulaması yapın. Özel bir konum kullanıyorsanız, burada tam dosya yolunu ayarlayın.", + "oauthConnectDescription": "Kimlik doğrulamasından sonra Roo, auth.json'dan erişim belirtecini okuyacak ve ChatGPT Responses (Codex) ile bağlantı kuracak.", + "learnMoreLinkText": "ChatGPT hakkında daha fazla bilgi edinin" + }, "openRouter": { "providerRouting": { "title": "OpenRouter Sağlayıcı Yönlendirmesi", @@ -824,7 +835,8 @@ "providerNotAllowed": "Sağlayıcı '{{provider}}' kuruluşunuz tarafından izin verilmiyor", "modelNotAllowed": "Model '{{model}}' sağlayıcı '{{provider}}' için kuruluşunuz tarafından izin verilmiyor", "profileInvalid": "Bu profil, kuruluşunuz tarafından izin verilmeyen bir sağlayıcı veya model içeriyor", - "qwenCodeOauthPath": "Geçerli bir OAuth kimlik bilgileri yolu sağlamalısın" + "qwenCodeOauthPath": "Geçerli bir OAuth kimlik bilgileri yolu sağlamalısın", + "openAiNativeCodexOauthPath": "İsteğe bağlı: ChatGPT Codex auth.json yolu. Boş olduğunda, varsayılan ~/.codex/auth.json'dur." }, "placeholders": { "apiKey": "API anahtarını girin...", @@ -877,5 +889,11 @@ "output": "Çıkış", "cacheReads": "Önbellek okumaları" } + }, + "ui": { + "collapseThinking": { + "label": "Düşünme mesajlarını varsayılan olarak daralt", + "description": "Etkinleştirildiğinde, düşünme blokları siz onlarla etkileşime girene kadar varsayılan olarak daraltılır" + } } } diff --git a/webview-ui/src/i18n/locales/tr/welcome.json b/webview-ui/src/i18n/locales/tr/welcome.json index 7551676c6c4..ff79c4f98a1 100644 --- a/webview-ui/src/i18n/locales/tr/welcome.json +++ b/webview-ui/src/i18n/locales/tr/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "LLM'ler için birleşik bir arayüz" + }, + "roo": { + "description": "Başlamak için en iyi ücretsiz modeller", + "incentive": "Roo'yu ücretsiz dene" } }, "chooseProvider": "Sihirini yapabilmesi için Roo'nun bir API anahtarına ihtiyacı var.", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index b14dc02a1cf..221ced0377a 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -61,7 +61,7 @@ "tooltip": "Phê duyệt hành động này" }, "runCommand": { - "title": "Chạy lệnh", + "title": "Lệnh", "tooltip": "Thực thi lệnh này" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "Tìm kiếm chế độ...", "noResults": "Không tìm thấy kết quả nào" }, - "errorReadingFile": "Lỗi khi đọc tệp:", + "errorReadingFile": "Lỗi khi đọc tệp", "noValidImages": "Không có hình ảnh hợp lệ nào được xử lý", "separator": "Dấu phân cách", "edit": "Chỉnh sửa...", @@ -163,49 +163,50 @@ "wantsToFetch": "Roo muốn lấy hướng dẫn chi tiết để hỗ trợ nhiệm vụ hiện tại" }, "fileOperations": { - "wantsToRead": "Roo muốn đọc tệp này:", - "wantsToReadOutsideWorkspace": "Roo muốn đọc tệp này bên ngoài không gian làm việc:", - "didRead": "Roo đã đọc tệp này:", - "wantsToEdit": "Roo muốn chỉnh sửa tệp này:", - "wantsToEditOutsideWorkspace": "Roo muốn chỉnh sửa tệp này bên ngoài không gian làm việc:", - "wantsToEditProtected": "Roo muốn chỉnh sửa tệp cấu hình được bảo vệ:", - "wantsToCreate": "Roo muốn tạo một tệp mới:", - "wantsToSearchReplace": "Roo muốn thực hiện tìm kiếm và thay thế trong tệp này:", - "didSearchReplace": "Roo đã thực hiện tìm kiếm và thay thế trong tệp này:", - "wantsToInsert": "Roo muốn chèn nội dung vào tệp này:", - "wantsToInsertWithLineNumber": "Roo muốn chèn nội dung vào dòng {{lineNumber}} của tệp này:", - "wantsToInsertAtEnd": "Roo muốn thêm nội dung vào cuối tệp này:", - "wantsToReadAndXMore": "Roo muốn đọc tệp này và {{count}} tệp khác:", - "wantsToReadMultiple": "Roo muốn đọc nhiều tệp:", - "wantsToApplyBatchChanges": "Roo muốn áp dụng thay đổi cho nhiều tệp:", - "wantsToGenerateImage": "Roo muốn tạo một hình ảnh:", - "wantsToGenerateImageOutsideWorkspace": "Roo muốn tạo hình ảnh bên ngoài không gian làm việc:", - "wantsToGenerateImageProtected": "Roo muốn tạo hình ảnh ở vị trí được bảo vệ:", - "didGenerateImage": "Roo đã tạo một hình ảnh:" + "wantsToRead": "Roo muốn đọc tệp này", + "wantsToReadOutsideWorkspace": "Roo muốn đọc tệp này bên ngoài không gian làm việc", + "didRead": "Roo đã đọc tệp này", + "wantsToEdit": "Roo muốn chỉnh sửa tệp này", + "wantsToEditOutsideWorkspace": "Roo muốn chỉnh sửa tệp này bên ngoài không gian làm việc", + "wantsToEditProtected": "Roo muốn chỉnh sửa tệp cấu hình được bảo vệ", + "wantsToCreate": "Roo muốn tạo một tệp mới", + "wantsToSearchReplace": "Roo muốn thực hiện tìm kiếm và thay thế trong tệp này", + "didSearchReplace": "Roo đã thực hiện tìm kiếm và thay thế trong tệp này", + "wantsToInsert": "Roo muốn chèn nội dung vào tệp này", + "wantsToInsertWithLineNumber": "Roo muốn chèn nội dung vào dòng {{lineNumber}} của tệp này", + "wantsToInsertAtEnd": "Roo muốn thêm nội dung vào cuối tệp này", + "wantsToReadAndXMore": "Roo muốn đọc tệp này và {{count}} tệp khác", + "wantsToReadMultiple": "Roo muốn đọc nhiều tệp", + "wantsToApplyBatchChanges": "Roo muốn áp dụng thay đổi cho nhiều tệp", + "wantsToGenerateImage": "Roo muốn tạo một hình ảnh", + "wantsToGenerateImageOutsideWorkspace": "Roo muốn tạo hình ảnh bên ngoài không gian làm việc", + "wantsToGenerateImageProtected": "Roo muốn tạo hình ảnh ở vị trí được bảo vệ", + "didGenerateImage": "Roo đã tạo một hình ảnh" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo muốn xem các tệp cấp cao nhất trong thư mục này:", - "didViewTopLevel": "Roo đã xem các tệp cấp cao nhất trong thư mục này:", - "wantsToViewRecursive": "Roo muốn xem đệ quy tất cả các tệp trong thư mục này:", - "didViewRecursive": "Roo đã xem đệ quy tất cả các tệp trong thư mục này:", - "wantsToViewDefinitions": "Roo muốn xem tên định nghĩa mã nguồn được sử dụng trong thư mục này:", - "didViewDefinitions": "Roo đã xem tên định nghĩa mã nguồn được sử dụng trong thư mục này:", - "wantsToSearch": "Roo muốn tìm kiếm trong thư mục này cho {{regex}}:", - "didSearch": "Roo đã tìm kiếm trong thư mục này cho {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo muốn tìm kiếm trong thư mục này (ngoài không gian làm việc) cho {{regex}}:", - "didSearchOutsideWorkspace": "Roo đã tìm kiếm trong thư mục này (ngoài không gian làm việc) cho {{regex}}:", - "wantsToViewTopLevelOutsideWorkspace": "Roo muốn xem các tệp cấp cao nhất trong thư mục này (ngoài không gian làm việc):", - "didViewTopLevelOutsideWorkspace": "Roo đã xem các tệp cấp cao nhất trong thư mục này (ngoài không gian làm việc):", - "wantsToViewRecursiveOutsideWorkspace": "Roo muốn xem đệ quy tất cả các tệp trong thư mục này (ngoài không gian làm việc):", - "didViewRecursiveOutsideWorkspace": "Roo đã xem đệ quy tất cả các tệp trong thư mục này (ngoài không gian làm việc):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo muốn xem tên định nghĩa mã nguồn được sử dụng trong thư mục này (ngoài không gian làm việc):", - "didViewDefinitionsOutsideWorkspace": "Roo đã xem tên định nghĩa mã nguồn được sử dụng trong thư mục này (ngoài không gian làm việc):" + "wantsToViewTopLevel": "Roo muốn xem các tệp cấp cao nhất trong thư mục này", + "didViewTopLevel": "Roo đã xem các tệp cấp cao nhất trong thư mục này", + "wantsToViewRecursive": "Roo muốn xem đệ quy tất cả các tệp trong thư mục này", + "didViewRecursive": "Roo đã xem đệ quy tất cả các tệp trong thư mục này", + "wantsToViewDefinitions": "Roo muốn xem tên định nghĩa mã nguồn được sử dụng trong thư mục này", + "didViewDefinitions": "Roo đã xem tên định nghĩa mã nguồn được sử dụng trong thư mục này", + "wantsToSearch": "Roo muốn tìm kiếm trong thư mục này cho {{regex}}", + "didSearch": "Roo đã tìm kiếm trong thư mục này cho {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo muốn tìm kiếm trong thư mục này (ngoài không gian làm việc) cho {{regex}}", + "didSearchOutsideWorkspace": "Roo đã tìm kiếm trong thư mục này (ngoài không gian làm việc) cho {{regex}}", + "wantsToViewTopLevelOutsideWorkspace": "Roo muốn xem các tệp cấp cao nhất trong thư mục này (ngoài không gian làm việc)", + "didViewTopLevelOutsideWorkspace": "Roo đã xem các tệp cấp cao nhất trong thư mục này (ngoài không gian làm việc)", + "wantsToViewRecursiveOutsideWorkspace": "Roo muốn xem đệ quy tất cả các tệp trong thư mục này (ngoài không gian làm việc)", + "didViewRecursiveOutsideWorkspace": "Roo đã xem đệ quy tất cả các tệp trong thư mục này (ngoài không gian làm việc)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo muốn xem tên định nghĩa mã nguồn được sử dụng trong thư mục này (ngoài không gian làm việc)", + "didViewDefinitionsOutsideWorkspace": "Roo đã xem tên định nghĩa mã nguồn được sử dụng trong thư mục này (ngoài không gian làm việc)" }, "commandOutput": "Kết quả lệnh", "commandExecution": { "running": "Đang chạy", + "abort": "Hủy bỏ", "pid": "PID: {{pid}}", - "exited": "Đã thoát ({{exitCode}})", + "exitStatus": "Đã thoát với trạng thái {{exitCode}}", "manageCommands": "Quản lý quyền lệnh", "commandManagementDescription": "Quản lý quyền lệnh: Nhấp vào ✓ để cho phép tự động thực thi, ✗ để từ chối thực thi. Các mẫu có thể được bật/tắt hoặc xóa khỏi danh sách. Xem tất cả cài đặt", "addToAllowed": "Thêm vào danh sách cho phép", @@ -220,9 +221,15 @@ }, "response": "Phản hồi", "arguments": "Tham số", + "text": { + "rooSaid": "Roo đã nói" + }, + "feedback": { + "youSaid": "Bạn đã nói" + }, "mcp": { - "wantsToUseTool": "Roo muốn sử dụng một công cụ trên máy chủ MCP {{serverName}}:", - "wantsToAccessResource": "Roo muốn truy cập một tài nguyên trên máy chủ MCP {{serverName}}:" + "wantsToUseTool": "Roo muốn sử dụng một công cụ trên máy chủ MCP {{serverName}}", + "wantsToAccessResource": "Roo muốn truy cập một tài nguyên trên máy chủ MCP {{serverName}}" }, "modes": { "wantsToSwitch": "Roo muốn chuyển sang chế độ {{mode}}", @@ -231,7 +238,7 @@ "didSwitchWithReason": "Roo đã chuyển sang chế độ {{mode}} vì: {{reason}}" }, "subtasks": { - "wantsToCreate": "Roo muốn tạo một nhiệm vụ phụ mới trong chế độ {{mode}}:", + "wantsToCreate": "Roo muốn tạo một nhiệm vụ phụ mới trong chế độ {{mode}}", "wantsToFinish": "Roo muốn hoàn thành nhiệm vụ phụ này", "newTaskContent": "Hướng dẫn nhiệm vụ phụ", "completionContent": "Nhiệm vụ phụ đã hoàn thành", @@ -240,7 +247,7 @@ "completionInstructions": "Nhiệm vụ phụ đã hoàn thành! Bạn có thể xem lại kết quả và đề xuất các sửa đổi hoặc bước tiếp theo. Nếu mọi thứ có vẻ tốt, hãy xác nhận để trả kết quả về nhiệm vụ chính." }, "questions": { - "hasQuestion": "Roo có một câu hỏi:" + "hasQuestion": "Roo có một câu hỏi" }, "taskCompleted": "Nhiệm vụ hoàn thành", "powershell": { @@ -250,6 +257,7 @@ "tooltipManage": "Quản lý cài đặt tự động phê duyệt", "tooltipStatus": "Tự động phê duyệt được bật cho: {{toggles}}", "title": "Tự động phê duyệt", + "toggle": "Bật/tắt tự động phê duyệt", "all": "Tất cả", "none": "Không có", "description": "Thực hiện các hành động này mà không cần xin phép. Chỉ bật tính năng này cho các hành động bạn hoàn toàn tin tưởng.", @@ -279,15 +287,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} Đã phát hành", - "description": "Giới thiệu Roo Code Cloud: Mang sức mạnh của Roo vượt ra ngoài IDE", - "feature1": "Theo dõi tiến trình tác vụ từ bất kỳ đâu (Miễn phí): Nhận cập nhật thời gian thực về các tác vụ chạy dài mà không bị mắc kẹt trong IDE của bạn", - "feature2": "Điều khiển Tiện ích Roo từ xa (Pro): Bắt đầu, dừng và tương tác với các tác vụ từ giao diện trình duyệt dựa trên chat.", - "learnMore": "Sẵn sàng nắm quyền kiểm soát? Tìm hiểu thêm tại đây.", - "visitCloudButton": "Truy cập Roo Code Cloud", - "socialLinks": "Tham gia với chúng tôi trên X, Discord, hoặc r/RooCode" + "stealthModel": { + "feature": "Mô hình stealth MIỄN PHÍ có thời hạn - Code Supernova: Một mô hình lập trình agentic đa năng hỗ trợ đầu vào hình ảnh, có sẵn qua Roo Code Cloud.", + "note": "(Lưu ý: các prompt và completion được ghi lại bởi người tạo mô hình và được sử dụng để cải thiện mô hình)", + "connectButton": "Kết nối với Roo Code Cloud", + "selectModel": "Chọn roo/code-supernova từ nhà cung cấp Roo Code Cloud trong Cài đặt để bắt đầu.", + "goToSettingsButton": "Đi tới Cài đặt" + }, + "socialLinks": "Tham gia với chúng tôi trên X, Discord, hoặc r/RooCode 🚀" }, "browser": { - "rooWantsToUse": "Roo muốn sử dụng trình duyệt:", + "rooWantsToUse": "Roo muốn sử dụng trình duyệt", "consoleLogs": "Nhật ký bảng điều khiển", "noNewLogs": "(Không có nhật ký mới)", "screenshot": "Ảnh chụp màn hình trình duyệt", @@ -312,8 +322,6 @@ "tooltips": { "expand": "Mở rộng khối mã", "collapse": "Thu gọn khối mã", - "enable_wrap": "Bật tự động xuống dòng", - "disable_wrap": "Tắt tự động xuống dòng", "copy_code": "Sao chép mã" } }, @@ -337,8 +345,8 @@ } }, "codebaseSearch": { - "wantsToSearch": "Roo muốn tìm kiếm trong cơ sở mã cho {{query}}:", - "wantsToSearchWithPath": "Roo muốn tìm kiếm trong cơ sở mã cho {{query}} trong {{path}}:", + "wantsToSearch": "Roo muốn tìm kiếm trong cơ sở mã cho {{query}}", + "wantsToSearchWithPath": "Roo muốn tìm kiếm trong cơ sở mã cho {{query}} trong {{path}}", "didSearch_one": "Đã tìm thấy 1 kết quả", "didSearch_other": "Đã tìm thấy {{count}} kết quả", "resultTooltip": "Điểm tương tự: {{score}} (nhấp để mở tệp)" @@ -399,23 +407,11 @@ "url": "Dán URL để lấy nội dung" }, "queuedMessages": { - "title": "Tin nhắn trong hàng đợi:", + "title": "Tin nhắn trong hàng đợi", "clickToEdit": "Nhấp để chỉnh sửa tin nhắn" }, "slashCommand": { - "wantsToRun": "Roo muốn chạy lệnh slash:", - "didRun": "Roo đã chạy lệnh slash:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "Đã Đạt Giới Hạn Yêu Cầu Tự Động Phê Duyệt", - "description": "Roo đã đạt đến giới hạn tự động phê duyệt là {{count}} yêu cầu API. Bạn có muốn đặt lại bộ đếm và tiếp tục nhiệm vụ không?", - "button": "Đặt lại và Tiếp tục" - }, - "autoApprovedCostLimitReached": { - "title": "Đã Đạt Giới Hạn Chi Phí Tự Động Phê Duyệt", - "description": "Roo đã đạt đến giới hạn chi phí tự động phê duyệt là ${{count}}. Bạn có muốn đặt lại chi phí và tiếp tục với nhiệm vụ không?", - "button": "Đặt lại và Tiếp tục" - } + "wantsToRun": "Roo muốn chạy lệnh slash", + "didRun": "Roo đã chạy lệnh slash" } } diff --git a/webview-ui/src/i18n/locales/vi/cloud.json b/webview-ui/src/i18n/locales/vi/cloud.json index 069c57e87b2..a3ad623da98 100644 --- a/webview-ui/src/i18n/locales/vi/cloud.json +++ b/webview-ui/src/i18n/locales/vi/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "Gặp vấn đề?", "pasteCallbackUrl": "Sao chép URL redirect từ trình duyệt và dán vào đây:", "startOver": "Bắt đầu lại", + "personalAccount": "Tài Khoản Cá Nhân", + "switchAccount": "Chuyển Tài Khoản Roo Code Cloud", + "createTeamAccount": "Tạo Tài Khoản Nhóm", "cloudUrlPillLabel": "URL Roo Code Cloud", "upsell": { "autoApprovePowerUser": "Trao cho Roo một chút độc lập? Kiểm soát nó từ mọi nơi với Roo Code Cloud. Tìm hiểu thêm.", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 0f03de47a51..5282d45bdfd 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -30,6 +30,7 @@ "terminal": "Terminal", "slashCommands": "Lệnh Gạch Chéo", "prompts": "Lời nhắc", + "ui": "UI", "experimental": "Thử nghiệm", "language": "Ngôn ngữ", "about": "Giới thiệu" @@ -134,6 +135,7 @@ "resetToDefault": "Đặt lại về mặc định" }, "autoApprove": { + "toggleShortcut": "Bạn có thể định cấu hình một phím tắt chung cho cài đặt này trong tùy chọn IDE của bạn.", "description": "Cho phép Roo tự động thực hiện các hoạt động mà không cần phê duyệt. Chỉ bật những cài đặt này nếu bạn hoàn toàn tin tưởng AI và hiểu rõ các rủi ro bảo mật liên quan.", "enabled": "Phê duyệt tự động đã bật", "toggleAriaLabel": "Chuyển đổi tự động phê duyệt", @@ -380,6 +382,8 @@ "modelId": "ID mô hình", "apiKey": "Khóa API Ollama", "apiKeyHelp": "Khóa API tùy chọn cho các phiên bản Ollama đã xác thực hoặc dịch vụ đám mây. Để trống cho cài đặt cục bộ.", + "numCtx": "Kích thước cửa sổ ngữ cảnh (num_ctx)", + "numCtxHelp": "Ghi đè kích thước cửa sổ ngữ cảnh mặc định của mô hình. Để trống để sử dụng cấu hình Modelfile của mô hình. Giá trị tối thiểu là 128.", "description": "Ollama cho phép bạn chạy các mô hình cục bộ trên máy tính của bạn. Để biết hướng dẫn về cách bắt đầu, xem hướng dẫn nhanh của họ.", "warning": "Lưu ý: Roo Code sử dụng các lời nhắc phức tạp và hoạt động tốt nhất với các mô hình Claude. Các mô hình kém mạnh hơn có thể không hoạt động như mong đợi." }, @@ -395,6 +399,13 @@ "authenticatedMessage": "Đã xác thực an toàn thông qua tài khoản Roo Code Cloud của bạn.", "connectButton": "Kết nối với Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "Đường dẫn thông tin xác thực OAuth", + "oauthPathDescription": "Đường dẫn đến thông tin xác thực auth.json ChatGPT Codex của bạn. Mặc định {{defaultPath}} nếu để trống (Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json).", + "oauthCliDescription": "ChatGPT Codex sử dụng thông tin xác thực web ChatGPT của bạn thông qua CLI Codex chính thức. Xác thực với CLI Codex để tạo auth.json. Nếu bạn sử dụng vị trí tùy chỉnh, hãy đặt đường dẫn tệp đầy đủ ở đây.", + "oauthConnectDescription": "Sau khi xác thực, Roo sẽ đọc token truy cập từ auth.json và kết nối với ChatGPT Responses (Codex).", + "learnMoreLinkText": "Tìm hiểu thêm về ChatGPT" + }, "openRouter": { "providerRouting": { "title": "Định tuyến nhà cung cấp OpenRouter", @@ -824,7 +835,8 @@ "providerNotAllowed": "Nhà cung cấp '{{provider}}' không được phép bởi tổ chức của bạn", "modelNotAllowed": "Mô hình '{{model}}' không được phép cho nhà cung cấp '{{provider}}' bởi tổ chức của bạn", "profileInvalid": "Hồ sơ này chứa một nhà cung cấp hoặc mô hình không được phép bởi tổ chức của bạn", - "qwenCodeOauthPath": "Bạn phải cung cấp đường dẫn thông tin xác thực OAuth hợp lệ" + "qwenCodeOauthPath": "Bạn phải cung cấp đường dẫn thông tin xác thực OAuth hợp lệ", + "openAiNativeCodexOauthPath": "Tùy chọn: Đường dẫn đến auth.json của ChatGPT Codex. Khi trống, mặc định là ~/.codex/auth.json." }, "placeholders": { "apiKey": "Nhập khóa API...", @@ -877,5 +889,11 @@ "output": "Đầu ra", "cacheReads": "Lượt đọc bộ nhớ đệm" } + }, + "ui": { + "collapseThinking": { + "label": "Thu gọn tin nhắn Suy nghĩ theo mặc định", + "description": "Khi được bật, các khối suy nghĩ sẽ được thu gọn theo mặc định cho đến khi bạn tương tác với chúng" + } } } diff --git a/webview-ui/src/i18n/locales/vi/welcome.json b/webview-ui/src/i18n/locales/vi/welcome.json index 275bc5039dd..6a6545c3abf 100644 --- a/webview-ui/src/i18n/locales/vi/welcome.json +++ b/webview-ui/src/i18n/locales/vi/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "Giao diện thống nhất cho các LLM" + }, + "roo": { + "description": "Những mô hình miễn phí tốt nhất để bắt đầu", + "incentive": "Dùng thử Roo miễn phí" } }, "chooseProvider": "Để thực hiện phép màu của mình, Roo cần một khóa API.", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index d09909239b2..cbb0e8633ce 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -61,7 +61,7 @@ "tooltip": "批准此操作" }, "runCommand": { - "title": "运行命令", + "title": "命令", "tooltip": "执行此命令" }, "proceedWhileRunning": { @@ -125,7 +125,7 @@ "searchPlaceholder": "搜索模式...", "noResults": "未找到结果" }, - "errorReadingFile": "读取文件时出错:", + "errorReadingFile": "读取文件时出错", "noValidImages": "没有处理有效图片", "separator": "分隔符", "edit": "编辑...", @@ -163,49 +163,50 @@ "wantsToFetch": "Roo 想要获取详细指示以协助当前任务" }, "fileOperations": { - "wantsToRead": "需要读取文件:", - "wantsToReadOutsideWorkspace": "请求访问外部文件:", - "didRead": "已读取文件:", - "wantsToEdit": "需要编辑文件:", - "wantsToEditOutsideWorkspace": "需要编辑外部文件:", - "wantsToEditProtected": "需要编辑受保护的配置文件:", - "wantsToCreate": "需要新建文件:", - "wantsToSearchReplace": "需要在此文件中搜索和替换:", - "didSearchReplace": "已完成搜索和替换:", - "wantsToInsert": "需要在此文件中插入内容:", - "wantsToInsertWithLineNumber": "需要在第 {{lineNumber}} 行插入内容:", - "wantsToInsertAtEnd": "需要在文件末尾添加内容:", - "wantsToReadAndXMore": "Roo 想读取此文件以及另外 {{count}} 个文件:", - "wantsToReadMultiple": "Roo 想要读取多个文件:", - "wantsToApplyBatchChanges": "Roo 想要对多个文件应用更改:", - "wantsToGenerateImage": "需要生成图片:", - "wantsToGenerateImageOutsideWorkspace": "需要在工作区外生成图片:", - "wantsToGenerateImageProtected": "需要在受保护位置生成图片:", - "didGenerateImage": "已生成图片:" + "wantsToRead": "需要读取文件", + "wantsToReadOutsideWorkspace": "请求访问外部文件", + "didRead": "已读取文件", + "wantsToEdit": "需要编辑文件", + "wantsToEditOutsideWorkspace": "需要编辑外部文件", + "wantsToEditProtected": "需要编辑受保护的配置文件", + "wantsToCreate": "需要新建文件", + "wantsToSearchReplace": "需要在此文件中搜索和替换", + "didSearchReplace": "已完成搜索和替换", + "wantsToInsert": "需要在此文件中插入内容", + "wantsToInsertWithLineNumber": "需要在第 {{lineNumber}} 行插入内容", + "wantsToInsertAtEnd": "需要在文件末尾添加内容", + "wantsToReadAndXMore": "Roo 想读取此文件以及另外 {{count}} 个文件", + "wantsToReadMultiple": "Roo 想要读取多个文件", + "wantsToApplyBatchChanges": "Roo 想要对多个文件应用更改", + "wantsToGenerateImage": "需要生成图片", + "wantsToGenerateImageOutsideWorkspace": "需要在工作区外生成图片", + "wantsToGenerateImageProtected": "需要在受保护位置生成图片", + "didGenerateImage": "已生成图片" }, "directoryOperations": { - "wantsToViewTopLevel": "需要查看目录文件列表:", - "didViewTopLevel": "已查看目录文件列表:", - "wantsToViewRecursive": "需要查看目录所有文件:", - "didViewRecursive": "已查看目录所有文件:", - "wantsToViewDefinitions": "Roo想查看此目录中使用的源代码定义名称:", - "didViewDefinitions": "Roo已查看此目录中使用的源代码定义名称:", + "wantsToViewTopLevel": "需要查看目录文件列表", + "didViewTopLevel": "已查看目录文件列表", + "wantsToViewRecursive": "需要查看目录所有文件", + "didViewRecursive": "已查看目录所有文件", + "wantsToViewDefinitions": "Roo想查看此目录中使用的源代码定义名称", + "didViewDefinitions": "Roo已查看此目录中使用的源代码定义名称", "wantsToSearch": "需要搜索内容: {{regex}}", "didSearch": "已完成内容搜索: {{regex}}", "wantsToSearchOutsideWorkspace": "需要搜索内容(工作区外): {{regex}}", "didSearchOutsideWorkspace": "已完成内容搜索(工作区外): {{regex}}", - "wantsToViewTopLevelOutsideWorkspace": "需要查看目录文件列表(工作区外):", - "didViewTopLevelOutsideWorkspace": "已查看目录文件列表(工作区外):", - "wantsToViewRecursiveOutsideWorkspace": "需要查看目录所有文件(工作区外):", - "didViewRecursiveOutsideWorkspace": "已查看目录所有文件(工作区外):", - "wantsToViewDefinitionsOutsideWorkspace": "Roo想查看此目录中使用的源代码定义名称(工作区外):", - "didViewDefinitionsOutsideWorkspace": "Roo已查看此目录中使用的源代码定义名称(工作区外):" + "wantsToViewTopLevelOutsideWorkspace": "需要查看目录文件列表(工作区外)", + "didViewTopLevelOutsideWorkspace": "已查看目录文件列表(工作区外)", + "wantsToViewRecursiveOutsideWorkspace": "需要查看目录所有文件(工作区外)", + "didViewRecursiveOutsideWorkspace": "已查看目录所有文件(工作区外)", + "wantsToViewDefinitionsOutsideWorkspace": "Roo想查看此目录中使用的源代码定义名称(工作区外)", + "didViewDefinitionsOutsideWorkspace": "Roo已查看此目录中使用的源代码定义名称(工作区外)" }, "commandOutput": "命令输出", "commandExecution": { "running": "正在运行", + "abort": "中止", "pid": "PID: {{pid}}", - "exited": "已退出 ({{exitCode}})", + "exitStatus": "已退出,状态码 {{exitCode}}", "manageCommands": "管理命令权限", "commandManagementDescription": "管理命令权限:点击 ✓ 允许自动执行,点击 ✗ 拒绝执行。可以打开/关闭模式或从列表中删除。查看所有设置", "addToAllowed": "添加到允许列表", @@ -220,9 +221,15 @@ }, "response": "响应", "arguments": "参数", + "text": { + "rooSaid": "Roo 说" + }, + "feedback": { + "youSaid": "你说" + }, "mcp": { - "wantsToUseTool": "Roo想在{{serverName}} MCP上使用工具:", - "wantsToAccessResource": "Roo想访问{{serverName}} MCP服务上的资源:" + "wantsToUseTool": "Roo想在{{serverName}} MCP上使用工具", + "wantsToAccessResource": "Roo想访问{{serverName}} MCP服务上的资源" }, "modes": { "wantsToSwitch": "即将切换至{{mode}}模式", @@ -231,7 +238,7 @@ "didSwitchWithReason": "已切换至{{mode}}模式(原因:{{reason}})" }, "subtasks": { - "wantsToCreate": "Roo想在{{mode}}模式下创建新子任务:", + "wantsToCreate": "Roo想在{{mode}}模式下创建新子任务", "wantsToFinish": "Roo想完成此子任务", "newTaskContent": "子任务说明", "completionContent": "子任务已完成", @@ -240,7 +247,7 @@ "completionInstructions": "子任务已完成!您可以查看结果并提出修改或下一步建议。如果一切正常,请确认以将结果返回给主任务。" }, "questions": { - "hasQuestion": "Roo有一个问题:" + "hasQuestion": "Roo有一个问题" }, "taskCompleted": "任务完成", "powershell": { @@ -250,6 +257,7 @@ "tooltipManage": "管理自动批准设置", "tooltipStatus": "自动批准已启用:{{toggles}}", "title": "自动批准", + "toggle": "切换自动批准", "all": "全部", "none": "无", "description": "无需请求权限即可执行这些操作。仅对您完全信任的操作启用此功能。", @@ -279,15 +287,17 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} 已发布", - "description": "介绍 Roo Code Cloud:将 Roo 的强大功能扩展到 IDE 之外", - "feature1": "随时随地跟踪任务进度(免费):获取长时间运行任务的实时更新,无需困在 IDE 中", - "feature2": "远程控制 Roo 扩展(Pro):通过基于聊天的浏览器界面启动、停止和与任务交互。", - "learnMore": "准备掌控一切?在这里了解更多。", - "visitCloudButton": "访问 Roo Code Cloud", - "socialLinks": "在 XDiscordr/RooCode 上关注我们" + "stealthModel": { + "feature": "限时免费隐形模型 - Code Supernova:一个支持图像输入的多功能代理编程模型,通过 Roo Code Cloud 提供。", + "note": "(注意:提示词和补全内容会被模型创建者记录并用于改进模型)", + "connectButton": "连接到 Roo Code Cloud", + "selectModel": "在设置中从 Roo Code Cloud 提供商选择 roo/code-supernova 开始使用。", + "goToSettingsButton": "前往设置" + }, + "socialLinks": "在 XDiscordr/RooCode 上关注我们 🚀" }, "browser": { - "rooWantsToUse": "Roo想使用浏览器:", + "rooWantsToUse": "Roo想使用浏览器", "consoleLogs": "控制台日志", "noNewLogs": "(没有新日志)", "screenshot": "浏览器截图", @@ -312,8 +322,6 @@ "tooltips": { "expand": "展开代码块", "collapse": "收起代码块", - "enable_wrap": "启用自动换行", - "disable_wrap": "禁用自动换行", "copy_code": "复制代码" } }, @@ -399,23 +407,11 @@ "url": "粘贴URL以获取内容" }, "queuedMessages": { - "title": "队列消息:", + "title": "队列消息", "clickToEdit": "点击编辑消息" }, "slashCommand": { - "wantsToRun": "Roo 想要运行斜杠命令:", - "didRun": "Roo 运行了斜杠命令:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "已达自动批准请求限制", - "description": "Roo 已达到 {{count}} 次 API 请求的自动批准限制。您想重置计数并继续任务吗?", - "button": "重置并继续" - }, - "autoApprovedCostLimitReached": { - "title": "已达到自动批准的费用限额", - "description": "Roo已经达到了${{count}}的自动批准成本限制。您想重置成本并继续任务吗?", - "button": "重置并继续" - } + "wantsToRun": "Roo 想要运行斜杠命令", + "didRun": "Roo 运行了斜杠命令" } } diff --git a/webview-ui/src/i18n/locales/zh-CN/cloud.json b/webview-ui/src/i18n/locales/zh-CN/cloud.json index 47006c9227c..1fce239f63d 100644 --- a/webview-ui/src/i18n/locales/zh-CN/cloud.json +++ b/webview-ui/src/i18n/locales/zh-CN/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "遇到问题?", "pasteCallbackUrl": "从浏览器复制重定向 URL 并粘贴到这里:", "startOver": "重新开始", + "personalAccount": "个人账户", + "switchAccount": "切换 Roo Code Cloud 账户", + "createTeamAccount": "创建团队账户", "cloudUrlPillLabel": "Roo Code Cloud URL", "upsell": { "autoApprovePowerUser": "给 Roo 一些独立性?使用 Roo Code Cloud 从任何地方控制它。 了解更多。", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 51db19562a4..befdac0fcc8 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -30,6 +30,7 @@ "terminal": "终端", "slashCommands": "斜杠命令", "prompts": "提示词", + "ui": "UI", "experimental": "实验性", "language": "语言", "about": "关于 Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "恢复默认值" }, "autoApprove": { + "toggleShortcut": "您可以在 IDE 首选项中为此设置配置全局快捷方式。", "description": "允许 Roo 自动执行操作而无需批准。只有在您完全信任 AI 并了解相关安全风险的情况下才启用这些设置。", "enabled": "自动批准已启用", "toggleAriaLabel": "切换自动批准", @@ -380,6 +382,8 @@ "modelId": "模型 ID", "apiKey": "Ollama API 密钥", "apiKeyHelp": "用于已认证 Ollama 实例或云服务的可选 API 密钥。本地安装请留空。", + "numCtx": "上下文窗口大小 (num_ctx)", + "numCtxHelp": "覆盖模型的默认上下文窗口大小。留空以使用模型的 Modelfile 配置。最小值为 128。", "description": "Ollama 允许您在本地计算机上运行模型。有关如何开始使用的说明,请参阅其快速入门指南。", "warning": "注意:Roo Code 使用复杂的提示,与 Claude 模型配合最佳。功能较弱的模型可能无法按预期工作。" }, @@ -395,6 +399,13 @@ "authenticatedMessage": "已通过 Roo Code Cloud 账户安全认证。", "connectButton": "连接到 Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth 凭据路径", + "oauthPathDescription": "ChatGPT Codex auth.json 凭据的路径。如果留空则默认为 {{defaultPath}}(Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json)。", + "oauthCliDescription": "ChatGPT Codex 通过官方 Codex CLI 使用你的 ChatGPT 网页凭据。使用 Codex CLI 进行认证以创建 auth.json。如果使用自定义位置,请在此设置完整文件路径。", + "oauthConnectDescription": "认证后,Roo 将从 auth.json 读取访问 Token 并连接到 ChatGPT Responses(Codex)。", + "learnMoreLinkText": "了解更多关于 ChatGPT" + }, "openRouter": { "providerRouting": { "title": "OpenRouter 提供商路由", @@ -824,7 +835,8 @@ "providerNotAllowed": "提供商 '{{provider}}' 不允许用于您的组织", "modelNotAllowed": "模型 '{{model}}' 不允许用于提供商 '{{provider}}',您的组织不允许", "profileInvalid": "此配置文件包含您的组织不允许的提供商或模型", - "qwenCodeOauthPath": "您必须提供有效的 OAuth 凭证路径" + "qwenCodeOauthPath": "您必须提供有效的 OAuth 凭证路径", + "openAiNativeCodexOauthPath": "可选:ChatGPT Codex auth.json 路径。为空时默认为 ~/.codex/auth.json。" }, "placeholders": { "apiKey": "请输入 API 密钥...", @@ -877,5 +889,11 @@ "output": "输出", "cacheReads": "缓存读取" } + }, + "ui": { + "collapseThinking": { + "label": "默认折叠“思考”消息", + "description": "启用后,“思考”块将默认折叠,直到您与其交互" + } } } diff --git a/webview-ui/src/i18n/locales/zh-CN/welcome.json b/webview-ui/src/i18n/locales/zh-CN/welcome.json index a53adf08cd1..d4fe595e143 100644 --- a/webview-ui/src/i18n/locales/zh-CN/welcome.json +++ b/webview-ui/src/i18n/locales/zh-CN/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "统一了大语言模型的接口" + }, + "roo": { + "description": "最优秀的免费模型助你开始", + "incentive": "免费试用 Roo" } }, "chooseProvider": "Roo 需要一个 API 密钥才能发挥魔力。", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index f09a66f785a..dbc4b3dd9f8 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -69,7 +69,7 @@ } }, "runCommand": { - "title": "執行命令", + "title": "命令", "tooltip": "執行此命令" }, "proceedWhileRunning": { @@ -136,7 +136,7 @@ "addContext": "輸入 @ 新增內容,/ 執行命令", "dragFiles": "按住 Shift 鍵拖曳檔案", "dragFilesImages": "按住 Shift 鍵拖曳檔案/圖片", - "errorReadingFile": "讀取檔案時發生錯誤:", + "errorReadingFile": "讀取檔案時發生錯誤", "noValidImages": "未處理到任何有效圖片", "separator": "分隔符號", "edit": "編輯...", @@ -175,47 +175,47 @@ "wantsToFetch": "Roo 想要取得詳細指示以協助目前工作" }, "fileOperations": { - "wantsToRead": "Roo 想要讀取此檔案:", - "wantsToReadMultiple": "Roo 想要讀取多個檔案:", - "wantsToReadAndXMore": "Roo 想要讀取此檔案以及另外 {{count}} 個檔案:", - "wantsToReadOutsideWorkspace": "Roo 想要讀取此工作區外的檔案:", - "didRead": "Roo 已讀取此檔案:", - "wantsToEdit": "Roo 想要編輯此檔案:", - "wantsToEditOutsideWorkspace": "Roo 想要編輯此工作區外的檔案:", - "wantsToEditProtected": "Roo 想要編輯受保護的設定檔案:", - "wantsToApplyBatchChanges": "Roo 想要對多個檔案套用變更:", - "wantsToGenerateImage": "Roo 想要產生圖片:", - "wantsToGenerateImageOutsideWorkspace": "Roo 想要在工作區外產生圖片:", - "wantsToGenerateImageProtected": "Roo 想要在受保護位置產生圖片:", - "didGenerateImage": "Roo 已產生圖片:", - "wantsToCreate": "Roo 想要建立新檔案:", - "wantsToSearchReplace": "Roo 想要在此檔案中搜尋和取代:", - "didSearchReplace": "Roo 已在此檔案執行搜尋和取代:", - "wantsToInsert": "Roo 想要在此檔案中插入內容:", - "wantsToInsertWithLineNumber": "Roo 想要在此檔案第 {{lineNumber}} 行插入內容:", - "wantsToInsertAtEnd": "Roo 想要在此檔案尾端新增內容:" + "wantsToRead": "Roo 想要讀取此檔案", + "wantsToReadMultiple": "Roo 想要讀取多個檔案", + "wantsToReadAndXMore": "Roo 想要讀取此檔案以及另外 {{count}} 個檔案", + "wantsToReadOutsideWorkspace": "Roo 想要讀取此工作區外的檔案", + "didRead": "Roo 已讀取此檔案", + "wantsToEdit": "Roo 想要編輯此檔案", + "wantsToEditOutsideWorkspace": "Roo 想要編輯此工作區外的檔案", + "wantsToEditProtected": "Roo 想要編輯受保護的設定檔案", + "wantsToApplyBatchChanges": "Roo 想要對多個檔案套用變更", + "wantsToGenerateImage": "Roo 想要產生圖片", + "wantsToGenerateImageOutsideWorkspace": "Roo 想要在工作區外產生圖片", + "wantsToGenerateImageProtected": "Roo 想要在受保護位置產生圖片", + "didGenerateImage": "Roo 已產生圖片", + "wantsToCreate": "Roo 想要建立新檔案", + "wantsToSearchReplace": "Roo 想要在此檔案中搜尋和取代", + "didSearchReplace": "Roo 已在此檔案執行搜尋和取代", + "wantsToInsert": "Roo 想要在此檔案中插入內容", + "wantsToInsertWithLineNumber": "Roo 想要在此檔案第 {{lineNumber}} 行插入內容", + "wantsToInsertAtEnd": "Roo 想要在此檔案尾端新增內容" }, "directoryOperations": { - "wantsToViewTopLevel": "Roo 想要檢視此目錄中最上層的檔案:", - "didViewTopLevel": "Roo 已檢視此目錄中最上層的檔案:", - "wantsToViewTopLevelOutsideWorkspace": "Roo 想要檢視此目錄(工作區外)中最上層的檔案:", - "didViewTopLevelOutsideWorkspace": "Roo 已檢視此目錄(工作區外)中最上層的檔案:", - "wantsToViewRecursive": "Roo 想要遞迴檢視此目錄中的所有檔案:", - "didViewRecursive": "Roo 已遞迴檢視此目錄中的所有檔案:", - "wantsToViewRecursiveOutsideWorkspace": "Roo 想要遞迴檢視此目錄(工作區外)中的所有檔案:", - "didViewRecursiveOutsideWorkspace": "Roo 已遞迴檢視此目錄(工作區外)中的所有檔案:", - "wantsToViewDefinitions": "Roo 想要檢視此目錄中使用的原始碼定義名稱:", - "didViewDefinitions": "Roo 已檢視此目錄中使用的原始碼定義名稱:", - "wantsToViewDefinitionsOutsideWorkspace": "Roo 想要檢視此目錄(工作區外)中使用的原始碼定義名稱:", - "didViewDefinitionsOutsideWorkspace": "Roo 已檢視此目錄(工作區外)中使用的原始碼定義名稱:", - "wantsToSearch": "Roo 想要在此目錄中搜尋 {{regex}}:", - "didSearch": "Roo 已在此目錄中搜尋 {{regex}}:", - "wantsToSearchOutsideWorkspace": "Roo 想要在此目錄(工作區外)中搜尋 {{regex}}:", - "didSearchOutsideWorkspace": "Roo 已在此目錄(工作區外)中搜尋 {{regex}}:" + "wantsToViewTopLevel": "Roo 想要檢視此目錄中最上層的檔案", + "didViewTopLevel": "Roo 已檢視此目錄中最上層的檔案", + "wantsToViewTopLevelOutsideWorkspace": "Roo 想要檢視此目錄(工作區外)中最上層的檔案", + "didViewTopLevelOutsideWorkspace": "Roo 已檢視此目錄(工作區外)中最上層的檔案", + "wantsToViewRecursive": "Roo 想要遞迴檢視此目錄中的所有檔案", + "didViewRecursive": "Roo 已遞迴檢視此目錄中的所有檔案", + "wantsToViewRecursiveOutsideWorkspace": "Roo 想要遞迴檢視此目錄(工作區外)中的所有檔案", + "didViewRecursiveOutsideWorkspace": "Roo 已遞迴檢視此目錄(工作區外)中的所有檔案", + "wantsToViewDefinitions": "Roo 想要檢視此目錄中使用的原始碼定義名稱", + "didViewDefinitions": "Roo 已檢視此目錄中使用的原始碼定義名稱", + "wantsToViewDefinitionsOutsideWorkspace": "Roo 想要檢視此目錄(工作區外)中使用的原始碼定義名稱", + "didViewDefinitionsOutsideWorkspace": "Roo 已檢視此目錄(工作區外)中使用的原始碼定義名稱", + "wantsToSearch": "Roo 想要在此目錄中搜尋 {{regex}}", + "didSearch": "Roo 已在此目錄中搜尋 {{regex}}", + "wantsToSearchOutsideWorkspace": "Roo 想要在此目錄(工作區外)中搜尋 {{regex}}", + "didSearchOutsideWorkspace": "Roo 已在此目錄(工作區外)中搜尋 {{regex}}" }, "codebaseSearch": { - "wantsToSearch": "Roo 想要在程式碼庫中搜尋:{{query}}", - "wantsToSearchWithPath": "Roo 想要在 {{path}} 中搜尋程式碼庫:{{query}}", + "wantsToSearch": "Roo 想要在程式碼庫中搜尋 {{query}}", + "wantsToSearchWithPath": "Roo 想要在 {{path}} 中搜尋程式碼庫 {{query}}", "didSearch_one": "找到 1 個結果", "didSearch_other": "找到 {{count}} 個結果", "resultTooltip": "相似度評分:{{score}} (點選開啟檔案)" @@ -223,8 +223,9 @@ "commandOutput": "命令輸出", "commandExecution": { "running": "正在執行", + "abort": "中止", "pid": "PID: {{pid}}", - "exited": "已結束 ({{exitCode}})", + "exitStatus": "已結束,狀態碼 {{exitCode}}", "manageCommands": "管理命令權限", "commandManagementDescription": "管理命令權限:點選 ✓ 允許自動執行,點選 ✗ 拒絕執行。規則可以開啟/關閉或從清單中移除。檢視所有設定", "addToAllowed": "新增至允許清單", @@ -239,9 +240,15 @@ }, "response": "回應", "arguments": "參數", + "text": { + "rooSaid": "Roo 說" + }, + "feedback": { + "youSaid": "您說" + }, "mcp": { - "wantsToUseTool": "Roo 想要在 {{serverName}} MCP 伺服器上使用工具:", - "wantsToAccessResource": "Roo 想要存取 {{serverName}} MCP 伺服器上的資源:" + "wantsToUseTool": "Roo 想要在 {{serverName}} MCP 伺服器上使用工具", + "wantsToAccessResource": "Roo 想要存取 {{serverName}} MCP 伺服器上的資源" }, "modes": { "wantsToSwitch": "Roo 想要切換至 {{mode}} 模式", @@ -250,7 +257,7 @@ "didSwitchWithReason": "Roo 已切換至 {{mode}} 模式,原因:{{reason}}" }, "subtasks": { - "wantsToCreate": "Roo 想要在 {{mode}} 模式下建立新的子工作:", + "wantsToCreate": "Roo 想要在 {{mode}} 模式下建立新的子工作", "wantsToFinish": "Roo 想要完成此子工作", "newTaskContent": "子工作指示", "completionContent": "子工作已完成", @@ -259,7 +266,7 @@ "completionInstructions": "子工作已完成!您可以檢閱結果並提出修正或後續步驟。如果一切順利,請確認以將結果回傳給主任務。" }, "questions": { - "hasQuestion": "Roo 有一個問題:" + "hasQuestion": "Roo 有一個問題" }, "taskCompleted": "工作完成", "error": "錯誤", @@ -274,6 +281,7 @@ "tooltipManage": "管理自動批准設定", "tooltipStatus": "自動批准已啟用:{{toggles}}", "title": "自動批准", + "toggle": "切換自動批准", "all": "全部", "none": "無", "description": "無需請求權限即可執行這些操作。僅對您完全信任的操作啟用此功能。", @@ -288,12 +296,14 @@ }, "announcement": { "title": "🎉 Roo Code {{version}} 已發布", - "description": "介紹 Roo Code Cloud:將 Roo 的強大功能延伸到 IDE 之外", - "feature1": "隨時隨地追蹤任務進度(免費):取得長時間執行任務的即時更新,無需被困在 IDE 中", - "feature2": "遠端控制 Roo 擴充功能(Pro):透過基於聊天的瀏覽器介面啟動、停止並與任務互動。", - "learnMore": "準備好掌控一切了嗎?在這裡了解更多。", - "visitCloudButton": "造訪 Roo Code Cloud", - "socialLinks": "在 XDiscordr/RooCode 上關注我們" + "stealthModel": { + "feature": "限時免費隱形模型 - Code Supernova:一個支援圖像輸入的多功能代理程式編程模型,透過 Roo Code Cloud 提供。", + "note": "(注意:提示和完成會被模型創建者記錄並用於改進模型)", + "connectButton": "連接到 Roo Code Cloud", + "selectModel": "在設定中從 Roo Code Cloud 提供商選擇 roo/code-supernova 開始使用。", + "goToSettingsButton": "前往設定" + }, + "socialLinks": "在 XDiscordr/RooCode 上關注我們 🚀" }, "reasoning": { "thinking": "思考中", @@ -305,7 +315,7 @@ "countdownDisplay": "{{count}} 秒" }, "browser": { - "rooWantsToUse": "Roo 想要使用瀏覽器:", + "rooWantsToUse": "Roo 想要使用瀏覽器", "consoleLogs": "主控台記錄", "noNewLogs": "(沒有新記錄)", "screenshot": "瀏覽器螢幕擷圖", @@ -317,7 +327,7 @@ }, "sessionStarted": "瀏覽器工作階段已啟動", "actions": { - "title": "瀏覽器動作:", + "title": "瀏覽器動作", "launch": "在 {{url}} 啟動瀏覽器", "click": "點選 ({{coordinate}})", "type": "輸入「{{text}}」", @@ -330,8 +340,6 @@ "tooltips": { "expand": "展開程式碼區塊", "collapse": "摺疊程式碼區塊", - "enable_wrap": "啟用自動換行", - "disable_wrap": "停用自動換行", "copy_code": "複製程式碼" } }, @@ -399,23 +407,11 @@ "url": "貼上 URL 以擷取內容" }, "queuedMessages": { - "title": "佇列中的訊息:", + "title": "佇列中的訊息", "clickToEdit": "點選以編輯訊息" }, "slashCommand": { - "wantsToRun": "Roo 想要執行斜線指令:", - "didRun": "Roo 執行了斜線指令:" - }, - "ask": { - "autoApprovedRequestLimitReached": { - "title": "已達自動核准請求上限", - "description": "Roo 已達到 {{count}} 次 API 請求的自動核准上限。您想重設計數並繼續工作嗎?", - "button": "重設並繼續" - }, - "autoApprovedCostLimitReached": { - "title": "已達自動核准費用上限", - "description": "Roo 已達到 ${{count}} 的自動核准費用上限。您想重設費用並繼續工作嗎?", - "button": "重設並繼續" - } + "wantsToRun": "Roo 想要執行斜線指令", + "didRun": "Roo 執行了斜線指令" } } diff --git a/webview-ui/src/i18n/locales/zh-TW/cloud.json b/webview-ui/src/i18n/locales/zh-TW/cloud.json index 053dd23024f..54cecf1af2a 100644 --- a/webview-ui/src/i18n/locales/zh-TW/cloud.json +++ b/webview-ui/src/i18n/locales/zh-TW/cloud.json @@ -22,6 +22,9 @@ "havingTrouble": "遇到問題?", "pasteCallbackUrl": "從瀏覽器複製重新導向 URL 並貼上到這裡:", "startOver": "重新開始", + "personalAccount": "個人帳戶", + "switchAccount": "切換 Roo Code Cloud 帳戶", + "createTeamAccount": "創建團隊帳戶", "cloudUrlPillLabel": "Roo Code Cloud URL", "upsell": { "autoApprovePowerUser": "給 Roo 一點獨立性?使用 Roo Code Cloud 隨時隨地控制它。了解更多。", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 89d517f5b57..c03a243cb8d 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -30,6 +30,7 @@ "terminal": "終端機", "slashCommands": "斜線命令", "prompts": "提示詞", + "ui": "UI", "experimental": "實驗性", "language": "語言", "about": "關於 Roo Code" @@ -134,6 +135,7 @@ "resetToDefault": "重設為預設值" }, "autoApprove": { + "toggleShortcut": "您可以在 IDE 偏好設定中為此設定設定全域快捷鍵。", "description": "允許 Roo 無需核准即執行操作。僅在您完全信任 AI 並了解相關安全風險時啟用這些設定。", "enabled": "自動核准已啟用", "toggleAriaLabel": "切換自動核准", @@ -380,6 +382,8 @@ "modelId": "模型 ID", "apiKey": "Ollama API 金鑰", "apiKeyHelp": "用於已認證 Ollama 執行個體或雲端服務的選用 API 金鑰。本機安裝請留空。", + "numCtx": "上下文視窗大小 (num_ctx)", + "numCtxHelp": "覆寫模型的預設上下文視窗大小。留空以使用模型的 Modelfile 設定。最小值為 128。", "description": "Ollama 允許您在本機電腦執行模型。請參閱快速入門指南。", "warning": "注意:Roo Code 使用複雜提示,與 Claude 模型搭配最佳。功能較弱的模型可能無法正常運作。" }, @@ -395,6 +399,13 @@ "authenticatedMessage": "已透過 Roo Code Cloud 帳戶安全認證。", "connectButton": "連接到 Roo Code Cloud" }, + "openAiNativeCodex": { + "oauthPathLabel": "OAuth 憑證路徑", + "oauthPathDescription": "您的 ChatGPT Codex auth.json 憑證路徑。如果留空則預設為 {{defaultPath}}(Windows: C:\\\\Users\\\\USERNAME\\\\.codex\\\\auth.json)。", + "oauthCliDescription": "ChatGPT Codex 透過官方 Codex CLI 使用您的 ChatGPT 網頁憑證。使用 Codex CLI 進行認證以建立 auth.json。如果您使用自訂位置,請在此設定完整檔案路徑。", + "oauthConnectDescription": "認證後,Roo 將從 auth.json 讀取存取權杖並連接到 ChatGPT Responses(Codex)。", + "learnMoreLinkText": "深入了解 ChatGPT" + }, "openRouter": { "providerRouting": { "title": "OpenRouter 供應商路由", @@ -824,7 +835,8 @@ "providerNotAllowed": "供應商 '{{provider}}' 不允許用於您的組織。", "modelNotAllowed": "模型 '{{model}}' 不允許用於供應商 '{{provider}}',您的組織不允許", "profileInvalid": "此設定檔包含您的組織不允許的供應商或模型", - "qwenCodeOauthPath": "您必須提供有效的 OAuth 憑證路徑" + "qwenCodeOauthPath": "您必須提供有效的 OAuth 憑證路徑", + "openAiNativeCodexOauthPath": "可選:ChatGPT Codex auth.json 路徑。當空白時,預設為 ~/.codex/auth.json。" }, "placeholders": { "apiKey": "請輸入 API 金鑰...", @@ -877,5 +889,11 @@ "output": "輸出", "cacheReads": "快取讀取" } + }, + "ui": { + "collapseThinking": { + "label": "預設折疊“思考”訊息", + "description": "啟用後,“思考”塊將預設折疊,直到您與其互動" + } } } diff --git a/webview-ui/src/i18n/locales/zh-TW/welcome.json b/webview-ui/src/i18n/locales/zh-TW/welcome.json index de1beb9ffe3..ed4526844bb 100644 --- a/webview-ui/src/i18n/locales/zh-TW/welcome.json +++ b/webview-ui/src/i18n/locales/zh-TW/welcome.json @@ -10,6 +10,10 @@ }, "openrouter": { "description": "LLM 的統一介面" + }, + "roo": { + "description": "最優秀的免費模型助你開始", + "incentive": "免費試用 Roo" } }, "chooseProvider": "Roo 需要 API 金鑰才能發揮魔力。",