From 1b5830c9a1e16d19a28490fb57956d7fca1f8d77 Mon Sep 17 00:00:00 2001 From: Naved Merchant Date: Fri, 19 Jun 2026 14:27:49 -0700 Subject: [PATCH 01/64] chore: prepare v3.62.0 release (#658) --- CHANGELOG.md | 23 ++++++++++++++++++ README.md | 26 ++++++++++----------- locales/ca/README.md | 8 +++---- locales/de/README.md | 8 +++---- locales/es/README.md | 8 +++---- locales/fr/README.md | 8 +++---- locales/hi/README.md | 8 +++---- locales/id/README.md | 8 +++---- locales/it/README.md | 8 +++---- locales/ja/README.md | 8 +++---- locales/ko/README.md | 8 +++---- locales/nl/README.md | 8 +++---- locales/pl/README.md | 8 +++---- locales/pt-BR/README.md | 8 +++---- locales/ru/README.md | 8 +++---- locales/tr/README.md | 8 +++---- locales/vi/README.md | 8 +++---- locales/zh-CN/README.md | 8 +++---- locales/zh-TW/README.md | 8 +++---- src/core/webview/ClineProvider.ts | 2 +- src/package.json | 2 +- webview-ui/src/i18n/locales/ca/chat.json | 6 ++--- webview-ui/src/i18n/locales/de/chat.json | 6 ++--- webview-ui/src/i18n/locales/en/chat.json | 6 ++--- webview-ui/src/i18n/locales/es/chat.json | 6 ++--- webview-ui/src/i18n/locales/fr/chat.json | 6 ++--- webview-ui/src/i18n/locales/hi/chat.json | 6 ++--- webview-ui/src/i18n/locales/id/chat.json | 6 ++--- webview-ui/src/i18n/locales/it/chat.json | 6 ++--- webview-ui/src/i18n/locales/ja/chat.json | 6 ++--- webview-ui/src/i18n/locales/ko/chat.json | 6 ++--- webview-ui/src/i18n/locales/nl/chat.json | 6 ++--- webview-ui/src/i18n/locales/pl/chat.json | 6 ++--- webview-ui/src/i18n/locales/pt-BR/chat.json | 6 ++--- webview-ui/src/i18n/locales/ru/chat.json | 6 ++--- webview-ui/src/i18n/locales/tr/chat.json | 6 ++--- webview-ui/src/i18n/locales/vi/chat.json | 6 ++--- webview-ui/src/i18n/locales/zh-CN/chat.json | 6 ++--- webview-ui/src/i18n/locales/zh-TW/chat.json | 6 ++--- 39 files changed, 159 insertions(+), 138 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5ab07af40..217abe9b9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Zoo Code Changelog +## [3.62.0] + +### Minor Changes + +- Add GLM-5.2 support — the latest GLM model is now available in your provider settings (#597 by @percy4, PR #608 by @MobCode100) +- Add OpenCode-Go native model parameters, Anthropic-format routing, and context-token fix for more reliable responses (#646 by @ykoneee, PR #652 by @navedmerchant) +- Add tool-writer mode to the Marketplace — a new specialized mode for writing and maintaining tool definitions (#603 by @RayCarro, PR #604 by @RayCarro) +- Add LiteLLM support for forwarding taskId as X-Zoo-Session-ID request header for better request tracing (#590 by @awschmeder, PR #591 by @awschmeder) +- Fix: Apply apiRequestTimeout consistently across all providers (#565 by @daewoongoh, PR #567 by @daewoongoh) +- Fix: Restore diff view scroll position and fix tab handling on save/deny (#586 by @awschmeder, PR #589 by @awschmeder) +- Fix: Deliver terminal completion signal when end event wins the race against setActiveStream (#489 by @drzraf, #622 by @onlineapps-cloud, PR #645 by @edelauna) +- Fix: Fetch OpenCode-Go models unconditionally — the /models endpoint is public (PR #437 by @proyectoauraorg) +- Refactor: Extract RateLimitClock from Task static state for cleaner rate-limit handling (#361 by @edelauna, PR #628 by @edelauna) +- Refactor: Use extractReasoningFromDelta helper for reasoning extraction across providers (PR #588 by @daewoongoh) +- Fix: Automate PR review-state and stale labels in GitHub Actions (PR #636 by @edelauna) +- Re-enable the prefer-const ESLint rule (PR #250 by @0xMink) +- Add stale PR workflows and auto-closure policy (PR #631 by @edelauna) +- Update dependency vitest to v4 [security] (PR #443 by @app/renovate) +- Update dependency shell-quote to v1.8.4 [security] (PR #554 by @app/renovate) +- Update dependency esbuild to v0.28.1 [security] (PR #595 by @app/renovate) +- Update dependency vite to v8.0.16 [security] (PR #642 by @app/renovate) +- Update GitHub Actions (PR #521 by @app/renovate) + ## [3.60.0] ### Minor Changes diff --git a/README.md b/README.md index bbcb62137e..ce0f1ac8a8 100644 --- a/README.md +++ b/README.md @@ -53,19 +53,17 @@ You can find a quick guide for migrating from Roo Code to Zoo Code in the [Roo→Zoo migration guide](https://docs.zoocode.dev/roo-to-zoo-migration). We plan to try and help users as they transition over, we have our [Reddit](https://www.reddit.com/r/ZooCode) and [Discord](https://discord.gg/VxfP4Vx3gX) for this exact support, so if you are having problems or if you have question, jump on and ask. -## What's New in v3.60.0 - -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) and OpenAI GPT-5.5 are now available in your provider settings -- **Per-mode MCP allowlists** — restrict which MCP servers are active for each mode using a new allowlist in your mode configuration -- **Workspace rootResolution** — new setting to control how Zoo Code resolves file paths across roots in multi-root workspaces -- **Configurable chat font size** and **VS Code integrated terminal shell override** -- **GitHub-style alerts** rendered in the webview -- **Configurable max output tokens** for GLM models -- **WorkspacePathResolver** — reliable path handling across symlinked workspaces -- Fix React crash from malformed follow-up suggestion mode -- Fix OpenAI temperature being omitted when no custom value is set -- Handle per-key failures during settings import -- Security updates: mermaid v11.15.0, axios v1.16.0 +## What's New in v3.62.0 + +- **GLM-5.2 support** — the latest GLM model is now available in your provider settings +- **OpenCode-Go improvements** — native model parameters, Anthropic-format routing, and a context-token fix for more reliable responses +- **Tool-writer mode** — a new specialized mode for writing and maintaining tool definitions, now available in the Marketplace +- **LiteLLM session header** — forward taskId as X-Zoo-Session-ID request header for better request tracing +- Fix apiRequestTimeout applied consistently across all providers +- Fix diff view scroll position and tab handling on save/deny +- Fix terminal completion signal delivery when end event wins the race +- Refactor RateLimitClock out of Task static state for cleaner rate-limit handling +- Security updates: vitest v4, shell-quote v1.8.4, esbuild v0.28.1, vite v8.0.16
🌐 Available languages @@ -89,7 +87,7 @@ for this exact support, so if you are having problems or if you have question, j - [简体中文](locales/zh-CN/README.md) - [繁體中文](locales/zh-TW/README.md) - ... -
+ --- diff --git a/locales/ca/README.md b/locales/ca/README.md index 9028697b93..68ef28a029 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -30,11 +30,11 @@ Pots trobar una guia ràpida per passar de Roo Code a Zoo Code a la [guia de migració Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Volem ajudar tant com puguem durant la transició, i per això tens el nostre [Reddit](https://www.reddit.com/r/ZooCode) i [Discord](https://discord.gg/VxfP4Vx3gX) per a aquest suport. Si tens problemes o alguna pregunta, entra i pregunta. -## Novetats a la v3.60.0 +## Novetats a la v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) i OpenAI GPT-5.5 ara estan disponibles a la configuració del proveïdor -- **Llistes d'accés MCP per mode** — restringeix quins servidors MCP estan actius per mode usant una llista d'accés a la configuració del mode -- **rootResolution per a l'espai de treball** — nou ajust per controlar com Zoo Code resol les rutes d'arxiu entre arrels en espais de treball multi-arrel +- **Suport per a GLM-5.2** — l'últim model GLM ja està disponible a la configuració del proveïdor +- **Millores d'OpenCode-Go** — paràmetres de model natius, encaminament en format Anthropic i correcció de context-token per a respostes més fiables +- **Mode tool-writer** — un nou mode especialitzat per escriure i mantenir definicions d'eines, ja disponible al Marketplace ## Què pot fer Zoo Code per TU? diff --git a/locales/de/README.md b/locales/de/README.md index 2e2727031b..ac187fc3e5 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -30,11 +30,11 @@ Eine kurze Anleitung für den Wechsel von Roo Code zu Zoo Code findest du im [Roo→Zoo-Migrationsleitfaden](https://docs.zoocode.dev/roo-to-zoo-migration). Wir wollen Nutzer beim Umstieg so gut wie möglich unterstützen, und genau dafür sind unser [Reddit](https://www.reddit.com/r/ZooCode) und [Discord](https://discord.gg/VxfP4Vx3gX) da. Wenn du Probleme hast oder Fragen auftauchen, komm vorbei und frag nach. -## Neu in v3.60.0 +## Neu in v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) und OpenAI GPT-5.5 sind jetzt in den Anbieter-Einstellungen verfügbar -- **MCP-Allowlists pro Modus** — schränke ein, welche MCP-Server pro Modus aktiv sind, mit einer Allowlist in der Moduskonfiguration -- **Workspace-Einstellung rootResolution** — neue Einstellung zur Steuerung der Dateipfadauflösung in Multi-Root-Workspaces +- **GLM-5.2-Unterstützung** — das neueste GLM-Modell ist jetzt in deinen Anbieter-Einstellungen verfügbar +- **OpenCode-Go-Verbesserungen** — native Modellparameter, Anthropic-Format-Routing und ein Context-Token-Fix für zuverlässigere Antworten +- **Tool-Writer-Modus** — ein neuer spezieller Modus zum Schreiben und Pflegen von Tool-Definitionen, jetzt im Marketplace verfügbar ## Was kann Zoo Code für DICH tun? diff --git a/locales/es/README.md b/locales/es/README.md index f42477abfe..2bc21b70df 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -30,11 +30,11 @@ Puedes encontrar una guía rápida para pasar de Roo Code a Zoo Code en la [guía de migración Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Queremos ayudar a los usuarios durante la transición, y para eso tenemos nuestro [Reddit](https://www.reddit.com/r/ZooCode) y [Discord](https://discord.gg/VxfP4Vx3gX). Si tienes problemas o alguna pregunta, entra y pregúntanos. -## Novedades de la v3.60.0 +## Novedades de la v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) y OpenAI GPT-5.5 ya están disponibles en la configuración del proveedor -- **Listas de permitidos de MCP por modo** — restringe qué servidores MCP están activos por modo con una lista de permitidos en la configuración del modo -- **rootResolution para el espacio de trabajo** — nuevo ajuste para controlar la resolución de rutas de archivos en espacios de trabajo multi-raíz +- **Soporte para GLM-5.2** — el último modelo GLM ya está disponible en la configuración del proveedor +- **Mejoras de OpenCode-Go** — parámetros de modelo nativos, enrutamiento en formato Anthropic y corrección de context-token para respuestas más fiables +- **Modo tool-writer** — un nuevo modo especializado para escribir y mantener definiciones de herramientas, ya disponible en el Marketplace ## ¿Qué puede hacer Zoo Code por TI? diff --git a/locales/fr/README.md b/locales/fr/README.md index 6e43a66bb8..3162a1fbc2 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -30,11 +30,11 @@ Tu peux trouver un guide rapide pour passer de Roo Code à Zoo Code dans le [guide de migration Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). On veut aider au maximum pendant la transition, et notre [Reddit](https://www.reddit.com/r/ZooCode) et notre [Discord](https://discord.gg/VxfP4Vx3gX) sont là pour ça. Si tu rencontres un problème ou si tu as une question, viens demander. -## Nouveautés de la v3.60.0 +## Nouveautés de la v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) et OpenAI GPT-5.5 sont désormais disponibles dans les paramètres du fournisseur -- **Listes d'autorisation MCP par mode** — restreins les serveurs MCP actifs par mode grâce à une liste d'autorisation dans la configuration du mode -- **Paramètre rootResolution pour l'espace de travail** — nouveau réglage pour contrôler la résolution des chemins de fichiers dans les espaces de travail multi-racines +- **Prise en charge de GLM-5.2** — le dernier modèle GLM est désormais disponible dans les paramètres du fournisseur +- **Améliorations d'OpenCode-Go** — paramètres de modèle natifs, routage au format Anthropic et correction de context-token pour des réponses plus fiables +- **Mode tool-writer** — un nouveau mode spécialisé pour écrire et maintenir des définitions d'outils, désormais disponible sur le Marketplace ## Que peut faire Zoo Code pour VOUS ? diff --git a/locales/hi/README.md b/locales/hi/README.md index d5b0b1faf5..ba9b3f8a62 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -30,11 +30,11 @@ Roo Code से Zoo Code में आने के लिए एक quick guide तुम्हें [Roo→Zoo migration guide](https://docs.zoocode.dev/roo-to-zoo-migration) में मिल जाएगी। We plan to help users as much as possible during the transition, और उसी support के लिए हमारा [Reddit](https://www.reddit.com/r/ZooCode) और [Discord](https://discord.gg/VxfP4Vx3gX) है। अगर तुम्हें कोई problem हो या कोई question हो, आकर पूछो। -## v3.60.0 में नया क्या है +## v3.62.0 में नया क्या है -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) और OpenAI GPT-5.5 अब provider settings में उपलब्ध हैं -- **प्रति-मोड MCP allowlists** — mode configuration में allowlist का उपयोग करके प्रत्येक mode के लिए सक्रिय MCP servers को सीमित करें -- **Workspace rootResolution सेटिंग** — multi-root workspaces में फ़ाइल पथ resolution को नियंत्रित करने के लिए नई सेटिंग +- **GLM-5.2 समर्थन** — नवीनतम GLM मॉडल अब आपके provider settings में उपलब्ध है +- **OpenCode-Go सुधार** — native model parameters, Anthropic-format routing, और अधिक विश्वसनीय प्रतिक्रियाओं के लिए context-token fix +- **Tool-writer mode** — tool definitions को लिखने और बनाए रखने के लिए एक नया विशेष मोड, अब Marketplace में उपलब्ध है ## Zoo Code आपके लिए क्या कर सकता है? diff --git a/locales/id/README.md b/locales/id/README.md index 8eb12f1817..55fed23cfc 100644 --- a/locales/id/README.md +++ b/locales/id/README.md @@ -30,11 +30,11 @@ Kamu bisa menemukan panduan singkat untuk berpindah dari Roo Code ke Zoo Code di [panduan migrasi Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Kami ingin membantu pengguna semaksimal mungkin selama masa transisi, dan itulah gunanya [Reddit](https://www.reddit.com/r/ZooCode) dan [Discord](https://discord.gg/VxfP4Vx3gX) kami. Kalau kamu mengalami masalah atau punya pertanyaan, langsung mampir dan tanya. -## Yang Baru di v3.60.0 +## Yang Baru di v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) dan OpenAI GPT-5.5 kini tersedia di pengaturan penyedia -- **Allowlist MCP per mode** — batasi server MCP yang aktif per mode menggunakan allowlist baru di konfigurasi mode -- **Pengaturan rootResolution workspace** — pengaturan baru untuk mengontrol resolusi path file di workspace multi-root +- **Dukungan GLM-5.2** — model GLM terbaru kini tersedia di pengaturan penyedia kamu +- **Peningkatan OpenCode-Go** — parameter model native, routing format Anthropic, dan perbaikan context-token untuk respons yang lebih andal +- **Mode tool-writer** — mode khusus baru untuk menulis dan memelihara definisi tool, kini tersedia di Marketplace ## Apa yang Bisa Zoo Code Lakukan Untuk ANDA? diff --git a/locales/it/README.md b/locales/it/README.md index 7f6fd3c8a5..5272e846a2 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -30,11 +30,11 @@ Puoi trovare una guida rapida per passare da Roo Code a Zoo Code nella [guida alla migrazione Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Vogliamo aiutare gli utenti il più possibile durante la transizione, e per questo abbiamo il nostro [Reddit](https://www.reddit.com/r/ZooCode) e il nostro [Discord](https://discord.gg/VxfP4Vx3gX). Se hai problemi o domande, passa pure e chiedi. -## Novità in v3.60.0 +## Novità in v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) e OpenAI GPT-5.5 sono ora disponibili nelle impostazioni del provider -- **Allowlist MCP per modalità** — limita i server MCP attivi per modalità con una allowlist nella configurazione della modalità -- **Impostazione rootResolution per il workspace** — nuova impostazione per controllare la risoluzione dei percorsi file nei workspace multi-root +- **Supporto GLM-5.2** — l'ultimo modello GLM è ora disponibile nelle impostazioni del provider +- **Miglioramenti di OpenCode-Go** — parametri del modello nativi, routing in formato Anthropic e correzione del context-token per risposte più affidabili +- **Modalità tool-writer** — una nuova modalità specializzata per scrivere e mantenere le definizioni degli strumenti, ora disponibile nel Marketplace ## Cosa può fare Zoo Code per TE? diff --git a/locales/ja/README.md b/locales/ja/README.md index bf7fdde74e..7f3f50c32c 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -30,11 +30,11 @@ Roo Code から Zoo Code へ移行するためのクイックガイドは、[Roo→Zoo 移行ガイド](https://docs.zoocode.dev/roo-to-zoo-migration) で確認できます。移行中のユーザーをできるだけ支援したいと考えていて、そのために [Reddit](https://www.reddit.com/r/ZooCode) と [Discord](https://discord.gg/VxfP4Vx3gX) を用意しています。困ったことや質問があれば、気軽に参加して聞いてください。 -## v3.60.0 の新機能 +## v3.62.0 の新機能 -- **Fable 5 + GPT-5.5** — Claude Fable 5(Anthropic、Bedrock、Vertex)と OpenAI GPT-5.5 がプロバイダー設定で利用可能になりました -- **モード別 MCP allowlist** — モード設定の allowlist を使用して、各モードで有効にする MCP サーバーを制限できます -- **ワークスペース rootResolution 設定** — マルチルートワークスペースでのファイルパス解決方法を制御する新しい設定 +- **GLM-5.2 サポート** — 最新の GLM モデルがプロバイダー設定で利用可能になりました +- **OpenCode-Go の改善** — ネイティブモデルパラメータ、Anthropic フォーマットルーティング、より信頼性の高い応答のための context-token 修正 +- **Tool-writer モード** — ツール定義の作成と保守のための新しい専門モードが Marketplace で利用可能になりました ## Zoo Codeがあなたのためにできること diff --git a/locales/ko/README.md b/locales/ko/README.md index cfcd1422ea..6ecd6a5e7f 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -30,11 +30,11 @@ Roo Code에서 Zoo Code로 옮겨오는 빠른 가이드는 [Roo→Zoo 마이그레이션 가이드](https://docs.zoocode.dev/roo-to-zoo-migration)에서 확인할 수 있어. 전환하는 동안 사용자들을 최대한 돕고 싶고, 바로 그 지원을 위해 [Reddit](https://www.reddit.com/r/ZooCode)와 [Discord](https://discord.gg/VxfP4Vx3gX)를 운영하고 있어. 문제가 있거나 궁금한 점이 있으면 들어와서 편하게 물어봐. -## v3.60.0의 새로운 기능 +## v3.62.0의 새로운 기능 -- **Fable 5 + GPT-5.5** — Claude Fable 5(Anthropic, Bedrock, Vertex)와 OpenAI GPT-5.5가 공급자 설정에서 이제 사용 가능합니다 -- **모드별 MCP allowlist** — 모드 설정의 allowlist를 사용하여 각 모드에서 활성화할 MCP 서버를 제한하세요 -- **워크스페이스 rootResolution 설정** — 멀티 루트 워크스페이스에서 파일 경로 해석 방식을 제어하는 새 설정 +- **GLM-5.2 지원** — 최신 GLM 모델이 이제 공급자 설정에서 사용 가능합니다 +- **OpenCode-Go 개선** — 네이티브 모델 매개변수, Anthropic 형식 라우팅, 더 안정적인 응답을 위한 context-token 수정 +- **Tool-writer 모드** — 도구 정의를 작성하고 유지 관리하는 새로운 전문 모드가 Marketplace에서 사용 가능합니다 ## Zoo Code가 당신을 위해 무엇을 할 수 있을까요? diff --git a/locales/nl/README.md b/locales/nl/README.md index f07bd6bb7b..06470a4687 100644 --- a/locales/nl/README.md +++ b/locales/nl/README.md @@ -30,11 +30,11 @@ Je vindt een korte handleiding voor de overstap van Roo Code naar Zoo Code in de [Roo→Zoo-migratiegids](https://docs.zoocode.dev/roo-to-zoo-migration). We willen gebruikers zo goed mogelijk helpen tijdens de overgang, en precies daarvoor zijn onze [Reddit](https://www.reddit.com/r/ZooCode) en [Discord](https://discord.gg/VxfP4Vx3gX) er. Als je ergens tegenaan loopt of vragen hebt, kom langs en vraag het. -## Nieuw in v3.60.0 +## Nieuw in v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) en OpenAI GPT-5.5 zijn nu beschikbaar in de providerinstellingen -- **MCP-allowlists per modus** — beperk welke MCP-servers actief zijn per modus met een allowlist in de modusconfiguratie -- **Workspace rootResolution-instelling** — nieuwe instelling voor het beheren van bestandspadresolutie in multi-root-workspaces +- **GLM-5.2-ondersteuning** — het nieuwste GLM-model is nu beschikbaar in je providerinstellingen +- **OpenCode-Go-verbeteringen** — native modelparameters, Anthropic-formaat routing en een context-token-fix voor betrouwbaardere antwoorden +- **Tool-writer-modus** — een nieuwe gespecialiseerde modus voor het schrijven en onderhouden van tool-definities, nu beschikbaar in de Marketplace ## Wat kan Zoo Code voor JOU doen? diff --git a/locales/pl/README.md b/locales/pl/README.md index b5227853e3..5fa2b3a4d2 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -30,11 +30,11 @@ Szybki przewodnik po przejściu z Roo Code do Zoo Code znajdziesz w [przewodniku migracji Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Chcemy jak najlepiej pomagać użytkownikom w czasie przejścia i właśnie do tego służą nasze [Reddit](https://www.reddit.com/r/ZooCode) oraz [Discord](https://discord.gg/VxfP4Vx3gX). Jeśli masz problem albo pytanie, wpadaj i pytaj. -## Nowości w v3.60.0 +## Nowości w v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) i OpenAI GPT-5.5 są teraz dostępne w ustawieniach dostawcy -- **Allowlisty MCP per tryb** — ogranicz aktywne serwery MCP dla każdego trybu za pomocą allowlisty w konfiguracji trybu -- **Ustawienie rootResolution dla workspace** — nowe ustawienie do kontrolowania rozwiązywania ścieżek plików w środowiskach wielokorzeniowych +- **Obsługa GLM-5.2** — najnowszy model GLM jest teraz dostępny w ustawieniach dostawcy +- **Ulepszenia OpenCode-Go** — natywne parametry modelu, routing w formacie Anthropic i poprawka context-token dla bardziej niezawodnych odpowiedzi +- **Tryb tool-writer** — nowy specjalistyczny tryb do pisania i utrzymania definicji narzędzi, teraz dostępny w Marketplace ## Co Zoo Code może zrobić dla CIEBIE? diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index d19ee14fbe..e045c232b6 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -30,11 +30,11 @@ Você encontra um guia rápido para migrar do Roo Code para o Zoo Code no [guia de migração Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Queremos ajudar os usuários durante essa transição da melhor forma possível, e é exatamente para isso que temos nosso [Reddit](https://www.reddit.com/r/ZooCode) e nosso [Discord](https://discord.gg/VxfP4Vx3gX). Se você tiver algum problema ou dúvida, apareça por lá e pergunte. -## Novidades na v3.60.0 +## Novidades na v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) e OpenAI GPT-5.5 já estão disponíveis nas configurações do provedor -- **Allowlists de MCP por modo** — restrinja quais servidores MCP ficam ativos por modo com uma allowlist na configuração do modo -- **Configuração rootResolution para workspace** — nova configuração para controlar a resolução de caminhos de arquivos em workspaces multi-root +- **Suporte a GLM-5.2** — o modelo GLM mais recente já está disponível nas configurações do provedor +- **Melhorias no OpenCode-Go** — parâmetros de modelo nativos, roteamento em formato Anthropic e correção de context-token para respostas mais confiáveis +- **Modo tool-writer** — um novo modo especializado para escrever e manter definições de ferramentas, agora disponível no Marketplace ## O que o Zoo Code pode fazer por VOCÊ? diff --git a/locales/ru/README.md b/locales/ru/README.md index 707e6b28f2..b051ef0f13 100644 --- a/locales/ru/README.md +++ b/locales/ru/README.md @@ -30,11 +30,11 @@ Короткое руководство по переходу с Roo Code на Zoo Code можно найти в [гайде по миграции Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Мы хотим как можно лучше помочь пользователям во время перехода, и именно для этого у нас есть [Reddit](https://www.reddit.com/r/ZooCode) и [Discord](https://discord.gg/VxfP4Vx3gX). Если у тебя возникнут проблемы или вопросы, заходи и спрашивай. -## Что нового в v3.60.0 +## Что нового в v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) и OpenAI GPT-5.5 теперь доступны в настройках провайдера -- **Allowlist MCP для каждого режима** — ограничивай активные MCP-серверы для каждого режима через allowlist в настройках режима -- **Настройка rootResolution для рабочего пространства** — новая настройка для управления разрешением путей в мультикорневых рабочих пространствах +- **Поддержка GLM-5.2** — последняя модель GLM теперь доступна в настройках провайдера +- **Улучшения OpenCode-Go** — нативные параметры модели, маршрутизация в формате Anthropic и исправление context-token для более надёжных ответов +- **Режим tool-writer** — новый специализированный режим для написания и поддержки определений инструментов, теперь доступен в Marketplace ## Что Zoo Code может сделать для ВАС? diff --git a/locales/tr/README.md b/locales/tr/README.md index 0e51cf9512..4770b69ccf 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -30,11 +30,11 @@ Roo Code'dan Zoo Code'a geçmek için hızlı bir rehberi [Roo→Zoo geçiş rehberinde](https://docs.zoocode.dev/roo-to-zoo-migration) bulabilirsin. Geçiş sürecinde kullanıcılara elimizden geldiğince yardımcı olmak istiyoruz ve bunun için [Reddit](https://www.reddit.com/r/ZooCode) ile [Discord](https://discord.gg/VxfP4Vx3gX) topluluklarımız var. Bir sorun yaşarsan ya da sorunun olursa gel ve sor. -## v3.60.0'daki Yenilikler +## v3.62.0'daki Yenilikler -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) ve OpenAI GPT-5.5 artık sağlayıcı ayarlarında mevcut -- **Mod başına MCP allowlist'leri** — mod yapılandırmasındaki allowlist ile her mod için aktif MCP sunucularını kısıtla -- **Çalışma alanı rootResolution ayarı** — çok köklü çalışma alanlarında dosya yolu çözümlemesini kontrol eden yeni ayar +- **GLM-5.2 desteği** — en yeni GLM modeli artık sağlayıcı ayarlarında mevcut +- **OpenCode-Go iyileştirmeleri** — yerel model parametreleri, Anthropic formatı yönlendirme ve daha güvenilir yanıtlar için context-token düzeltmesi +- **Tool-writer modu** — araç tanımlarını yazmak ve sürdürmek için yeni bir uzmanlaşmış mod, artık Marketplace'te mevcut ## Zoo Code SİZİN İçin Ne Yapabilir? diff --git a/locales/vi/README.md b/locales/vi/README.md index 17a170b740..3534ab91e8 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -30,11 +30,11 @@ Bạn có thể xem hướng dẫn nhanh để chuyển từ Roo Code sang Zoo Code trong [hướng dẫn chuyển đổi Roo→Zoo](https://docs.zoocode.dev/roo-to-zoo-migration). Chúng tôi muốn hỗ trợ người dùng nhiều nhất có thể trong quá trình chuyển đổi, và đó chính là lý do chúng tôi có [Reddit](https://www.reddit.com/r/ZooCode) và [Discord](https://discord.gg/VxfP4Vx3gX). Nếu bạn gặp vấn đề hoặc có câu hỏi, cứ vào hỏi nhé. -## Điểm mới trong v3.60.0 +## Điểm mới trong v3.62.0 -- **Fable 5 + GPT-5.5** — Claude Fable 5 (Anthropic, Bedrock, Vertex) và OpenAI GPT-5.5 hiện có trong cài đặt nhà cung cấp -- **Allowlist MCP theo chế độ** — hạn chế máy chủ MCP nào hoạt động cho mỗi chế độ bằng allowlist trong cấu hình chế độ -- **Cài đặt rootResolution cho không gian làm việc** — cài đặt mới kiểm soát cách phân giải đường dẫn tệp trong không gian làm việc nhiều gốc +- **Hỗ trợ GLM-5.2** — mô hình GLM mới nhất hiện có trong cài đặt nhà cung cấp của bạn +- **Cải tiến OpenCode-Go** — tham số mô hình gốc, định tuyến định dạng Anthropic và sửa lỗi context-token để phản hồi đáng tin cậy hơn +- **Chế độ tool-writer** — chế độ chuyên biệt mới để viết và duy trì các định nghĩa công cụ, hiện có trên Marketplace ## Zoo Code có thể làm gì cho BẠN? diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 9f7b00ccba..9659f4d603 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -30,11 +30,11 @@ 你可以在 [Roo→Zoo 迁移指南](https://docs.zoocode.dev/roo-to-zoo-migration) 中找到从 Roo Code 迁移到 Zoo Code 的快速说明。我们希望在大家迁移过程中尽可能提供帮助,这也是我们设立 [Reddit](https://www.reddit.com/r/ZooCode) 和 [Discord](https://discord.gg/VxfP4Vx3gX) 社区的原因。如果你遇到问题或有任何疑问,欢迎加入后直接提问。 -## v3.60.0 新增内容 +## v3.62.0 新增内容 -- **Fable 5 + GPT-5.5** — Claude Fable 5(Anthropic、Bedrock、Vertex)和 OpenAI GPT-5.5 现已在提供商设置中可用 -- **按模式的 MCP 允许列表** — 在模式配置中使用允许列表限制每个模式下活跃的 MCP 服务器 -- **工作区 rootResolution 设置** — 新设置,用于控制 Zoo Code 在多根工作区中解析文件路径的方式 +- **GLM-5.2 支持** — 最新 GLM 模型现已在提供商设置中可用 +- **OpenCode-Go 改进** — 原生模型参数、Anthropic 格式路由和 context-token 修复,提供更可靠的响应 +- **Tool-writer 模式** — 用于编写和维护工具定义的新专用模式,现已在 Marketplace 中可用 ## Zoo Code 能为您做什么? diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index cbb608b6e8..10f4d54ee1 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -30,11 +30,11 @@ 你可以在 [Roo→Zoo 遷移指南](https://docs.zoocode.dev/roo-to-zoo-migration) 中找到從 Roo Code 遷移到 Zoo Code 的快速說明。我們希望在大家轉移過程中盡可能提供協助,這也是我們設立 [Reddit](https://www.reddit.com/r/ZooCode) 和 [Discord](https://discord.gg/VxfP4Vx3gX) 社群的原因。如果你遇到問題或有任何疑問,歡迎加入後直接提問。 -## v3.60.0 新功能 +## v3.62.0 新功能 -- **Fable 5 + GPT-5.5** — Claude Fable 5(Anthropic、Bedrock、Vertex)和 OpenAI GPT-5.5 現已在提供商設定中可用 -- **按模式的 MCP 允許清單** — 在模式設定中使用允許清單限制每個模式下活躍的 MCP 伺服器 -- **工作區 rootResolution 設定** — 新設定,用於控制 Zoo Code 在多根工作區中解析檔案路徑的方式 +- **GLM-5.2 支援** — 最新 GLM 模型現已在提供商設定中可用 +- **OpenCode-Go 改進** — 原生模型參數、Anthropic 格式路由和 context-token 修復,提供更可靠的回應 +- **Tool-writer 模式** — 用於編寫和維護工具定義的新專用模式,現已在 Marketplace 中可用 ## Zoo Code 能為您做什麼? diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 8cd0bdd911..78d7200417 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -195,7 +195,7 @@ export class ClineProvider public isViewLaunched = false public settingsImportedAt?: number - public readonly latestAnnouncementId = "jun-2026-v3.60.0-fable5-gpt55-mcp-allowlists-rootresolution" // v3.60.0 Fable 5, GPT-5.5, per-mode MCP allowlists, workspace rootResolution + public readonly latestAnnouncementId = "jun-2026-v3.62.0-glm52-opencodego-toolwriter" // v3.62.0 GLM-5.2, OpenCode-Go native model params & routing, tool-writer mode public readonly providerSettingsManager: ProviderSettingsManager public readonly customModesManager: CustomModesManager diff --git a/src/package.json b/src/package.json index 3b3484f287..88427f5b5a 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "ZooCodeOrganization", - "version": "3.60.0", + "version": "3.62.0", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index a2b3a9f418..4c55c98d0b 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -333,9 +333,9 @@ "support": "Dona suport a Zoo Code fent-nos una estrella a GitHub.", "release": { "heading": "Novetats:", - "highlight1": "Nous models d'IA — Claude Fable 5 a tots els proveïdors d'Anthropic i OpenAI GPT-5.5 ara estan disponibles a la configuració del proveïdor.", - "highlight2": "Llistes d'accés MCP per mode — restringeix quins servidors MCP estan actius per cada mode usant una nova llista d'accés a la configuració del mode.", - "highlight3": "Configuració rootResolution per a l'espai de treball — un nou ajust que controla com Zoo Code resol les rutes d'arxiu entre els arrels dels espais de treball multi-arrel." + "highlight1": "Suport per a GLM-5.2 — l'últim model GLM ja està disponible a la configuració del proveïdor.", + "highlight2": "Millores d'OpenCode-Go — paràmetres de model natius, encaminament en format Anthropic i correcció de context-token per a respostes més fiables.", + "highlight3": "Mode tool-writer — un nou mode especialitzat per escriure i mantenir definicions d'eines, ja disponible al Marketplace." }, "cloudAgents": { "heading": "Novetats al núvol:", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 7731ba023c..4e23c43ed3 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -333,9 +333,9 @@ "support": "Bitte unterstütze Zoo Code, indem du uns auf GitHub einen Stern gibst.", "release": { "heading": "Was ist neu:", - "highlight1": "Neue KI-Modelle — Claude Fable 5 für alle Anthropic-Anbieter und OpenAI GPT-5.5 sind jetzt in deinen Anbieter-Einstellungen verfügbar.", - "highlight2": "MCP-Allowlists pro Modus — schränke ein, welche MCP-Server pro Modus aktiv sind, mit einer neuen Allowlist in deiner Moduskonfiguration.", - "highlight3": "Workspace-Einstellung rootResolution — eine neue Einstellung, die steuert, wie Zoo Code Dateipfade über Wurzeln in Multi-Root-Workspaces auflöst." + "highlight1": "GLM-5.2-Unterstützung — das neueste GLM-Modell ist jetzt in deinen Anbieter-Einstellungen verfügbar.", + "highlight2": "OpenCode-Go-Verbesserungen — native Modellparameter, Anthropic-Format-Routing und ein Context-Token-Fix für zuverlässigere Antworten.", + "highlight3": "Tool-Writer-Modus — ein neuer spezieller Modus zum Schreiben und Pflegen von Tool-Definitionen, jetzt im Marketplace verfügbar." }, "cloudAgents": { "heading": "Neu in der Cloud:", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index c944e3d6e2..86b5c7af95 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -352,9 +352,9 @@ "support": "Please support Zoo Code by starring us on GitHub.", "release": { "heading": "What's New:", - "highlight1": "New AI models — Claude Fable 5 across all Anthropic providers and OpenAI GPT-5.5 are now available in your provider settings.", - "highlight2": "Per-mode MCP allowlists — restrict which MCP servers are active for each mode using a new allowlist in your mode configuration.", - "highlight3": "Workspace rootResolution — a new setting that controls how Zoo Code resolves file paths across roots in multi-root workspaces." + "highlight1": "GLM-5.2 support — the latest GLM model is now available in your provider settings.", + "highlight2": "OpenCode-Go improvements — native model parameters, Anthropic-format routing, and a context-token fix for more reliable responses.", + "highlight3": "Tool-writer mode — a new specialized mode for writing and maintaining tool definitions is now available in the Marketplace." }, "cloudAgents": { "heading": "New in the Cloud:", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 8c89e53860..354da5fd62 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -333,9 +333,9 @@ "support": "Apoya a Zoo Code dándonos una estrella en GitHub.", "release": { "heading": "Novedades:", - "highlight1": "Nuevos modelos de IA — Claude Fable 5 en todos los proveedores de Anthropic y OpenAI GPT-5.5 ya están disponibles en la configuración del proveedor.", - "highlight2": "Listas de permitidos de MCP por modo — restringe qué servidores MCP están activos por modo con una nueva lista de permitidos en la configuración del modo.", - "highlight3": "Ajuste rootResolution para el espacio de trabajo — un nuevo ajuste que controla cómo Zoo Code resuelve las rutas de archivos en espacios de trabajo multi-raíz." + "highlight1": "Soporte para GLM-5.2 — el último modelo GLM ya está disponible en la configuración del proveedor.", + "highlight2": "Mejoras de OpenCode-Go — parámetros de modelo nativos, enrutamiento en formato Anthropic y corrección de context-token para respuestas más fiables.", + "highlight3": "Modo tool-writer — un nuevo modo especializado para escribir y mantener definiciones de herramientas, ya disponible en el Marketplace." }, "cloudAgents": { "heading": "Novedades en la Nube:", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index be05943b63..52540c8ef5 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -333,9 +333,9 @@ "support": "Soutiens Zoo Code en nous donnant une étoile sur GitHub.", "release": { "heading": "Nouveautés :", - "highlight1": "Nouveaux modèles d'IA — Claude Fable 5 pour tous les fournisseurs Anthropic et OpenAI GPT-5.5 sont désormais disponibles dans les paramètres du fournisseur.", - "highlight2": "Listes d'autorisation MCP par mode — restreins les serveurs MCP actifs par mode grâce à une nouvelle liste d'autorisation dans la configuration du mode.", - "highlight3": "Paramètre rootResolution pour l'espace de travail — un nouveau réglage qui contrôle la résolution des chemins de fichiers dans les espaces de travail multi-racines." + "highlight1": "Prise en charge de GLM-5.2 — le dernier modèle GLM est désormais disponible dans les paramètres du fournisseur.", + "highlight2": "Améliorations d'OpenCode-Go — paramètres de modèle natifs, routage au format Anthropic et correction de context-token pour des réponses plus fiables.", + "highlight3": "Mode tool-writer — un nouveau mode spécialisé pour écrire et maintenir des définitions d'outils, désormais disponible sur le Marketplace." }, "cloudAgents": { "heading": "Nouveautés dans le Cloud :", diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 8fada4e51c..9445bf2b6a 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -333,9 +333,9 @@ "support": "कृपया GitHub पर हमें स्टार देकर Zoo Code का समर्थन करें।", "release": { "heading": "नया क्या है:", - "highlight1": "नए AI मॉडल — Claude Fable 5 सभी Anthropic providers पर और OpenAI GPT-5.5 अब आपके provider settings में उपलब्ध हैं।", - "highlight2": "प्रति-मोड MCP allowlists — mode configuration में नई allowlist का उपयोग करके प्रत्येक mode के लिए सक्रिय MCP servers को सीमित करें।", - "highlight3": "Workspace rootResolution सेटिंग — एक नई सेटिंग जो नियंत्रित करती है कि Zoo Code multi-root workspaces में फ़ाइल पथों को कैसे resolve करता है।" + "highlight1": "GLM-5.2 समर्थन — नवीनतम GLM मॉडल अब आपके provider settings में उपलब्ध है।", + "highlight2": "OpenCode-Go सुधार — native model parameters, Anthropic-format routing, और अधिक विश्वसनीय प्रतिक्रियाओं के लिए context-token fix।", + "highlight3": "Tool-writer mode — tool definitions को लिखने और बनाए रखने के लिए एक नया विशेष मोड, अब Marketplace में उपलब्ध है।" }, "cloudAgents": { "heading": "क्लाउड में नया:", diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index abff022395..766d682a88 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -362,9 +362,9 @@ "support": "Dukung Zoo Code dengan memberi kami bintang di GitHub.", "release": { "heading": "Yang Baru:", - "highlight1": "Model AI baru — Claude Fable 5 di semua penyedia Anthropic dan OpenAI GPT-5.5 kini tersedia di pengaturan penyedia kamu.", - "highlight2": "Allowlist MCP per mode — batasi server MCP mana yang aktif untuk setiap mode menggunakan allowlist baru di konfigurasi mode kamu.", - "highlight3": "Pengaturan rootResolution workspace — pengaturan baru yang mengontrol cara Zoo Code menyelesaikan path file di workspace multi-root." + "highlight1": "Dukungan GLM-5.2 — model GLM terbaru kini tersedia di pengaturan penyedia kamu.", + "highlight2": "Peningkatan OpenCode-Go — parameter model native, routing format Anthropic, dan perbaikan context-token untuk respons yang lebih andal.", + "highlight3": "Mode tool-writer — mode khusus baru untuk menulis dan memelihara definisi tool, kini tersedia di Marketplace." }, "cloudAgents": { "heading": "Baru di Cloud:", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 77d3a870bf..352537753e 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -333,9 +333,9 @@ "support": "Sostieni Zoo Code lasciandoci una stella su GitHub.", "release": { "heading": "Novità:", - "highlight1": "Nuovi modelli AI — Claude Fable 5 per tutti i provider Anthropic e OpenAI GPT-5.5 sono ora disponibili nelle impostazioni del provider.", - "highlight2": "Allowlist MCP per modalità — limita i server MCP attivi per ogni modalità usando una nuova allowlist nella configurazione della modalità.", - "highlight3": "Impostazione rootResolution per il workspace — una nuova impostazione che controlla come Zoo Code risolve i percorsi file nei workspace multi-root." + "highlight1": "Supporto GLM-5.2 — l'ultimo modello GLM è ora disponibile nelle impostazioni del provider.", + "highlight2": "Miglioramenti di OpenCode-Go — parametri del modello nativi, routing in formato Anthropic e correzione del context-token per risposte più affidabili.", + "highlight3": "Modalità tool-writer — una nuova modalità specializzata per scrivere e mantenere le definizioni degli strumenti, ora disponibile nel Marketplace." }, "cloudAgents": { "heading": "Novità nel Cloud:", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index ae01fb5aaa..ccecccb802 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -333,9 +333,9 @@ "support": "GitHubでスターを付けて Zoo Code を応援してください。", "release": { "heading": "新機能:", - "highlight1": "新しい AI モデル — すべての Anthropic プロバイダーで Claude Fable 5、OpenAI GPT-5.5 がプロバイダー設定で利用可能になりました。", - "highlight2": "モード別 MCP allowlist — モード設定の新しい allowlist を使用して、各モードで有効にする MCP サーバーを制限できます。", - "highlight3": "ワークスペース rootResolution 設定 — マルチルートワークスペースでのファイルパス解決方法を制御する新しい設定です。" + "highlight1": "GLM-5.2 サポート — 最新の GLM モデルがプロバイダー設定で利用可能になりました。", + "highlight2": "OpenCode-Go の改善 — ネイティブモデルパラメータ、Anthropic フォーマットルーティング、より信頼性の高い応答のための context-token 修正。", + "highlight3": "Tool-writer モード — ツール定義の作成と保守のための新しい専門モードが Marketplace で利用可能になりました。" }, "cloudAgents": { "heading": "クラウドの新機能:", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index c7a4132aae..4fd5fe0546 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -333,9 +333,9 @@ "support": "GitHub에서 별표를 눌러 Zoo Code를 응원해 주세요.", "release": { "heading": "새로운 기능:", - "highlight1": "새 AI 모델 — 모든 Anthropic 공급자에서 Claude Fable 5와 OpenAI GPT-5.5를 공급자 설정에서 이제 사용할 수 있습니다.", - "highlight2": "모드별 MCP allowlist — 모드 설정의 새 allowlist를 사용하여 각 모드에서 활성화할 MCP 서버를 제한하세요.", - "highlight3": "워크스페이스 rootResolution 설정 — 멀티 루트 워크스페이스에서 Zoo Code가 파일 경로를 해석하는 방식을 제어하는 새 설정입니다." + "highlight1": "GLM-5.2 지원 — 최신 GLM 모델이 이제 공급자 설정에서 사용 가능합니다.", + "highlight2": "OpenCode-Go 개선 — 네이티브 모델 매개변수, Anthropic 형식 라우팅, 더 안정적인 응답을 위한 context-token 수정.", + "highlight3": "Tool-writer 모드 — 도구 정의를 작성하고 유지 관리하는 새로운 전문 모드가 Marketplace에서 사용 가능합니다." }, "cloudAgents": { "heading": "클라우드의 새로운 기능:", diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 486c16f0d4..922889865b 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -306,9 +306,9 @@ "support": "Steun Zoo Code door ons een ster te geven op GitHub.", "release": { "heading": "Wat is nieuw:", - "highlight1": "Nieuwe AI-modellen — Claude Fable 5 voor alle Anthropic-providers en OpenAI GPT-5.5 zijn nu beschikbaar in je providerinstellingen.", - "highlight2": "MCP-allowlists per modus — beperk welke MCP-servers actief zijn per modus met een nieuwe allowlist in je modusconfiguratie.", - "highlight3": "Workspace rootResolution-instelling — een nieuwe instelling die bepaalt hoe Zoo Code bestandspaden oplost in multi-root-workspaces." + "highlight1": "GLM-5.2-ondersteuning — het nieuwste GLM-model is nu beschikbaar in je providerinstellingen.", + "highlight2": "OpenCode-Go-verbeteringen — native modelparameters, Anthropic-formaat routing en een context-token-fix voor betrouwbaardere antwoorden.", + "highlight3": "Tool-writer-modus — een nieuwe gespecialiseerde modus voor het schrijven en onderhouden van tool-definities, nu beschikbaar in de Marketplace." }, "cloudAgents": { "heading": "Nieuw in de Cloud:", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 9f79f3da96..3ae1765305 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -333,9 +333,9 @@ "support": "Wesprzyj Zoo Code, dając nam gwiazdkę na GitHub.", "release": { "heading": "Co nowego:", - "highlight1": "Nowe modele AI — Claude Fable 5 dla wszystkich dostawców Anthropic i OpenAI GPT-5.5 są teraz dostępne w ustawieniach dostawcy.", - "highlight2": "Allowlisty MCP per tryb — ogranicz, które serwery MCP są aktywne dla każdego trybu, używając nowej allowlisty w konfiguracji trybu.", - "highlight3": "Ustawienie rootResolution dla workspace — nowe ustawienie kontrolujące sposób rozwiązywania ścieżek plików w środowiskach wielokorzeniowych." + "highlight1": "Obsługa GLM-5.2 — najnowszy model GLM jest teraz dostępny w ustawieniach dostawcy.", + "highlight2": "Ulepszenia OpenCode-Go — natywne parametry modelu, routing w formacie Anthropic i poprawka context-token dla bardziej niezawodnych odpowiedzi.", + "highlight3": "Tryb tool-writer — nowy specjalistyczny tryb do pisania i utrzymania definicji narzędzi, teraz dostępny w Marketplace." }, "cloudAgents": { "heading": "Nowości w chmurze:", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index c49662f602..babda6f2fd 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -333,9 +333,9 @@ "support": "Apoie o Zoo Code nos dando uma estrela no GitHub.", "release": { "heading": "Novidades:", - "highlight1": "Novos modelos de IA — Claude Fable 5 em todos os provedores Anthropic e OpenAI GPT-5.5 já estão disponíveis nas configurações do provedor.", - "highlight2": "Allowlists de MCP por modo — restrinja quais servidores MCP ficam ativos por modo usando uma nova allowlist na configuração do modo.", - "highlight3": "Configuração rootResolution para workspace — uma nova configuração que controla como o Zoo Code resolve caminhos de arquivos em workspaces multi-root." + "highlight1": "Suporte a GLM-5.2 — o modelo GLM mais recente já está disponível nas configurações do provedor.", + "highlight2": "Melhorias no OpenCode-Go — parâmetros de modelo nativos, roteamento em formato Anthropic e correção de context-token para respostas mais confiáveis.", + "highlight3": "Modo tool-writer — um novo modo especializado para escrever e manter definições de ferramentas, agora disponível no Marketplace." }, "cloudAgents": { "heading": "Novidades na Nuvem:", diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 4108a027da..0eb46caa89 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -307,9 +307,9 @@ "support": "Поддержите Zoo Code, поставив нам звезду на GitHub.", "release": { "heading": "Что нового:", - "highlight1": "Новые модели ИИ — Claude Fable 5 для всех провайдеров Anthropic и OpenAI GPT-5.5 теперь доступны в настройках провайдера.", - "highlight2": "Allowlist MCP для каждого режима — ограничивай, какие MCP-серверы активны в каждом режиме, используя новый allowlist в настройках режима.", - "highlight3": "Настройка rootResolution для рабочего пространства — новая настройка, управляющая разрешением путей к файлам в мультикорневых рабочих пространствах." + "highlight1": "Поддержка GLM-5.2 — последняя модель GLM теперь доступна в настройках провайдера.", + "highlight2": "Улучшения OpenCode-Go — нативные параметры модели, маршрутизация в формате Anthropic и исправление context-token для более надёжных ответов.", + "highlight3": "Режим tool-writer — новый специализированный режим для написания и поддержки определений инструментов, теперь доступен в Marketplace." }, "cloudAgents": { "heading": "Новое в облаке:", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 83cbfb5a26..2f0e21388a 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -334,9 +334,9 @@ "support": "Lütfen GitHub'da bize yıldız vererek Zoo Code'u destekle.", "release": { "heading": "Yenilikler:", - "highlight1": "Yeni yapay zeka modelleri — Tüm Anthropic sağlayıcılarında Claude Fable 5 ve OpenAI GPT-5.5 artık sağlayıcı ayarlarında mevcut.", - "highlight2": "Mod başına MCP allowlist'leri — Mod yapılandırmasındaki yeni allowlist ile her mod için hangi MCP sunucularının aktif olacağını kısıtla.", - "highlight3": "Çalışma alanı rootResolution ayarı — Zoo Code'un çok köklü çalışma alanlarında dosya yollarını nasıl çözdüğünü kontrol eden yeni bir ayar." + "highlight1": "GLM-5.2 desteği — en yeni GLM modeli artık sağlayıcı ayarlarında mevcut.", + "highlight2": "OpenCode-Go iyileştirmeleri — yerel model parametreleri, Anthropic formatı yönlendirme ve daha güvenilir yanıtlar için context-token düzeltmesi.", + "highlight3": "Tool-writer modu — araç tanımlarını yazmak ve sürdürmek için yeni bir uzmanlaşmış mod, artık Marketplace'te mevcut." }, "cloudAgents": { "heading": "Cloud'daki yenilikler:", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 52113d8cda..a56377730c 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -334,9 +334,9 @@ "support": "Hãy ủng hộ Zoo Code bằng cách tặng sao cho chúng tôi trên GitHub.", "release": { "heading": "Có gì mới:", - "highlight1": "Các mô hình AI mới — Claude Fable 5 trên tất cả nhà cung cấp Anthropic và OpenAI GPT-5.5 hiện có trong cài đặt nhà cung cấp của bạn.", - "highlight2": "Allowlist MCP theo chế độ — hạn chế máy chủ MCP nào được kích hoạt cho mỗi chế độ bằng allowlist mới trong cấu hình chế độ.", - "highlight3": "Cài đặt rootResolution cho không gian làm việc — cài đặt mới kiểm soát cách Zoo Code phân giải đường dẫn tệp trong không gian làm việc nhiều gốc." + "highlight1": "Hỗ trợ GLM-5.2 — mô hình GLM mới nhất hiện có trong cài đặt nhà cung cấp của bạn.", + "highlight2": "Cải tiến OpenCode-Go — tham số mô hình gốc, định tuyến định dạng Anthropic và sửa lỗi context-token để phản hồi đáng tin cậy hơn.", + "highlight3": "Chế độ tool-writer — chế độ chuyên biệt mới để viết và duy trì các định nghĩa công cụ, hiện có trên Marketplace." }, "cloudAgents": { "heading": "Mới trên Cloud:", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 528ad14959..28465d0a7a 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -334,9 +334,9 @@ "support": "请在 GitHub 上为 Zoo Code 点星支持我们。", "release": { "heading": "新增功能:", - "highlight1": "新 AI 模型 — Claude Fable 5(适用于所有 Anthropic 提供商)和 OpenAI GPT-5.5 现已在提供商设置中可用。", - "highlight2": "按模式的 MCP 允许列表 — 在模式配置中使用新的允许列表,限制每个模式下哪些 MCP 服务器处于活动状态。", - "highlight3": "工作区 rootResolution 设置 — 一项新设置,用于控制 Zoo Code 在多根工作区中解析文件路径的方式。" + "highlight1": "GLM-5.2 支持 — 最新 GLM 模型现已在提供商设置中可用。", + "highlight2": "OpenCode-Go 改进 — 原生模型参数、Anthropic 格式路由和 context-token 修复,提供更可靠的响应。", + "highlight3": "Tool-writer 模式 — 用于编写和维护工具定义的新专用模式,现已在 Marketplace 中可用。" }, "cloudAgents": { "heading": "云端新功能:", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 23c5a39194..dab783e4bc 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -355,9 +355,9 @@ "support": "請在 GitHub 上為 Zoo Code 加星支持我們。", "release": { "heading": "新增功能:", - "highlight1": "新 AI 模型 — Claude Fable 5(適用於所有 Anthropic 提供商)和 OpenAI GPT-5.5 現已在提供商設定中可用。", - "highlight2": "按模式的 MCP 允許清單 — 在模式設定中使用新的允許清單,限制每個模式下哪些 MCP 伺服器處於活動狀態。", - "highlight3": "工作區 rootResolution 設定 — 一項新設定,用於控制 Zoo Code 在多根工作區中解析檔案路徑的方式。" + "highlight1": "GLM-5.2 支援 — 最新 GLM 模型現已在提供商設定中可用。", + "highlight2": "OpenCode-Go 改進 — 原生模型參數、Anthropic 格式路由和 context-token 修復,提供更可靠的回應。", + "highlight3": "Tool-writer 模式 — 用於編寫和維護工具定義的新專用模式,現已在 Marketplace 中可用。" }, "cloudAgents": { "heading": "雲端的新功能:", From f798462f458e1291c0b7480193d339cc2a29d932 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 18:53:28 +0000 Subject: [PATCH 02/64] chore(deps): update dependency undici to v6.27.0 [security] (#659) * chore(deps): update dependency undici to v6.27.0 [security] * deps(undici): pinning to version --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Elliott de Launay --- package.json | 2 +- pnpm-lock.yaml | 63 +++++- .../ClineProvider.flicker-free-cancel.spec.ts | 190 +++++++++++++++++- 3 files changed, 236 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 18db64c5fa..7247572ffc 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "esbuild": "0.28.1", "rollup": "4.60.4", "vite": "8.0.16", - "undici": ">=5.29.0", + "undici": "6.27.0", "form-data": ">=4.0.4", "bluebird": ">=3.7.2", "glob": "11.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4caf0e862a..92a7b186a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ overrides: esbuild: 0.28.1 rollup: 4.60.4 vite: 8.0.16 - undici: '>=5.29.0' + undici: 6.27.0 form-data: '>=4.0.4' bluebird: '>=3.7.2' glob: 11.1.0 @@ -640,8 +640,8 @@ importers: specifier: ^0.1.12 version: 0.1.12 undici: - specifier: '>=5.29.0' - version: 6.24.0 + specifier: 6.27.0 + version: 6.27.0 uuid: specifier: ^11.1.0 version: 11.1.1 @@ -1502,24 +1502,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@basetenlabs/performance-client-linux-riscv64-gnu@0.0.10': resolution: {integrity: sha512-2KUvdK4wuoZdIqNnJhx7cu6ybXCwtiwGAtlrEvhai3FOkUQ3wE2Xa+TQ33mNGSyFbw6wAvLawYtKVFmmw27gJw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@basetenlabs/performance-client-linux-x64-gnu@0.0.10': resolution: {integrity: sha512-9jjQPjHLiVOGwUPlmhnBl7OmmO7hQ8WMt+v3mJuxkS5JTNDmVOngfmgGlbN9NjBhQMENjdcMUVOquVo7HeybGQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@basetenlabs/performance-client-linux-x64-musl@0.0.10': resolution: {integrity: sha512-bjYB8FKcPvEa251Ep2Gm3tvywADL9eavVjZsikdf0AvJ1K5pT+vLLvJBU9ihBsTPWnbF4pJgxVjwS6UjVObsQA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@basetenlabs/performance-client-win32-arm64-msvc@0.0.10': resolution: {integrity: sha512-Vxq5UXEmfh3C3hpwXdp3Daaf0dnLR9zFH2x8MJ1Hf/TcilmOP1clneewNpIv0e7MrnT56Z4pM6P3d8VFMZqBKg==} @@ -2124,24 +2128,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@node-rs/crc32-linux-arm64-musl@1.10.6': resolution: {integrity: sha512-k8ra/bmg0hwRrIEE8JL1p32WfaN9gDlUUpQRWsbxd1WhjqvXea7kKO6K4DwVxyxlPhBS9Gkb5Urq7Y4mXANzaw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@node-rs/crc32-linux-x64-gnu@1.10.6': resolution: {integrity: sha512-IfjtqcuFK7JrSZ9mlAFhb83xgium30PguvRjIMI45C3FJwu18bnLk1oR619IYb/zetQT82MObgmqfKOtgemEKw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@node-rs/crc32-linux-x64-musl@1.10.6': resolution: {integrity: sha512-LbFYsA5M9pNunOweSt6uhxenYQF94v3bHDAQRPTQ3rnjn+mK6IC7YTAYoBjvoJP8lVzcvk9hRj8wp4Jyh6Y80g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@node-rs/crc32-wasm32-wasi@1.10.6': resolution: {integrity: sha512-KaejdLgHMPsRaxnM+OG9L9XdWL2TabNx80HLdsCOoX9BVhEkfh39OeahBo8lBmidylKbLGMQoGfIKDjq0YMStw==} @@ -2222,31 +2230,37 @@ packages: resolution: {integrity: sha512-BhEzNLjn4HjP8+Q18D3/jeIDBxW7OgoJYIjw2CaaysnYneoTlij8hPTKxHfyqq4IGM3fFs9TLR/k338M3zkQ7g==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-arm64-musl@11.2.0': resolution: {integrity: sha512-yxbMYUgRmN2V8x8XoxmD/Qq6aG7YIW3ToMDILfmcfeeRRVieEJ3DOWBT0JSE+YgrOy79OyFDH/1lO8VnqLmDQQ==} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-resolver/binding-linux-riscv64-gnu@11.2.0': resolution: {integrity: sha512-QG1UfgC2N2qhW1tOnDCgB/26vn1RCshR5sYPhMeaxO1gMQ3kEKbZ3QyBXxrG1IX5qsXYj5hPDJLDYNYUjRcOpg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-s390x-gnu@11.2.0': resolution: {integrity: sha512-uqTDsQdi6mrkSV1gvwbuT8jf/WFl6qVDVjNlx7IPSaAByrNiJfPrhTmH8b+Do58Dylz7QIRZgxQ8CHIZSyBUdg==} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-x64-gnu@11.2.0': resolution: {integrity: sha512-GZdHXhJ7p6GaQg9MjRqLebwBf8BLvGIagccI6z5yMj4fV3LU4QuDfwSEERG+R6oQ/Su9672MBqWwncvKcKT68w==} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-x64-musl@11.2.0': resolution: {integrity: sha512-YBAC3GOicYznReG2twE7oFPSeK9Z1f507z1EYWKg6HpGYRYRlJyszViu7PrhMT85r/MumDTs429zm+CNqpFWOA==} cpu: [x64] os: [linux] + libc: [musl] '@oxc-resolver/binding-wasm32-wasi@11.2.0': resolution: {integrity: sha512-+qlIg45CPVPy+Jn3vqU1zkxA/AAv6e/2Ax/ImX8usZa8Tr2JmQn/93bmSOOOnr9fXRV9d0n4JyqYzSWxWPYDEw==} @@ -2814,36 +2828,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.3': resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.3': resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.3': resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.3': resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.3': resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.3': resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} @@ -2908,66 +2928,79 @@ packages: resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.4': resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.4': resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.4': resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.4': resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.4': resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.4': resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.4': resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.4': resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.4': resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.4': resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.4': resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.4': resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.4': resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} @@ -3284,24 +3317,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.6': resolution: {integrity: sha512-8kjivE5xW0qAQ9HX9reVFmZj3t+VmljDLVRJpVBEoTR+3bKMnvC7iLcoSGNIUJGOZy1mLVq7x/gerVg0T+IsYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.6': resolution: {integrity: sha512-A4spQhwnWVpjWDLXnOW9PSinO2PTKJQNRmL/aIl2U/O+RARls8doDfs6R41+DAXK0ccacvRyDpR46aVQJJCoCg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.6': resolution: {integrity: sha512-YRee+6ZqdzgiQAHVSLfl3RYmqeeaWVCk796MhXhLQu2kJu2COHBkqlqsqKYx3p8Hmk5pGCQd2jTAoMWWFeyG2A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.6': resolution: {integrity: sha512-qAp4ooTYrBQ5pk5jgg54/U1rCJ/9FLYOkkQ/nTE+bVMseMfB6O7J8zb19YTpWuu4UdfRf5zzOrNKfl6T64MNrQ==} @@ -6393,48 +6430,56 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-gnu@1.32.0: resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.29.2: resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.29.2: resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.29.2: resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.29.2: resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} @@ -8583,8 +8628,8 @@ packages: undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - undici@6.24.0: - resolution: {integrity: sha512-lVLNosgqo5EkGqh5XUDhGfsMSoO8K0BAN0TyJLvwNRSl4xWGZlCVYsAIpa/OpA3TvmnM01GWcoKmc3ZWo5wKKA==} + undici@6.27.0: + resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} engines: {node: '>=18.17'} unicorn-magic@0.3.0: @@ -10878,7 +10923,7 @@ snapshots: '@qdrant/openapi-typescript-fetch': 1.2.6 '@sevinf/maybe': 0.5.0 typescript: 5.8.3 - undici: 6.24.0 + undici: 6.27.0 '@qdrant/openapi-typescript-fetch@1.2.6': {} @@ -12503,7 +12548,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@vitest/utils@4.1.0': dependencies: @@ -13109,7 +13154,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 6.24.0 + undici: 6.27.0 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -18104,7 +18149,7 @@ snapshots: undici-types@7.10.0: {} - undici@6.24.0: {} + undici@6.27.0: {} unicorn-magic@0.3.0: {} diff --git a/src/core/webview/__tests__/ClineProvider.flicker-free-cancel.spec.ts b/src/core/webview/__tests__/ClineProvider.flicker-free-cancel.spec.ts index 2710136978..7d8cf11706 100644 --- a/src/core/webview/__tests__/ClineProvider.flicker-free-cancel.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.flicker-free-cancel.spec.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest" +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" import * as vscode from "vscode" import { ClineProvider } from "../ClineProvider" @@ -44,20 +44,35 @@ vi.mock("vscode", () => { } }) -vi.mock("../../task/Task") -vi.mock("../../config/ContextProxy") +vi.mock("../../task/Task", () => ({ + Task: vi.fn().mockImplementation(function () { + return { + taskId: "mock-task-id", + instanceId: "mock-instance-id", + abortTask: vi.fn(), + emit: vi.fn(), + on: vi.fn(), + off: vi.fn(), + } + }), +})) vi.mock("../../../services/mcp/McpServerManager", () => ({ McpServerManager: { getInstance: vi.fn().mockResolvedValue({ registerClient: vi.fn(), + unregisterClient: vi.fn(), }), unregisterProvider: vi.fn(), }, })) -vi.mock("../../../services/marketplace") -vi.mock("../../../integrations/workspace/WorkspaceTracker") -vi.mock("../../config/ProviderSettingsManager") -vi.mock("../../config/CustomModesManager") +vi.mock("../../../integrations/workspace/WorkspaceTracker", () => ({ + default: vi.fn().mockImplementation(function () { + return { + initializeFilePaths: vi.fn(), + dispose: vi.fn(), + } + }), +})) vi.mock("../../../utils/path", () => ({ getWorkspacePath: vi.fn().mockReturnValue("/test/workspace"), })) @@ -87,6 +102,155 @@ vi.mock("../../../shared/embeddingModels", () => ({ EMBEDDING_MODEL_PROFILES: [], })) +vi.mock("../../../shared/modes", () => ({ + modes: [{ slug: "code", name: "Code Mode", roleDefinition: "You are a code assistant", groups: ["read", "edit"] }], + getModeBySlug: vi.fn().mockReturnValue({ + slug: "code", + name: "Code Mode", + roleDefinition: "You are a code assistant", + groups: ["read", "edit"], + }), + getGroupName: vi.fn().mockReturnValue("General Tools"), + defaultModeSlug: "code", +})) + +vi.mock("p-wait-for", () => ({ + __esModule: true, + default: vi.fn().mockResolvedValue(undefined), +})) + +vi.mock("fs/promises", () => ({ + mkdir: vi.fn().mockResolvedValue(undefined), + writeFile: vi.fn().mockResolvedValue(undefined), + readFile: vi.fn().mockResolvedValue(""), + readdir: vi.fn().mockResolvedValue([]), + unlink: vi.fn().mockResolvedValue(undefined), + rmdir: vi.fn().mockResolvedValue(undefined), + access: vi.fn().mockResolvedValue(undefined), + rm: vi.fn().mockResolvedValue(undefined), +})) + +vi.mock("axios", () => ({ + default: { get: vi.fn().mockResolvedValue({ data: { data: [] } }), post: vi.fn() }, + get: vi.fn().mockResolvedValue({ data: { data: [] } }), + post: vi.fn(), +})) + +vi.mock("delay", () => { + const delayFn = (_ms: number) => Promise.resolve() + delayFn.createDelay = () => delayFn + delayFn.reject = () => Promise.reject(new Error("Delay rejected")) + delayFn.range = () => Promise.resolve() + return { default: delayFn } +}) + +vi.mock("../../../utils/storage", () => ({ + getSettingsDirectoryPath: vi.fn().mockResolvedValue("/test/settings/path"), + getTaskDirectoryPath: vi.fn().mockResolvedValue("/test/task/path"), + getGlobalStoragePath: vi.fn().mockResolvedValue("/test/storage/path"), + getStorageBasePath: vi.fn().mockImplementation((defaultPath: string) => defaultPath), +})) + +vi.mock("../../../utils/safeWriteJson", () => ({ + safeWriteJson: vi.fn().mockResolvedValue(undefined), +})) + +vi.mock("../../../utils/tts", () => ({ + setTtsEnabled: vi.fn(), + setTtsSpeed: vi.fn(), +})) + +vi.mock("../../../api", () => ({ + buildApiHandler: vi.fn().mockReturnValue({ + getModel: vi.fn().mockReturnValue({ id: "claude-3-sonnet" }), + }), +})) + +vi.mock("../../prompts/system", () => ({ + SYSTEM_PROMPT: vi.fn().mockImplementation(async () => "mocked system prompt"), + codeMode: "code", +})) + +vi.mock("../../prompts/sections/custom-instructions") + +vi.mock("../../../api/providers/fetchers/modelCache", () => ({ + getModels: vi.fn().mockResolvedValue({}), + flushModels: vi.fn(), + getModelsFromCache: vi.fn().mockReturnValue(undefined), +})) + +vi.mock("../../../integrations/misc/extract-text", () => ({ + extractTextFromFile: vi.fn().mockResolvedValue("file content"), +})) + +vi.mock("../diff/strategies/multi-search-replace", () => ({ + MultiSearchReplaceDiffStrategy: vi.fn().mockImplementation(function () { + return { getName: () => "test-strategy", applyDiff: vi.fn() } + }), +})) + +vi.mock("@modelcontextprotocol/sdk/types.js", () => ({ + CallToolResultSchema: {}, + ListResourcesResultSchema: {}, + ListResourceTemplatesResultSchema: {}, + ListToolsResultSchema: {}, + ReadResourceResultSchema: {}, + ErrorCode: { InvalidRequest: "InvalidRequest", MethodNotFound: "MethodNotFound", InternalError: "InternalError" }, + McpError: class McpError extends Error { + code: string + constructor(code: string, message: string) { + super(message) + this.code = code + this.name = "McpError" + } + }, +})) + +vi.mock("@modelcontextprotocol/sdk/client/index.js", () => ({ + Client: vi.fn().mockImplementation(function () { + return { + connect: vi.fn().mockResolvedValue(undefined), + close: vi.fn().mockResolvedValue(undefined), + listTools: vi.fn().mockResolvedValue({ tools: [] }), + callTool: vi.fn().mockResolvedValue({ content: [] }), + } + }), +})) + +vi.mock("@modelcontextprotocol/sdk/client/stdio.js", () => ({ + StdioClientTransport: vi.fn().mockImplementation(function () { + return { connect: vi.fn().mockResolvedValue(undefined), close: vi.fn().mockResolvedValue(undefined) } + }), +})) + +vi.mock("../../../services/skills/SkillsManager", () => ({ + SkillsManager: vi.fn().mockImplementation(function () { + return { + initialize: vi.fn().mockResolvedValue(undefined), + dispose: vi.fn().mockResolvedValue(undefined), + } + }), +})) + +vi.mock("../../task-persistence", () => ({ + TaskHistoryStore: vi.fn().mockImplementation(function () { + return { + initialize: vi.fn().mockResolvedValue(undefined), + dispose: vi.fn(), + initialized: Promise.resolve(), + get: vi.fn().mockReturnValue(undefined), + getAll: vi.fn().mockReturnValue([]), + upsert: vi.fn().mockResolvedValue([]), + delete: vi.fn().mockResolvedValue(undefined), + deleteMany: vi.fn().mockResolvedValue(undefined), + migrateFromGlobalState: vi.fn().mockResolvedValue(undefined), + } + }), + readApiMessages: vi.fn().mockResolvedValue([]), + saveApiMessages: vi.fn().mockResolvedValue(undefined), + saveTaskMessages: vi.fn().mockResolvedValue(undefined), +})) + describe("ClineProvider flicker-free cancel", () => { let provider: ClineProvider let mockContext: any @@ -195,6 +359,10 @@ describe("ClineProvider flicker-free cancel", () => { }) }) + afterEach(async () => { + await provider.dispose() + }) + it("should not remove current task from stack when rehydrating same taskId", async () => { // Setup: Add a task to the stack first ;(provider as any).clineStack = [mockTask1] @@ -242,7 +410,9 @@ describe("ClineProvider flicker-free cancel", () => { ;(provider as any).clineStack = [mockTask1] // Spy on removeClineFromStack to verify it IS called - const removeClineFromStackSpy = vi.spyOn(provider, "removeClineFromStack").mockResolvedValue(undefined) + const removeClineFromStackSpy = vi.spyOn(provider, "removeClineFromStack").mockImplementation(async () => { + ;(provider as any).clineStack.pop() + }) // Create history item with different taskId const historyItem: HistoryItem = { @@ -268,7 +438,9 @@ describe("ClineProvider flicker-free cancel", () => { ;(provider as any).clineStack = [] // Spy on removeClineFromStack - const removeClineFromStackSpy = vi.spyOn(provider, "removeClineFromStack").mockResolvedValue(undefined) + const removeClineFromStackSpy = vi.spyOn(provider, "removeClineFromStack").mockImplementation(async () => { + ;(provider as any).clineStack.pop() + }) // Create history item const historyItem: HistoryItem = { From 35356b1b57d4ac4503efa61d294a29050710929d Mon Sep 17 00:00:00 2001 From: edelauna <54631123+edelauna@users.noreply.github.com> Date: Sat, 20 Jun 2026 14:54:54 -0400 Subject: [PATCH 03/64] fix(McpHub): resolve persistently flaky McpHub.spec.ts tests after Vitest 4 upgrade (#666) * fix(McpHup): mocking fs library * test(McpHub): addressing flakey promises --- src/services/mcp/__tests__/McpHub.spec.ts | 152 +++++++++------------- 1 file changed, 64 insertions(+), 88 deletions(-) diff --git a/src/services/mcp/__tests__/McpHub.spec.ts b/src/services/mcp/__tests__/McpHub.spec.ts index 02c0d2ec7e..5107ab8f71 100644 --- a/src/services/mcp/__tests__/McpHub.spec.ts +++ b/src/services/mcp/__tests__/McpHub.spec.ts @@ -1,4 +1,4 @@ -import fs from "fs/promises" +import * as fs from "fs/promises" import type { Mock } from "vitest" import type { ExtensionContext, Uri } from "vscode" @@ -10,33 +10,20 @@ import { ServerConfigSchema, McpHub } from "../McpHub" import { OAUTH_FLOW_TIMEOUT_MS } from "../constants" import { t } from "../../../i18n" -// Mock fs/promises before importing anything that uses it -vi.mock("fs/promises", () => ({ - default: { - access: vi.fn().mockResolvedValue(undefined), - writeFile: vi.fn().mockResolvedValue(undefined), - readFile: vi.fn().mockResolvedValue("{}"), - unlink: vi.fn().mockResolvedValue(undefined), - rename: vi.fn().mockResolvedValue(undefined), - lstat: vi.fn().mockImplementation(() => { - return Promise.resolve({ - isDirectory: () => true, - }) - }), - mkdir: vi.fn().mockResolvedValue(undefined), - }, - access: vi.fn().mockResolvedValue(undefined), - writeFile: vi.fn().mockResolvedValue(undefined), - readFile: vi.fn().mockResolvedValue("{}"), - unlink: vi.fn().mockResolvedValue(undefined), - rename: vi.fn().mockResolvedValue(undefined), - lstat: vi.fn().mockImplementation(() => { - return Promise.resolve({ - isDirectory: () => true, - }) - }), - mkdir: vi.fn().mockResolvedValue(undefined), -})) +// Mock fs/promises before importing anything that uses it. +// Named exports and the default export must share the same vi.fn() instances so that +// `import * as fs` (used by McpHub.ts) and `import fs` (default) both see the same mocks. +vi.mock("fs/promises", () => { + const access = vi.fn().mockResolvedValue(undefined) + const writeFile = vi.fn().mockResolvedValue(undefined) + const readFile = vi.fn().mockResolvedValue("{}") + const unlink = vi.fn().mockResolvedValue(undefined) + const rename = vi.fn().mockResolvedValue(undefined) + const lstat = vi.fn().mockImplementation(() => Promise.resolve({ isDirectory: () => true })) + const mkdir = vi.fn().mockResolvedValue(undefined) + const shared = { access, writeFile, readFile, unlink, rename, lstat, mkdir } + return { default: shared, ...shared } +}) // Import safeWriteJson to use in mocks import { safeWriteJson } from "../../../utils/safeWriteJson" @@ -93,7 +80,6 @@ vi.mock("vscode", () => ({ from: vi.fn(), }, })) -vi.mock("fs/promises") vi.mock("../../../core/webview/ClineProvider") // Mock the MCP SDK modules @@ -124,7 +110,7 @@ describe("McpHub", () => { const originalConsoleError = console.error const originalPlatform = Object.getOwnPropertyDescriptor(process, "platform") - beforeEach(() => { + beforeEach(async () => { vi.clearAllMocks() // Mock console.error to suppress error messages during tests @@ -194,6 +180,7 @@ describe("McpHub", () => { ) mcpHub = new McpHub(mockProvider as ClineProvider) + await mcpHub.waitUntilReady() }) afterEach(() => { @@ -426,7 +413,7 @@ describe("McpHub", () => { ) const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Verify watcher was created expect(chokidar.watch).toHaveBeenCalledWith(["/path/to/watch"], expect.any(Object)) @@ -503,7 +490,7 @@ describe("McpHub", () => { ) const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Verify watchers were created expect(chokidar.watch).toHaveBeenCalled() @@ -537,7 +524,7 @@ describe("McpHub", () => { vi.mocked(chokidar.watch).mockClear() const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Verify no watcher was created for disabled server expect(chokidar.watch).not.toHaveBeenCalled() @@ -561,7 +548,7 @@ describe("McpHub", () => { ) const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Find the connection const connection = mcpHub.connections.find((conn) => conn.server.name === "mcp-disabled-server") @@ -587,7 +574,7 @@ describe("McpHub", () => { ) const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Find the connection const connection = mcpHub.connections.find((conn) => conn.server.name === "server-disabled-server") @@ -614,7 +601,7 @@ describe("McpHub", () => { ) const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Find the connection const connection = mcpHub.connections.find((conn) => conn.server.name === "both-reasons-server") @@ -645,7 +632,7 @@ describe("McpHub", () => { const mcpHub = new McpHub(mockProvider as ClineProvider) // Wait for initialization - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // The server should be created as a disconnected connection with null client/transport const connection = mcpHub.connections.find((conn) => conn.server.name === "null-safety-server") @@ -715,7 +702,7 @@ describe("McpHub", () => { ) const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Get the connection const connection = mcpHub.connections.find((conn) => conn.server.name === "type-check-server") @@ -733,7 +720,7 @@ describe("McpHub", () => { it("should handle missing connections safely", async () => { const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Try operations on non-existent server await expect(mcpHub.callTool("non-existent-server", "test-tool", {})).rejects.toThrow( @@ -791,7 +778,7 @@ describe("McpHub", () => { ) const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Delete the connection await mcpHub.deleteConnection("delete-safety-server") @@ -1414,7 +1401,7 @@ describe("McpHub", () => { const mcpHub = new McpHub(mockProvider as ClineProvider) // Wait for initialization - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // The server should be created as a disconnected connection const connection = mcpHub.connections.find((conn) => conn.server.name === "disabled-server") @@ -1445,7 +1432,7 @@ describe("McpHub", () => { const mcpHub = new McpHub(mockProvider as ClineProvider) // Wait for initialization - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // The server should be created as a disconnected connection const connection = mcpHub.connections.find((conn) => conn.server.name === "disabled-server") @@ -1831,7 +1818,7 @@ describe("McpHub", () => { // Create McpHub and let it initialize with MCP enabled const mcpHub = new McpHub(mockProvider as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Verify server is connected const connectedServer = mcpHub.connections.find((conn) => conn.server.name === "toggle-test-server") @@ -1889,7 +1876,7 @@ describe("McpHub", () => { const mcpHub = new McpHub(disabledMockProvider as unknown as ClineProvider) // Wait for initialization - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Find the disabled-test-server const disabledServer = mcpHub.connections.find((conn) => conn.server.name === "disabled-test-server") @@ -1961,7 +1948,7 @@ describe("McpHub", () => { const mcpHub = new McpHub(enabledMockProvider as unknown as ClineProvider) // Wait for initialization - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Find the enabled-test-server const enabledServer = mcpHub.connections.find((conn) => conn.server.name === "enabled-test-server") @@ -2000,7 +1987,7 @@ describe("McpHub", () => { // Create McpHub with disabled MCP const mcpHub = new McpHub(disabledMockProvider as unknown as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Clear previous calls vi.clearAllMocks() @@ -2047,7 +2034,7 @@ describe("McpHub", () => { // Create McpHub with disabled MCP const mcpHub = new McpHub(disabledMockProvider as unknown as ClineProvider) - await new Promise((resolve) => setTimeout(resolve, 100)) + await mcpHub.waitUntilReady() // Set isConnecting to false to ensure it's properly reset mcpHub.isConnecting = false @@ -2125,10 +2112,7 @@ describe("McpHub", () => { } }) - // Create a new McpHub instance - const mcpHub = new McpHub(mockProvider as ClineProvider) - - // Mock the config file read + // Mock the config file read BEFORE creating McpHub vi.mocked(fs.readFile).mockResolvedValue( JSON.stringify({ mcpServers: { @@ -2140,8 +2124,9 @@ describe("McpHub", () => { }), ) - // Initialize servers (this will trigger connectToServer) - await mcpHub["initializeGlobalMcpServers"]() + // Create a new McpHub instance and wait for initialization + const mcpHub = new McpHub(mockProvider as ClineProvider) + await mcpHub.waitUntilReady() // Verify StdioClientTransport was called with wrapped command expect(StdioClientTransport).toHaveBeenCalledWith( @@ -2189,10 +2174,7 @@ describe("McpHub", () => { } }) - // Create a new McpHub instance - const mcpHub = new McpHub(mockProvider as ClineProvider) - - // Mock the config file read + // Mock the config file read BEFORE creating McpHub vi.mocked(fs.readFile).mockResolvedValue( JSON.stringify({ mcpServers: { @@ -2204,8 +2186,9 @@ describe("McpHub", () => { }), ) - // Initialize servers (this will trigger connectToServer) - await mcpHub["initializeGlobalMcpServers"]() + // Create a new McpHub instance and wait for initialization + const mcpHub = new McpHub(mockProvider as ClineProvider) + await mcpHub.waitUntilReady() // Verify StdioClientTransport was called without wrapping expect(StdioClientTransport).toHaveBeenCalledWith( @@ -2253,10 +2236,7 @@ describe("McpHub", () => { } }) - // Create a new McpHub instance - const mcpHub = new McpHub(mockProvider as ClineProvider) - - // Mock the config file read with cmd.exe already as command + // Mock the config file read BEFORE creating McpHub vi.mocked(fs.readFile).mockResolvedValue( JSON.stringify({ mcpServers: { @@ -2268,8 +2248,9 @@ describe("McpHub", () => { }), ) - // Initialize servers (this will trigger connectToServer) - await mcpHub["initializeGlobalMcpServers"]() + // Create a new McpHub instance and wait for initialization + const mcpHub = new McpHub(mockProvider as ClineProvider) + await mcpHub.waitUntilReady() // Verify StdioClientTransport was called without double-wrapping expect(StdioClientTransport).toHaveBeenCalledWith( @@ -2324,10 +2305,7 @@ describe("McpHub", () => { } }) - // Create a new McpHub instance - const mcpHub = new McpHub(mockProvider as ClineProvider) - - // Mock the config file read - simulating fnm/nvm-windows scenario + // Mock the config file read BEFORE creating McpHub - simulating fnm/nvm-windows scenario vi.mocked(fs.readFile).mockResolvedValue( JSON.stringify({ mcpServers: { @@ -2345,8 +2323,9 @@ describe("McpHub", () => { }), ) - // Initialize servers (this will trigger connectToServer) - await mcpHub["initializeGlobalMcpServers"]() + // Create a new McpHub instance and wait for initialization + const mcpHub = new McpHub(mockProvider as ClineProvider) + await mcpHub.waitUntilReady() // Verify that the command was wrapped with cmd.exe expect(StdioClientTransport).toHaveBeenCalledWith( @@ -2399,10 +2378,7 @@ describe("McpHub", () => { } }) - // Create a new McpHub instance - const mcpHub = new McpHub(mockProvider as ClineProvider) - - // Mock the config file read with CMD (uppercase) as command + // Mock the config file read BEFORE creating McpHub vi.mocked(fs.readFile).mockResolvedValue( JSON.stringify({ mcpServers: { @@ -2414,8 +2390,9 @@ describe("McpHub", () => { }), ) - // Initialize servers (this will trigger connectToServer) - await mcpHub["initializeGlobalMcpServers"]() + // Create a new McpHub instance and wait for initialization + const mcpHub = new McpHub(mockProvider as ClineProvider) + await mcpHub.waitUntilReady() // Verify StdioClientTransport was called without double-wrapping expect(StdioClientTransport).toHaveBeenCalledWith( @@ -2462,7 +2439,7 @@ describe("McpHub", () => { mockSecretStorage = { getOAuthData: vi.fn().mockResolvedValue(null), - onDidChange: vi.fn().mockReturnValue(vi.fn()), + onDidChange: vi.fn().mockImplementation(() => vi.fn()), } ;(mcpHub as any).secretStorage = mockSecretStorage @@ -2608,11 +2585,9 @@ describe("McpHub", () => { mockConnection, ) - // _initiateOAuthFlow awaits getOAuthData() before calling withProgress. - // Two ticks: tick 1 resolves getOAuthData, tick 2 runs the continuation - // that calls withProgress, setting capturedCancellationToken. - await Promise.resolve() - await Promise.resolve() + // Wait for withProgress to be invoked: getOAuthData must resolve first, + // then the continuation calls withProgress synchronously, setting capturedCancellationToken. + await vi.waitFor(() => expect(capturedCancellationToken).toBeDefined()) capturedCancellationToken._fire() await flowPromise @@ -2940,9 +2915,9 @@ describe("McpHub", () => { mockConnection, ) - // Two ticks: getOAuthData resolves, then withProgress registers the watcher - await Promise.resolve() - await Promise.resolve() + // Flush microtasks: getOAuthData resolves, then withProgress fires synchronously + // (registering the watcher) — no tick-counting needed. + await vi.advanceTimersByTimeAsync(0) expect((mcpHub as any)._oauthWatchers.size).toBe(1) const firstEntry = (mcpHub as any)._oauthWatchers.get(`${serverName}:${source}`) @@ -2956,10 +2931,11 @@ describe("McpHub", () => { mockConnection, ) - await Promise.resolve() - await Promise.resolve() + await vi.advanceTimersByTimeAsync(0) // Still exactly one watcher for this server key expect((mcpHub as any)._oauthWatchers.size).toBe(1) + // The first watcher's unsubscribe must have been called before replacement + expect(firstEntry.unsubscribe).toHaveBeenCalledOnce() // Watcher entry was replaced (second flow's entry, not first) const secondEntry = (mcpHub as any)._oauthWatchers.get(`${serverName}:${source}`) expect(secondEntry).not.toBe(firstEntry) From 74583b55e115f1ddd4631aecfc43fec154848fc6 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sat, 20 Jun 2026 21:55:34 +0300 Subject: [PATCH 04/64] feat(fireworks): add kimi-k2p7-code model (#599) --- packages/types/src/providers/fireworks.ts | 15 ++++++++++++ src/api/providers/__tests__/fireworks.spec.ts | 24 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/packages/types/src/providers/fireworks.ts b/packages/types/src/providers/fireworks.ts index 12e24c161e..3b18ad50b8 100644 --- a/packages/types/src/providers/fireworks.ts +++ b/packages/types/src/providers/fireworks.ts @@ -6,6 +6,7 @@ export type FireworksModelId = | "accounts/fireworks/models/kimi-k2-thinking" | "accounts/fireworks/models/kimi-k2p5" | "accounts/fireworks/models/kimi-k2p6" + | "accounts/fireworks/models/kimi-k2p7-code" | "accounts/fireworks/models/minimax-m2" | "accounts/fireworks/models/minimax-m2p1" | "accounts/fireworks/models/qwen3-235b-a22b-instruct-2507" @@ -265,6 +266,20 @@ export const fireworksModels = { description: "DeepSeek V4 Pro is the latest iteration of the DeepSeek model family, with improved reasoning, code generation, and instruction following over the V3 series.", }, + "accounts/fireworks/models/kimi-k2p7-code": { + maxTokens: 16384, + contextWindow: 262144, + supportsImages: true, + supportsPromptCache: true, + preserveReasoning: true, + supportsTemperature: true, + defaultTemperature: 1.0, + inputPrice: 0.95, + outputPrice: 4.0, + cacheReadsPrice: 0.19, + description: + "Kimi K2.7 Code is Moonshot AI's latest coding-focused model, building on K2.6 with enhanced code generation, reasoning, and unified vision/text understanding for software development workflows.", + }, "accounts/fireworks/models/glm-5p1": { maxTokens: 25344, contextWindow: 202752, diff --git a/src/api/providers/__tests__/fireworks.spec.ts b/src/api/providers/__tests__/fireworks.spec.ts index 18fded5c05..33d50ab7b2 100644 --- a/src/api/providers/__tests__/fireworks.spec.ts +++ b/src/api/providers/__tests__/fireworks.spec.ts @@ -183,6 +183,30 @@ describe("FireworksHandler", () => { ) }) + it("should return Kimi K2.7 code model with correct configuration", () => { + const testModelId: FireworksModelId = "accounts/fireworks/models/kimi-k2p7-code" + const handlerWithModel = new FireworksHandler({ + apiModelId: testModelId, + fireworksApiKey: "test-fireworks-api-key", + }) + const model = handlerWithModel.getModel() + expect(model.id).toBe(testModelId) + expect(model.info).toEqual( + expect.objectContaining({ + maxTokens: 16384, + contextWindow: 262144, + supportsImages: true, + supportsPromptCache: true, + supportsTemperature: true, + preserveReasoning: true, + defaultTemperature: 1.0, + inputPrice: 0.95, + outputPrice: 4.0, + cacheReadsPrice: 0.19, + }), + ) + }) + it("should return MiniMax M2 model with correct configuration", () => { const testModelId: FireworksModelId = "accounts/fireworks/models/minimax-m2" const handlerWithModel = new FireworksHandler({ From f21802cf4b64feb533ce2c2c727b695b73141864 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 15:50:34 -0400 Subject: [PATCH 05/64] chore(deps): update dependency @types/node to v20.19.43 (#669) * chore(deps): update dependency @types/node to v20.19.43 * deps(node): unifying on 20 before upgrade --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Elliott de Launay --- apps/cli/package.json | 2 +- apps/vscode-e2e/package.json | 2 +- package.json | 2 +- packages/build/package.json | 2 +- packages/cloud/package.json | 2 +- packages/core/package.json | 2 +- packages/ipc/package.json | 2 +- packages/telemetry/package.json | 2 +- packages/types/package.json | 2 +- packages/vscode-shim/package.json | 2 +- pnpm-lock.yaml | 258 +++++++++--------------------- src/package.json | 2 +- webview-ui/package.json | 2 +- 13 files changed, 86 insertions(+), 196 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index c350bc736c..8474e42623 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -41,7 +41,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "24.2.1", + "@types/node": "20.19.43", "@types/react": "18.3.23", "@vitest/coverage-v8": "4.1.0", "ink-testing-library": "4.0.0", diff --git a/apps/vscode-e2e/package.json b/apps/vscode-e2e/package.json index 71fadd5e00..80f7b8fe0d 100644 --- a/apps/vscode-e2e/package.json +++ b/apps/vscode-e2e/package.json @@ -17,7 +17,7 @@ "@roo-code/types": "workspace:^", "@copilotkit/aimock": "1.15.1", "@types/mocha": "10.0.10", - "@types/node": "20.19.41", + "@types/node": "20.19.43", "@types/vscode": "1.100.0", "@vscode/test-cli": "0.0.11", "@vscode/test-electron": "2.5.2", diff --git a/package.json b/package.json index 7247572ffc..13d72d36fb 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@changesets/cli": "2.29.7", "@dotenvx/dotenvx": "1.66.0", "@roo-code/config-typescript": "workspace:^", - "@types/node": "24.2.1", + "@types/node": "20.19.43", "@vscode/vsce": "3.3.2", "esbuild": "0.28.1", "eslint": "9.28.0", diff --git a/packages/build/package.json b/packages/build/package.json index c74b7aa114..dd74f1b65b 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -18,7 +18,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "20.19.41", + "@types/node": "20.19.43", "vitest": "4.1.0" } } diff --git a/packages/cloud/package.json b/packages/cloud/package.json index 9a1ccc39b7..265aaff08b 100644 --- a/packages/cloud/package.json +++ b/packages/cloud/package.json @@ -21,7 +21,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "24.2.1", + "@types/node": "20.19.43", "@types/vscode": "1.100.0", "globals": "16.3.0", "@vitest/coverage-v8": "4.1.0", diff --git a/packages/core/package.json b/packages/core/package.json index 8b2e84968d..4cb970c6b8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "24.2.1", + "@types/node": "20.19.43", "@vitest/coverage-v8": "4.1.0", "vitest": "4.1.0" } diff --git a/packages/ipc/package.json b/packages/ipc/package.json index abe90f52fa..d79e8b5900 100644 --- a/packages/ipc/package.json +++ b/packages/ipc/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "20.19.41", + "@types/node": "20.19.43", "@types/node-ipc": "9.2.3" } } diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index e3b78ae018..fd3e3c0327 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "20.19.41", + "@types/node": "20.19.43", "@types/vscode": "1.100.0", "@vitest/coverage-v8": "4.1.0", "vitest": "4.1.0" diff --git a/packages/types/package.json b/packages/types/package.json index 5ecc8bf422..852f7b1062 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "24.2.1", + "@types/node": "20.19.43", "globals": "16.3.0", "tsup": "8.5.0", "ajv": "8.18.0", diff --git a/packages/vscode-shim/package.json b/packages/vscode-shim/package.json index e439ed240e..e097cac40f 100644 --- a/packages/vscode-shim/package.json +++ b/packages/vscode-shim/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "24.2.1", + "@types/node": "20.19.43", "vitest": "4.1.0" }, "dependencies": {} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92a7b186a6..8c2f786a85 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ importers: devDependencies: '@changesets/cli': specifier: 2.29.7 - version: 2.29.7(@types/node@24.2.1) + version: 2.29.7(@types/node@20.19.43) '@dotenvx/dotenvx': specifier: 1.66.0 version: 1.66.0 @@ -31,8 +31,8 @@ importers: specifier: workspace:^ version: link:packages/config-typescript '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 20.19.43 + version: 20.19.43 '@vscode/vsce': specifier: 3.3.2 version: 3.3.2 @@ -47,7 +47,7 @@ importers: version: 9.1.7 knip: specifier: 5.60.2 - version: 5.60.2(@types/node@24.2.1)(typescript@5.8.3) + version: 5.60.2(@types/node@20.19.43)(typescript@5.8.3) lint-staged: specifier: 16.4.0 version: 16.4.0 @@ -131,8 +131,8 @@ importers: specifier: workspace:^ version: link:../../packages/config-typescript '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 20.19.43 + version: 20.19.43 '@types/react': specifier: 18.3.23 version: 18.3.23 @@ -153,7 +153,7 @@ importers: version: 4.19.4 vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) apps/vscode-e2e: devDependencies: @@ -173,8 +173,8 @@ importers: specifier: 10.0.10 version: 10.0.10 '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.19.43 + version: 20.19.43 '@types/vscode': specifier: 1.100.0 version: 1.100.0 @@ -213,11 +213,11 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.19.43 + version: 20.19.43 vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) packages/cloud: dependencies: @@ -244,8 +244,8 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 20.19.43 + version: 20.19.43 '@types/vscode': specifier: 1.100.0 version: 1.100.0 @@ -257,7 +257,7 @@ importers: version: 16.3.0 vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) packages/config-eslint: devDependencies: @@ -322,14 +322,14 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 20.19.43 + version: 20.19.43 '@vitest/coverage-v8': specifier: 4.1.0 version: 4.1.0(vitest@4.1.0) vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) packages/ipc: dependencies: @@ -347,8 +347,8 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.19.43 + version: 20.19.43 '@types/node-ipc': specifier: 9.2.3 version: 9.2.3 @@ -372,8 +372,8 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.19.43 + version: 20.19.43 '@types/vscode': specifier: 1.100.0 version: 1.100.0 @@ -382,7 +382,7 @@ importers: version: 4.1.0(vitest@4.1.0) vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) packages/types: dependencies: @@ -400,8 +400,8 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 20.19.43 + version: 20.19.43 ajv: specifier: 8.18.0 version: 8.18.0 @@ -413,7 +413,7 @@ importers: version: 8.5.0(jiti@2.4.2)(postcss@8.5.15)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.9.0) vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) zod-to-json-schema: specifier: 3.25.1 version: 3.25.1(zod@3.25.76) @@ -427,11 +427,11 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 24.2.1 - version: 24.2.1 + specifier: 20.19.43 + version: 20.19.43 vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) src: dependencies: @@ -689,8 +689,8 @@ importers: specifier: 10.0.10 version: 10.0.10 '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.19.43 + version: 20.19.43 '@types/node-cache': specifier: 4.2.5 version: 4.2.5 @@ -738,7 +738,7 @@ importers: version: 6.0.1 vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) webview-ui: dependencies: @@ -792,7 +792,7 @@ importers: version: link:../packages/types '@tailwindcss/vite': specifier: ^4.0.0 - version: 4.1.6(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.6(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@tanstack/react-query': specifier: ^5.68.0 version: 5.76.1(react@18.3.1) @@ -966,8 +966,8 @@ importers: specifier: 0.16.7 version: 0.16.7 '@types/node': - specifier: 20.19.41 - version: 20.19.41 + specifier: 20.19.43 + version: 20.19.43 '@types/react': specifier: 18.3.23 version: 18.3.23 @@ -985,7 +985,7 @@ importers: version: 1.57.5 '@vitejs/plugin-react': specifier: 5.2.0 - version: 5.2.0(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 5.2.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 4.1.0 version: 4.1.0(vitest@4.1.0) @@ -1000,10 +1000,10 @@ importers: version: 26.1.0 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + version: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) packages: @@ -1502,28 +1502,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@basetenlabs/performance-client-linux-riscv64-gnu@0.0.10': resolution: {integrity: sha512-2KUvdK4wuoZdIqNnJhx7cu6ybXCwtiwGAtlrEvhai3FOkUQ3wE2Xa+TQ33mNGSyFbw6wAvLawYtKVFmmw27gJw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - libc: [glibc] '@basetenlabs/performance-client-linux-x64-gnu@0.0.10': resolution: {integrity: sha512-9jjQPjHLiVOGwUPlmhnBl7OmmO7hQ8WMt+v3mJuxkS5JTNDmVOngfmgGlbN9NjBhQMENjdcMUVOquVo7HeybGQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@basetenlabs/performance-client-linux-x64-musl@0.0.10': resolution: {integrity: sha512-bjYB8FKcPvEa251Ep2Gm3tvywADL9eavVjZsikdf0AvJ1K5pT+vLLvJBU9ihBsTPWnbF4pJgxVjwS6UjVObsQA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@basetenlabs/performance-client-win32-arm64-msvc@0.0.10': resolution: {integrity: sha512-Vxq5UXEmfh3C3hpwXdp3Daaf0dnLR9zFH2x8MJ1Hf/TcilmOP1clneewNpIv0e7MrnT56Z4pM6P3d8VFMZqBKg==} @@ -2128,28 +2124,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@node-rs/crc32-linux-arm64-musl@1.10.6': resolution: {integrity: sha512-k8ra/bmg0hwRrIEE8JL1p32WfaN9gDlUUpQRWsbxd1WhjqvXea7kKO6K4DwVxyxlPhBS9Gkb5Urq7Y4mXANzaw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@node-rs/crc32-linux-x64-gnu@1.10.6': resolution: {integrity: sha512-IfjtqcuFK7JrSZ9mlAFhb83xgium30PguvRjIMI45C3FJwu18bnLk1oR619IYb/zetQT82MObgmqfKOtgemEKw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@node-rs/crc32-linux-x64-musl@1.10.6': resolution: {integrity: sha512-LbFYsA5M9pNunOweSt6uhxenYQF94v3bHDAQRPTQ3rnjn+mK6IC7YTAYoBjvoJP8lVzcvk9hRj8wp4Jyh6Y80g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@node-rs/crc32-wasm32-wasi@1.10.6': resolution: {integrity: sha512-KaejdLgHMPsRaxnM+OG9L9XdWL2TabNx80HLdsCOoX9BVhEkfh39OeahBo8lBmidylKbLGMQoGfIKDjq0YMStw==} @@ -2230,37 +2222,31 @@ packages: resolution: {integrity: sha512-BhEzNLjn4HjP8+Q18D3/jeIDBxW7OgoJYIjw2CaaysnYneoTlij8hPTKxHfyqq4IGM3fFs9TLR/k338M3zkQ7g==} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-arm64-musl@11.2.0': resolution: {integrity: sha512-yxbMYUgRmN2V8x8XoxmD/Qq6aG7YIW3ToMDILfmcfeeRRVieEJ3DOWBT0JSE+YgrOy79OyFDH/1lO8VnqLmDQQ==} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-resolver/binding-linux-riscv64-gnu@11.2.0': resolution: {integrity: sha512-QG1UfgC2N2qhW1tOnDCgB/26vn1RCshR5sYPhMeaxO1gMQ3kEKbZ3QyBXxrG1IX5qsXYj5hPDJLDYNYUjRcOpg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-s390x-gnu@11.2.0': resolution: {integrity: sha512-uqTDsQdi6mrkSV1gvwbuT8jf/WFl6qVDVjNlx7IPSaAByrNiJfPrhTmH8b+Do58Dylz7QIRZgxQ8CHIZSyBUdg==} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-x64-gnu@11.2.0': resolution: {integrity: sha512-GZdHXhJ7p6GaQg9MjRqLebwBf8BLvGIagccI6z5yMj4fV3LU4QuDfwSEERG+R6oQ/Su9672MBqWwncvKcKT68w==} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-x64-musl@11.2.0': resolution: {integrity: sha512-YBAC3GOicYznReG2twE7oFPSeK9Z1f507z1EYWKg6HpGYRYRlJyszViu7PrhMT85r/MumDTs429zm+CNqpFWOA==} cpu: [x64] os: [linux] - libc: [musl] '@oxc-resolver/binding-wasm32-wasi@11.2.0': resolution: {integrity: sha512-+qlIg45CPVPy+Jn3vqU1zkxA/AAv6e/2Ax/ImX8usZa8Tr2JmQn/93bmSOOOnr9fXRV9d0n4JyqYzSWxWPYDEw==} @@ -2828,42 +2814,36 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.3': resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.3': resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.3': resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.3': resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.3': resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.3': resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} @@ -2928,79 +2908,66 @@ packages: resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.4': resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.4': resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.4': resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.4': resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.4': resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.4': resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.4': resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.4': resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.4': resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.4': resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.4': resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.4': resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.60.4': resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} @@ -3317,28 +3284,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.6': resolution: {integrity: sha512-8kjivE5xW0qAQ9HX9reVFmZj3t+VmljDLVRJpVBEoTR+3bKMnvC7iLcoSGNIUJGOZy1mLVq7x/gerVg0T+IsYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.6': resolution: {integrity: sha512-A4spQhwnWVpjWDLXnOW9PSinO2PTKJQNRmL/aIl2U/O+RARls8doDfs6R41+DAXK0ccacvRyDpR46aVQJJCoCg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.6': resolution: {integrity: sha512-YRee+6ZqdzgiQAHVSLfl3RYmqeeaWVCk796MhXhLQu2kJu2COHBkqlqsqKYx3p8Hmk5pGCQd2jTAoMWWFeyG2A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.6': resolution: {integrity: sha512-qAp4ooTYrBQ5pk5jgg54/U1rCJ/9FLYOkkQ/nTE+bVMseMfB6O7J8zb19YTpWuu4UdfRf5zzOrNKfl6T64MNrQ==} @@ -3650,11 +3613,8 @@ packages: '@types/node@18.19.100': resolution: {integrity: sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==} - '@types/node@20.19.41': - resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} - - '@types/node@24.2.1': - resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -6430,56 +6390,48 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-gnu@1.32.0: resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.29.2: resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.29.2: resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.29.2: resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.29.2: resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} @@ -8625,9 +8577,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - undici@6.27.0: resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} engines: {node: '>=18.17'} @@ -10205,7 +10154,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@24.2.1)': + '@changesets/cli@2.29.7(@types/node@20.19.43)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -10221,7 +10170,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@24.2.1) + '@inquirer/external-editor': 1.0.2(@types/node@20.19.43) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -10324,7 +10273,7 @@ snapshots: '@copilotkit/aimock@1.15.1(vitest@4.1.0)': optionalDependencies: - vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@csstools/color-helpers@5.0.2': {} @@ -10596,12 +10545,12 @@ snapshots: figures: 6.1.0 ink: 6.6.0(@types/react@18.3.23)(react@19.2.3) - '@inquirer/external-editor@1.0.2(@types/node@24.2.1)': + '@inquirer/external-editor@1.0.2(@types/node@20.19.43)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 24.2.1 + '@types/node': 20.19.43 '@ioredis/commands@1.3.0': {} @@ -10633,7 +10582,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.2.1 + '@types/node': 20.19.43 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -11999,12 +11948,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.6 '@tailwindcss/oxide-win32-x64-msvc': 4.1.6 - '@tailwindcss/vite@4.1.6(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': + '@tailwindcss/vite@4.1.6(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.1.6 '@tailwindcss/oxide': 4.1.6 tailwindcss: 4.1.6 - vite: 8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) '@tanstack/query-core@5.76.0': {} @@ -12297,12 +12246,12 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 24.2.1 + '@types/node': 20.19.43 form-data: 4.0.5 '@types/node-ipc@9.2.3': dependencies: - '@types/node': 24.2.1 + '@types/node': 20.19.43 '@types/node@12.20.55': {} @@ -12312,14 +12261,10 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.19.41': + '@types/node@20.19.43': dependencies: undici-types: 6.21.0 - '@types/node@24.2.1': - dependencies: - undici-types: 7.10.0 - '@types/prop-types@15.7.14': {} '@types/proper-lockfile@4.1.4': @@ -12462,7 +12407,7 @@ snapshots: '@vercel/oidc@3.1.0': {} - '@vitejs/plugin-react@5.2.0(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': + '@vitejs/plugin-react@5.2.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -12470,7 +12415,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -12486,7 +12431,7 @@ snapshots: obug: 2.1.2 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@vitest/expect@4.1.0': dependencies: @@ -12497,29 +12442,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.0(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3))': + '@vitest/mocker@4.1.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) + vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) - '@vitest/mocker@4.1.0(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': + '@vitest/mocker@4.1.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) - - '@vitest/mocker@4.1.0(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.0 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) '@vitest/pretty-format@4.1.0': dependencies: @@ -12548,7 +12485,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@vitest/utils@4.1.0': dependencies: @@ -15282,7 +15219,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.2.1 + '@types/node': 20.19.43 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15449,10 +15386,10 @@ snapshots: kind-of@6.0.3: {} - knip@5.60.2(@types/node@24.2.1)(typescript@5.8.3): + knip@5.60.2(@types/node@20.19.43)(typescript@5.8.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 24.2.1 + '@types/node': 20.19.43 fast-glob: 3.3.3 formatly: 0.2.4 jiti: 2.4.2 @@ -18147,8 +18084,6 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.10.0: {} - undici@6.27.0: {} unicorn-magic@0.3.0: {} @@ -18356,7 +18291,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3): + vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -18364,14 +18299,14 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.19.41 + '@types/node': 20.19.43 esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.4.2 tsx: 4.19.4 yaml: 2.8.3 - vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): + vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -18379,62 +18314,17 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.19.41 + '@types/node': 20.19.43 esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.4.2 tsx: 4.19.4 yaml: 2.9.0 - vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.15 - rolldown: 1.0.3 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 24.2.1 - esbuild: 0.28.1 - fsevents: 2.3.3 - jiti: 2.4.2 - tsx: 4.19.4 - yaml: 2.9.0 - - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.2 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 20.19.41 - '@vitest/ui': 4.1.0(vitest@4.1.0) - jsdom: 26.1.0 - transitivePeerDependencies: - - msw - - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.41)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)): + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + '@vitest/mocker': 4.1.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.0 '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -18451,20 +18341,20 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@20.19.41)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 20.19.41 + '@types/node': 20.19.43 '@vitest/ui': 4.1.0(vitest@4.1.0) jsdom: 26.1.0 transitivePeerDependencies: - msw - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.2.1)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)): + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) + '@vitest/mocker': 4.1.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.0 '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -18481,11 +18371,11 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@24.2.1)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) + vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 24.2.1 + '@types/node': 20.19.43 '@vitest/ui': 4.1.0(vitest@4.1.0) jsdom: 26.1.0 transitivePeerDependencies: diff --git a/src/package.json b/src/package.json index 88427f5b5a..9d55922ed0 100644 --- a/src/package.json +++ b/src/package.json @@ -543,7 +543,7 @@ "@types/diff": "5.2.3", "@types/lodash.debounce": "4.0.9", "@types/mocha": "10.0.10", - "@types/node": "20.19.41", + "@types/node": "20.19.43", "@types/node-cache": "4.2.5", "@types/proper-lockfile": "4.1.4", "@types/ps-tree": "1.1.6", diff --git a/webview-ui/package.json b/webview-ui/package.json index 4a68b0d9bf..be4df7650c 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -92,7 +92,7 @@ "@types/diff": "5.2.3", "@types/jest": "29.5.14", "@types/katex": "0.16.7", - "@types/node": "20.19.41", + "@types/node": "20.19.43", "@types/react": "18.3.23", "@types/react-dom": "18.3.7", "@types/shell-quote": "1.7.5", From ad7dcfeabf3c3d4ab302107126bc6eaef538b848 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 20:31:34 +0000 Subject: [PATCH 06/64] chore(deps): update dependency @vscode/test-cli to v0.0.12 (#670) * chore(deps): update dependency @vscode/test-cli to v0.0.12 * deps(vscode-cli): removing unused dep --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Elliott de Launay --- apps/vscode-e2e/.vscode-test.mjs | 16 ---- apps/vscode-e2e/package.json | 1 - pnpm-lock.yaml | 132 ------------------------------- 3 files changed, 149 deletions(-) delete mode 100644 apps/vscode-e2e/.vscode-test.mjs diff --git a/apps/vscode-e2e/.vscode-test.mjs b/apps/vscode-e2e/.vscode-test.mjs deleted file mode 100644 index 71773e561d..0000000000 --- a/apps/vscode-e2e/.vscode-test.mjs +++ /dev/null @@ -1,16 +0,0 @@ -/** - * See: https://code.visualstudio.com/api/working-with-extensions/testing-extension - */ - -import { defineConfig } from "@vscode/test-cli" - -export default defineConfig({ - label: "integrationTest", - files: "out/suite/**/*.test.js", - workspaceFolder: ".", - mocha: { - ui: "tdd", - timeout: 60000, - }, - launchArgs: ["--enable-proposed-api=ZooCodeOrganization.zoo-code", "--disable-extensions"], -}) diff --git a/apps/vscode-e2e/package.json b/apps/vscode-e2e/package.json index 80f7b8fe0d..71a25f22ed 100644 --- a/apps/vscode-e2e/package.json +++ b/apps/vscode-e2e/package.json @@ -19,7 +19,6 @@ "@types/mocha": "10.0.10", "@types/node": "20.19.43", "@types/vscode": "1.100.0", - "@vscode/test-cli": "0.0.11", "@vscode/test-electron": "2.5.2", "glob": "11.1.0", "mocha": "11.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c2f786a85..857b0ff8c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -178,9 +178,6 @@ importers: '@types/vscode': specifier: 1.100.0 version: 1.100.0 - '@vscode/test-cli': - specifier: 0.0.11 - version: 0.0.11 '@vscode/test-electron': specifier: 2.5.2 version: 2.5.2 @@ -1543,9 +1540,6 @@ packages: resolution: {integrity: sha512-H6bpd1JcDbuJsOS2dNft+CCGLzBqHJO/ST/4mMKhLAW641J6PpVJUw1szYsk/dTetdedbWxHpMkvFObOKeP8nw==} engines: {node: '>= 10'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1966,10 +1960,6 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - '@jest/expect-utils@29.7.0': resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3790,11 +3780,6 @@ packages: '@vscode/ripgrep@1.17.0': resolution: {integrity: sha512-mBRKm+ASPkUcw4o9aAgfbusIu6H4Sdhw09bjeP1YOBFTJEZAnrnk6WZwzv8NEjgC82f7ILvhmb1WIElSugea6g==} - '@vscode/test-cli@0.0.11': - resolution: {integrity: sha512-qO332yvzFqGhBMJrp6TdwbIydiHgCtxXc2Nl6M58mbH/Z+0CyLR76Jzv4YWPEthhrARprzCRJUqzFvTHFhTj7Q==} - engines: {node: '>=18'} - hasBin: true - '@vscode/test-electron@2.5.2': resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} engines: {node: '>=16'} @@ -3960,10 +3945,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} engines: {node: '>= 6'} @@ -4125,10 +4106,6 @@ packages: bignumber.js@9.3.0: resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - binary@0.3.0: resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} @@ -4205,11 +4182,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - c8@9.1.0: - resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} - engines: {node: '>=14.14.0'} - hasBin: true - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -4301,10 +4273,6 @@ packages: resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} engines: {node: '>=18.17'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -5886,10 +5854,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -6126,10 +6090,6 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -7658,10 +7618,6 @@ packages: readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -8281,10 +8237,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -8329,10 +8281,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -8745,10 +8693,6 @@ packages: deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -10119,8 +10063,6 @@ snapshots: '@basetenlabs/performance-client-win32-ia32-msvc': 0.0.10 '@basetenlabs/performance-client-win32-x64-msvc': 0.0.10 - '@bcoe/v8-coverage@0.2.3': {} - '@bcoe/v8-coverage@1.0.2': {} '@braintree/sanitize-url@7.1.2': {} @@ -10567,8 +10509,6 @@ snapshots: dependencies: minipass: 7.1.2 - '@istanbuljs/schema@0.1.3': {} - '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 @@ -12503,18 +12443,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vscode/test-cli@0.0.11': - dependencies: - '@types/mocha': 10.0.10 - c8: 9.1.0 - chokidar: 3.6.0 - enhanced-resolve: 5.18.1 - glob: 11.1.0 - minimatch: 9.0.5 - mocha: 11.2.2 - supports-color: 9.4.0 - yargs: 17.7.2 - '@vscode/test-electron@2.5.2': dependencies: http-proxy-agent: 7.0.2 @@ -12698,11 +12626,6 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.2 - archiver-utils@2.1.0: dependencies: glob: 11.1.0 @@ -12901,8 +12824,6 @@ snapshots: bignumber.js@9.3.0: {} - binary-extensions@2.3.0: {} - binary@0.3.0: dependencies: buffers: 0.1.1 @@ -12986,20 +12907,6 @@ snapshots: bytes@3.1.2: {} - c8@9.1.0: - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 3.3.1 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.7 - test-exclude: 6.0.0 - v8-to-istanbul: 9.3.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -13094,18 +13001,6 @@ snapshots: undici: 6.27.0 whatwg-mimetype: 4.0.0 - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -14973,10 +14868,6 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -15165,11 +15056,6 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 @@ -17004,10 +16890,6 @@ snapshots: dependencies: minimatch: 5.1.6 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.2 - readdirp@4.1.2: {} reconnecting-eventsource@1.6.4: {} @@ -17778,8 +17660,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} - supports-preserve-symlinks-flag@1.0.0: {} symbol-tree@3.2.4: {} @@ -17833,12 +17713,6 @@ snapshots: term-size@2.2.1: {} - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 11.1.0 - minimatch: 3.1.2 - text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -18256,12 +18130,6 @@ snapshots: uuid@9.0.1: {} - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - vary@1.1.2: {} vfile-location@5.0.3: From dfb31dac776a646091cdf8407a98b8dccc651035 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 20:44:51 +0000 Subject: [PATCH 07/64] chore(deps): update dependency execa to v9.6.1 (#671) * chore(deps): update dependency execa to v9.6.1 * deps(execa): bumping pinned version --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Elliott de Launay --- pnpm-lock.yaml | 47 +++++++++++------------------------------------ src/package.json | 2 +- 2 files changed, 12 insertions(+), 37 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 857b0ff8c0..6af5e656c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,7 +104,7 @@ importers: version: 7.0.6 execa: specifier: ^9.5.2 - version: 9.6.0 + version: 9.6.1 fuzzysort: specifier: ^3.1.0 version: 3.1.0 @@ -301,7 +301,7 @@ importers: version: 0.28.1 execa: specifier: ^9.5.2 - version: 9.6.0 + version: 9.6.1 ignore: specifier: ^7.0.3 version: 7.0.5 @@ -719,8 +719,8 @@ importers: specifier: 0.25.12 version: 0.25.12 execa: - specifier: 9.5.3 - version: 9.5.3 + specifier: 9.6.1 + version: 9.6.1 mkdirp: specifier: 3.0.1 version: 3.0.1 @@ -5163,12 +5163,8 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.5.3: - resolution: {integrity: sha512-QFNnTvU3UjgWFy8Ef9iDHvIdcgZ344ebkwYx4/KLbR+CKQA4xBaHzv+iRpp86QfMHP8faFQLh8iOc57215y4Rg==} - engines: {node: ^18.19.0 || >=20.5.0} - - execa@9.6.0: - resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} exenv-es6@1.1.1: @@ -7390,8 +7386,8 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.2.0: - resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} process-nextick-args@2.0.1: @@ -9060,10 +9056,6 @@ packages: resolution: {integrity: sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw==} engines: {node: '>=18.19'} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} - engines: {node: '>=18'} - yoctocolors@2.1.2: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} @@ -14019,7 +14011,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.5.3: + execa@9.6.1: dependencies: '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 @@ -14029,26 +14021,11 @@ snapshots: is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.2.0 + pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 yoctocolors: 2.1.2 - execa@9.6.0: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.1 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.2.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.1 - exenv-es6@1.1.1: {} expand-template@2.0.3: @@ -16627,7 +16604,7 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-ms@9.2.0: + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -18489,8 +18466,6 @@ snapshots: dependencies: yoctocolors: 2.1.2 - yoctocolors@2.1.1: {} - yoctocolors@2.1.2: {} yoga-layout@3.2.1: {} diff --git a/src/package.json b/src/package.json index 9d55922ed0..4b46f4f638 100644 --- a/src/package.json +++ b/src/package.json @@ -554,7 +554,7 @@ "@vscode/vsce": "3.3.2", "ai": "6.0.77", "esbuild-wasm": "0.25.12", - "execa": "9.5.3", + "execa": "9.6.1", "mkdirp": "3.0.1", "nock": "14.0.10", "ovsx": "0.10.4", From ccf07eba3a33e2a27eb6fa456cd0c8874e703f10 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 21:18:41 +0000 Subject: [PATCH 08/64] chore(deps): update dependency axios to v1.18.0 (#673) * chore(deps): update dependency axios to v1.18.0 * deps(renovate): adding pnpm dedupe --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Elliott de Launay --- pnpm-lock.yaml | 712 +++++++++++-------------------------------------- renovate.json | 1 + 2 files changed, 163 insertions(+), 550 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6af5e656c6..a4d46a1685 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -509,7 +509,7 @@ importers: version: 0.5.0 axios: specifier: ^1.12.0 - version: 1.16.0 + version: 1.18.0 chokidar: specifier: ^4.0.1 version: 4.0.3 @@ -551,7 +551,7 @@ importers: version: 25.2.1(typescript@5.8.3) ignore: specifier: ^7.0.3 - version: 7.0.4 + version: 7.0.5 isbinaryfile: specifier: ^5.0.7 version: 5.0.7 @@ -653,7 +653,7 @@ importers: version: 9.2.0 yaml: specifier: ^2.8.0 - version: 2.8.3 + version: 2.9.0 zhipu-ai-provider: specifier: ^0.2.2 version: 0.2.2(zod@3.25.76) @@ -735,7 +735,7 @@ importers: version: 6.0.1 vitest: specifier: 4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)) webview-ui: dependencies: @@ -780,7 +780,7 @@ importers: version: 1.3.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.1.2 - version: 1.2.2(@types/react@18.3.23)(react@18.3.1) + version: 1.2.3(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-tooltip': specifier: ^1.1.8 version: 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -804,7 +804,7 @@ importers: version: 0.7.2 axios: specifier: ^1.12.0 - version: 1.16.0 + version: 1.18.0 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -837,10 +837,10 @@ importers: version: 25.2.1(typescript@5.8.3) katex: specifier: ^0.16.11 - version: 0.16.22 + version: 0.16.47 lru-cache: specifier: ^11.1.0 - version: 11.1.0 + version: 11.2.2 lucide-react: specifier: ^0.518.0 version: 0.518.0(react@18.3.1) @@ -1085,12 +1085,6 @@ packages: peerDependencies: zod: 3.25.76 - '@ai-sdk/openai-compatible@2.0.37': - resolution: {integrity: sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw==} - engines: {node: '>=18'} - peerDependencies: - zod: 3.25.76 - '@ai-sdk/openai-compatible@2.0.47': resolution: {integrity: sha512-Enm5UlL0zUCrW3792opk5h7hRWxZOZzDe6eQYVFqX9LUOGGCe1h8MZWAGim765nwzgnjlpeYOsuzZmLtRsTPlg==} engines: {node: '>=18'} @@ -1115,12 +1109,6 @@ packages: peerDependencies: zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.21': - resolution: {integrity: sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw==} - engines: {node: '>=18'} - peerDependencies: - zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.27': resolution: {integrity: sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==} engines: {node: '>=18'} @@ -1429,14 +1417,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.27.4': - resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} @@ -1982,9 +1962,6 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -3037,10 +3014,6 @@ packages: resolution: {integrity: sha512-4Jys0ni2tB2VZzgslbEgszZyMdTkPOFGA8g+So/NjR8oy6Qwaq4eSwsrRI+NMtb0Dq4kqCzGUu/nGUx7OM/xfw==} engines: {node: '>=18.0.0'} - '@smithy/core@3.17.2': - resolution: {integrity: sha512-n3g4Nl1Te+qGPDbNFAYf+smkRVB+JhFsGy9uJXXZQEufoP4u0r+WLh6KvTDolCswaagysDc/afS1yvb2jnj1gQ==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.24.3': resolution: {integrity: sha512-Ep/7tPamGY8mgESE3LyLKtxJyy6U52WWAqr/3wial47Sj4u3PiIF73AOGI27UyLy9duTkhZbgzodOfLV4TduZg==} engines: {node: '>=18.0.0'} @@ -3153,10 +3126,6 @@ packages: resolution: {integrity: sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==} engines: {node: '>=18.0.0'} - '@smithy/types@4.8.1': - resolution: {integrity: sha512-N0Zn0OT1zc+NA+UVfkYqQzviRh5ucWwO7mBV3TmHHprMnfcJNfhlPicDkBHi0ewbh+y3evR6cNAW0Raxvb01NA==} - engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.4': resolution: {integrity: sha512-w/N/Iw0/PTwJ36PDqU9PzAwVElo4qXxCC0eCTlUtIz/Z5V/2j/cViMHi0hPukSBHp4DVwvUlUhLgCzqSJ6plrg==} engines: {node: '>=18.0.0'} @@ -3221,10 +3190,6 @@ packages: resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} - engines: {node: '>=18.0.0'} - '@smithy/util-utf8@4.3.3': resolution: {integrity: sha512-c1QpRBn3aMsoqE64dd4Imgjy8Pynfw+eR7GkjElquxUFSnezwYVaOFm8JcYa+Bo/5ssbEyPKcT3+4bmrWYh6eQ==} engines: {node: '>=18.0.0'} @@ -3868,6 +3833,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -3905,10 +3874,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@7.2.0: - resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} - engines: {node: '>=18'} - ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -4037,8 +4002,8 @@ packages: aws4fetch@1.0.20: resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - axios@1.16.0: - resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} + axios@1.18.0: + resolution: {integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==} azure-devops-node-api@12.5.0: resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} @@ -4234,10 +4199,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -4311,10 +4272,6 @@ packages: resolution: {integrity: sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==} engines: {node: '>=18.20'} - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} - engines: {node: '>=20'} - cli-truncate@5.2.0: resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} @@ -4697,9 +4654,6 @@ packages: date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - dayjs@1.11.21: resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} @@ -4715,15 +4669,6 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -4805,10 +4750,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -4988,9 +4929,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.43.0: - resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} - es-toolkit@1.47.0: resolution: {integrity: sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==} @@ -5139,10 +5077,6 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} - eventsource-parser@3.0.8: resolution: {integrity: sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==} engines: {node: '>=18.0.0'} @@ -5307,21 +5241,9 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - flatted@3.4.0: resolution: {integrity: sha512-kC6Bb+ooptOIvWj5B63EQWkF0FEnNjV2ZNkLMLZRDDduIiWeFF4iKnslwhiWxjAdbg4NzTNo6h0qLuvFrcx+Sw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -5342,12 +5264,8 @@ packages: form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} formatly@0.2.4: @@ -5435,10 +5353,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} - engines: {node: '>=18'} - get-east-asian-width@1.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} @@ -5588,10 +5502,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -5670,10 +5580,6 @@ packages: htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -5682,6 +5588,10 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -5736,10 +5646,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.4: - resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} - engines: {node: '>= 4'} - ignore@7.0.5: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} @@ -5905,10 +5811,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} - is-fullwidth-code-point@5.1.0: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} @@ -6237,10 +6139,6 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} - katex@0.16.22: - resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} - hasBin: true - katex@0.16.47: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true @@ -6559,10 +6457,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} - lru-cache@11.2.2: resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} @@ -6927,11 +6821,6 @@ packages: react: '*' react-dom: '*' - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7436,10 +7325,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - qs@6.15.2: resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} @@ -7457,10 +7342,6 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} - raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} @@ -7854,11 +7735,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -7974,10 +7850,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -8051,10 +7923,6 @@ packages: standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -8091,10 +7959,6 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.1.0: - resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} - engines: {node: '>=20'} - string-width@8.2.1: resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} engines: {node: '>=20'} @@ -8131,10 +7995,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} @@ -8306,18 +8166,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.2.3: - resolution: {integrity: sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==} - engines: {node: '>=18'} - tinyexec@1.2.4: resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -8333,10 +8185,6 @@ packages: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - tmp@0.2.4: resolution: {integrity: sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==} engines: {node: '>=14.14'} @@ -8509,9 +8357,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} @@ -8675,10 +8520,6 @@ packages: resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true - uuid@14.0.0: - resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -8920,10 +8761,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} - wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -8931,30 +8768,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.20.1: resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} engines: {node: '>=10.0.0'} @@ -9004,11 +8817,6 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -9201,12 +9009,6 @@ snapshots: '@ai-sdk/provider-utils': 4.0.14(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai-compatible@2.0.37(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@3.25.76) - zod: 3.25.76 - '@ai-sdk/openai-compatible@2.0.47(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 @@ -9228,13 +9030,6 @@ snapshots: zod-to-json-schema: 3.25.1(zod@3.25.76) '@ai-sdk/provider-utils@4.0.14(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 3.25.76 - - '@ai-sdk/provider-utils@4.0.21(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 @@ -9270,7 +9065,7 @@ snapshots: '@alcalzone/ansi-tokenize@0.2.3': dependencies: ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.0.0 + is-fullwidth-code-point: 5.1.0 '@ampproject/remapping@2.3.0': dependencies: @@ -9321,7 +9116,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.922.0 + '@aws-sdk/types': 3.973.8 '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -9329,7 +9124,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.922.0 + '@aws-sdk/types': 3.973.8 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -9338,7 +9133,7 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.922.0 + '@aws-sdk/types': 3.973.8 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -9362,7 +9157,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.922.0 '@aws-sdk/util-user-agent-node': 3.922.0 '@smithy/config-resolver': 4.4.2 - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/eventstream-serde-browser': 4.2.4 '@smithy/eventstream-serde-config-resolver': 4.3.4 '@smithy/eventstream-serde-node': 4.2.4 @@ -9378,7 +9173,7 @@ snapshots: '@smithy/node-http-handler': 4.4.4 '@smithy/protocol-http': 5.3.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -9389,7 +9184,7 @@ snapshots: '@smithy/util-middleware': 4.2.4 '@smithy/util-retry': 4.2.4 '@smithy/util-stream': 4.5.5 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-utf8': 4.3.3 '@smithy/uuid': 1.1.0 tslib: 2.8.1 transitivePeerDependencies: @@ -9411,7 +9206,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.922.0 '@aws-sdk/util-user-agent-node': 3.922.0 '@smithy/config-resolver': 4.4.2 - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/fetch-http-handler': 5.3.5 '@smithy/hash-node': 4.2.4 '@smithy/invalid-dependency': 4.2.4 @@ -9424,7 +9219,7 @@ snapshots: '@smithy/node-http-handler': 4.4.4 '@smithy/protocol-http': 5.3.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -9454,7 +9249,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.922.0 '@aws-sdk/util-user-agent-node': 3.922.0 '@smithy/config-resolver': 4.4.2 - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/fetch-http-handler': 5.3.5 '@smithy/hash-node': 4.2.4 '@smithy/invalid-dependency': 4.2.4 @@ -9467,7 +9262,7 @@ snapshots: '@smithy/node-http-handler': 4.4.4 '@smithy/protocol-http': 5.3.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -9486,16 +9281,16 @@ snapshots: dependencies: '@aws-sdk/types': 3.922.0 '@aws-sdk/xml-builder': 3.921.0 - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/node-config-provider': 4.3.4 '@smithy/property-provider': 4.2.4 '@smithy/protocol-http': 5.3.4 '@smithy/signature-v4': 5.3.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-base64': 4.3.0 '@smithy/util-middleware': 4.2.4 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-utf8': 4.3.3 tslib: 2.8.1 '@aws-sdk/credential-provider-cognito-identity@3.922.0': @@ -9503,7 +9298,7 @@ snapshots: '@aws-sdk/client-cognito-identity': 3.922.0 '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -9513,7 +9308,7 @@ snapshots: '@aws-sdk/core': 3.922.0 '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.922.0': @@ -9525,7 +9320,7 @@ snapshots: '@smithy/property-provider': 4.2.4 '@smithy/protocol-http': 5.3.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-stream': 4.5.5 tslib: 2.8.1 @@ -9542,7 +9337,7 @@ snapshots: '@smithy/credential-provider-imds': 4.2.4 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -9559,7 +9354,7 @@ snapshots: '@smithy/credential-provider-imds': 4.2.4 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -9570,7 +9365,7 @@ snapshots: '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/credential-provider-sso@3.922.0': @@ -9581,7 +9376,7 @@ snapshots: '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -9593,7 +9388,7 @@ snapshots: '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -9613,11 +9408,11 @@ snapshots: '@aws-sdk/nested-clients': 3.922.0 '@aws-sdk/types': 3.922.0 '@smithy/config-resolver': 4.4.2 - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/credential-provider-imds': 4.2.4 '@smithy/node-config-provider': 4.3.4 '@smithy/property-provider': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -9626,27 +9421,27 @@ snapshots: dependencies: '@aws-sdk/types': 3.922.0 '@smithy/eventstream-codec': 4.3.3 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-eventstream@3.922.0': dependencies: '@aws-sdk/types': 3.922.0 '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.922.0': dependencies: '@aws-sdk/types': 3.922.0 '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-logger@3.922.0': dependencies: '@aws-sdk/types': 3.922.0 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.922.0': @@ -9654,7 +9449,7 @@ snapshots: '@aws-sdk/types': 3.922.0 '@aws/lambda-invoke-store': 0.1.1 '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-user-agent@3.922.0': @@ -9662,9 +9457,9 @@ snapshots: '@aws-sdk/core': 3.922.0 '@aws-sdk/types': 3.922.0 '@aws-sdk/util-endpoints': 3.922.0 - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-websocket@3.922.0': @@ -9676,7 +9471,7 @@ snapshots: '@smithy/fetch-http-handler': 5.3.5 '@smithy/protocol-http': 5.3.4 '@smithy/signature-v4': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 @@ -9695,7 +9490,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.922.0 '@aws-sdk/util-user-agent-node': 3.922.0 '@smithy/config-resolver': 4.4.2 - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/fetch-http-handler': 5.3.5 '@smithy/hash-node': 4.2.4 '@smithy/invalid-dependency': 4.2.4 @@ -9708,7 +9503,7 @@ snapshots: '@smithy/node-http-handler': 4.4.4 '@smithy/protocol-http': 5.3.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -9728,7 +9523,7 @@ snapshots: '@aws-sdk/types': 3.922.0 '@smithy/config-resolver': 4.4.2 '@smithy/node-config-provider': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/token-providers@3.922.0': @@ -9738,14 +9533,14 @@ snapshots: '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt '@aws-sdk/types@3.922.0': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/types@3.973.8': @@ -9756,7 +9551,7 @@ snapshots: '@aws-sdk/util-endpoints@3.922.0': dependencies: '@aws-sdk/types': 3.922.0 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/url-parser': 4.2.4 '@smithy/util-endpoints': 3.2.4 tslib: 2.8.1 @@ -9765,7 +9560,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.922.0 '@smithy/querystring-builder': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.804.0': @@ -9775,7 +9570,7 @@ snapshots: '@aws-sdk/util-user-agent-browser@3.922.0': dependencies: '@aws-sdk/types': 3.922.0 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 bowser: 2.11.0 tslib: 2.8.1 @@ -9784,12 +9579,12 @@ snapshots: '@aws-sdk/middleware-user-agent': 3.922.0 '@aws-sdk/types': 3.922.0 '@smithy/node-config-provider': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/xml-builder@3.921.0': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 fast-xml-parser: 5.2.5 tslib: 2.8.1 @@ -9967,10 +9762,6 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.27.1': {} - - '@babel/runtime@7.27.4': {} - '@babel/runtime@7.29.7': {} '@babel/template@7.28.6': @@ -10438,7 +10229,7 @@ snapshots: '@google/genai@1.29.1(@modelcontextprotocol/sdk@1.26.0(zod@3.25.76))': dependencies: google-auth-library: 10.5.0 - ws: 8.18.3 + ws: 8.20.1 optionalDependencies: '@modelcontextprotocol/sdk': 1.26.0(zod@3.25.76) transitivePeerDependencies: @@ -10473,7 +10264,7 @@ snapshots: '@inkjs/ui@2.0.0(ink@6.6.0(@types/react@18.3.23)(react@19.2.3))': dependencies: - chalk: 5.4.1 + chalk: 5.6.2 cli-spinners: 3.3.0 deepmerge: 4.3.1 figures: 6.1.0 @@ -10530,8 +10321,6 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -10549,7 +10338,7 @@ snapshots: '@lmstudio/lms-isomorphic@0.4.5': dependencies: - ws: 8.18.2 + ws: 8.20.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10629,7 +10418,7 @@ snapshots: jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.0 - raw-body: 3.0.0 + raw-body: 3.0.2 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: @@ -11499,31 +11288,18 @@ snapshots: '@smithy/abort-controller@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/config-resolver@4.4.2': dependencies: '@smithy/node-config-provider': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-config-provider': 4.2.0 '@smithy/util-endpoints': 3.2.4 '@smithy/util-middleware': 4.2.4 tslib: 2.8.1 - '@smithy/core@3.17.2': - dependencies: - '@smithy/middleware-serde': 4.2.4 - '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-middleware': 4.2.4 - '@smithy/util-stream': 4.5.5 - '@smithy/util-utf8': 4.2.0 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - '@smithy/core@3.24.3': dependencies: '@aws-crypto/crc32': 5.2.0 @@ -11534,7 +11310,7 @@ snapshots: dependencies: '@smithy/node-config-provider': 4.3.4 '@smithy/property-provider': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/url-parser': 4.2.4 tslib: 2.8.1 @@ -11546,44 +11322,44 @@ snapshots: '@smithy/eventstream-serde-browser@4.2.4': dependencies: '@smithy/eventstream-serde-universal': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/eventstream-serde-config-resolver@4.3.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/eventstream-serde-node@4.2.4': dependencies: '@smithy/eventstream-serde-universal': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/eventstream-serde-universal@4.2.4': dependencies: '@smithy/eventstream-codec': 4.3.3 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/fetch-http-handler@5.3.5': dependencies: '@smithy/protocol-http': 5.3.4 '@smithy/querystring-builder': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-base64': 4.3.0 tslib: 2.8.1 '@smithy/hash-node@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-utf8': 4.3.3 tslib: 2.8.1 '@smithy/invalid-dependency@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -11597,16 +11373,16 @@ snapshots: '@smithy/middleware-content-length@4.2.4': dependencies: '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/middleware-endpoint@4.3.6': dependencies: - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/middleware-serde': 4.2.4 '@smithy/node-config-provider': 4.3.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/url-parser': 4.2.4 '@smithy/util-middleware': 4.2.4 tslib: 2.8.1 @@ -11617,7 +11393,7 @@ snapshots: '@smithy/protocol-http': 5.3.4 '@smithy/service-error-classification': 4.2.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-middleware': 4.2.4 '@smithy/util-retry': 4.2.4 '@smithy/uuid': 1.1.0 @@ -11626,19 +11402,19 @@ snapshots: '@smithy/middleware-serde@4.2.4': dependencies: '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/middleware-stack@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/node-config-provider@4.3.4': dependencies: '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/node-http-handler@4.4.4': @@ -11646,57 +11422,57 @@ snapshots: '@smithy/abort-controller': 4.2.4 '@smithy/protocol-http': 5.3.4 '@smithy/querystring-builder': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/property-provider@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/protocol-http@5.3.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/querystring-builder@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 '@smithy/querystring-parser@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/service-error-classification@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/shared-ini-file-loader@4.3.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/signature-v4@5.3.4': dependencies: '@smithy/is-array-buffer': 4.2.0 '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-hex-encoding': 4.2.0 '@smithy/util-middleware': 4.2.4 '@smithy/util-uri-escape': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-utf8': 4.3.3 tslib: 2.8.1 '@smithy/smithy-client@4.9.2': dependencies: - '@smithy/core': 3.17.2 + '@smithy/core': 3.24.3 '@smithy/middleware-endpoint': 4.3.6 '@smithy/middleware-stack': 4.2.4 '@smithy/protocol-http': 5.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-stream': 4.5.5 tslib: 2.8.1 @@ -11704,20 +11480,16 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/types@4.8.1': - dependencies: - tslib: 2.8.1 - '@smithy/url-parser@4.2.4': dependencies: '@smithy/querystring-parser': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/util-base64@4.3.0': dependencies: '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-utf8': 4.3.3 tslib: 2.8.1 '@smithy/util-body-length-browser@4.2.0': @@ -11746,7 +11518,7 @@ snapshots: dependencies: '@smithy/property-provider': 4.2.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/util-defaults-mode-node@4.2.8': @@ -11756,13 +11528,13 @@ snapshots: '@smithy/node-config-provider': 4.3.4 '@smithy/property-provider': 4.2.4 '@smithy/smithy-client': 4.9.2 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/util-endpoints@3.2.4': dependencies: '@smithy/node-config-provider': 4.3.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/util-hex-encoding@4.2.0': @@ -11771,24 +11543,24 @@ snapshots: '@smithy/util-middleware@4.2.4': dependencies: - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/util-retry@4.2.4': dependencies: '@smithy/service-error-classification': 4.2.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/util-stream@4.5.5': dependencies: '@smithy/fetch-http-handler': 5.3.5 '@smithy/node-http-handler': 4.4.4 - '@smithy/types': 4.8.1 + '@smithy/types': 4.14.2 '@smithy/util-base64': 4.3.0 '@smithy/util-buffer-from': 4.2.0 '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-utf8': 4.3.3 tslib: 2.8.1 '@smithy/util-uri-escape@4.2.0': @@ -11800,11 +11572,6 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.2.0': - dependencies: - '@smithy/util-buffer-from': 4.2.0 - tslib: 2.8.1 - '@smithy/util-utf8@4.3.3': dependencies: '@smithy/core': 3.24.3 @@ -11864,7 +11631,7 @@ snapshots: '@tailwindcss/oxide@4.1.6': dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 tar: 7.4.3 optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.1.6 @@ -12179,7 +11946,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: '@types/node': 20.19.43 - form-data: 4.0.5 + form-data: 4.0.6 '@types/node-ipc@9.2.3': dependencies: @@ -12374,14 +12141,6 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3))': - dependencies: - '@vitest/spy': 4.1.0 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) - '@vitest/mocker@4.1.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.0 @@ -12493,7 +12252,7 @@ snapshots: cheerio: 1.0.0 cockatiel: 3.2.1 commander: 12.1.0 - form-data: 4.0.4 + form-data: 4.0.6 glob: 11.1.0 hosted-git-info: 4.1.0 jsonc-parser: 3.3.1 @@ -12503,8 +12262,8 @@ snapshots: minimatch: 3.1.2 parse-semver: 1.1.1 read: 1.0.7 - semver: 7.7.2 - tmp: 0.2.3 + semver: 7.7.3 + tmp: 0.2.4 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.5.0 @@ -12543,6 +12302,12 @@ snapshots: acorn@8.15.0: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + agent-base@7.1.3: {} agentkeepalive@4.6.0: @@ -12553,7 +12318,7 @@ snapshots: dependencies: '@ai-sdk/anthropic': 3.0.42(zod@3.25.76) '@ai-sdk/openai': 3.0.27(zod@3.25.76) - '@ai-sdk/openai-compatible': 2.0.37(zod@3.25.76) + '@ai-sdk/openai-compatible': 2.0.47(zod@3.25.76) '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.14(zod@3.25.76) ai: 6.0.77(zod@3.25.76) @@ -12588,10 +12353,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@7.2.0: - dependencies: - environment: 1.1.0 - ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -12753,13 +12514,15 @@ snapshots: aws4fetch@1.0.20: {} - axios@1.16.0: + axios@1.18.0: dependencies: follow-redirects: 1.16.0 - form-data: 4.0.5 + form-data: 4.0.6 + https-proxy-agent: 5.0.1 proxy-from-env: 2.1.0 transitivePeerDependencies: - debug + - supports-color azure-devops-node-api@12.5.0: dependencies: @@ -12834,7 +12597,7 @@ snapshots: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3(supports-color@8.1.1) - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.7.0 on-finished: 2.4.1 qs: 6.15.2 @@ -12950,8 +12713,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} - chalk@5.6.2: {} character-entities-html4@2.1.0: {} @@ -13021,11 +12782,6 @@ snapshots: cli-spinners@3.3.0: {} - cli-truncate@5.1.1: - dependencies: - slice-ansi: 7.1.0 - string-width: 8.1.0 - cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 @@ -13060,7 +12816,7 @@ snapshots: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-dialog': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -13431,8 +13187,6 @@ snapshots: date-fns@4.1.0: {} - dayjs@1.11.13: {} - dayjs@1.11.21: {} debounce@2.2.0: {} @@ -13441,10 +13195,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1: - dependencies: - ms: 2.1.3 - debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -13508,8 +13258,6 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.4: {} - detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -13740,8 +13488,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.43.0: {} - es-toolkit@1.47.0: {} es6-error@4.1.1: {} @@ -13967,8 +13713,6 @@ snapshots: eventemitter3@5.0.4: {} - eventsource-parser@3.0.6: {} - eventsource-parser@3.0.8: {} eventsource@3.0.7: @@ -13978,7 +13722,7 @@ snapshots: exceljs@4.4.0: dependencies: archiver: 5.3.2 - dayjs: 1.11.13 + dayjs: 1.11.21 fast-csv: 4.3.6 jszip: 3.10.1 readable-stream: 3.6.2 @@ -14061,19 +13805,19 @@ snapshots: etag: 1.8.1 finalhandler: 2.1.0 fresh: 2.0.0 - http-errors: 2.0.0 + http-errors: 2.0.1 merge-descriptors: 2.0.0 mime-types: 3.0.1 on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.15.2 range-parser: 1.2.1 router: 2.2.0 send: 1.2.0 serve-static: 2.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: @@ -14173,7 +13917,7 @@ snapshots: escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -14195,17 +13939,13 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.0 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.3.3: {} - flatted@3.4.0: {} - follow-redirects@1.15.9: {} - follow-redirects@1.16.0: {} for-each@0.3.5: @@ -14219,15 +13959,7 @@ snapshots: form-data-encoder@1.7.2: {} - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - form-data@4.0.5: + form-data@4.0.6: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -14336,8 +14068,6 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.3.0: {} - get-east-asian-width@1.6.0: {} get-folder-size@5.0.0: {} @@ -14508,10 +14238,6 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -14653,14 +14379,6 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -14676,6 +14394,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -14701,7 +14426,7 @@ snapshots: i18next@25.2.1(typescript@5.8.3): dependencies: - '@babel/runtime': 7.27.4 + '@babel/runtime': 7.29.7 optionalDependencies: typescript: 5.8.3 @@ -14717,8 +14442,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.4: {} - ignore@7.0.5: {} immediate@3.0.6: {} @@ -14748,28 +14471,28 @@ snapshots: ink@6.6.0(@types/react@18.3.23)(react@19.2.3): dependencies: '@alcalzone/ansi-tokenize': 0.2.3 - ansi-escapes: 7.2.0 + ansi-escapes: 7.3.0 ansi-styles: 6.2.3 auto-bind: 5.0.1 chalk: 5.6.2 cli-boxes: 3.0.0 cli-cursor: 4.0.0 - cli-truncate: 5.1.1 + cli-truncate: 5.2.0 code-excerpt: 4.0.0 - es-toolkit: 1.43.0 + es-toolkit: 1.47.0 indent-string: 5.0.0 is-in-ci: 2.0.0 patch-console: 2.0.0 react: 19.2.3 react-reconciler: 0.33.0(react@19.2.3) signal-exit: 3.0.7 - slice-ansi: 7.1.0 + slice-ansi: 7.1.2 stack-utils: 2.0.6 - string-width: 8.1.0 + string-width: 8.2.1 type-fest: 4.41.0 widest-line: 5.0.0 - wrap-ansi: 9.0.0 - ws: 8.18.3 + wrap-ansi: 9.0.2 + ws: 8.20.1 yoga-layout: 3.2.1 optionalDependencies: '@types/react': 18.3.23 @@ -14799,7 +14522,7 @@ snapshots: dependencies: '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -14889,10 +14612,6 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@5.0.0: - dependencies: - get-east-asian-width: 1.3.0 - is-fullwidth-code-point@5.1.0: dependencies: get-east-asian-width: 1.6.0 @@ -15225,10 +14944,6 @@ snapshots: jwt-decode@4.0.0: {} - katex@0.16.22: - dependencies: - commander: 8.3.0 - katex@0.16.47: dependencies: commander: 8.3.0 @@ -15394,7 +15109,7 @@ snapshots: listr2: 9.0.5 picomatch: 4.0.4 string-argv: 0.3.2 - tinyexec: 1.2.3 + tinyexec: 1.2.4 yaml: 2.9.0 listenercount@1.0.1: {} @@ -15506,8 +15221,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} - lru-cache@11.2.2: {} lru-cache@5.1.1: @@ -15802,7 +15515,7 @@ snapshots: roughjs: 4.6.6 stylis: 4.4.0 ts-dedent: 2.2.0 - uuid: 14.0.0 + uuid: 11.1.1 micromark-core-commonmark@2.0.3: dependencies: @@ -15885,7 +15598,7 @@ snapshots: dependencies: '@types/katex': 0.16.7 devlop: 1.1.0 - katex: 0.16.22 + katex: 0.16.47 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 @@ -16129,7 +15842,7 @@ snapshots: nano-css@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 @@ -16140,8 +15853,6 @@ snapshots: stacktrace-js: 2.0.2 stylis: 4.4.0 - nanoid@3.3.11: {} - nanoid@3.3.12: {} napi-build-utils@2.0.0: @@ -16344,11 +16055,11 @@ snapshots: dependencies: '@vscode/vsce': 3.3.2 commander: 6.2.1 - follow-redirects: 1.15.9 + follow-redirects: 1.16.0 is-ci: 2.0.0 leven: 3.1.0 - semver: 7.7.2 - tmp: 0.2.3 + semver: 7.7.3 + tmp: 0.2.4 yauzl-promise: 4.0.0 transitivePeerDependencies: - bare-buffer @@ -16545,7 +16256,7 @@ snapshots: postcss@8.4.49: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -16568,7 +16279,7 @@ snapshots: prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 @@ -16653,10 +16364,6 @@ snapshots: punycode@2.3.1: {} - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - qs@6.15.2: dependencies: side-channel: 1.1.0 @@ -16671,13 +16378,6 @@ snapshots: range-parser@1.2.1: {} - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - unpipe: 1.0.0 - raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -16705,7 +16405,7 @@ snapshots: react-i18next@15.5.1(i18next@25.2.1(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3): dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.29.7 html-parse-stringify: 3.0.1 i18next: 25.2.1(typescript@5.8.3) react: 18.3.1 @@ -16787,7 +16487,7 @@ snapshots: react-textarea-autosize@8.5.9(@types/react@18.3.23)(react@18.3.1): dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.29.7 react: 18.3.1 use-composed-ref: 1.4.0(@types/react@18.3.23)(react@18.3.1) use-latest: 1.3.0(@types/react@18.3.23)(react@18.3.1) @@ -16926,7 +16626,7 @@ snapshots: '@types/katex': 0.16.7 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 - katex: 0.16.22 + katex: 0.16.47 unist-util-visit-parents: 6.0.1 vfile: 6.0.3 @@ -17204,8 +16904,6 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} - semver@7.7.3: {} send@1.2.0: @@ -17215,12 +16913,12 @@ snapshots: escape-html: 1.0.3 etag: 1.8.1 fresh: 2.0.0 - http-errors: 2.0.0 + http-errors: 2.0.1 mime-types: 3.0.1 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -17362,11 +17060,6 @@ snapshots: slash@3.0.0: {} - slice-ansi@7.1.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.0.0 - slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -17433,8 +17126,6 @@ snapshots: standard-as-callback@2.1.0: {} - statuses@2.0.1: {} - statuses@2.0.2: {} std-env@4.1.0: {} @@ -17475,11 +17166,6 @@ snapshots: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 - string-width@8.1.0: - dependencies: - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.2 - string-width@8.2.1: dependencies: get-east-asian-width: 1.6.0 @@ -17544,10 +17230,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 - strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -17718,15 +17400,8 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.2.3: {} - tinyexec@1.2.4: {} - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -17740,8 +17415,6 @@ snapshots: dependencies: tldts-core: 6.1.86 - tmp@0.2.3: {} - tmp@0.2.4: {} to-regex-range@5.0.1: @@ -17817,7 +17490,7 @@ snapshots: source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.15 @@ -17900,9 +17573,9 @@ snapshots: typed-rest-client@1.8.11: dependencies: - qs: 6.14.0 + qs: 6.15.2 tunnel: 0.0.6 - underscore: 1.13.7 + underscore: 1.13.8 typescript-eslint@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3): dependencies: @@ -17927,8 +17600,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - underscore@1.13.7: {} - underscore@1.13.8: {} undici-types@5.26.5: {} @@ -18101,8 +17772,6 @@ snapshots: uuid@11.1.1: {} - uuid@14.0.0: {} - uuid@8.3.2: {} uuid@9.0.1: {} @@ -18136,21 +17805,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.15 - rolldown: 1.0.3 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 20.19.43 - esbuild: 0.28.1 - fsevents: 2.3.3 - jiti: 2.4.2 - tsx: 4.19.4 - yaml: 2.8.3 - vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 @@ -18166,36 +17820,6 @@ snapshots: tsx: 4.19.4 yaml: 2.9.0 - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.2 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 20.19.43 - '@vitest/ui': 4.1.0(vitest@4.1.0) - jsdom: 26.1.0 - transitivePeerDependencies: - - msw - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.43)(@vitest/ui@4.1.0)(jsdom@26.1.0)(vite@8.0.16(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.0 @@ -18365,12 +17989,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 - wrap-ansi@9.0.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.1.2 - wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 @@ -18379,10 +17997,6 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.2: {} - - ws@8.18.3: {} - ws@8.20.1: {} xml-name-validator@5.0.0: {} @@ -18408,8 +18022,6 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.3: {} - yaml@2.9.0: {} yargs-parser@20.2.9: {} diff --git a/renovate.json b/renovate.json index e86916181e..69ba659080 100644 --- a/renovate.json +++ b/renovate.json @@ -3,6 +3,7 @@ "extends": ["config:best-practices"], "forkProcessing": "enabled", "timezone": "America/Los_Angeles", + "postUpdateOptions": ["pnpmDedupe"], "prConcurrentLimit": 5, "prCreation": "not-pending", "ignoreDeps": ["@vscode/vsce"], From de8886a0ebcef16e91c8d300d3400770a9cac5a3 Mon Sep 17 00:00:00 2001 From: Naved Merchant Date: Sat, 20 Jun 2026 18:16:00 -0700 Subject: [PATCH 09/64] =?UTF-8?q?fix:=20auto-close=20files=20setting=20can?= =?UTF-8?q?not=20be=20unchecked=20=E2=80=94=20always=20reverts=20to=20chec?= =?UTF-8?q?ked=20(#668)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: include auto-close settings in getState and getStateToPostToWebview The autoCloseZooOpenedFiles, autoCloseZooOpenedFilesAfterUserEdited, and autoCloseZooOpenedNewFiles settings were saved to global state but never included in the state posted back to the webview (getStateToPostToWebview) or returned by getState. This caused the checkbox to always revert to checked after saving, and the DiffViewProvider to always use the default value regardless of the user's preference. Also adds a changeset instruction to AGENTS.md. Closes #667 * test: move auto-close settings tests to ClineProvider.spec.ts and assert all three fields Address review comments on PR #668: - Move the auto-close settings test block from ClineProvider.taskHistory.spec.ts to ClineProvider.spec.ts, where existing getState settings coverage (autoCondenseContext, writeDelayMs) already lives. - Expand the getState regression test to assert autoCloseZooOpenedFiles, autoCloseZooOpenedFilesAfterUserEdited, and autoCloseZooOpenedNewFiles so a regression dropping any of the three fields is caught. --- AGENTS.md | 1 + src/core/webview/ClineProvider.ts | 9 ++++ .../webview/__tests__/ClineProvider.spec.ts | 50 +++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index b93d6a76cc..c32cb8c64b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,6 +3,7 @@ This file provides guidance to agents when working with code in this repository. - Settings View Pattern: When working on `SettingsView`, inputs must bind to the local `cachedState`, NOT the live `useExtensionState()`. The `cachedState` acts as a buffer for user edits, isolating them from the `ContextProxy` source-of-truth until the user explicitly clicks "Save". Wiring inputs directly to the live state causes race conditions. +- Changesets: Do NOT create `.changeset` files for each commit or code change. Changesets are managed separately by maintainers and should not be generated by agents during normal development. ## Test Placement Guidance diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 78d7200417..b2bb73e982 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2278,6 +2278,9 @@ export class ClineProvider openRouterImageApiKey, openRouterImageGenerationSelectedModel, lockApiConfigAcrossModes, + autoCloseZooOpenedFiles, + autoCloseZooOpenedFilesAfterUserEdited, + autoCloseZooOpenedNewFiles, } = await this.getState() let cloudOrganizations: CloudOrganizationMembership[] = [] @@ -2457,6 +2460,9 @@ export class ClineProvider imageGenerationProvider, openRouterImageApiKey, openRouterImageGenerationSelectedModel, + autoCloseZooOpenedFiles: autoCloseZooOpenedFiles ?? true, + autoCloseZooOpenedFilesAfterUserEdited: autoCloseZooOpenedFilesAfterUserEdited ?? false, + autoCloseZooOpenedNewFiles: autoCloseZooOpenedNewFiles ?? false, openAiCodexIsAuthenticated: await (async () => { try { const { openAiCodexOAuthManager } = await import("../../integrations/openai-codex/oauth") @@ -2657,6 +2663,9 @@ export class ClineProvider imageGenerationProvider: stateValues.imageGenerationProvider, openRouterImageApiKey: stateValues.openRouterImageApiKey, openRouterImageGenerationSelectedModel: stateValues.openRouterImageGenerationSelectedModel, + autoCloseZooOpenedFiles: stateValues.autoCloseZooOpenedFiles, + autoCloseZooOpenedFilesAfterUserEdited: stateValues.autoCloseZooOpenedFilesAfterUserEdited, + autoCloseZooOpenedNewFiles: stateValues.autoCloseZooOpenedNewFiles, } } diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index e1ddd881b8..158238ce7e 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -1010,6 +1010,56 @@ describe("ClineProvider", () => { expect(mockPostMessage).toHaveBeenCalled() }) + describe("auto-close settings are included in posted state", () => { + it("getStateToPostToWebview returns saved autoCloseZooOpenedFiles value", async () => { + await provider.resolveWebviewView(mockWebviewView) + + // Simulate the updateSettings handler storing the value. + await provider.contextProxy.setValue("autoCloseZooOpenedFiles", false) + await provider.contextProxy.setValue("autoCloseZooOpenedFilesAfterUserEdited", true) + await provider.contextProxy.setValue("autoCloseZooOpenedNewFiles", true) + + const state = await provider.getStateToPostToWebview() + + // The saved values must be present in the state posted to the webview. + expect(state.autoCloseZooOpenedFiles).toBe(false) + expect(state.autoCloseZooOpenedFilesAfterUserEdited).toBe(true) + expect(state.autoCloseZooOpenedNewFiles).toBe(true) + }) + + it("getStateToPostToWebview defaults autoCloseZooOpenedFiles to true when unset", async () => { + await provider.resolveWebviewView(mockWebviewView) + + // Ensure the settings are not set. + await provider.contextProxy.setValue("autoCloseZooOpenedFiles", undefined) + await provider.contextProxy.setValue("autoCloseZooOpenedFilesAfterUserEdited", undefined) + await provider.contextProxy.setValue("autoCloseZooOpenedNewFiles", undefined) + + const state = await provider.getStateToPostToWebview() + + // Unset values should default to their documented defaults. + expect(state.autoCloseZooOpenedFiles).toBe(true) + expect(state.autoCloseZooOpenedFilesAfterUserEdited).toBe(false) + expect(state.autoCloseZooOpenedNewFiles).toBe(false) + }) + + it("getState returns saved autoCloseZooOpenedFiles value for DiffViewProvider", async () => { + await provider.resolveWebviewView(mockWebviewView) + + await provider.contextProxy.setValue("autoCloseZooOpenedFiles", false) + await provider.contextProxy.setValue("autoCloseZooOpenedFilesAfterUserEdited", true) + await provider.contextProxy.setValue("autoCloseZooOpenedNewFiles", true) + + const state = await provider.getState() + + // DiffViewProvider reads from getState(); all three fields must be present + // so a regression that drops any of them is caught. + expect(state.autoCloseZooOpenedFiles).toBe(false) + expect(state.autoCloseZooOpenedFilesAfterUserEdited).toBe(true) + expect(state.autoCloseZooOpenedNewFiles).toBe(true) + }) + }) + it("loads saved API config when switching modes", async () => { await provider.resolveWebviewView(mockWebviewView) const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as any).mock.calls[0][0] From e2fce6c08e7df4d98d6382db215671945379408c Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <263205322+roomote[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 22:43:51 -0400 Subject: [PATCH 10/64] [Feat] Add Roo Code history import to the About page (#141) * feat: adding i18n strings and handling no tasks to import edge case * fix(importRooTaskHistory): validate history_item.json content to prevent path traversal * test(importRooTaskHistory): check that only one import writes atomically * feat(About): translate aria-label --------- Co-authored-by: Elliott de Launay --- packages/types/src/vscode-extension-host.ts | 11 + .../__tests__/importRooTaskHistory.spec.ts | 620 ++++++++++++++++++ .../task-persistence/importRooTaskHistory.ts | 368 +++++++++++ ...iewMessageHandler.importRooHistory.spec.ts | 257 ++++++++ src/core/webview/webviewMessageHandler.ts | 87 +++ src/i18n/locales/ca/common.json | 14 +- src/i18n/locales/de/common.json | 14 +- src/i18n/locales/en/common.json | 12 +- src/i18n/locales/es/common.json | 14 +- src/i18n/locales/fr/common.json | 14 +- src/i18n/locales/hi/common.json | 14 +- src/i18n/locales/id/common.json | 14 +- src/i18n/locales/it/common.json | 14 +- src/i18n/locales/ja/common.json | 14 +- src/i18n/locales/ko/common.json | 14 +- src/i18n/locales/nl/common.json | 14 +- src/i18n/locales/pl/common.json | 14 +- src/i18n/locales/pt-BR/common.json | 14 +- src/i18n/locales/ru/common.json | 14 +- src/i18n/locales/tr/common.json | 14 +- src/i18n/locales/vi/common.json | 14 +- src/i18n/locales/zh-CN/common.json | 14 +- src/i18n/locales/zh-TW/common.json | 14 +- webview-ui/src/components/settings/About.tsx | 154 ++++- .../settings/__tests__/About.spec.tsx | 155 ++++- webview-ui/src/i18n/locales/ca/settings.json | 18 + webview-ui/src/i18n/locales/de/settings.json | 18 + webview-ui/src/i18n/locales/en/settings.json | 18 + webview-ui/src/i18n/locales/es/settings.json | 18 + webview-ui/src/i18n/locales/fr/settings.json | 18 + webview-ui/src/i18n/locales/hi/settings.json | 18 + webview-ui/src/i18n/locales/id/settings.json | 18 + webview-ui/src/i18n/locales/it/settings.json | 18 + webview-ui/src/i18n/locales/ja/settings.json | 18 + webview-ui/src/i18n/locales/ko/settings.json | 18 + webview-ui/src/i18n/locales/nl/settings.json | 18 + webview-ui/src/i18n/locales/pl/settings.json | 18 + .../src/i18n/locales/pt-BR/settings.json | 18 + webview-ui/src/i18n/locales/ru/settings.json | 18 + webview-ui/src/i18n/locales/tr/settings.json | 18 + webview-ui/src/i18n/locales/vi/settings.json | 18 + .../src/i18n/locales/zh-CN/settings.json | 18 + .../src/i18n/locales/zh-TW/settings.json | 18 + 43 files changed, 2185 insertions(+), 41 deletions(-) create mode 100644 src/core/task-persistence/__tests__/importRooTaskHistory.spec.ts create mode 100644 src/core/task-persistence/importRooTaskHistory.ts create mode 100644 src/core/webview/__tests__/webviewMessageHandler.importRooHistory.spec.ts diff --git a/packages/types/src/vscode-extension-host.ts b/packages/types/src/vscode-extension-host.ts index 0f19adcff5..2cf42c342b 100644 --- a/packages/types/src/vscode-extension-host.ts +++ b/packages/types/src/vscode-extension-host.ts @@ -100,6 +100,7 @@ export interface ExtensionMessage { | "folderSelected" | "skills" | "fileContent" + | "rooHistoryImportProgress" text?: string /** For fileContent: { path, content, error? } */ fileContent?: { path: string; content: string | null; error?: string } @@ -178,6 +179,15 @@ export interface ExtensionMessage { tools?: SerializedCustomToolDefinition[] // For customToolsResult skills?: SkillMetadata[] // For skills response modes?: { slug: string; name: string }[] // For modes response + rooHistoryImportProgress?: { + status: "starting" | "copying" | "finished" | "failed" + copiedFileCount: number + totalFileCount: number + importedTaskCount: number + totalTaskCount: number + currentTaskId?: string + currentFileName?: string + } aggregatedCosts?: { // For taskWithAggregatedCosts response totalCost: number @@ -590,6 +600,7 @@ export interface WebviewMessage { | "removeInstalledMarketplaceItem" | "marketplaceInstallResult" | "shareTaskSuccess" + | "importRooHistory" // Skills messages | "requestSkills" | "createSkill" diff --git a/src/core/task-persistence/__tests__/importRooTaskHistory.spec.ts b/src/core/task-persistence/__tests__/importRooTaskHistory.spec.ts new file mode 100644 index 0000000000..017f77a3ec --- /dev/null +++ b/src/core/task-persistence/__tests__/importRooTaskHistory.spec.ts @@ -0,0 +1,620 @@ +import * as fs from "fs/promises" +import * as os from "os" +import * as path from "path" +import * as vscode from "vscode" + +import { + importRooTaskHistory, + isConcurrentDestinationClaimError, + resolveRooHistoryImportPaths, +} from "../importRooTaskHistory" + +vi.mock("vscode", () => ({ + workspace: { + getConfiguration: vi.fn(), + }, +})) + +const makeHistoryItem = (id: string, extra: Record = {}) => + JSON.stringify({ id, number: 1, ts: 1000, task: "t", tokensIn: 0, tokensOut: 0, totalCost: 0, ...extra }) + +describe("importRooTaskHistory", () => { + let tempRoot: string + + const mockStorageConfiguration = ({ + roo = "", + zoo = "", + throwOnRoo = false, + }: { + roo?: string + zoo?: string + throwOnRoo?: boolean + } = {}) => { + const getConfigurationMock = vi.mocked(vscode.workspace.getConfiguration) + + getConfigurationMock.mockImplementation((section?: string) => { + const resolvedSection = section ?? "" + return { + get: vi.fn().mockImplementation(() => { + if (resolvedSection === "roo-cline" && throwOnRoo) { + throw new Error("roo config unavailable") + } + + if (resolvedSection === "roo-cline") { + return roo + } + + if (resolvedSection === "zoo-code") { + return zoo + } + + return "" + }), + } as any + }) + } + + beforeEach(async () => { + tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "roo-history-import-")) + vi.clearAllMocks() + }) + + afterEach(async () => { + await fs.rm(tempRoot, { recursive: true, force: true }) + }) + + it("resolves Roo and Zoo storage roots from extension domains and configured custom paths", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooCustomStoragePath = path.join(tempRoot, "roo-custom") + const zooCustomStoragePath = path.join(tempRoot, "zoo-custom") + + mockStorageConfiguration({ + roo: rooCustomStoragePath, + zoo: zooCustomStoragePath, + }) + + const result = await resolveRooHistoryImportPaths(zooGlobalStoragePath) + + expect(result.rooExtensionDomain).toBe("RooVeterinaryInc.roo-cline") + expect(result.zooExtensionDomain).toBe("ZooCodeOrganization.zoo-code") + expect(result.rooStorageRoots).toEqual([ + path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline"), + rooCustomStoragePath, + ]) + expect(result.zooStorageRoot).toBe(zooCustomStoragePath) + }) + + it("falls back to the default Roo storage root when reading Roo custom storage fails", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + + mockStorageConfiguration({ throwOnRoo: true }) + + const result = await resolveRooHistoryImportPaths(zooGlobalStoragePath) + + expect(result.rooStorageRoots).toEqual([path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline")]) + expect(result.zooStorageRoot).toBe(zooGlobalStoragePath) + }) + + it("dedupes Roo storage roots when the custom path matches the default Roo storage root", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + + mockStorageConfiguration({ roo: rooDefaultStorageRoot }) + + const result = await resolveRooHistoryImportPaths(zooGlobalStoragePath) + + expect(result.rooStorageRoots).toEqual([rooDefaultStorageRoot]) + }) + + it("copies Roo task directories into the active Zoo storage root", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + const rooCustomStorageRoot = path.join(tempRoot, "roo-custom") + const zooCustomStorageRoot = path.join(tempRoot, "zoo-custom") + + mockStorageConfiguration({ + roo: rooCustomStorageRoot, + zoo: zooCustomStorageRoot, + }) + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-default"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-default", "history_item.json"), + makeHistoryItem("task-default"), + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-default", "ui_messages.json"), "default") + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "_index.json"), "{}") + + await fs.mkdir(path.join(rooCustomStorageRoot, "tasks", "task-custom"), { recursive: true }) + await fs.writeFile( + path.join(rooCustomStorageRoot, "tasks", "task-custom", "history_item.json"), + makeHistoryItem("task-custom"), + ) + await fs.writeFile( + path.join(rooCustomStorageRoot, "tasks", "task-custom", "api_conversation_history.json"), + "custom", + ) + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.foundTaskCount).toBe(2) + expect(result.importedTaskCount).toBe(2) + expect(result.importedFileCount).toBe(4) + expect( + await fs.readFile(path.join(zooCustomStorageRoot, "tasks", "task-default", "ui_messages.json"), "utf8"), + ).toBe("default") + expect( + await fs.readFile( + path.join(zooCustomStorageRoot, "tasks", "task-custom", "api_conversation_history.json"), + "utf8", + ), + ).toBe("custom") + await expect(fs.access(path.join(zooCustomStorageRoot, "tasks", "_index.json"))).rejects.toMatchObject({ + code: "ENOENT", + }) + }) + + it("does not overwrite an existing Zoo task directory when the same Roo history is imported again", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + + mockStorageConfiguration() + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-repeat"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-repeat", "history_item.json"), + makeHistoryItem("task-repeat", { source: "first-import" }), + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-repeat", "ui_messages.json"), "first-ui") + + const firstImportResult = await importRooTaskHistory(zooGlobalStoragePath) + + expect(firstImportResult.importedTaskCount).toBe(1) + expect(firstImportResult.importedFileCount).toBe(2) + + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-repeat", "history_item.json"), + makeHistoryItem("task-repeat", { source: "second-import" }), + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-repeat", "ui_messages.json"), "second-ui") + + const secondImportResult = await importRooTaskHistory(zooGlobalStoragePath) + + expect(secondImportResult.foundTaskCount).toBe(1) + expect(secondImportResult.importedTaskCount).toBe(0) + expect(secondImportResult.importedFileCount).toBe(0) + expect( + await fs.readFile(path.join(zooGlobalStoragePath, "tasks", "task-repeat", "history_item.json"), "utf8"), + ).toBe(makeHistoryItem("task-repeat", { source: "first-import" })) + expect( + await fs.readFile(path.join(zooGlobalStoragePath, "tasks", "task-repeat", "ui_messages.json"), "utf8"), + ).toBe("first-ui") + }) + + it("deterministically keeps the first importable Roo task when duplicate task IDs exist across roots", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + const rooCustomStorageRoot = path.join(tempRoot, "roo-custom") + + mockStorageConfiguration({ roo: rooCustomStorageRoot }) + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-shared"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-shared", "history_item.json"), + makeHistoryItem("task-shared", { source: "default-root" }), + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-shared", "ui_messages.json"), "default-ui") + + await fs.mkdir(path.join(rooCustomStorageRoot, "tasks", "task-shared"), { recursive: true }) + await fs.writeFile( + path.join(rooCustomStorageRoot, "tasks", "task-shared", "history_item.json"), + makeHistoryItem("task-shared", { source: "custom-root" }), + ) + await fs.writeFile(path.join(rooCustomStorageRoot, "tasks", "task-shared", "ui_messages.json"), "custom-ui") + + await fs.mkdir(path.join(rooCustomStorageRoot, "tasks", "task-custom-only"), { recursive: true }) + await fs.writeFile( + path.join(rooCustomStorageRoot, "tasks", "task-custom-only", "history_item.json"), + makeHistoryItem("task-custom-only", { source: "custom-root" }), + ) + await fs.writeFile( + path.join(rooCustomStorageRoot, "tasks", "task-custom-only", "ui_messages.json"), + "custom-only-ui", + ) + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.importedTaskCount).toBe(2) + expect(result.importedFileCount).toBe(4) + expect( + await fs.readFile(path.join(zooGlobalStoragePath, "tasks", "task-shared", "history_item.json"), "utf8"), + ).toBe(makeHistoryItem("task-shared", { source: "default-root" })) + expect( + await fs.readFile(path.join(zooGlobalStoragePath, "tasks", "task-shared", "ui_messages.json"), "utf8"), + ).toBe("default-ui") + expect( + await fs.readFile( + path.join(zooGlobalStoragePath, "tasks", "task-custom-only", "history_item.json"), + "utf8", + ), + ).toBe(makeHistoryItem("task-custom-only", { source: "custom-root" })) + }) + + it("reports Roo history import progress as files are copied", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + const onProgress = vi.fn() + + mockStorageConfiguration() + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-progress"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-progress", "history_item.json"), + makeHistoryItem("task-progress"), + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-progress", "ui_messages.json"), "ui") + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-progress", "api_conversation_history.json"), + "api", + ) + + await importRooTaskHistory(zooGlobalStoragePath, onProgress) + + expect(onProgress.mock.calls).toEqual([ + [ + { + copiedFileCount: 0, + totalFileCount: 3, + importedTaskCount: 0, + totalTaskCount: 1, + currentTaskId: undefined, + currentFileName: undefined, + }, + ], + [ + { + copiedFileCount: 1, + totalFileCount: 3, + importedTaskCount: 1, + totalTaskCount: 1, + currentTaskId: "task-progress", + currentFileName: "history_item.json", + }, + ], + [ + { + copiedFileCount: 2, + totalFileCount: 3, + importedTaskCount: 1, + totalTaskCount: 1, + currentTaskId: "task-progress", + currentFileName: "ui_messages.json", + }, + ], + [ + { + copiedFileCount: 3, + totalFileCount: 3, + importedTaskCount: 1, + totalTaskCount: 1, + currentTaskId: "task-progress", + currentFileName: "api_conversation_history.json", + }, + ], + ]) + }) + + it("imports only top-level task history files and skips checkpoint directories", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + const zooCustomStorageRoot = path.join(tempRoot, "shared-storage") + + mockStorageConfiguration({ + roo: zooCustomStorageRoot, + zoo: zooCustomStorageRoot, + }) + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-visible", "checkpoints", ".git", "objects"), { + recursive: true, + }) + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", ".task-hidden"), { recursive: true }) + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "_task-hidden"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-visible", "history_item.json"), + makeHistoryItem("task-visible"), + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-visible", "ui_messages.json"), "visible-ui") + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-visible", "api_conversation_history.json"), + "visible-api", + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-visible", "task_metadata.json"), "metadata") + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "loose.json"), "loose") + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-visible", "checkpoints", ".git", "objects", "object"), + "git-object", + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", ".task-hidden", "history_item.json"), "hidden-dir") + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "_task-hidden", "history_item.json"), "hidden-dir") + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.rooStorageRoots).toEqual([rooDefaultStorageRoot]) + expect(result.importedTaskCount).toBe(1) + expect(result.importedFileCount).toBe(4) + expect( + await fs.readFile(path.join(zooCustomStorageRoot, "tasks", "task-visible", "ui_messages.json"), "utf8"), + ).toBe("visible-ui") + expect( + await fs.readFile( + path.join(zooCustomStorageRoot, "tasks", "task-visible", "api_conversation_history.json"), + "utf8", + ), + ).toBe("visible-api") + expect( + await fs.readFile(path.join(zooCustomStorageRoot, "tasks", "task-visible", "task_metadata.json"), "utf8"), + ).toBe("metadata") + await expect(fs.access(path.join(zooCustomStorageRoot, "tasks", ".task-hidden"))).rejects.toMatchObject({ + code: "ENOENT", + }) + await expect(fs.access(path.join(zooCustomStorageRoot, "tasks", "_task-hidden"))).rejects.toMatchObject({ + code: "ENOENT", + }) + await expect( + fs.access( + path.join(zooCustomStorageRoot, "tasks", "task-visible", "checkpoints", ".git", "objects", "object"), + ), + ).rejects.toMatchObject({ + code: "ENOENT", + }) + await expect(fs.access(path.join(zooCustomStorageRoot, "tasks", "loose.json"))).rejects.toMatchObject({ + code: "ENOENT", + }) + }) + + it("ignores missing Roo task roots while still importing from available roots", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + const rooMissingCustomStorageRoot = path.join(tempRoot, "roo-missing") + + mockStorageConfiguration({ roo: rooMissingCustomStorageRoot }) + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-default"), { recursive: true }) + const taskDefaultHistoryJson = JSON.stringify({ + id: "task-default", + number: 1, + ts: 1000, + task: "t", + tokensIn: 0, + tokensOut: 0, + totalCost: 0, + }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-default", "history_item.json"), + taskDefaultHistoryJson, + ) + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.rooStorageRoots).toEqual([rooDefaultStorageRoot, rooMissingCustomStorageRoot]) + expect(result.importedTaskCount).toBe(1) + expect(result.importedFileCount).toBe(1) + expect( + await fs.readFile(path.join(zooGlobalStoragePath, "tasks", "task-default", "history_item.json"), "utf8"), + ).toBe(taskDefaultHistoryJson) + }) + + it("skips tasks that do not have an importable history_item.json", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + + mockStorageConfiguration() + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-missing-history"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-missing-history", "ui_messages.json"), + "ui only", + ) + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.importedTaskCount).toBe(0) + expect(result.importedFileCount).toBe(0) + await expect(fs.access(path.join(zooGlobalStoragePath, "tasks", "task-missing-history"))).rejects.toMatchObject( + { + code: "ENOENT", + }, + ) + }) + + it("does not delete an existing Zoo task when the Roo task is missing history_item.json", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + const existingZooTaskDirectory = path.join(zooGlobalStoragePath, "tasks", "task-existing") + + mockStorageConfiguration() + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-existing"), { recursive: true }) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-existing", "ui_messages.json"), "ui only") + await fs.mkdir(existingZooTaskDirectory, { recursive: true }) + await fs.writeFile(path.join(existingZooTaskDirectory, "history_item.json"), "existing") + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.importedTaskCount).toBe(0) + expect(result.importedFileCount).toBe(0) + expect(await fs.readFile(path.join(existingZooTaskDirectory, "history_item.json"), "utf8")).toBe("existing") + }) + + it("does not overwrite an existing Zoo task when the Roo task is otherwise importable", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + const existingZooTaskDirectory = path.join(zooGlobalStoragePath, "tasks", "task-existing") + + mockStorageConfiguration() + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-existing"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-existing", "history_item.json"), + makeHistoryItem("task-existing", { source: "roo" }), + ) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks", "task-existing", "ui_messages.json"), "roo-ui") + await fs.mkdir(existingZooTaskDirectory, { recursive: true }) + await fs.writeFile(path.join(existingZooTaskDirectory, "history_item.json"), "existing") + await fs.writeFile(path.join(existingZooTaskDirectory, "ui_messages.json"), "existing-ui") + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.importedTaskCount).toBe(0) + expect(result.importedFileCount).toBe(0) + expect(await fs.readFile(path.join(existingZooTaskDirectory, "history_item.json"), "utf8")).toBe("existing") + expect(await fs.readFile(path.join(existingZooTaskDirectory, "ui_messages.json"), "utf8")).toBe("existing-ui") + }) + + it("rejects task IDs containing dots or underscore prefixes to prevent traversal", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + + mockStorageConfiguration() + + // These directory names look like valid FS entries but should be rejected. + // (Slash/backslash can't exist in directory names on Linux/Mac/Windows.) + const unsafeCandidates = ["task.id", ".hidden-task", "_reserved-task"] + for (const name of unsafeCandidates) { + const dir = path.join(rooDefaultStorageRoot, "tasks", name) + await fs.mkdir(dir, { recursive: true }) + await fs.writeFile(path.join(dir, "history_item.json"), "unsafe") + } + + // A safe task alongside unsafe ones should still be imported. + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-safe"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-safe", "history_item.json"), + makeHistoryItem("task-safe"), + ) + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.importedTaskCount).toBe(1) + for (const name of unsafeCandidates) { + await expect(fs.access(path.join(zooGlobalStoragePath, "tasks", name))).rejects.toMatchObject({ + code: "ENOENT", + }) + } + }) + + it("rejects tasks whose history_item.json id field does not match the directory name or contains unsafe characters", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + + mockStorageConfiguration() + + // id mismatches the directory name — could drive path traversal in TaskHistoryStore + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-mismatch"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-mismatch", "history_item.json"), + makeHistoryItem("different-task-id"), + ) + + // id contains a path traversal sequence + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-traversal"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-traversal", "history_item.json"), + makeHistoryItem("../../evil"), + ) + + // id fails schema validation (not a valid HistoryItem) + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-invalid-schema"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-invalid-schema", "history_item.json"), + JSON.stringify({ id: "task-invalid-schema" }), + ) + + // A task with a correct, schema-valid id should still import. + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-valid"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-valid", "history_item.json"), + makeHistoryItem("task-valid"), + ) + + const result = await importRooTaskHistory(zooGlobalStoragePath) + + expect(result.importedTaskCount).toBe(1) + await expect(fs.access(path.join(zooGlobalStoragePath, "tasks", "task-mismatch"))).rejects.toMatchObject({ + code: "ENOENT", + }) + await expect(fs.access(path.join(zooGlobalStoragePath, "tasks", "task-traversal"))).rejects.toMatchObject({ + code: "ENOENT", + }) + await expect(fs.access(path.join(zooGlobalStoragePath, "tasks", "task-invalid-schema"))).rejects.toMatchObject({ + code: "ENOENT", + }) + await expect(fs.access(path.join(zooGlobalStoragePath, "tasks", "task-valid"))).resolves.toBeUndefined() + }) + + it("rethrows unexpected task-root errors while importing Roo history", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + + mockStorageConfiguration() + + await fs.mkdir(rooDefaultStorageRoot, { recursive: true }) + await fs.writeFile(path.join(rooDefaultStorageRoot, "tasks"), "not a directory") + + await expect(importRooTaskHistory(zooGlobalStoragePath)).rejects.toMatchObject({ + code: "ENOTDIR", + }) + }) + + it("treats Windows EPERM rename as a concurrent destination claim only when the destination exists", () => { + const error = new Error("operation not permitted") as NodeJS.ErrnoException + error.code = "EPERM" + + expect(isConcurrentDestinationClaimError(error, true)).toBe(true) + expect(isConcurrentDestinationClaimError(error, false)).toBe(false) + }) + + it("imports the complete file set when two calls run concurrently against the same Roo task", async () => { + const zooGlobalStoragePath = path.join(tempRoot, "globalStorage", "zoocodeorganization.zoo-code") + const rooDefaultStorageRoot = path.join(tempRoot, "globalStorage", "rooveterinaryinc.roo-cline") + + mockStorageConfiguration() + + await fs.mkdir(path.join(rooDefaultStorageRoot, "tasks", "task-concurrent"), { recursive: true }) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-concurrent", "history_item.json"), + makeHistoryItem("task-concurrent"), + ) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-concurrent", "ui_messages.json"), + "concurrent-ui", + ) + await fs.writeFile( + path.join(rooDefaultStorageRoot, "tasks", "task-concurrent", "api_conversation_history.json"), + "concurrent-api", + ) + + const [result1, result2] = await Promise.all([ + importRooTaskHistory(zooGlobalStoragePath), + importRooTaskHistory(zooGlobalStoragePath), + ]) + + // Exactly one call should win the atomic rename; the other should skip gracefully. + expect(result1.importedTaskCount + result2.importedTaskCount).toBe(1) + + const destTaskDir = path.join(zooGlobalStoragePath, "tasks", "task-concurrent") + + // The winning import must have written all three files completely. + expect(await fs.readFile(path.join(destTaskDir, "history_item.json"), "utf8")).toBe( + makeHistoryItem("task-concurrent"), + ) + expect(await fs.readFile(path.join(destTaskDir, "ui_messages.json"), "utf8")).toBe("concurrent-ui") + expect(await fs.readFile(path.join(destTaskDir, "api_conversation_history.json"), "utf8")).toBe( + "concurrent-api", + ) + + // No staging directories should be left behind. + const tasksEntries = await fs.readdir(path.join(zooGlobalStoragePath, "tasks")) + expect(tasksEntries.filter((e) => e.startsWith("_staging_"))).toHaveLength(0) + }) +}) diff --git a/src/core/task-persistence/importRooTaskHistory.ts b/src/core/task-persistence/importRooTaskHistory.ts new file mode 100644 index 0000000000..92dc1cafa7 --- /dev/null +++ b/src/core/task-persistence/importRooTaskHistory.ts @@ -0,0 +1,368 @@ +import type { Dirent } from "fs" +import * as fs from "fs/promises" +import * as path from "path" +import * as vscode from "vscode" + +import { historyItemSchema } from "@roo-code/types" + +import { GlobalFileNames } from "../../shared/globalFileNames" +import { Package } from "../../shared/package" +import { getStorageBasePath } from "../../utils/storage" + +const ROO_EXTENSION_DOMAIN = "RooVeterinaryInc.roo-cline" +const ROO_STORAGE_DIRECTORY = ROO_EXTENSION_DOMAIN.toLowerCase() +const ROO_CONFIGURATION_SECTION = "roo-cline" +const IMPORTABLE_TASK_FILE_NAMES = [ + GlobalFileNames.historyItem, + GlobalFileNames.uiMessages, + GlobalFileNames.apiConversationHistory, + GlobalFileNames.taskMetadata, +] + +// Reject task IDs that could cause path traversal or filesystem confusion. +// Valid Roo task IDs are Unix-millisecond timestamps (all digits), but we +// conservatively allow any name that doesn't contain path separators or dots, +// and doesn't start with a hidden/reserved prefix. +const UNSAFE_TASK_ID_RE = /[/\\.]|^_/ + +export interface RooHistoryImportPaths { + rooExtensionDomain: string + zooExtensionDomain: string + rooStorageRoots: string[] + zooStorageRoot: string +} + +export interface RooHistoryImportResult extends RooHistoryImportPaths { + foundTaskCount: number + importedTaskCount: number + importedFileCount: number +} + +export interface RooHistoryImportProgress { + copiedFileCount: number + totalFileCount: number + importedTaskCount: number + totalTaskCount: number + currentTaskId?: string + currentFileName?: string +} + +interface ImportableTaskPlan { + taskId: string + sourceTaskDirectory: string + fileNames: string[] +} + +const toComparablePath = (candidatePath: string) => { + const resolvedPath = path.resolve(candidatePath) + return process.platform === "win32" ? resolvedPath.toLowerCase() : resolvedPath +} + +const dedupePaths = (paths: string[]) => { + const seen = new Set() + return paths.filter((candidatePath) => { + const comparablePath = toComparablePath(candidatePath) + if (seen.has(comparablePath)) { + return false + } + seen.add(comparablePath) + return true + }) +} + +const getConfiguredCustomStoragePath = (configurationSection: string) => { + try { + const configuredPath = vscode.workspace + .getConfiguration(configurationSection) + .get("customStoragePath", "") + .trim() + return configuredPath || undefined + } catch { + return undefined + } +} + +// Only treat missing files as skippable — permission errors should propagate. +const isAbsent = (error: unknown) => (error as NodeJS.ErrnoException).code === "ENOENT" + +// Validate that history_item.json parses as a HistoryItem and that its `id` +// field matches the task directory name. Prevents imported metadata from +// driving unsafe path operations downstream (TaskHistoryStore uses item.id +// directly in path.join calls). +const validateHistoryItem = async (filePath: string, expectedTaskId: string): Promise => { + try { + const raw = await fs.readFile(filePath, "utf8") + const parsed = historyItemSchema.safeParse(JSON.parse(raw)) + if (!parsed.success) { + return false + } + return parsed.data.id === expectedTaskId && !UNSAFE_TASK_ID_RE.test(parsed.data.id) + } catch { + return false + } +} + +const isRegularFile = async (filePath: string): Promise => { + try { + const stat = await fs.lstat(filePath) + return stat.isFile() + } catch { + return false + } +} + +const copyTaskFileIfPresent = async ( + sourceTaskDirectory: string, + stagingTaskDirectory: string, + fileName: string, +): Promise => { + const sourcePath = path.join(sourceTaskDirectory, fileName) + + if (!(await isRegularFile(sourcePath))) { + return false + } + + await fs.mkdir(stagingTaskDirectory, { recursive: true }) + await fs.copyFile(sourcePath, path.join(stagingTaskDirectory, fileName)) + return true +} + +const pathExists = async (candidatePath: string) => { + try { + await fs.access(candidatePath) + return true + } catch { + return false + } +} + +export const isConcurrentDestinationClaimError = (error: unknown, destinationWasClaimed: boolean) => { + const nodeError = error as NodeJS.ErrnoException + return ( + destinationWasClaimed && + (nodeError.code === "EEXIST" || nodeError.code === "ENOTEMPTY" || nodeError.code === "EPERM") + ) +} + +const getImportableTaskFileNames = async (sourceTaskDirectory: string) => { + const fileNames: string[] = [] + + for (const fileName of IMPORTABLE_TASK_FILE_NAMES) { + try { + const filePath = path.join(sourceTaskDirectory, fileName) + if (await isRegularFile(filePath)) { + fileNames.push(fileName) + } + } catch (error) { + if (isAbsent(error)) { + continue + } + throw error + } + } + + return fileNames +} + +const collectImportableTaskPlans = async (sourceRoots: string[]) => { + const taskPlans: ImportableTaskPlan[] = [] + const taskIds = new Set() + + for (const sourceRoot of sourceRoots) { + const sourceTasksRoot = path.join(sourceRoot, "tasks") + let entries: Dirent[] + + try { + entries = await fs.readdir(sourceTasksRoot, { withFileTypes: true }) + } catch (error) { + const nodeError = error as NodeJS.ErrnoException + if (nodeError.code === "ENOENT") { + continue + } + throw error + } + + for (const entry of entries) { + if (!entry.isDirectory() || UNSAFE_TASK_ID_RE.test(entry.name)) { + continue + } + + // Preserve source-root priority: the first importable occurrence of a task ID wins. + if (taskIds.has(entry.name)) { + continue + } + + const sourceTaskDirectory = path.join(sourceTasksRoot, entry.name) + const fileNames = await getImportableTaskFileNames(sourceTaskDirectory) + + if (!fileNames.includes(GlobalFileNames.historyItem)) { + continue + } + + taskPlans.push({ + taskId: entry.name, + sourceTaskDirectory, + fileNames, + }) + taskIds.add(entry.name) + } + } + + return { + taskPlans, + totalTaskCount: taskPlans.length, + } +} + +export const resolveRooHistoryImportPaths = async (globalStoragePath: string): Promise => { + const zooExtensionDomain = `${Package.publisher}.${Package.name}` + const zooStorageRoot = await getStorageBasePath(globalStoragePath) + const rooDefaultStorageRoot = path.join(path.dirname(globalStoragePath), ROO_STORAGE_DIRECTORY) + const rooCustomStorageRoot = getConfiguredCustomStoragePath(ROO_CONFIGURATION_SECTION) + + return { + rooExtensionDomain: ROO_EXTENSION_DOMAIN, + zooExtensionDomain, + rooStorageRoots: dedupePaths([rooDefaultStorageRoot, ...(rooCustomStorageRoot ? [rooCustomStorageRoot] : [])]), + zooStorageRoot, + } +} + +export const importRooTaskHistory = async ( + globalStoragePath: string, + onProgress?: (progress: RooHistoryImportProgress) => Promise | void, +): Promise => { + const paths = await resolveRooHistoryImportPaths(globalStoragePath) + const destinationComparablePath = toComparablePath(paths.zooStorageRoot) + const sourceRoots = paths.rooStorageRoots.filter( + (sourceRoot) => toComparablePath(sourceRoot) !== destinationComparablePath, + ) + const destinationTasksRoot = path.join(paths.zooStorageRoot, "tasks") + const { taskPlans, totalTaskCount: foundTaskCount } = await collectImportableTaskPlans(sourceRoots) + const importedTaskIds = new Set() + let importedFileCount = 0 + let copiedFileCount = 0 + let stagingFileCount = 0 + // Tracks tasks whose history_item has been staged but not yet atomically + // promoted — used so progress reports show 1-based task count during copy. + let inFlightTaskCount = 0 + const importableTaskPlans: ImportableTaskPlan[] = [] + + await fs.mkdir(destinationTasksRoot, { recursive: true }) + + for (const taskPlan of taskPlans) { + const destinationTaskDirectory = path.join(destinationTasksRoot, taskPlan.taskId) + if (await pathExists(destinationTaskDirectory)) { + continue + } + + importableTaskPlans.push(taskPlan) + } + + const totalTaskCount = importableTaskPlans.length + let totalFileCount = importableTaskPlans.reduce((count, taskPlan) => count + taskPlan.fileNames.length, 0) + + const reportProgress = async (currentTaskId?: string, currentFileName?: string) => { + if (!onProgress) { + return + } + + await onProgress({ + copiedFileCount, + totalFileCount, + importedTaskCount: importedTaskIds.size + inFlightTaskCount, + totalTaskCount, + currentTaskId, + currentFileName, + }) + } + + await reportProgress() + + for (const taskPlan of importableTaskPlans) { + const destinationTaskDirectory = path.join(destinationTasksRoot, taskPlan.taskId) + + // Re-check under the loop — a concurrent import may have claimed this task. + if (await pathExists(destinationTaskDirectory)) { + totalFileCount -= taskPlan.fileNames.length + continue + } + + // Stage into a unique temp directory, then atomically rename to avoid + // leaving partial task directories that a retry would skip as already-present. + // Using mkdtemp ensures concurrent imports for the same task ID don't collide. + const stagingDirectory = await fs.mkdtemp(path.join(destinationTasksRoot, `_staging_${taskPlan.taskId}_`)) + stagingFileCount = 0 + + try { + const historyItemCopied = await copyTaskFileIfPresent( + taskPlan.sourceTaskDirectory, + stagingDirectory, + GlobalFileNames.historyItem, + ) + + if (!historyItemCopied) { + totalFileCount -= taskPlan.fileNames.length + await reportProgress(taskPlan.taskId, GlobalFileNames.historyItem) + continue + } + + // Validate the staged history_item.json: it must parse as a valid + // HistoryItem and its id must match the directory name exactly. + const stagedHistoryItemPath = path.join(stagingDirectory, GlobalFileNames.historyItem) + if (!(await validateHistoryItem(stagedHistoryItemPath, taskPlan.taskId))) { + totalFileCount -= taskPlan.fileNames.length + await reportProgress(taskPlan.taskId, GlobalFileNames.historyItem) + continue + } + + stagingFileCount += 1 + copiedFileCount += 1 + inFlightTaskCount = 1 + await reportProgress(taskPlan.taskId, GlobalFileNames.historyItem) + + for (const fileName of taskPlan.fileNames) { + if (fileName === GlobalFileNames.historyItem) { + continue + } + + if (await copyTaskFileIfPresent(taskPlan.sourceTaskDirectory, stagingDirectory, fileName)) { + stagingFileCount += 1 + copiedFileCount += 1 + } else { + totalFileCount -= 1 + } + + await reportProgress(taskPlan.taskId, fileName) + } + + // Atomic promotion: rename staging → destination. + // If destination was concurrently created, treat it as a skip. + try { + await fs.rename(stagingDirectory, destinationTaskDirectory) + importedTaskIds.add(taskPlan.taskId) + importedFileCount += stagingFileCount + } catch (renameError) { + const destinationWasClaimed = await pathExists(destinationTaskDirectory) + if (!isConcurrentDestinationClaimError(renameError, destinationWasClaimed)) { + throw renameError + } + // Destination claimed concurrently — discard staging, uncount progress. + copiedFileCount -= stagingFileCount + totalFileCount -= taskPlan.fileNames.length + } finally { + inFlightTaskCount = 0 + } + } finally { + await fs.rm(stagingDirectory, { recursive: true, force: true }) + } + } + + return { + ...paths, + rooStorageRoots: sourceRoots, + foundTaskCount, + importedTaskCount: importedTaskIds.size, + importedFileCount, + } +} diff --git a/src/core/webview/__tests__/webviewMessageHandler.importRooHistory.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.importRooHistory.spec.ts new file mode 100644 index 0000000000..df85ff1df4 --- /dev/null +++ b/src/core/webview/__tests__/webviewMessageHandler.importRooHistory.spec.ts @@ -0,0 +1,257 @@ +import { beforeEach, describe, expect, it, vi } from "vitest" + +vi.mock("../../../i18n", () => ({ + t: vi.fn((key: string) => key), + changeLanguage: vi.fn(), +})) + +import { webviewMessageHandler } from "../webviewMessageHandler" +import type { ClineProvider } from "../ClineProvider" + +vi.mock("vscode", () => ({ + window: { + showErrorMessage: vi.fn(), + showWarningMessage: vi.fn(), + showInformationMessage: vi.fn(), + }, + workspace: { + workspaceFolders: undefined, + getConfiguration: vi.fn(() => ({ + get: vi.fn(), + update: vi.fn(), + })), + }, + env: { + clipboard: { writeText: vi.fn() }, + openExternal: vi.fn(), + }, + commands: { + executeCommand: vi.fn(), + }, + Uri: { + parse: vi.fn((s: string) => ({ toString: () => s })), + file: vi.fn((p: string) => ({ fsPath: p })), + }, + ConfigurationTarget: { + Global: 1, + Workspace: 2, + WorkspaceFolder: 3, + }, +})) + +const importRooTaskHistoryMock = vi.fn() +vi.mock("../../task-persistence/importRooTaskHistory", () => ({ + importRooTaskHistory: (...args: any[]) => importRooTaskHistoryMock(...args), +})) + +import * as vscode from "vscode" + +describe("webviewMessageHandler - importRooHistory", () => { + let mockProvider: ClineProvider & { + contextProxy: any + taskHistoryStore: { + invalidateAll: ReturnType + reconcile: ReturnType + flushIndex: ReturnType + } + postMessageToWebview: ReturnType + postStateToWebview: ReturnType + log: ReturnType + } + + beforeEach(() => { + vi.clearAllMocks() + + mockProvider = { + contextProxy: { + getValue: vi.fn(), + setValue: vi.fn(), + globalStorageUri: { fsPath: "/mock/storage" }, + }, + taskHistoryStore: { + invalidateAll: vi.fn(), + reconcile: vi.fn().mockResolvedValue(undefined), + flushIndex: vi.fn().mockResolvedValue(undefined), + }, + postMessageToWebview: vi.fn().mockResolvedValue(undefined), + postStateToWebview: vi.fn().mockResolvedValue(undefined), + log: vi.fn(), + } as any + }) + + it("refreshes task history, streams progress, and shows a success message after importing Roo history", async () => { + importRooTaskHistoryMock.mockImplementation(async (_globalStoragePath, onProgress) => { + await onProgress?.({ + copiedFileCount: 2, + totalFileCount: 4, + importedTaskCount: 1, + totalTaskCount: 2, + currentTaskId: "task-1", + currentFileName: "ui_messages.json", + }) + + return { + rooExtensionDomain: "RooVeterinaryInc.roo-cline", + zooExtensionDomain: "ZooCodeOrganization.zoo-code", + rooStorageRoots: ["/mock/roo-storage"], + zooStorageRoot: "/mock/storage", + foundTaskCount: 2, + importedTaskCount: 2, + importedFileCount: 4, + } + }) + + await webviewMessageHandler(mockProvider as any, { type: "importRooHistory" } as any) + + expect(importRooTaskHistoryMock).toHaveBeenCalledWith("/mock/storage", expect.any(Function)) + expect(mockProvider.taskHistoryStore.invalidateAll).toHaveBeenCalledTimes(1) + expect(mockProvider.taskHistoryStore.reconcile).toHaveBeenCalledTimes(1) + expect(mockProvider.taskHistoryStore.flushIndex).toHaveBeenCalledTimes(1) + expect(mockProvider.postStateToWebview).toHaveBeenCalledTimes(1) + expect(mockProvider.postMessageToWebview).toHaveBeenNthCalledWith(1, { + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "starting", + copiedFileCount: 0, + totalFileCount: 0, + importedTaskCount: 0, + totalTaskCount: 0, + }, + }) + expect(mockProvider.postMessageToWebview).toHaveBeenNthCalledWith(2, { + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "copying", + copiedFileCount: 2, + totalFileCount: 4, + importedTaskCount: 1, + totalTaskCount: 2, + currentTaskId: "task-1", + currentFileName: "ui_messages.json", + }, + }) + expect(mockProvider.postMessageToWebview).toHaveBeenNthCalledWith(3, { + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "finished", + copiedFileCount: 4, + totalFileCount: 4, + importedTaskCount: 2, + totalTaskCount: 2, + currentTaskId: "task-1", + currentFileName: "ui_messages.json", + }, + }) + expect(vscode.window.showInformationMessage).toHaveBeenCalledWith("common:info.rooHistoryImport.success") + expect(vscode.window.showWarningMessage).not.toHaveBeenCalled() + }) + + it("uses the singular success message when one Roo task history is imported", async () => { + importRooTaskHistoryMock.mockResolvedValue({ + rooExtensionDomain: "RooVeterinaryInc.roo-cline", + zooExtensionDomain: "ZooCodeOrganization.zoo-code", + rooStorageRoots: ["/mock/roo-storage"], + zooStorageRoot: "/mock/storage", + foundTaskCount: 1, + importedTaskCount: 1, + importedFileCount: 2, + }) + + await webviewMessageHandler(mockProvider as any, { type: "importRooHistory" } as any) + + expect(vscode.window.showInformationMessage).toHaveBeenCalledWith("common:info.rooHistoryImport.success") + expect(mockProvider.postMessageToWebview).toHaveBeenNthCalledWith(2, { + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "finished", + copiedFileCount: 2, + totalFileCount: 2, + importedTaskCount: 1, + totalTaskCount: 1, + }, + }) + expect(vscode.window.showWarningMessage).not.toHaveBeenCalled() + }) + + it("shows a 'not found' warning when no Roo history exists at all", async () => { + importRooTaskHistoryMock.mockResolvedValue({ + rooExtensionDomain: "RooVeterinaryInc.roo-cline", + zooExtensionDomain: "ZooCodeOrganization.zoo-code", + rooStorageRoots: ["/mock/roo-storage"], + zooStorageRoot: "/mock/storage", + foundTaskCount: 0, + importedTaskCount: 0, + importedFileCount: 0, + }) + + await webviewMessageHandler(mockProvider as any, { type: "importRooHistory" } as any) + + expect(importRooTaskHistoryMock).toHaveBeenCalledWith("/mock/storage", expect.any(Function)) + expect(mockProvider.taskHistoryStore.invalidateAll).not.toHaveBeenCalled() + expect(mockProvider.taskHistoryStore.reconcile).not.toHaveBeenCalled() + expect(mockProvider.taskHistoryStore.flushIndex).not.toHaveBeenCalled() + expect(mockProvider.postStateToWebview).not.toHaveBeenCalled() + expect(mockProvider.postMessageToWebview).toHaveBeenNthCalledWith(2, { + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "finished", + copiedFileCount: 0, + totalFileCount: 0, + importedTaskCount: 0, + totalTaskCount: 0, + }, + }) + expect(vscode.window.showWarningMessage).toHaveBeenCalledWith("common:warnings.rooHistoryImport.nothingFound") + expect(vscode.window.showInformationMessage).not.toHaveBeenCalled() + }) + + it("shows an 'already imported' warning when all Roo tasks are already in Zoo", async () => { + importRooTaskHistoryMock.mockResolvedValue({ + rooExtensionDomain: "RooVeterinaryInc.roo-cline", + zooExtensionDomain: "ZooCodeOrganization.zoo-code", + rooStorageRoots: ["/mock/roo-storage"], + zooStorageRoot: "/mock/storage", + foundTaskCount: 3, + importedTaskCount: 0, + importedFileCount: 0, + }) + + await webviewMessageHandler(mockProvider as any, { type: "importRooHistory" } as any) + + // History is refreshed even when nothing new was imported, so a retry + // after a partial-copy failure still reconciles the store. + expect(mockProvider.taskHistoryStore.invalidateAll).toHaveBeenCalledTimes(1) + expect(mockProvider.taskHistoryStore.reconcile).toHaveBeenCalledTimes(1) + expect(mockProvider.taskHistoryStore.flushIndex).toHaveBeenCalledTimes(1) + expect(mockProvider.postStateToWebview).toHaveBeenCalledTimes(1) + expect(vscode.window.showWarningMessage).toHaveBeenCalledWith( + "common:warnings.rooHistoryImport.alreadyImported", + ) + expect(vscode.window.showInformationMessage).not.toHaveBeenCalled() + }) + + it("shows an error without refreshing task history when the import throws", async () => { + importRooTaskHistoryMock.mockRejectedValue(new Error("permission denied")) + + await webviewMessageHandler(mockProvider as any, { type: "importRooHistory" } as any) + + expect(mockProvider.taskHistoryStore.invalidateAll).not.toHaveBeenCalled() + expect(mockProvider.taskHistoryStore.reconcile).not.toHaveBeenCalled() + expect(mockProvider.taskHistoryStore.flushIndex).not.toHaveBeenCalled() + expect(mockProvider.postStateToWebview).not.toHaveBeenCalled() + expect(mockProvider.log).toHaveBeenCalledWith("[importRooHistory] failed: permission denied") + expect(mockProvider.postMessageToWebview).toHaveBeenNthCalledWith(2, { + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "failed", + copiedFileCount: 0, + totalFileCount: 0, + importedTaskCount: 0, + totalTaskCount: 0, + }, + }) + expect(vscode.window.showErrorMessage).toHaveBeenCalledWith("common:errors.rooHistoryImport") + expect(vscode.window.showInformationMessage).not.toHaveBeenCalled() + expect(vscode.window.showWarningMessage).not.toHaveBeenCalled() + }) +}) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 49b605f2d3..5a827d5126 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -28,6 +28,7 @@ import { TelemetryService } from "@roo-code/telemetry" import { type ApiMessage } from "../task-persistence/apiMessages" import { saveTaskMessages } from "../task-persistence" +import { importRooTaskHistory } from "../task-persistence/importRooTaskHistory" import { ClineProvider } from "./ClineProvider" import { handleCheckpointRestoreOperation } from "./checkpointRestoreHandler" @@ -903,6 +904,92 @@ export const webviewMessageHandler = async ( break } + case "importRooHistory": { + let latestProgress = { + copiedFileCount: 0, + totalFileCount: 0, + importedTaskCount: 0, + totalTaskCount: 0, + } + + try { + await provider.postMessageToWebview({ + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "starting", + ...latestProgress, + }, + }) + + const result = await importRooTaskHistory( + provider.contextProxy.globalStorageUri.fsPath, + async (progress) => { + latestProgress = progress + await provider.postMessageToWebview({ + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "copying", + ...progress, + }, + }) + }, + ) + + if (result.foundTaskCount === 0) { + await provider.postMessageToWebview({ + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "finished", + ...latestProgress, + }, + }) + vscode.window.showWarningMessage( + t("common:warnings.rooHistoryImport.nothingFound", { domain: result.rooExtensionDomain }), + ) + break + } + + // Refresh history whenever Roo tasks were found — even if all already existed — + // so a retry after a partial-copy failure still reconciles the store. + provider.taskHistoryStore.invalidateAll() + await provider.taskHistoryStore.reconcile() + await provider.taskHistoryStore.flushIndex() + await provider.postStateToWebview() + await provider.postMessageToWebview({ + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "finished", + ...latestProgress, + copiedFileCount: result.importedFileCount, + totalFileCount: latestProgress.totalFileCount || result.importedFileCount, + importedTaskCount: result.importedTaskCount, + totalTaskCount: latestProgress.totalTaskCount || result.importedTaskCount, + }, + }) + + if (result.importedTaskCount === 0) { + vscode.window.showWarningMessage( + t("common:warnings.rooHistoryImport.alreadyImported", { count: result.foundTaskCount }), + ) + } else { + vscode.window.showInformationMessage( + t("common:info.rooHistoryImport.success", { count: result.importedTaskCount }), + ) + } + } catch (error) { + const message = error instanceof Error ? error.message : String(error) + provider.log(`[importRooHistory] failed: ${message}`) + await provider.postMessageToWebview({ + type: "rooHistoryImportProgress", + rooHistoryImportProgress: { + status: "failed", + ...latestProgress, + }, + }) + vscode.window.showErrorMessage(t("common:errors.rooHistoryImport", { error: message })) + } + break + } case "exportSettings": await exportSettings({ providerSettingsManager: provider.providerSettingsManager, diff --git a/src/i18n/locales/ca/common.json b/src/i18n/locales/ca/common.json index 0a1c99f1f8..f988fa0c37 100644 --- a/src/i18n/locales/ca/common.json +++ b/src/i18n/locales/ca/common.json @@ -145,12 +145,18 @@ "manual_url_missing_params": "URL de callback no vàlida: falten paràmetres requerits (code i state)", "manual_url_auth_failed": "Autenticació manual per URL ha fallat", "manual_url_auth_error": "Autenticació fallida", - "mode_import_failed": "Ha fallat la importació del mode: {{error}}" + "mode_import_failed": "Ha fallat la importació del mode: {{error}}", + "rooHistoryImport": "No s'ha pogut importar l'historial de Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "No s'ha seleccionat contingut de terminal", "missing_task_files": "Els fitxers d'aquesta tasca falten. Vols eliminar-la de la llista de tasques?", - "auto_import_failed": "Ha fallat la importació automàtica de la configuració de ZooCode: {{error}}" + "auto_import_failed": "Ha fallat la importació automàtica de la configuració de ZooCode: {{error}}", + "rooHistoryImport": { + "nothingFound": "No s'ha trobat historial de tasques de Roo Code per importar de {{domain}}.", + "alreadyImported_one": "Tot l'historial de tasca de Roo Code ({{count}}) ja s'ha importat a Zoo Code.", + "alreadyImported_other": "Tots els {{count}} historials de tasques de Roo Code ja s'han importat a Zoo Code." + } }, "info": { "no_changes": "No s'han trobat canvis.", @@ -169,6 +175,10 @@ "mode_imported": "Mode importat correctament", "roo": { "signInUnavailable": "L'inici de sessió de Roo Code Cloud no està disponible en aquest moment. Configura un altre proveïdor per continuar." + }, + "rooHistoryImport": { + "success_one": "S'ha importat {{count}} historial de tasca de Roo Code a Zoo Code.", + "success_other": "S'han importat {{count}} historials de tasques de Roo Code a Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index 02f27925a5..03dc94ca22 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -141,12 +141,18 @@ "manual_url_no_query": "Ungültige Callback-URL: Query-Parameter fehlen", "manual_url_missing_params": "Ungültige Callback-URL: erforderliche Parameter (code und state) fehlen", "manual_url_auth_failed": "Manuelle URL-Authentifizierung fehlgeschlagen", - "manual_url_auth_error": "Authentifizierung fehlgeschlagen" + "manual_url_auth_error": "Authentifizierung fehlgeschlagen", + "rooHistoryImport": "Fehler beim Importieren des Roo Code-Verlaufs: {{error}}" }, "warnings": { "no_terminal_content": "Kein Terminal-Inhalt ausgewählt", "missing_task_files": "Die Dateien dieser Aufgabe fehlen. Möchtest du sie aus der Aufgabenliste entfernen?", - "auto_import_failed": "Fehler beim automatischen Import der ZooCode-Einstellungen: {{error}}" + "auto_import_failed": "Fehler beim automatischen Import der ZooCode-Einstellungen: {{error}}", + "rooHistoryImport": { + "nothingFound": "Es wurde kein Roo Code-Aufgabenverlauf zum Importieren von {{domain}} gefunden.", + "alreadyImported_one": "Der {{count}} Roo Code-Aufgabenverlauf wurde bereits in Zoo Code importiert.", + "alreadyImported_other": "Alle {{count}} Roo Code-Aufgabenverläufe wurden bereits in Zoo Code importiert." + } }, "info": { "no_changes": "Keine Änderungen gefunden.", @@ -165,6 +171,10 @@ "mode_imported": "Modus erfolgreich importiert", "roo": { "signInUnavailable": "Die Anmeldung bei Roo Code Cloud ist derzeit nicht verfügbar. Konfiguriere einen anderen Anbieter, um fortzufahren." + }, + "rooHistoryImport": { + "success_one": "{{count}} Roo Code-Aufgabenverlauf in Zoo Code importiert.", + "success_other": "{{count}} Roo Code-Aufgabenverläufe in Zoo Code importiert." } }, "answers": { diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 5abed998a5..190af9180a 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -78,6 +78,7 @@ "share_not_enabled": "Task sharing is not enabled for this organization.", "share_task_not_found": "Task not found or access denied.", "mode_import_failed": "Failed to import mode: {{error}}", + "rooHistoryImport": "Failed to import Roo Code history: {{error}}", "delete_rules_folder_failed": "Failed to delete rules folder: {{rulesFolderPath}}. Error: {{error}}", "command_not_found": "Command '{{name}}' not found", "open_command_file": "Failed to open command file", @@ -146,7 +147,12 @@ "warnings": { "no_terminal_content": "No terminal content selected", "missing_task_files": "This task's files are missing. Would you like to remove it from the task list?", - "auto_import_failed": "Failed to auto-import ZooCode settings: {{error}}" + "auto_import_failed": "Failed to auto-import ZooCode settings: {{error}}", + "rooHistoryImport": { + "nothingFound": "No Roo Code task history was found to import from {{domain}}.", + "alreadyImported_one": "All {{count}} Roo Code task history has already been imported into Zoo Code.", + "alreadyImported_other": "All {{count}} Roo Code task histories have already been imported into Zoo Code." + } }, "info": { "no_changes": "No changes found.", @@ -163,6 +169,10 @@ "image_saved": "Image saved to {{path}}", "mode_exported": "Mode '{{mode}}' exported successfully", "mode_imported": "Mode imported successfully", + "rooHistoryImport": { + "success_one": "Imported {{count}} Roo Code task history into Zoo Code.", + "success_other": "Imported {{count}} Roo Code task histories into Zoo Code." + }, "roo": { "signInUnavailable": "Roo Code Cloud sign-in is currently unavailable. Configure another provider to continue." } diff --git a/src/i18n/locales/es/common.json b/src/i18n/locales/es/common.json index 3c5d6ea754..4fcbd82a85 100644 --- a/src/i18n/locales/es/common.json +++ b/src/i18n/locales/es/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Error al importar el historial de Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "No hay contenido de terminal seleccionado", "missing_task_files": "Los archivos de esta tarea faltan. ¿Deseas eliminarla de la lista de tareas?", - "auto_import_failed": "Error al importar automáticamente la configuración de ZooCode: {{error}}" + "auto_import_failed": "Error al importar automáticamente la configuración de ZooCode: {{error}}", + "rooHistoryImport": { + "nothingFound": "No se encontró historial de tareas de Roo Code para importar desde {{domain}}.", + "alreadyImported_one": "El historial de {{count}} tarea de Roo Code ya ha sido importado en Zoo Code.", + "alreadyImported_other": "Los {{count}} historiales de tareas de Roo Code ya han sido importados en Zoo Code." + } }, "info": { "no_changes": "No se encontraron cambios.", @@ -165,6 +171,10 @@ "mode_imported": "Modo importado correctamente", "roo": { "signInUnavailable": "El inicio de sesión de Roo Code Cloud no está disponible en este momento. Configura otro proveedor para continuar." + }, + "rooHistoryImport": { + "success_one": "Se importó {{count}} historial de tarea de Roo Code en Zoo Code.", + "success_other": "Se importaron {{count}} historiales de tareas de Roo Code en Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index 7f9e466f04..ece55c9b11 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Échec de l'importation de l'historique Roo Code : {{error}}" }, "warnings": { "no_terminal_content": "Aucun contenu de terminal sélectionné", "missing_task_files": "Les fichiers de cette tâche sont introuvables. Souhaitez-vous la supprimer de la liste des tâches ?", - "auto_import_failed": "Échec de l'importation automatique des paramètres ZooCode : {{error}}" + "auto_import_failed": "Échec de l'importation automatique des paramètres ZooCode : {{error}}", + "rooHistoryImport": { + "nothingFound": "Aucun historique de tâches Roo Code trouvé à importer depuis {{domain}}.", + "alreadyImported_one": "L'historique de {{count}} tâche Roo Code a déjà été importé dans Zoo Code.", + "alreadyImported_other": "Les {{count}} historiques de tâches Roo Code ont déjà été importés dans Zoo Code." + } }, "info": { "no_changes": "Aucun changement trouvé.", @@ -165,6 +171,10 @@ "mode_imported": "Mode importé avec succès", "roo": { "signInUnavailable": "La connexion à Roo Code Cloud n'est pas disponible pour le moment. Configure un autre fournisseur pour continuer." + }, + "rooHistoryImport": { + "success_one": "{{count}} historique de tâche Roo Code importé dans Zoo Code.", + "success_other": "{{count}} historiques de tâches Roo Code importés dans Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index 3c567dac08..42e46f0e9e 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Roo Code इतिहास आयात करने में विफल: {{error}}" }, "warnings": { "no_terminal_content": "कोई टर्मिनल सामग्री चयनित नहीं", "missing_task_files": "इस टास्क की फाइलें गायब हैं। क्या आप इसे टास्क सूची से हटाना चाहते हैं?", - "auto_import_failed": "ZooCode सेटिंग्स का स्वचालित आयात विफल: {{error}}" + "auto_import_failed": "ZooCode सेटिंग्स का स्वचालित आयात विफल: {{error}}", + "rooHistoryImport": { + "nothingFound": "{{domain}} से आयात करने के लिए कोई Roo Code कार्य इतिहास नहीं मिला।", + "alreadyImported_one": "सभी {{count}} Roo Code कार्य इतिहास पहले से ही Zoo Code में आयात किया जा चुका है।", + "alreadyImported_other": "सभी {{count}} Roo Code कार्य इतिहास पहले से ही Zoo Code में आयात किए जा चुके हैं।" + } }, "info": { "no_changes": "कोई परिवर्तन नहीं मिला।", @@ -165,6 +171,10 @@ "mode_imported": "मोड सफलतापूर्वक आयात किया गया", "roo": { "signInUnavailable": "Roo Code Cloud साइन-इन अभी उपलब्ध नहीं है। जारी रखने के लिए कोई दूसरा प्रदाता कॉन्फ़िगर करें।" + }, + "rooHistoryImport": { + "success_one": "{{count}} Roo Code कार्य इतिहास Zoo Code में आयात किया।", + "success_other": "{{count}} Roo Code कार्य इतिहास Zoo Code में आयात किए।" } }, "answers": { diff --git a/src/i18n/locales/id/common.json b/src/i18n/locales/id/common.json index 7208ea9507..92dbf24171 100644 --- a/src/i18n/locales/id/common.json +++ b/src/i18n/locales/id/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Gagal mengimpor riwayat Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "Tidak ada konten terminal yang dipilih", "missing_task_files": "File tugas ini hilang. Apakah kamu ingin menghapusnya dari daftar tugas?", - "auto_import_failed": "Gagal mengimpor pengaturan ZooCode secara otomatis: {{error}}" + "auto_import_failed": "Gagal mengimpor pengaturan ZooCode secara otomatis: {{error}}", + "rooHistoryImport": { + "nothingFound": "Tidak ada riwayat tugas Roo Code yang ditemukan untuk diimpor dari {{domain}}.", + "alreadyImported_one": "Semua {{count}} riwayat tugas Roo Code sudah diimpor ke Zoo Code.", + "alreadyImported_other": "Semua {{count}} riwayat tugas Roo Code sudah diimpor ke Zoo Code." + } }, "info": { "no_changes": "Tidak ada perubahan ditemukan.", @@ -165,6 +171,10 @@ "mode_imported": "Mode berhasil diimpor", "roo": { "signInUnavailable": "Masuk ke Roo Code Cloud saat ini tidak tersedia. Konfigurasikan penyedia lain untuk melanjutkan." + }, + "rooHistoryImport": { + "success_one": "{{count}} riwayat tugas Roo Code berhasil diimpor ke Zoo Code.", + "success_other": "{{count}} riwayat tugas Roo Code berhasil diimpor ke Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json index a69a96092c..fd739f7d8d 100644 --- a/src/i18n/locales/it/common.json +++ b/src/i18n/locales/it/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Impossibile importare la cronologia di Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "Nessun contenuto del terminale selezionato", "missing_task_files": "I file di questa attività sono mancanti. Vuoi rimuoverla dall'elenco delle attività?", - "auto_import_failed": "Importazione automatica delle impostazioni ZooCode fallita: {{error}}" + "auto_import_failed": "Importazione automatica delle impostazioni ZooCode fallita: {{error}}", + "rooHistoryImport": { + "nothingFound": "Nessuna cronologia di attività Roo Code trovata da importare da {{domain}}.", + "alreadyImported_one": "La cronologia di {{count}} attività Roo Code è già stata importata in Zoo Code.", + "alreadyImported_other": "Tutte le {{count}} cronologie di attività Roo Code sono già state importate in Zoo Code." + } }, "info": { "no_changes": "Nessuna modifica trovata.", @@ -165,6 +171,10 @@ "mode_imported": "Modalità importata con successo", "roo": { "signInUnavailable": "L'accesso a Roo Code Cloud non è attualmente disponibile. Configura un altro provider per continuare." + }, + "rooHistoryImport": { + "success_one": "Importata {{count}} cronologia di attività Roo Code in Zoo Code.", + "success_other": "Importate {{count}} cronologie di attività Roo Code in Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json index bea4db707c..06c8fd4a05 100644 --- a/src/i18n/locales/ja/common.json +++ b/src/i18n/locales/ja/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Roo Codeの履歴のインポートに失敗しました: {{error}}" }, "warnings": { "no_terminal_content": "選択されたターミナルコンテンツがありません", "missing_task_files": "このタスクのファイルが見つかりません。タスクリストから削除しますか?", - "auto_import_failed": "ZooCode設定の自動インポートに失敗しました:{{error}}" + "auto_import_failed": "ZooCode設定の自動インポートに失敗しました:{{error}}", + "rooHistoryImport": { + "nothingFound": "{{domain}}からインポートするRoo Codeのタスク履歴が見つかりませんでした。", + "alreadyImported_one": "{{count}}件のRoo Codeタスク履歴はすでにZoo Codeにインポート済みです。", + "alreadyImported_other": "{{count}}件のRoo Codeタスク履歴はすでにZoo Codeにインポート済みです。" + } }, "info": { "no_changes": "変更は見つかりませんでした。", @@ -165,6 +171,10 @@ "mode_imported": "モードが正常にインポートされました", "roo": { "signInUnavailable": "Roo Code Cloud へのサインインは現在利用できません。続行するには別のプロバイダーを設定してください。" + }, + "rooHistoryImport": { + "success_one": "{{count}}件のRoo CodeタスクをZoo Codeにインポートしました。", + "success_other": "{{count}}件のRoo CodeタスクをZoo Codeにインポートしました。" } }, "answers": { diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json index daf9f69e4c..4b2944cfd9 100644 --- a/src/i18n/locales/ko/common.json +++ b/src/i18n/locales/ko/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Roo Code 기록 가져오기 실패: {{error}}" }, "warnings": { "no_terminal_content": "선택된 터미널 내용이 없습니다", "missing_task_files": "이 작업의 파일이 누락되었습니다. 작업 목록에서 제거하시겠습니까?", - "auto_import_failed": "ZooCode 설정 자동 가져오기 실패: {{error}}" + "auto_import_failed": "ZooCode 설정 자동 가져오기 실패: {{error}}", + "rooHistoryImport": { + "nothingFound": "{{domain}}에서 가져올 Roo Code 작업 기록을 찾을 수 없습니다.", + "alreadyImported_one": "{{count}}개의 Roo Code 작업 기록이 이미 Zoo Code로 가져와졌습니다.", + "alreadyImported_other": "{{count}}개의 Roo Code 작업 기록이 이미 Zoo Code로 가져와졌습니다." + } }, "info": { "no_changes": "변경 사항이 없습니다.", @@ -165,6 +171,10 @@ "mode_imported": "모드를 성공적으로 가져왔습니다", "roo": { "signInUnavailable": "Roo Code Cloud 로그인은 현재 사용할 수 없습니다. 계속하려면 다른 제공업체를 구성하세요." + }, + "rooHistoryImport": { + "success_one": "Roo Code 작업 기록 {{count}}개를 Zoo Code로 가져왔습니다.", + "success_other": "Roo Code 작업 기록 {{count}}개를 Zoo Code로 가져왔습니다." } }, "answers": { diff --git a/src/i18n/locales/nl/common.json b/src/i18n/locales/nl/common.json index 3f4c1e984d..96a921c6c1 100644 --- a/src/i18n/locales/nl/common.json +++ b/src/i18n/locales/nl/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Importeren van Roo Code-geschiedenis mislukt: {{error}}" }, "warnings": { "no_terminal_content": "Geen terminalinhoud geselecteerd", "missing_task_files": "De bestanden van deze taak ontbreken. Wil je deze uit de takenlijst verwijderen?", - "auto_import_failed": "Automatisch importeren van ZooCode-instellingen mislukt: {{error}}" + "auto_import_failed": "Automatisch importeren van ZooCode-instellingen mislukt: {{error}}", + "rooHistoryImport": { + "nothingFound": "Geen Roo Code-taakgeschiedenis gevonden om te importeren van {{domain}}.", + "alreadyImported_one": "De {{count}} Roo Code-taakgeschiedenis is al geïmporteerd in Zoo Code.", + "alreadyImported_other": "Alle {{count}} Roo Code-taakgeschiedenissen zijn al geïmporteerd in Zoo Code." + } }, "info": { "no_changes": "Geen wijzigingen gevonden.", @@ -165,6 +171,10 @@ "mode_imported": "Modus succesvol geïmporteerd", "roo": { "signInUnavailable": "Inloggen bij Roo Code Cloud is momenteel niet beschikbaar. Configureer een andere provider om door te gaan." + }, + "rooHistoryImport": { + "success_one": "{{count}} Roo Code-taakgeschiedenis geïmporteerd in Zoo Code.", + "success_other": "{{count}} Roo Code-taakgeschiedenissen geïmporteerd in Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json index c88aabcaa5..f3e789e842 100644 --- a/src/i18n/locales/pl/common.json +++ b/src/i18n/locales/pl/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Nie udało się zaimportować historii Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "Nie wybrano zawartości terminala", "missing_task_files": "Pliki tego zadania są brakujące. Czy chcesz usunąć je z listy zadań?", - "auto_import_failed": "Nie udało się automatycznie zaimportować ustawień ZooCode: {{error}}" + "auto_import_failed": "Nie udało się automatycznie zaimportować ustawień ZooCode: {{error}}", + "rooHistoryImport": { + "nothingFound": "Nie znaleziono historii zadań Roo Code do zaimportowania z {{domain}}.", + "alreadyImported_one": "Cała {{count}} historia zadań Roo Code została już zaimportowana do Zoo Code.", + "alreadyImported_other": "Wszystkie {{count}} historii zadań Roo Code zostały już zaimportowane do Zoo Code." + } }, "info": { "no_changes": "Nie znaleziono zmian.", @@ -165,6 +171,10 @@ "mode_imported": "Tryb pomyślnie zaimportowany", "roo": { "signInUnavailable": "Logowanie do Roo Code Cloud jest obecnie niedostępne. Skonfiguruj innego dostawcę, aby kontynuować." + }, + "rooHistoryImport": { + "success_one": "Zaimportowano {{count}} historię zadania Roo Code do Zoo Code.", + "success_other": "Zaimportowano {{count}} historii zadań Roo Code do Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index ce4c51e08d..ac5ec44f6b 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -145,12 +145,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Falha ao importar o histórico do Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "Nenhum conteúdo do terminal selecionado", "missing_task_files": "Os arquivos desta tarefa estão faltando. Deseja removê-la da lista de tarefas?", - "auto_import_failed": "Falha ao importar automaticamente as configurações do ZooCode: {{error}}" + "auto_import_failed": "Falha ao importar automaticamente as configurações do ZooCode: {{error}}", + "rooHistoryImport": { + "nothingFound": "Nenhum histórico de tarefas do Roo Code encontrado para importar de {{domain}}.", + "alreadyImported_one": "O histórico de {{count}} tarefa do Roo Code já foi importado para o Zoo Code.", + "alreadyImported_other": "Todos os {{count}} históricos de tarefas do Roo Code já foram importados para o Zoo Code." + } }, "info": { "no_changes": "Nenhuma alteração encontrada.", @@ -169,6 +175,10 @@ "mode_imported": "Modo importado com sucesso", "roo": { "signInUnavailable": "O login do Roo Code Cloud não está disponível no momento. Configure outro provedor para continuar." + }, + "rooHistoryImport": { + "success_one": "{{count}} histórico de tarefa do Roo Code importado para o Zoo Code.", + "success_other": "{{count}} históricos de tarefas do Roo Code importados para o Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json index 9d096fb346..26d4b2032f 100644 --- a/src/i18n/locales/ru/common.json +++ b/src/i18n/locales/ru/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Ошибка импорта истории Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "Не выбрано содержимое терминала", "missing_task_files": "Файлы этой задачи отсутствуют. Хотите удалить её из списка задач?", - "auto_import_failed": "Не удалось автоматически импортировать настройки ZooCode: {{error}}" + "auto_import_failed": "Не удалось автоматически импортировать настройки ZooCode: {{error}}", + "rooHistoryImport": { + "nothingFound": "История задач Roo Code для импорта из {{domain}} не найдена.", + "alreadyImported_one": "{{count}} история задач Roo Code уже импортирована в Zoo Code.", + "alreadyImported_other": "Все {{count}} истории задач Roo Code уже импортированы в Zoo Code." + } }, "info": { "no_changes": "Изменения не найдены.", @@ -165,6 +171,10 @@ "mode_imported": "Режим успешно импортирован", "roo": { "signInUnavailable": "Вход в Roo Code Cloud сейчас недоступен. Настрой другого провайдера, чтобы продолжить." + }, + "rooHistoryImport": { + "success_one": "{{count}} история задач Roo Code импортирована в Zoo Code.", + "success_other": "{{count}} историй задач Roo Code импортировано в Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/tr/common.json b/src/i18n/locales/tr/common.json index 3d83d28c32..bde000783a 100644 --- a/src/i18n/locales/tr/common.json +++ b/src/i18n/locales/tr/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Roo Code geçmişi içe aktarılamadı: {{error}}" }, "warnings": { "no_terminal_content": "Seçili terminal içeriği yok", "missing_task_files": "Bu görevin dosyaları eksik. Görev listesinden kaldırmak istiyor musunuz?", - "auto_import_failed": "ZooCode ayarları otomatik olarak içe aktarılamadı: {{error}}" + "auto_import_failed": "ZooCode ayarları otomatik olarak içe aktarılamadı: {{error}}", + "rooHistoryImport": { + "nothingFound": "{{domain}} kaynağından içe aktarılacak Roo Code görev geçmişi bulunamadı.", + "alreadyImported_one": "{{count}} Roo Code görev geçmişinin tamamı zaten Zoo Code'a aktarılmış.", + "alreadyImported_other": "{{count}} Roo Code görev geçmişinin tamamı zaten Zoo Code'a aktarılmış." + } }, "info": { "no_changes": "Değişiklik bulunamadı.", @@ -165,6 +171,10 @@ "mode_imported": "Mod başarıyla içe aktarıldı", "roo": { "signInUnavailable": "Roo Code Cloud girişi şu anda kullanılamıyor. Devam etmek için farklı bir sağlayıcı yapılandırın." + }, + "rooHistoryImport": { + "success_one": "{{count}} Roo Code görev geçmişi Zoo Code'a aktarıldı.", + "success_other": "{{count}} Roo Code görev geçmişi Zoo Code'a aktarıldı." } }, "answers": { diff --git a/src/i18n/locales/vi/common.json b/src/i18n/locales/vi/common.json index d111ade94b..2a9433c506 100644 --- a/src/i18n/locales/vi/common.json +++ b/src/i18n/locales/vi/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "Không thể nhập lịch sử Roo Code: {{error}}" }, "warnings": { "no_terminal_content": "Không có nội dung terminal được chọn", "missing_task_files": "Các tệp của nhiệm vụ này bị thiếu. Bạn có muốn xóa nó khỏi danh sách nhiệm vụ không?", - "auto_import_failed": "Không thể tự động nhập cài đặt ZooCode: {{error}}" + "auto_import_failed": "Không thể tự động nhập cài đặt ZooCode: {{error}}", + "rooHistoryImport": { + "nothingFound": "Không tìm thấy lịch sử nhiệm vụ Roo Code nào để nhập từ {{domain}}.", + "alreadyImported_one": "{{count}} lịch sử nhiệm vụ Roo Code đã được nhập vào Zoo Code.", + "alreadyImported_other": "Tất cả {{count}} lịch sử nhiệm vụ Roo Code đã được nhập vào Zoo Code." + } }, "info": { "no_changes": "Không tìm thấy thay đổi nào.", @@ -165,6 +171,10 @@ "mode_imported": "Chế độ đã được nhập thành công", "roo": { "signInUnavailable": "Đăng nhập Roo Code Cloud hiện không khả dụng. Hãy cấu hình nhà cung cấp khác để tiếp tục." + }, + "rooHistoryImport": { + "success_one": "Đã nhập {{count}} lịch sử nhiệm vụ Roo Code vào Zoo Code.", + "success_other": "Đã nhập {{count}} lịch sử nhiệm vụ Roo Code vào Zoo Code." } }, "answers": { diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index 1ff8d330cf..a1d0b06e89 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -146,12 +146,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "导入 Roo Code 历史记录失败:{{error}}" }, "warnings": { "no_terminal_content": "没有选择终端内容", "missing_task_files": "此任务的文件丢失。您想从任务列表中删除它吗?", - "auto_import_failed": "自动导入 ZooCode 设置失败:{{error}}" + "auto_import_failed": "自动导入 ZooCode 设置失败:{{error}}", + "rooHistoryImport": { + "nothingFound": "未找到可从 {{domain}} 导入的 Roo Code 任务历史记录。", + "alreadyImported_one": "全部 {{count}} 条 Roo Code 任务历史记录已导入 Zoo Code。", + "alreadyImported_other": "全部 {{count}} 条 Roo Code 任务历史记录已导入 Zoo Code。" + } }, "info": { "no_changes": "未找到更改。", @@ -170,6 +176,10 @@ "mode_imported": "模式已成功导入", "roo": { "signInUnavailable": "Roo Code Cloud 登录当前不可用。请配置其他提供商以继续。" + }, + "rooHistoryImport": { + "success_one": "已将 {{count}} 条 Roo Code 任务历史记录导入 Zoo Code。", + "success_other": "已将 {{count}} 条 Roo Code 任务历史记录导入 Zoo Code。" } }, "answers": { diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index 74e661e280..92435e42ff 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -141,12 +141,18 @@ "streamProcessingError": "Error processing response stream: {{message}}", "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" - } + }, + "rooHistoryImport": "匯入 Roo Code 歷史記錄失敗:{{error}}" }, "warnings": { "no_terminal_content": "沒有選擇終端機內容", "missing_task_files": "此工作的檔案遺失。您想從工作列表中刪除它嗎?", - "auto_import_failed": "自動匯入 ZooCode 設定失敗:{{error}}" + "auto_import_failed": "自動匯入 ZooCode 設定失敗:{{error}}", + "rooHistoryImport": { + "nothingFound": "未找到可從 {{domain}} 匯入的 Roo Code 工作歷史記錄。", + "alreadyImported_one": "全部 {{count}} 筆 Roo Code 工作歷史記錄已匯入 Zoo Code。", + "alreadyImported_other": "全部 {{count}} 筆 Roo Code 工作歷史記錄已匯入 Zoo Code。" + } }, "info": { "no_changes": "沒有找到更改。", @@ -165,6 +171,10 @@ "mode_imported": "模式已成功匯入", "roo": { "signInUnavailable": "Roo Code Cloud 登入目前無法使用。請設定其他提供者以繼續。" + }, + "rooHistoryImport": { + "success_one": "已將 {{count}} 筆 Roo Code 工作歷史記錄匯入 Zoo Code。", + "success_other": "已將 {{count}} 筆 Roo Code 工作歷史記錄匯入 Zoo Code。" } }, "answers": { diff --git a/webview-ui/src/components/settings/About.tsx b/webview-ui/src/components/settings/About.tsx index c33063e047..7459d5b8df 100644 --- a/webview-ui/src/components/settings/About.tsx +++ b/webview-ui/src/components/settings/About.tsx @@ -1,10 +1,10 @@ -import { HTMLAttributes } from "react" +import { HTMLAttributes, useEffect, useState } from "react" import { useAppTranslation } from "@/i18n/TranslationContext" import { Trans } from "react-i18next" -import { Download, Upload, TriangleAlert, Bug, Lightbulb, Shield, MessagesSquare } from "lucide-react" -import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" +import { ArrowRightLeft, Download, Upload, TriangleAlert, Bug, Lightbulb, Shield, MessagesSquare } from "lucide-react" +import { VSCodeButton, VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" -import type { TelemetrySetting } from "@roo-code/types" +import type { ExtensionMessage, TelemetrySetting } from "@roo-code/types" import { Package } from "@roo/package" @@ -17,6 +17,8 @@ import { SectionHeader } from "./SectionHeader" import { Section } from "./Section" import { SearchableSetting } from "./SearchableSetting" +type RooHistoryImportProgress = NonNullable + type AboutProps = HTMLAttributes & { telemetrySetting: TelemetrySetting setTelemetrySetting: (setting: TelemetrySetting) => void @@ -26,6 +28,70 @@ type AboutProps = HTMLAttributes & { export const About = ({ telemetrySetting, setTelemetrySetting, debug, setDebug, className, ...props }: AboutProps) => { const { t } = useAppTranslation() + const [rooHistoryImportProgress, setRooHistoryImportProgress] = useState(null) + + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + const message = event.data + if (message.type !== "rooHistoryImportProgress" || !message.rooHistoryImportProgress) { + return + } + + const progress = message.rooHistoryImportProgress + if (progress.status === "finished" && progress.totalFileCount === 0) { + setRooHistoryImportProgress(null) + return + } + + setRooHistoryImportProgress(progress) + } + + window.addEventListener("message", handleMessage) + return () => window.removeEventListener("message", handleMessage) + }, []) + + const isImporting = + rooHistoryImportProgress?.status === "starting" || rooHistoryImportProgress?.status === "copying" + const isImportFailed = rooHistoryImportProgress?.status === "failed" + const isImportSuccessful = + rooHistoryImportProgress?.status === "finished" && rooHistoryImportProgress.totalFileCount > 0 + const shouldShowImportProgress = !!rooHistoryImportProgress && (isImporting || isImportFailed || isImportSuccessful) + const importProgressPercent = + rooHistoryImportProgress && rooHistoryImportProgress.totalFileCount > 0 + ? Math.round((rooHistoryImportProgress.copiedFileCount / rooHistoryImportProgress.totalFileCount) * 100) + : 0 + const importProgressSummary = !rooHistoryImportProgress + ? "" + : isImportFailed + ? rooHistoryImportProgress.totalFileCount > 0 + ? t("settings:about.rooHistoryImport.summaryFailedWithFiles", { + copied: rooHistoryImportProgress.copiedFileCount, + total: rooHistoryImportProgress.totalFileCount, + }) + : t("settings:about.rooHistoryImport.summaryFailedNoFiles") + : t("settings:about.rooHistoryImport.summaryCopied", { + copied: rooHistoryImportProgress.copiedFileCount, + total: rooHistoryImportProgress.totalFileCount, + }) + const importProgressDetail = isImportFailed + ? t("settings:about.rooHistoryImport.detailFailed") + : rooHistoryImportProgress && rooHistoryImportProgress.importedTaskCount > 0 + ? t("settings:about.rooHistoryImport.detailTasksImported", { + count: rooHistoryImportProgress.importedTaskCount, + total: rooHistoryImportProgress.totalTaskCount, + }) + : t("settings:about.rooHistoryImport.detailPreparing") + + const handleImportRooHistory = () => { + setRooHistoryImportProgress({ + status: "starting", + copiedFileCount: 0, + totalFileCount: 0, + importedTaskCount: 0, + totalTaskCount: 0, + }) + vscode.postMessage({ type: "importRooHistory" }) + } return (
@@ -149,6 +215,86 @@ export const About = ({ telemetrySetting, setTelemetrySetting, debug, setDebug,
+ +
+ +
+
+
+ +
+
+
+ {t("settings:about.rooHistoryImport.cardTitle")} +
+
+ {t("settings:about.rooHistoryImport.cardDescription")} +
+
+
+ {shouldShowImportProgress && ( +
+
+
+ {isImporting ? ( + + ) : isImportFailed ? ( + + ) : ( + + )} + + {isImporting + ? t("settings:about.rooHistoryImport.statusImporting") + : isImportFailed + ? t("settings:about.rooHistoryImport.statusFailed") + : t("settings:about.rooHistoryImport.statusComplete")} + +
+
+ {importProgressPercent}% +
+
+
+
+
+
+
{importProgressSummary}
+
{importProgressDetail}
+
+
+ )} + + {isImporting + ? t("settings:about.rooHistoryImport.buttonImporting") + : t("settings:about.rooHistoryImport.buttonIdle")} + +
+ +
) } diff --git a/webview-ui/src/components/settings/__tests__/About.spec.tsx b/webview-ui/src/components/settings/__tests__/About.spec.tsx index ce6b7feb95..5266be8bae 100644 --- a/webview-ui/src/components/settings/__tests__/About.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/About.spec.tsx @@ -1,8 +1,9 @@ import React from "react" -import { render, screen } from "@/utils/test-utils" +import { act, fireEvent, render, screen } from "@/utils/test-utils" import { TranslationProvider } from "@/i18n/__mocks__/TranslationContext" import { EXTERNAL_LINKS } from "@/constants/externalLinks" +import { vscode } from "@/utils/vscode" import { About } from "../About" @@ -11,6 +12,16 @@ vi.mock("@/utils/vscode", () => ({ })) vi.mock("@vscode/webview-ui-toolkit/react", () => ({ + VSCodeButton: ({ + children, + onClick, + disabled, + ...props + }: React.ButtonHTMLAttributes & { appearance?: string }) => ( + + ), VSCodeCheckbox: ({ children, ...props }: React.InputHTMLAttributes) => (