From 6bd6c830fe8df112440a18f59cd513ea5b7f0c4e Mon Sep 17 00:00:00 2001 From: tszhong0411 Date: Sun, 26 Jan 2025 21:06:21 +0800 Subject: [PATCH 01/74] fix: typos in docs and code --- docs/mcp/mcp-quickstart.md | 4 ++-- src/core/Cline.ts | 6 +++--- src/core/sliding-window/index.ts | 2 +- src/core/webview/ClineProvider.ts | 8 ++++---- webview-ui/src/components/chat/AutoApproveMenu.tsx | 2 +- webview-ui/src/components/chat/ChatRow.tsx | 2 +- webview-ui/src/components/chat/ChatTextArea.tsx | 2 +- webview-ui/src/components/chat/ChatView.tsx | 2 +- webview-ui/src/components/common/CodeBlock.tsx | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/mcp/mcp-quickstart.md b/docs/mcp/mcp-quickstart.md index 13e194e47c..b1b5700694 100644 --- a/docs/mcp/mcp-quickstart.md +++ b/docs/mcp/mcp-quickstart.md @@ -38,7 +38,7 @@ STOP! Before proceeding, you MUST verify these requirements: MCP Server Panel 1. The MCP settings files should be display in a tab in VS Code. -1. Replce the file's contents with this code: +1. Replace the file's contents with this code: For Windows: @@ -96,7 +96,7 @@ You should witness Cline: 1. Update the mcp setting json file 1. Start the server and start the server -The mcp seetings file should now look like this: +The mcp settings file should now look like this: _For a Windows machine:_ diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 947a5fae6f..3b0877e05a 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -214,7 +214,7 @@ export class Cline { private async addToClineMessages(message: ClineMessage) { // these values allow us to reconstruct the conversation history at the time this cline message was created // it's important that apiConversationHistory is initialized before we add cline messages - message.conversationHistoryIndex = this.apiConversationHistory.length - 1 // NOTE: this is the index of the last added message which is the user message, and once the clinemessages have been presented we update the apiconversationhistory with the completed assistant message. This means when reseting to a message, we need to +1 this index to get the correct assistant message that this tool use corresponds to + message.conversationHistoryIndex = this.apiConversationHistory.length - 1 // NOTE: this is the index of the last added message which is the user message, and once the clinemessages have been presented we update the apiconversationhistory with the completed assistant message. This means when resetting to a message, we need to +1 this index to get the correct assistant message that this tool use corresponds to message.conversationHistoryDeletedRange = this.conversationHistoryDeletedRange this.clineMessages.push(message) await this.saveClineMessages() @@ -1386,7 +1386,7 @@ export class Cline { if (!block.partial) { // Some models add code block artifacts (around the tool calls) which show up at the end of text content - // matches ``` with atleast one char after the last backtick, at the end of the string + // matches ``` with at least one char after the last backtick, at the end of the string const match = content?.trimEnd().match(/```[a-zA-Z0-9_-]+$/) if (match) { const matchLength = match[0].length @@ -2773,7 +2773,7 @@ export class Cline { if (!block.partial || this.didRejectTool || this.didAlreadyUseTool) { // block is finished streaming and executing if (this.currentStreamingContentIndex === this.assistantMessageContent.length - 1) { - // its okay that we increment if !didCompleteReadingStream, it'll just return bc out of bounds and as streaming continues it will call presentAssitantMessage if a new block is ready. if streaming is finished then we set userMessageContentReady to true when out of bounds. This gracefully allows the stream to continue on and all potential content blocks be presented. + // its okay that we increment if !didCompleteReadingStream, it'll just return bc out of bounds and as streaming continues it will call presentAssistantMessage if a new block is ready. if streaming is finished then we set userMessageContentReady to true when out of bounds. This gracefully allows the stream to continue on and all potential content blocks be presented. // last block is complete and it is finished executing this.userMessageContentReady = true // will allow pwaitfor to continue } diff --git a/src/core/sliding-window/index.ts b/src/core/sliding-window/index.ts index 83b91eb381..a9ea7a0da9 100644 --- a/src/core/sliding-window/index.ts +++ b/src/core/sliding-window/index.ts @@ -65,7 +65,7 @@ export function getNextTruncationRange( let rangeEndIndex = startOfRest + messagesToRemove - 1 // Make sure the last message being removed is a user message, so that the next message after the initial task message is an assistant message. This preservers the user-assistant-user-assistant structure. - // NOTE: anthropic format messages are always user-assitant-user-assistant, while openai format messages can have multiple user messages in a row (we use anthropic format throughout cline) + // NOTE: anthropic format messages are always user-assistant-user-assistant, while openai format messages can have multiple user messages in a row (we use anthropic format throughout cline) if (messages[rangeEndIndex].role !== "user") { rangeEndIndex -= 1 } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index a54dc97986..6ca8cadff5 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -172,7 +172,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { webviewView.webview.html = this.getHtmlContent(webviewView.webview) // Sets up an event listener to listen for messages passed from the webview view context - // and executes code based on the message that is recieved + // and executes code based on the message that is received this.setWebviewMessageListener(webviewView.webview) // Logs show up in bottom panel > Debug Console @@ -243,7 +243,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { } async initClineWithTask(task?: string, images?: string[]) { - await this.clearTask() // ensures that an exising task doesn't exist before starting a new one, although this shouldn't be possible since user must clear task before starting a new one + await this.clearTask() // ensures that an existing task doesn't exist before starting a new one, although this shouldn't be possible since user must clear task before starting a new one const { apiConfiguration, customInstructions, autoApprovalSettings, browserSettings, chatSettings } = await this.getState() this.cline = new Cline( @@ -357,7 +357,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { /** * Sets up an event listener to listen for messages passed from the webview context and - * executes code based on the message that is recieved. + * executes code based on the message that is received. * * @param webview A reference to the extension webview */ @@ -1184,7 +1184,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { Now that we use retainContextWhenHidden, we don't have to store a cache of cline messages in the user's state, but we could to reduce memory footprint in long conversations. - We have to be careful of what state is shared between ClineProvider instances since there could be multiple instances of the extension running at once. For example when we cached cline messages using the same key, two instances of the extension could end up using the same key and overwriting each other's messages. - - Some state does need to be shared between the instances, i.e. the API key--however there doesn't seem to be a good way to notfy the other instances that the API key has changed. + - Some state does need to be shared between the instances, i.e. the API key--however there doesn't seem to be a good way to notify the other instances that the API key has changed. We need to use a unique identifier for each ClineProvider instance's message cache since we could be running several instances of the extension outside of just the sidebar i.e. in editor panels. diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index aa3a8a44a7..68863a8fd2 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -169,7 +169,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { // }} onClick={(e) => { /* - vscode web toolkit bug: when changing the value of a vscodecheckbox programatically, it will call its onChange with stale state. This led to updateEnabled being called with an old vesion of autoApprovalSettings, effectively undoing the state change that was triggered by the last action being unchecked. A simple workaround is to just not use onChange and intead use onClick. We are lucky this is a checkbox and the newvalue is simply opposite of current state. + vscode web toolkit bug: when changing the value of a vscodecheckbox programmatically, it will call its onChange with stale state. This led to updateEnabled being called with an old version of autoApprovalSettings, effectively undoing the state change that was triggered by the last action being unchecked. A simple workaround is to just not use onChange and instead use onClick. We are lucky this is a checkbox and the newvalue is simply opposite of current state. */ if (!hasEnabledActions) return e.stopPropagation() // stops click from bubbling up to the parent, in this case stopping the expanding/collapsing diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index fed1bb0cf4..766be253b9 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -751,7 +751,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi }}> {icon} {title} - {/* Need to render this everytime since it affects height of row by 2px */} + {/* Need to render this every time since it affects height of row by 2px */} 0 ? 1 : 0, diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 0f11b0a677..0852335694 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -378,7 +378,7 @@ const ChatTextArea = forwardRef( charBeforeCursor === " " || charBeforeCursor === "\n" || charBeforeCursor === "\r\n" const charAfterIsWhitespace = charAfterCursor === " " || charAfterCursor === "\n" || charAfterCursor === "\r\n" - // checks if char before cusor is whitespace after a mention + // checks if char before cursor is whitespace after a mention if ( charBeforeIsWhitespace && inputValue.slice(0, cursorPosition - 1).match(new RegExp(mentionRegex.source + "$")) // "$" is added to ensure the match occurs at the end of the string diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index aec4e544a9..07ab484ff6 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -418,7 +418,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie break } } - // textAreaRef.current is not explicitly required here since react gaurantees that ref will be stable across re-renders, and we're not using its value but its reference. + // textAreaRef.current is not explicitly required here since react guarantees that ref will be stable across re-renders, and we're not using its value but its reference. }, [isHidden, textAreaDisabled, enableButtons, handleSendMessage, handlePrimaryButtonClick, handleSecondaryButtonClick], ) diff --git a/webview-ui/src/components/common/CodeBlock.tsx b/webview-ui/src/components/common/CodeBlock.tsx index b00f641d5d..bc5c1fcbcf 100644 --- a/webview-ui/src/components/common/CodeBlock.tsx +++ b/webview-ui/src/components/common/CodeBlock.tsx @@ -120,7 +120,7 @@ const CodeBlock = memo(({ source, forceWrap = false }: CodeBlockProps) => { if (!node.lang) { node.lang = "javascript" } else if (node.lang.includes(".")) { - // if the langauge is a file, get the extension + // if the language is a file, get the extension node.lang = node.lang.split(".").slice(-1)[0] } }) From cb1fd31e3662ad436c51cd6d9bfabf188bd233bd Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 09:50:44 -1000 Subject: [PATCH 02/74] disable language dropdown until i18n fully integrated (#1489) --- .../src/components/settings/SettingsView.tsx | 6 +++--- webview-ui/src/i18n.ts | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 16707bae3f..a5293bdc4e 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -5,7 +5,7 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration, validateModelId } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "./ApiOptions" -import LanguageOptions from "./LanguageOptions" +//import LanguageOptions from "./LanguageOptions" import SettingsButton from "../common/SettingsButton" const IS_DEV = false // FIXME: use flags when packaging @@ -117,9 +117,9 @@ const SettingsView = ({ onDone }: SettingsViewProps) => { {t("customInstructionsDescription")}

-
+ {/*
-
+
*/} {IS_DEV && ( <> diff --git a/webview-ui/src/i18n.ts b/webview-ui/src/i18n.ts index c16285d492..774dbb4fdc 100644 --- a/webview-ui/src/i18n.ts +++ b/webview-ui/src/i18n.ts @@ -2,10 +2,10 @@ import i18n from "i18next" import { initReactI18next } from "react-i18next" import translationEN from "./locales/en/translation.json" -import translationDE from "./locales/de/translation.json" -import translationZHCN from "./locales/zh-cn/translation.json" -import translationZHTW from "./locales/zh-tw/translation.json" -import translationJA from "./locales/ja/translation.json" +//import translationDE from "./locales/de/translation.json" +//import translationZHCN from "./locales/zh-cn/translation.json" +//import translationZHTW from "./locales/zh-tw/translation.json" +//import translationJA from "./locales/ja/translation.json" i18n.use(initReactI18next) // passes i18n down to react-i18next .init({ @@ -18,10 +18,10 @@ i18n.use(initReactI18next) // passes i18n down to react-i18next }, }) -i18n.addResourceBundle("de", "translation", translationDE) i18n.addResourceBundle("en", "translation", translationEN) -i18n.addResourceBundle("zh-CN", "translation", translationZHCN) -i18n.addResourceBundle("zh-TW", "translation", translationZHTW) -i18n.addResourceBundle("ja", "translation", translationJA) +//i18n.addResourceBundle("de", "translation", translationDE) +//i18n.addResourceBundle("zh-CN", "translation", translationZHCN) +//i18n.addResourceBundle("zh-TW", "translation", translationZHTW) +//i18n.addResourceBundle("ja", "translation", translationJA) export default i18n From 42ad58d12801064a61b5de5734fb0ee5981f6328 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 10:39:42 -1000 Subject: [PATCH 03/74] feat: READMEs in other languages (es,de,ja,zh) --- README.md | 7 +- locales/es/CODE_OF_CONDUCT.md | 76 +++++++++++++++ locales/es/CONTRIBUTING.md | 82 ++++++++++++++++ locales/es/README.md | 161 ++++++++++++++++++++++++++++++ locales/ja/CODE_OF_CONDUCT.md | 76 +++++++++++++++ locales/ja/CONTRIBUTING.md | 82 ++++++++++++++++ locales/ja/README.md | 0 locales/zh-cn/CODE_OF_CONDUCT.md | 76 +++++++++++++++ locales/zh-cn/CONTRIBUTING.md | 82 ++++++++++++++++ locales/zh-cn/README.md | 162 +++++++++++++++++++++++++++++++ locales/zh-tw/CODE_OF_CONDUCT.md | 76 +++++++++++++++ locales/zh-tw/CONTRIBUTING.md | 82 ++++++++++++++++ locales/zh-tw/README.md | 161 ++++++++++++++++++++++++++++++ 13 files changed, 1122 insertions(+), 1 deletion(-) create mode 100644 locales/es/CODE_OF_CONDUCT.md create mode 100644 locales/es/CONTRIBUTING.md create mode 100644 locales/es/README.md create mode 100644 locales/ja/CODE_OF_CONDUCT.md create mode 100644 locales/ja/CONTRIBUTING.md create mode 100644 locales/ja/README.md create mode 100644 locales/zh-cn/CODE_OF_CONDUCT.md create mode 100644 locales/zh-cn/CONTRIBUTING.md create mode 100644 locales/zh-cn/README.md create mode 100644 locales/zh-tw/CODE_OF_CONDUCT.md create mode 100644 locales/zh-tw/CONTRIBUTING.md create mode 100644 locales/zh-tw/README.md diff --git a/README.md b/README.md index 22a9606a42..86ba0e501c 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,12 @@ -Meet Cline, an AI assistant that can use your **CLI** a**N**d **E**ditor. +Other language [README files](./README.md) are available in: +- [Español](./locale/es/README.md) +- [Deutsch](./locale/de/README.md) +- [日本語](./locale/ja/README.md) +- [简体中文](./locale/zh-cn/README.md) +- [繁體中文](./locale/zh-tw/README.md) Thanks to [Claude 3.5 Sonnet's agentic coding capabilities](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf), Cline can handle complex software development tasks step-by-step. With tools that let him create & edit files, explore large projects, use the browser, and execute terminal commands (after you grant permission), he can assist you in ways that go beyond code completion or tech support. Cline can even use the Model Context Protocol (MCP) to create new tools and extend his own capabilities. While autonomous AI scripts traditionally run in sandboxed environments, this extension provides a human-in-the-loop GUI to approve every file change and terminal command, providing a safe and accessible way to explore the potential of agentic AI. diff --git a/locales/es/CODE_OF_CONDUCT.md b/locales/es/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..3547e4628b --- /dev/null +++ b/locales/es/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at hi@cline.bot. All complaints +will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/locales/es/CONTRIBUTING.md b/locales/es/CONTRIBUTING.md new file mode 100644 index 0000000000..c4ef158090 --- /dev/null +++ b/locales/es/CONTRIBUTING.md @@ -0,0 +1,82 @@ +# Contribuir a Cline + +Nos alegra que estés interesado en contribuir a Cline. Ya sea que corrijas un error, añadas una función o mejores nuestra documentación, ¡cada contribución hace que Cline sea más inteligente! Para mantener nuestra comunidad viva y acogedora, todos los miembros deben cumplir con nuestro [Código de Conducta](CODE_OF_CONDUCT.md). + +## Informar de errores o problemas + +¡Los informes de errores ayudan a mejorar Cline para todos! Antes de crear un nuevo problema, por favor revisa los [problemas existentes](https://github.com/cline/cline/issues) para evitar duplicados. Cuando estés listo para informar un error, dirígete a nuestra [página de Issues](https://github.com/cline/cline/issues/new/choose), donde encontrarás una plantilla que te ayudará a completar la información relevante. + +
+ 🔐 Importante: Si descubres una vulnerabilidad de seguridad, utiliza la herramienta de seguridad de GitHub para informarla de manera privada. +
+ +## Decidir en qué trabajar + +¿Buscas una buena primera contribución? Revisa los issues etiquetados con ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) o ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). ¡Estos están especialmente seleccionados para nuevos colaboradores y son áreas donde nos encantaría recibir ayuda! + +También damos la bienvenida a contribuciones a nuestra [documentación](https://github.com/cline/cline/tree/main/docs). Ya sea corrigiendo errores tipográficos, mejorando guías existentes o creando nuevos contenidos educativos, queremos construir un repositorio de recursos gestionado por la comunidad que ayude a todos a sacar el máximo provecho de Cline. Puedes comenzar explorando `/docs` y buscando áreas que necesiten mejoras. + +Si planeas trabajar en una función más grande, por favor crea primero una [solicitud de función](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) para que podamos discutir si se alinea con la visión de Cline. + +## Configurar el entorno de desarrollo + +1. **Extensiones de VS Code** + + - Al abrir el proyecto, VS Code te pedirá que instales las extensiones recomendadas + - Estas extensiones son necesarias para el desarrollo, por favor acepta todas las solicitudes de instalación + - Si rechazaste las solicitudes, puedes instalarlas manualmente en la sección de extensiones + +2. **Desarrollo local** + - Ejecuta `npm run install:all` para instalar las dependencias + - Ejecuta `npm run test` para ejecutar las pruebas localmente + - Antes de enviar un PR, ejecuta `npm run format:fix` para formatear tu código + +## Escribir y enviar código + +Cualquiera puede contribuir código a Cline, pero te pedimos que sigas estas pautas para asegurar que tus contribuciones se integren sin problemas: + +1. **Mantén los Pull Requests enfocados** + + - Limita los PRs a una sola función o corrección de errores + - Divide los cambios más grandes en PRs más pequeños y coherentes + - Divide los cambios en commits lógicos que puedan ser revisados independientemente + +2. **Calidad del código** + + - Ejecuta `npm run lint` para verificar el estilo del código + - Ejecuta `npm run format` para formatear el código automáticamente + - Todos los PRs deben pasar las verificaciones de CI, que incluyen linting y formateo + - Corrige todas las advertencias o errores de ESLint antes de enviar + - Sigue las mejores prácticas para TypeScript y mantén la seguridad de tipos + +3. **Pruebas** + + - Añade pruebas para nuevas funciones + - Ejecuta `npm test` para asegurarte de que todas las pruebas pasen + - Actualiza las pruebas existentes si tus cambios las afectan + - Añade tanto pruebas unitarias como de integración donde sea apropiado + +4. **Pautas de commits** + + - Escribe mensajes de commit claros y descriptivos + - Usa el formato de commit convencional (por ejemplo, "feat:", "fix:", "docs:") + - Haz referencia a los issues relevantes en los commits con #número-del-issue + +5. **Antes de enviar** + + - Rebasea tu rama con el último Main + - Asegúrate de que tu rama se construya correctamente + - Verifica que todas las pruebas pasen + - Revisa tus cambios para eliminar cualquier código de depuración o registros de consola + +6. **Descripción del Pull Request** + - Describe claramente lo que hacen tus cambios + - Añade pasos para probar los cambios + - Enumera cualquier cambio importante + - Añade capturas de pantalla para cambios en la interfaz de usuario + +## Acuerdo de contribución + +Al enviar un Pull Request, aceptas que tus contribuciones se licencien bajo la misma licencia que el proyecto ([Apache 2.0](LICENSE)). + +Recuerda: Contribuir a Cline no solo significa escribir código, sino ser parte de una comunidad que está dando forma al futuro del desarrollo asistido por IA. ¡Hagamos algo grandioso juntos! 🚀 diff --git a/locales/es/README.md b/locales/es/README.md new file mode 100644 index 0000000000..7d88225fa8 --- /dev/null +++ b/locales/es/README.md @@ -0,0 +1,161 @@ +# Cline – #1 en OpenRouter + +

+ +

+ + + +Conozca a Cline, un asistente de IA que puede usar su **CLI** y **E**ditor. + +Gracias a las [habilidades de codificación agencial de Claude 3.5 Sonnet](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf), Cline puede abordar tareas complejas de desarrollo de software paso a paso. Con herramientas que le permiten crear y editar archivos, explorar grandes proyectos, usar el navegador y ejecutar comandos de terminal (con su aprobación), puede ayudarle de una manera que va más allá de la autocompletación de código o el soporte técnico. Cline incluso puede usar el Model Context Protocol (MCP) para crear nuevas herramientas y expandir sus propias capacidades. Mientras que los scripts de IA autónomos tradicionalmente se ejecutan en entornos aislados, esta extensión ofrece una GUI con un humano en el bucle para aprobar cada cambio de archivo y comando de terminal, proporcionando una forma segura y accesible de explorar el potencial de la IA agencial. + +1. Ingrese su tarea y agregue imágenes para convertir maquetas en aplicaciones funcionales o solucionar errores con capturas de pantalla. +2. Cline comenzará analizando su estructura de archivos y ASTs de código fuente, realizando búsquedas Regex y leyendo archivos relevantes para orientarse en proyectos existentes. Al gestionar cuidadosamente la información agregada, Cline puede proporcionar asistencia valiosa incluso en proyectos grandes y complejos sin sobrecargar la ventana de contexto. +3. Una vez que Cline tenga la información necesaria, puede: + - Crear y editar archivos + monitorear errores de Linter/Compilador, para que pueda solucionar proactivamente problemas como importaciones faltantes y errores de sintaxis. + - Ejecutar comandos directamente en su terminal y monitorear su salida, para que pueda responder a problemas del servidor de desarrollo después de editar un archivo. + - Para tareas de desarrollo web, Cline puede iniciar el sitio web en un navegador sin cabeza, hacer clic, escribir, desplazarse y capturar capturas de pantalla + registros de consola, para que pueda solucionar errores de tiempo de ejecución y errores visuales. +4. Cuando una tarea esté completa, Cline le presentará el resultado con un comando de terminal como `open -a "Google Chrome" index.html`, que puede ejecutar con un clic en un botón. + +> [!TIP] +> Use el atajo de teclado `CMD/CTRL + Shift + P` para abrir la paleta de comandos y escriba "Cline: Open In New Tab" para abrir la extensión como una pestaña en su editor. De esta manera, puede usar Cline junto a su explorador de archivos y ver más claramente cómo cambia su espacio de trabajo. + +--- + + + +### Use cualquier API y modelo + +Cline admite proveedores de API como OpenRouter, Anthropic, OpenAI, Google Gemini, AWS Bedrock, Azure y GCP Vertex. También puede configurar cualquier API compatible con OpenAI o usar un modelo local a través de LM Studio/Ollama. Si usa OpenRouter, la extensión recupera su lista de modelos más reciente, para que pueda usar los modelos más nuevos tan pronto como estén disponibles. + +La extensión también rastrea el uso total de tokens y costos de API para todo el ciclo de tareas y solicitudes individuales, para que esté informado sobre los gastos en cada paso. + + + +
+ + + +### Ejecutar comandos en el terminal + +Gracias a las nuevas [actualizaciones de integración de Shell en VSCode v1.93](https://code.visualstudio.com/updates/v1_93#_terminal-shell-integration-api), Cline puede ejecutar comandos directamente en su terminal y recibir la salida. Esto le permite realizar una variedad de tareas, desde la instalación de paquetes y la ejecución de scripts de compilación hasta la implementación de aplicaciones, la gestión de bases de datos y la ejecución de pruebas, adaptándose a su entorno de desarrollo y cadena de herramientas para hacer el trabajo correctamente. + +Para procesos de larga duración como servidores de desarrollo, use el botón "Continuar mientras se ejecuta" para permitir que Cline continúe con la tarea mientras el comando se ejecuta en segundo plano. Mientras Cline trabaja, será notificado sobre nuevas salidas del terminal, para que pueda responder a problemas que puedan surgir, como errores de compilación al editar archivos. + + + +
+ + + +### Crear y editar archivos + +Cline puede crear y editar archivos directamente en su editor y presentarle una vista de diferencias de los cambios. Puede editar o deshacer los cambios de Cline directamente en el editor de vista de diferencias o proporcionar comentarios en el chat hasta que esté satisfecho con el resultado. Cline también monitorea errores de Linter/Compilador (importaciones faltantes, errores de sintaxis, etc.), para que pueda solucionar problemas que surjan en el camino. + +Todos los cambios realizados por Cline se registran en la línea de tiempo de su archivo, proporcionando una forma sencilla de rastrear cambios y deshacerlos si es necesario. + + + +
+ + + +### Usar el navegador + +Con la nueva [habilidad de uso de computadora](https://www.anthropic.com/news/3-5-models-and-computer-use) de Claude 3.5 Sonnet, Cline puede iniciar un navegador, hacer clic en elementos, escribir texto y desplazarse, capturando capturas de pantalla y registros de consola. Esto permite la depuración interactiva, pruebas de extremo a extremo e incluso el uso general de la web. Esto le da la autonomía para solucionar errores visuales y problemas de tiempo de ejecución sin que tenga que copiar y pegar registros de errores. + +Intente pedirle a Cline que "pruebe la aplicación" y observe cómo ejecuta un comando como `npm run dev`, inicia su servidor de desarrollo local en un navegador y realiza una serie de pruebas para confirmar que todo funciona. [Vea una demostración aquí.](https://x.com/sdrzn/status/1850880547825823989) + + + +
+ + + +### "agregar una herramienta que..." + +Gracias al [Model Context Protocol](https://github.com/modelcontextprotocol), Cline puede expandir sus habilidades mediante herramientas personalizadas. Mientras que puede usar [servidores creados por la comunidad](https://github.com/modelcontextprotocol/servers), Cline puede en su lugar crear e instalar herramientas adaptadas a su flujo de trabajo específico. Simplemente pida a Cline que "agregue una herramienta" y él se encargará de todo, desde la creación de un nuevo servidor MCP hasta la instalación en la extensión. Estas herramientas personalizadas se convierten en parte del conjunto de herramientas de Cline y están listas para ser utilizadas en tareas futuras. + +- "agregar una herramienta que recupere tickets de Jira": Recuperar ACs de tickets y poner a Cline a trabajar +- "agregar una herramienta que gestione AWS EC2s": Verificar métricas del servidor y escalar instancias hacia arriba o hacia abajo +- "agregar una herramienta que recupere los últimos incidentes de PagerDuty": Recuperar detalles y pedir a Cline que solucione errores + + + +
+ + + +### Agregar contexto + +**`@url`:** Inserte una URL para que la extensión la recupere y convierta en Markdown, útil cuando desee proporcionar a Cline los documentos más recientes + +**`@problems`:** Agregue errores y advertencias del espacio de trabajo (panel 'Problemas') que Cline debe solucionar + +**`@file`:** Agregue el contenido de un archivo para que no tenga que desperdiciar solicitudes de API para aprobar la lectura del archivo (+ para buscar archivos) + +**`@folder`:** Agregue los archivos de una carpeta a la vez para acelerar aún más su flujo de trabajo + + + +
+ + + +### Puntos de control: Comparar y Restaurar + +Mientras Cline trabaja en una tarea, la extensión crea una instantánea de su espacio de trabajo en cada paso. Puede usar el botón 'Comparar' para ver una diferencia entre la instantánea y su espacio de trabajo actual, y el botón 'Restaurar' para volver a ese punto. + +Por ejemplo, si está trabajando con un servidor web local, puede usar 'Restaurar solo espacio de trabajo' para probar rápidamente diferentes versiones de su aplicación, y luego 'Restaurar tarea y espacio de trabajo' cuando encuentre la versión desde la que desea continuar trabajando. Esto le permite explorar diferentes enfoques de manera segura sin perder progreso. + + + +
+ +## Contribuir + +Para contribuir al proyecto, comience con nuestra [guía de contribución](CONTRIBUTING.md) para aprender los conceptos básicos. También puede unirse a nuestro [Discord](https://discord.gg/cline) para chatear con otros colaboradores en el canal `#contributors`. Si está buscando un trabajo a tiempo completo, consulte nuestras vacantes en nuestra [página de carreras](https://cline.bot/join-us). + +
+Instrucciones de desarrollo local + +1. Clone el repositorio _(Requiere [git-lfs](https://git-lfs.com/))_: + ```bash + git clone https://github.com/cline/cline.git + ``` +2. Abra el proyecto en VSCode: + ```bash + code cline + ``` +3. Instale las dependencias necesarias para la extensión y la GUI de Webview: + ```bash + npm run install:all + ``` +4. Inicie presionando `F5` (o `Run`->`Start Debugging`) para abrir una nueva ventana de VSCode con la extensión cargada. (Es posible que deba instalar la [extensión de emparejadores de problemas de esbuild](https://marketplace.visualstudio.com/items?itemName=connor4312.esbuild-problem-matchers) si encuentra problemas al compilar el proyecto.) + +
+ +## Licencia + +[Apache 2.0 © 2024 Cline Bot Inc.](./LICENSE) diff --git a/locales/ja/CODE_OF_CONDUCT.md b/locales/ja/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..3547e4628b --- /dev/null +++ b/locales/ja/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at hi@cline.bot. All complaints +will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/locales/ja/CONTRIBUTING.md b/locales/ja/CONTRIBUTING.md new file mode 100644 index 0000000000..75edd9ed43 --- /dev/null +++ b/locales/ja/CONTRIBUTING.md @@ -0,0 +1,82 @@ +# Contributing to Cline + +We're thrilled you're interested in contributing to Cline. Whether you're fixing a bug, adding a feature, or improving our docs, every contribution makes Cline smarter! To keep our community vibrant and welcoming, all members must adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## Reporting Bugs or Issues + +Bug reports help make Cline better for everyone! Before creating a new issue, please [search existing ones](https://github.com/cline/cline/issues) to avoid duplicates. When you're ready to report a bug, head over to our [issues page](https://github.com/cline/cline/issues/new/choose) where you'll find a template to help you with filling out the relevant information. + +
+ 🔐 Important: If you discover a security vulnerability, please use the Github security tool to report it privately. +
+ +## Deciding What to Work On + +Looking for a good first contribution? Check out issues labeled ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) or ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). These are specifically curated for new contributors and areas where we'd love some help! + +We also welcome contributions to our [documentation](https://github.com/cline/cline/tree/main/docs)! Whether it's fixing typos, improving existing guides, or creating new educational content - we'd love to build a community-driven repository of resources that helps everyone get the most out of Cline. You can start by diving into `/docs` and looking for areas that need improvement. + +If you're planning to work on a bigger feature, please create a [feature request](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) first so we can discuss whether it aligns with Cline's vision. + +## Development Setup + +1. **VS Code Extensions** + + - When opening the project, VS Code will prompt you to install recommended extensions + - These extensions are required for development - please accept all installation prompts + - If you dismissed the prompts, you can install them manually from the Extensions panel + +2. **Local Development** + - Run `npm run install:all` to install dependencies + - Run `npm run test` to run tests locally + - Before submitting PR, run `npm run format:fix` to format your code + +## Writing and Submitting Code + +Anyone can contribute code to Cline, but we ask that you follow these guidelines to ensure your contributions can be smoothly integrated: + +1. **Keep Pull Requests Focused** + + - Limit PRs to a single feature or bug fix + - Split larger changes into smaller, related PRs + - Break changes into logical commits that can be reviewed independently + +2. **Code Quality** + + - Run `npm run lint` to check code style + - Run `npm run format` to automatically format code + - All PRs must pass CI checks which include both linting and formatting + - Address any ESLint warnings or errors before submitting + - Follow TypeScript best practices and maintain type safety + +3. **Testing** + + - Add tests for new features + - Run `npm test` to ensure all tests pass + - Update existing tests if your changes affect them + - Include both unit tests and integration tests where appropriate + +4. **Commit Guidelines** + + - Write clear, descriptive commit messages + - Use conventional commit format (e.g., "feat:", "fix:", "docs:") + - Reference relevant issues in commits using #issue-number + +5. **Before Submitting** + + - Rebase your branch on the latest main + - Ensure your branch builds successfully + - Double-check all tests are passing + - Review your changes for any debugging code or console logs + +6. **Pull Request Description** + - Clearly describe what your changes do + - Include steps to test the changes + - List any breaking changes + - Add screenshots for UI changes + +## Contribution Agreement + +By submitting a pull request, you agree that your contributions will be licensed under the same license as the project ([Apache 2.0](LICENSE)). + +Remember: Contributing to Cline isn't just about writing code - it's about being part of a community that's shaping the future of AI-assisted development. Let's build something amazing together! 🚀 diff --git a/locales/ja/README.md b/locales/ja/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/locales/zh-cn/CODE_OF_CONDUCT.md b/locales/zh-cn/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..3547e4628b --- /dev/null +++ b/locales/zh-cn/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at hi@cline.bot. All complaints +will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/locales/zh-cn/CONTRIBUTING.md b/locales/zh-cn/CONTRIBUTING.md new file mode 100644 index 0000000000..75edd9ed43 --- /dev/null +++ b/locales/zh-cn/CONTRIBUTING.md @@ -0,0 +1,82 @@ +# Contributing to Cline + +We're thrilled you're interested in contributing to Cline. Whether you're fixing a bug, adding a feature, or improving our docs, every contribution makes Cline smarter! To keep our community vibrant and welcoming, all members must adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## Reporting Bugs or Issues + +Bug reports help make Cline better for everyone! Before creating a new issue, please [search existing ones](https://github.com/cline/cline/issues) to avoid duplicates. When you're ready to report a bug, head over to our [issues page](https://github.com/cline/cline/issues/new/choose) where you'll find a template to help you with filling out the relevant information. + +
+ 🔐 Important: If you discover a security vulnerability, please use the Github security tool to report it privately. +
+ +## Deciding What to Work On + +Looking for a good first contribution? Check out issues labeled ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) or ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). These are specifically curated for new contributors and areas where we'd love some help! + +We also welcome contributions to our [documentation](https://github.com/cline/cline/tree/main/docs)! Whether it's fixing typos, improving existing guides, or creating new educational content - we'd love to build a community-driven repository of resources that helps everyone get the most out of Cline. You can start by diving into `/docs` and looking for areas that need improvement. + +If you're planning to work on a bigger feature, please create a [feature request](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) first so we can discuss whether it aligns with Cline's vision. + +## Development Setup + +1. **VS Code Extensions** + + - When opening the project, VS Code will prompt you to install recommended extensions + - These extensions are required for development - please accept all installation prompts + - If you dismissed the prompts, you can install them manually from the Extensions panel + +2. **Local Development** + - Run `npm run install:all` to install dependencies + - Run `npm run test` to run tests locally + - Before submitting PR, run `npm run format:fix` to format your code + +## Writing and Submitting Code + +Anyone can contribute code to Cline, but we ask that you follow these guidelines to ensure your contributions can be smoothly integrated: + +1. **Keep Pull Requests Focused** + + - Limit PRs to a single feature or bug fix + - Split larger changes into smaller, related PRs + - Break changes into logical commits that can be reviewed independently + +2. **Code Quality** + + - Run `npm run lint` to check code style + - Run `npm run format` to automatically format code + - All PRs must pass CI checks which include both linting and formatting + - Address any ESLint warnings or errors before submitting + - Follow TypeScript best practices and maintain type safety + +3. **Testing** + + - Add tests for new features + - Run `npm test` to ensure all tests pass + - Update existing tests if your changes affect them + - Include both unit tests and integration tests where appropriate + +4. **Commit Guidelines** + + - Write clear, descriptive commit messages + - Use conventional commit format (e.g., "feat:", "fix:", "docs:") + - Reference relevant issues in commits using #issue-number + +5. **Before Submitting** + + - Rebase your branch on the latest main + - Ensure your branch builds successfully + - Double-check all tests are passing + - Review your changes for any debugging code or console logs + +6. **Pull Request Description** + - Clearly describe what your changes do + - Include steps to test the changes + - List any breaking changes + - Add screenshots for UI changes + +## Contribution Agreement + +By submitting a pull request, you agree that your contributions will be licensed under the same license as the project ([Apache 2.0](LICENSE)). + +Remember: Contributing to Cline isn't just about writing code - it's about being part of a community that's shaping the future of AI-assisted development. Let's build something amazing together! 🚀 diff --git a/locales/zh-cn/README.md b/locales/zh-cn/README.md new file mode 100644 index 0000000000..6fbe1d8215 --- /dev/null +++ b/locales/zh-cn/README.md @@ -0,0 +1,162 @@ +# Cline – \#1 on OpenRouter + +

+ +

+ + + +认识 Cline,一个可以使用你的 **CLI** 和 **编辑器** 的 AI 助手。 + +感谢 [Claude 3.5 Sonnet 的代理编码能力](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf),Cline 可以一步步处理复杂的软件开发任务。通过允许他创建和编辑文件、探索大型项目、使用浏览器和执行终端命令(在你授予权限后),他可以提供超越代码完成或技术支持的帮助。Cline 甚至可以使用 Model Context Protocol (MCP) 创建新工具并扩展自己的能力。虽然自主 AI 脚本传统上在沙盒环境中运行,但此扩展提供了一个人机交互的 GUI 来批准每个文件更改和终端命令,提供了一种安全且可访问的方式来探索代理 AI 的潜力。 + +1. 输入你的任务并添加图像,将模型转换为功能应用程序或通过截图修复错误。 +2. Cline 首先分析你的文件结构和源代码 AST,运行正则表达式搜索,并阅读相关文件以了解现有项目。通过仔细管理添加到上下文中的信息,Cline 即使在大型复杂项目中也能提供有价值的帮助,而不会使上下文窗口过载。 +3. 一旦 Cline 获得所需信息,他可以: + - 创建和编辑文件 + 监控 linter/编译器错误,从而主动修复诸如缺少导入和语法错误等问题。 + - 直接在你的终端中执行命令并监控其输出,从而在编辑文件后对开发服务器问题做出反应。 + - 对于 Web 开发任务,Cline 可以在无头浏览器中启动网站,点击、输入、滚动并捕获截图和控制台日志,从而修复运行时错误和视觉错误。 +4. 当任务完成时,Cline 将通过终端命令如 `open -a "Google Chrome" index.html` 向你展示结果,你可以通过点击按钮运行该命令。 + +> [!提示] +> 使用 `CMD/CTRL + Shift + P` 快捷键打开命令面板并输入 "Cline: Open In New Tab" 将扩展作为标签在编辑器中打开。这让你可以与文件资源管理器并排使用 Cline,更清楚地看到他如何改变你的工作空间。 + +--- + + + +### 使用任何 API 和模型 + +Cline 支持 OpenRouter、Anthropic、OpenAI、Google Gemini、AWS Bedrock、Azure 和 GCP Vertex 等 API 提供商。你还可以配置任何兼容 OpenAI 的 API,或通过 LM Studio/Ollama 使用本地模型。如果你使用 OpenRouter,扩展会获取他们的最新模型列表,让你在新模型可用时立即使用。 + +扩展还会跟踪整个任务循环和单个请求的总令牌和 API 使用成本,让你在每一步都了解支出情况。 + + + +
+ + + +### 在终端中运行命令 + +感谢 VSCode v1.93 中的新 [终端 shell 集成更新](https://code.visualstudio.com/updates/v1_93#_terminal-shell-integration-api),Cline 可以直接在你的终端中执行命令并接收输出。这使他能够执行广泛的任务,从安装包和运行构建脚本到部署应用程序、管理数据库和执行测试,同时适应你的开发环境和工具链以正确完成工作。 + +对于长时间运行的进程如开发服务器,使用“在运行时继续”按钮让 Cline 在命令后台运行时继续任务。当 Cline 工作时,他会在过程中收到任何新的终端输出通知,让他对可能出现的问题做出反应,例如编辑文件时的编译时错误。 + + + +
+ + + +### 创建和编辑文件 + +Cline 可以直接在你的编辑器中创建和编辑文件,向你展示更改的差异视图。你可以直接在差异视图编辑器中编辑或恢复 Cline 的更改,或在聊天中提供反馈,直到你对结果满意。Cline 还会监控 linter/编译器错误(缺少导入、语法错误等),以便他在过程中自行修复出现的问题。 + +Cline 所做的所有更改都会记录在你的文件时间轴中,提供了一种简单的方法来跟踪和恢复修改(如果需要)。 + + + +
+ + + +### 使用浏览器 + +借助 Claude 3.5 Sonnet 的新 [计算机使用](https://www.anthropic.com/news/3-5-models-and-computer-use) 功能,Cline 可以启动浏览器,点击元素,输入文本和滚动,在每一步捕获截图和控制台日志。这允许进行交互式调试、端到端测试,甚至是一般的网页使用!这使他能够自主修复视觉错误和运行时问题,而无需你亲自操作和复制粘贴错误日志。 + +试试让 Cline “测试应用程序”,看看他如何运行 `npm run dev` 命令,在浏览器中启动你本地运行的开发服务器,并执行一系列测试以确认一切正常。[在这里查看演示。](https://x.com/sdrzn/status/1850880547825823989) + + + +
+ + + +### “添加一个工具……” + +感谢 [Model Context Protocol](https://github.com/modelcontextprotocol),Cline 可以通过自定义工具扩展他的能力。虽然你可以使用 [社区制作的服务器](https://github.com/modelcontextprotocol/servers),但 Cline 可以创建和安装适合你特定工作流程的工具。只需让 Cline “添加一个工具”,他将处理所有事情,从创建新的 MCP 服务器到将其安装到扩展中。这些自定义工具将成为 Cline 工具包的一部分,准备在未来的任务中使用。 + +- “添加一个获取 Jira 工单的工具”:检索工单 AC 并让 Cline 开始工作 +- “添加一个管理 AWS EC2 的工具”:检查服务器指标并上下扩展实例 +- “添加一个获取最新 PagerDuty 事件的工具”:获取详细信息并让 Cline 修复错误 + + + +
+ + + +### 添加上下文 + +**`@url`:** 粘贴一个 URL 以供扩展获取并转换为 markdown,当你想给 Cline 提供最新文档时非常有用 + +**`@problems`:** 添加工作区错误和警告(“问题”面板)以供 Cline 修复 + +**`@file`:** 添加文件内容,这样你就不必浪费 API 请求批准读取文件(+ 输入以搜索文件) + +**`@folder`:** 一次添加文件夹的文件,以进一步加快你的工作流程 + + + +
+ + + +### 检查点:比较和恢复 + +当 Cline 完成任务时,扩展会在每一步拍摄你的工作区快照。你可以使用“比较”按钮查看快照和当前工作区之间的差异,并使用“恢复”按钮回滚到该点。 + +例如,当使用本地 Web 服务器时,你可以使用“仅恢复工作区”快速测试应用程序的不同版本,然后在找到要继续构建的版本时使用“恢复任务和工作区”。这让你可以安全地探索不同的方法而不会丢失进度。 + + + +
+ +## 贡献 + +要为项目做出贡献,请从我们的 [贡献指南](CONTRIBUTING.md) 开始,了解基础知识。你还可以加入我们的 [Discord](https://discord.gg/cline) 在 `#contributors` 频道与其他贡献者聊天。如果你正在寻找全职工作,请查看我们在 [招聘页面](https://cline.bot/join-us) 上的开放职位! + +
+本地开发说明 + +1. 克隆仓库 _(需要 [git-lfs](https://git-lfs.com/))_: + ```bash + git clone https://github.com/cline/cline.git + ``` +2. 在 VSCode 中打开项目: + ```bash + code cline + ``` +3. 安装扩展和 webview-gui 的必要依赖: + ```bash + npm run install:all + ``` +4. 按 `F5`(或 `运行`->`开始调试`)启动以打开一个加载了扩展的新 VSCode 窗口。(如果你在构建项目时遇到问题,可能需要安装 [esbuild problem matchers 扩展](https://marketplace.visualstudio.com/items?itemName=connor4312.esbuild-problem-matchers)) + +
+ +## 许可证 + +[Apache 2.0 © 2024 Cline Bot Inc.](./LICENSE) + diff --git a/locales/zh-tw/CODE_OF_CONDUCT.md b/locales/zh-tw/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..3547e4628b --- /dev/null +++ b/locales/zh-tw/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at hi@cline.bot. All complaints +will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/locales/zh-tw/CONTRIBUTING.md b/locales/zh-tw/CONTRIBUTING.md new file mode 100644 index 0000000000..698a897c50 --- /dev/null +++ b/locales/zh-tw/CONTRIBUTING.md @@ -0,0 +1,82 @@ +# 貢獻於 Cline + +我們很高興您有興趣為 Cline 做出貢獻。無論您是修復錯誤、添加功能還是改進我們的文檔,每一個貢獻都讓 Cline 更加智能!為了保持我們的社區充滿活力和歡迎,所有成員必須遵守我們的[行為準則](CODE_OF_CONDUCT.md)。 + +## 報告錯誤或問題 + +錯誤報告有助於讓 Cline 對每個人都更好!在創建新問題之前,請[搜索現有問題](https://github.com/cline/cline/issues)以避免重複。當您準備報告錯誤時,請前往我們的[問題頁面](https://github.com/cline/cline/issues/new/choose),您會找到一個模板來幫助您填寫相關信息。 + +
+ 🔐 重要: 如果您發現安全漏洞,請使用Github 安全工具私下報告。 +
+ +## 決定要做什麼 + +尋找一個好的首次貢獻?查看標有["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue)或["help wanted"](https://github.com/cline/cline/labels/help%20wanted)的問題。這些是專門為新貢獻者和我們希望得到幫助的領域策劃的! + +我們也歡迎對我們[文檔](https://github.com/cline/cline/tree/main/docs)的貢獻!無論是修正錯別字、改進現有指南還是創建新的教育內容 - 我們希望建立一個由社區驅動的資源庫,幫助每個人充分利用 Cline。您可以從深入研究 `/docs` 並尋找需要改進的領域開始。 + +如果您計劃開發一個更大的功能,請先創建一個[功能請求](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop),以便我們討論它是否符合 Cline 的願景。 + +## 開發設置 + +1. **VS Code 擴展** + + - 打開項目時,VS Code 會提示您安裝推薦的擴展 + - 這些擴展是開發所需的 - 請接受所有安裝提示 + - 如果您忽略了提示,可以從擴展面板手動安裝它們 + +2. **本地開發** + - 運行 `npm run install:all` 安裝依賴項 + - 運行 `npm run test` 本地運行測試 + - 提交 PR 之前,運行 `npm run format:fix` 格式化您的代碼 + +## 編寫和提交代碼 + +任何人都可以為 Cline 貢獻代碼,但我們要求您遵循以下指南,以確保您的貢獻能夠順利集成: + +1. **保持 Pull Requests 集中** + + - 將 PR 限制在單個功能或錯誤修復 + - 將較大的更改拆分為較小的相關 PR + - 將更改分為邏輯提交,可以獨立審查 + +2. **代碼質量** + + - 運行 `npm run lint` 檢查代碼風格 + - 運行 `npm run format` 自動格式化代碼 + - 所有 PR 必須通過包括 lint 和格式化在內的 CI 檢查 + - 提交前解決所有 ESLint 警告或錯誤 + - 遵循 TypeScript 最佳實踐並保持類型安全 + +3. **測試** + + - 為新功能添加測試 + - 運行 `npm test` 確保所有測試通過 + - 如果您的更改影響現有測試,請更新它們 + - 在適當的地方包括單元測試和集成測試 + +4. **提交指南** + + - 撰寫清晰、描述性的提交消息 + - 使用常規提交格式(例如 "feat:"、"fix:"、"docs:") + - 在提交中引用相關問題,使用 #issue-number + +5. **提交前** + + - 將您的分支重新基於最新的 main + - 確保您的分支成功構建 + - 仔細檢查所有測試是否通過 + - 檢查您的更改是否有任何調試代碼或控制台日誌 + +6. **Pull Request 描述** + - 清楚地描述您的更改內容 + - 包括測試更改的步驟 + - 列出任何重大更改 + - 為 UI 更改添加截圖 + +## 貢獻協議 + +通過提交 pull request,您同意您的貢獻將根據與項目相同的許可證([Apache 2.0](LICENSE))進行許可。 + +記住:貢獻於 Cline 不僅僅是編寫代碼 - 這是關於成為一個塑造 AI 輔助開發未來的社區的一部分。讓我們一起創造一些驚人的東西!🚀 diff --git a/locales/zh-tw/README.md b/locales/zh-tw/README.md new file mode 100644 index 0000000000..0325650d01 --- /dev/null +++ b/locales/zh-tw/README.md @@ -0,0 +1,161 @@ +# Cline – OpenRouter 上的 \#1 + +

+ +

+ + + +認識 Cline,一個可以使用你的 **CLI** 和 **編輯器** 的 AI 助手。 + +感謝 [Claude 3.5 Sonnet 的代理編碼能力](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf),Cline 可以一步步處理複雜的軟件開發任務。通過允許他創建和編輯文件、探索大型項目、使用瀏覽器和執行終端命令(在你授予權限後),他可以提供超越代碼完成或技術支持的幫助。Cline 甚至可以使用 Model Context Protocol (MCP) 創建新工具並擴展自己的能力。雖然自主 AI 腳本傳統上在沙盒環境中運行,但此擴展提供了一個人機交互的 GUI 來批准每個文件更改和終端命令,提供了一種安全且可訪問的方式來探索代理 AI 的潛力。 + +1. 輸入你的任務並添加圖像,將模型轉換為功能應用程序或通過截圖修復錯誤。 +2. Cline 首先分析你的文件結構和源代碼 AST,運行正則表達式搜索,並閱讀相關文件以了解現有項目。通過仔細管理添加到上下文中的信息,Cline 即使在大型複雜項目中也能提供有價值的幫助,而不會使上下文窗口過載。 +3. 一旦 Cline 獲得所需信息,他可以: + - 創建和編輯文件 + 監控 linter/編譯器錯誤,從而主動修復諸如缺少導入和語法錯誤等問題。 + - 直接在你的終端中執行命令並監控其輸出,從而在編輯文件後對開發服務器問題做出反應。 + - 對於 Web 開發任務,Cline 可以在無頭瀏覽器中啟動網站,點擊、輸入、滾動並捕獲截圖和控制台日誌,從而修復運行時錯誤和視覺錯誤。 +4. 當任務完成時,Cline 將通過終端命令如 `open -a "Google Chrome" index.html` 向你展示結果,你可以通過點擊按鈕運行該命令。 + +> [!提示] +> 使用 `CMD/CTRL + Shift + P` 快捷鍵打開命令面板並輸入 "Cline: Open In New Tab" 將擴展作為標籤在編輯器中打開。這讓你可以與文件資源管理器並排使用 Cline,更清楚地看到他如何改變你的工作空間。 + +--- + + + +### 使用任何 API 和模型 + +Cline 支持 OpenRouter、Anthropic、OpenAI、Google Gemini、AWS Bedrock、Azure 和 GCP Vertex 等 API 提供商。你還可以配置任何兼容 OpenAI 的 API,或通過 LM Studio/Ollama 使用本地模型。如果你使用 OpenRouter,擴展會獲取他們的最新模型列表,讓你在新模型可用時立即使用。 + +擴展還會跟蹤整個任務循環和單個請求的總令牌和 API 使用成本,讓你在每一步都了解支出情況。 + + + +
+ + + +### 在終端中運行命令 + +感謝 VSCode v1.93 中的新 [終端 shell 集成更新](https://code.visualstudio.com/updates/v1_93#_terminal-shell-integration-api),Cline 可以直接在你的終端中執行命令並接收輸出。這使他能夠執行廣泛的任務,從安裝包和運行構建腳本到部署應用程序、管理數據庫和執行測試,同時適應你的開發環境和工具鏈以正確完成工作。 + +對於長時間運行的進程如開發服務器,使用“在運行時繼續”按鈕讓 Cline 在命令後台運行時繼續任務。當 Cline 工作時,他會在過程中收到任何新的終端輸出通知,讓他對可能出現的問題做出反應,例如編輯文件時的編譯時錯誤。 + + + +
+ + + +### 創建和編輯文件 + +Cline 可以直接在你的編輯器中創建和編輯文件,向你展示更改的差異視圖。你可以直接在差異視圖編輯器中編輯或恢復 Cline 的更改,或在聊天中提供反饋,直到你對結果滿意。Cline 還會監控 linter/編譯器錯誤(缺少導入、語法錯誤等),以便他在過程中自行修復出現的問題。 + +Cline 所做的所有更改都會記錄在你的文件時間軸中,提供了一種簡單的方法來跟蹤和恢復修改(如果需要)。 + + + +
+ + + +### 使用瀏覽器 + +借助 Claude 3.5 Sonnet 的新 [計算機使用](https://www.anthropic.com/news/3-5-models-and-computer-use) 功能,Cline 可以啟動瀏覽器,點擊元素,輸入文本和滾動,在每一步捕獲截圖和控制台日誌。這允許進行交互式調試、端到端測試,甚至是一般的網頁使用!這使他能夠自主修復視覺錯誤和運行時問題,而無需你親自操作和複製粘貼錯誤日誌。 + +試試讓 Cline “測試應用程序”,看看他如何運行 `npm run dev` 命令,在瀏覽器中啟動你本地運行的開發服務器,並執行一系列測試以確認一切正常。[在這裡查看演示。](https://x.com/sdrzn/status/1850880547825823989) + + + +
+ + + +### “添加一個工具……” + +感謝 [Model Context Protocol](https://github.com/modelcontextprotocol),Cline 可以通過自定義工具擴展他的能力。雖然你可以使用 [社區製作的服務器](https://github.com/modelcontextprotocol/servers),但 Cline 可以創建和安裝適合你特定工作流程的工具。只需讓 Cline “添加一個工具”,他將處理所有事情,從創建新的 MCP 服務器到將其安裝到擴展中。這些自定義工具將成為 Cline 工具包的一部分,準備在未來的任務中使用。 + +- “添加一個獲取 Jira 工單的工具”:檢索工單 AC 並讓 Cline 開始工作 +- “添加一個管理 AWS EC2 的工具”:檢查服務器指標並上下擴展實例 +- “添加一個獲取最新 PagerDuty 事件的工具”:獲取詳細信息並讓 Cline 修復錯誤 + + + +
+ + + +### 添加上下文 + +**`@url`:** 粘貼一個 URL 以供擴展獲取並轉換為 markdown,當你想給 Cline 提供最新文檔時非常有用 + +**`@problems`:** 添加工作區錯誤和警告(“問題”面板)以供 Cline 修復 + +**`@file`:** 添加文件內容,這樣你就不必浪費 API 請求批准讀取文件(+ 輸入以搜索文件) + +**`@folder`:** 一次添加文件夾的文件,以進一步加快你的工作流程 + + + +
+ + + +### 檢查點:比較和恢復 + +當 Cline 完成任務時,擴展會在每一步拍攝你的工作區快照。你可以使用“比較”按鈕查看快照和當前工作區之間的差異,並使用“恢復”按鈕回滾到該點。 + +例如,當使用本地 Web 服務器時,你可以使用“僅恢復工作區”快速測試應用程序的不同版本,然後在找到要繼續構建的版本時使用“恢復任務和工作區”。這讓你可以安全地探索不同的方法而不會丟失進度。 + + + +
+ +## 貢獻 + +要為項目做出貢獻,請從我們的 [貢獻指南](CONTRIBUTING.md) 開始,了解基礎知識。你還可以加入我們的 [Discord](https://discord.gg/cline) 在 `#contributors` 頻道與其他貢獻者聊天。如果你正在尋找全職工作,請查看我們在 [招聘頁面](https://cline.bot/join-us) 上的開放職位! + +
+本地開發說明 + +1. 克隆倉庫 _(需要 [git-lfs](https://git-lfs.com/))_: + ```bash + git clone https://github.com/cline/cline.git + ``` +2. 在 VSCode 中打開項目: + ```bash + code cline + ``` +3. 安裝擴展和 webview-gui 的必要依賴: + ```bash + npm run install:all + ``` +4. 按 `F5`(或 `運行`->`開始調試`)啟動以打開一個加載了擴展的新 VSCode 窗口。(如果你在構建項目時遇到問題,可能需要安裝 [esbuild problem matchers 擴展](https://marketplace.visualstudio.com/items?itemName=connor4312.esbuild-problem-matchers)) + +
+ +## 許可證 + +[Apache 2.0 © 2024 Cline Bot Inc.](./LICENSE) From 742d169601687e636a19983c67571fbdba5a8575 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 10:41:30 -1000 Subject: [PATCH 04/74] typo --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 86ba0e501c..fa8919d10c 100644 --- a/README.md +++ b/README.md @@ -27,11 +27,11 @@ Other language [README files](./README.md) are available in: -- [Español](./locale/es/README.md) -- [Deutsch](./locale/de/README.md) -- [日本語](./locale/ja/README.md) -- [简体中文](./locale/zh-cn/README.md) -- [繁體中文](./locale/zh-tw/README.md) +- [Español](./locales/es/README.md) +- [Deutsch](./locales/de/README.md) +- [日本語](./locales/ja/README.md) +- [简体中文](./locales/zh-cn/README.md) +- [繁體中文](./locales/zh-tw/README.md) Thanks to [Claude 3.5 Sonnet's agentic coding capabilities](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf), Cline can handle complex software development tasks step-by-step. With tools that let him create & edit files, explore large projects, use the browser, and execute terminal commands (after you grant permission), he can assist you in ways that go beyond code completion or tech support. Cline can even use the Model Context Protocol (MCP) to create new tools and extend his own capabilities. While autonomous AI scripts traditionally run in sandboxed environments, this extension provides a human-in-the-loop GUI to approve every file change and terminal command, providing a safe and accessible way to explore the potential of agentic AI. From 26c6a0105c1c0177f405cf57f312f1e74aa67b76 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 10:48:29 -1000 Subject: [PATCH 05/74] spanish and other languages --- locales/es/CODE_OF_CONDUCT.md | 105 +++++++++++++++---------------- locales/ja/CODE_OF_CONDUCT.md | 83 ++++++++---------------- locales/ja/CONTRIBUTING.md | 104 +++++++++++++++--------------- locales/zh-cn/CODE_OF_CONDUCT.md | 85 +++++++++---------------- locales/zh-cn/CONTRIBUTING.md | 104 +++++++++++++++--------------- locales/zh-tw/CODE_OF_CONDUCT.md | 83 ++++++++---------------- 6 files changed, 236 insertions(+), 328 deletions(-) diff --git a/locales/es/CODE_OF_CONDUCT.md b/locales/es/CODE_OF_CONDUCT.md index 3547e4628b..82fe929eda 100644 --- a/locales/es/CODE_OF_CONDUCT.md +++ b/locales/es/CODE_OF_CONDUCT.md @@ -1,76 +1,71 @@ -# Contributor Covenant Code of Conduct +# Código de Conducta para Contribuyentes -## Our Pledge +## Nuestro Compromiso -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. +En el interés de fomentar un entorno abierto y acogedor, nosotros como +contribuyentes y mantenedores nos comprometemos a hacer de la participación en nuestro proyecto y +nuestra comunidad una experiencia libre de acoso para todos, independientemente de la edad, tamaño corporal, +discapacidad, etnia, características sexuales, identidad y expresión de género, +nivel de experiencia, educación, estatus socioeconómico, nacionalidad, apariencia personal, +raza, religión o identidad y orientación sexual. -## Our Standards +## Nuestros Estándares -Examples of behavior that contributes to creating a positive environment -include: +Ejemplos de comportamientos que contribuyen a crear un entorno positivo incluyen: -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members +- Uso de un lenguaje acogedor e inclusivo +- Respeto a diferentes puntos de vista y experiencias +- Aceptar de manera constructiva las críticas +- Centrarse en lo que es mejor para la comunidad +- Mostrar empatía hacia otros miembros de la comunidad -Examples of unacceptable behavior by participants include: +Ejemplos de comportamientos inaceptables por parte de los participantes incluyen: -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +- El uso de lenguaje o imágenes sexualizadas y la atención o avances sexuales no deseados +- Trollear, comentarios insultantes/despectivos y ataques personales o políticos +- Acoso público o privado +- Publicar información privada de otros, como una dirección física o electrónica, + sin permiso explícito +- Otras conductas que podrían considerarse inapropiadas en un entorno profesional -## Our Responsibilities +## Nuestras Responsabilidades -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +Los mantenedores del proyecto son responsables de aclarar los estándares de comportamiento aceptable +y se espera que tomen medidas correctivas apropiadas y justas en respuesta a cualquier +caso de comportamiento inaceptable. -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +Los mantenedores del proyecto tienen el derecho y la responsabilidad de eliminar, editar o rechazar +comentarios, commits, código, ediciones de wiki, issues y otras contribuciones que no estén alineadas con este Código de Conducta, o de prohibir temporal o permanentemente a cualquier contribuyente cuyo comportamiento sea inapropiado, +amenazante, ofensivo o dañino. -## Scope +## Alcance -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. +Este Código de Conducta se aplica tanto dentro de los espacios del proyecto como en espacios públicos +cuando una persona representa el proyecto o su comunidad. Ejemplos de +representación de un proyecto o comunidad incluyen el uso de una dirección de correo electrónico oficial del proyecto, +publicar en una cuenta oficial de redes sociales o actuar como un representante designado +en un evento en línea o fuera de línea. La representación de un proyecto puede +ser definida y clarificada más específicamente por los mantenedores del proyecto. -## Enforcement +## Aplicación -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at hi@cline.bot. All complaints -will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +Los casos de comportamiento abusivo, acosador o inaceptable de otra manera pueden +ser reportados contactando al equipo del proyecto en hi@cline.bot. Todas las quejas +serán revisadas e investigadas y resultarán en una respuesta que +se considere necesaria y apropiada a las circunstancias. El equipo del proyecto está +obligado a mantener la confidencialidad con respecto al informante de un incidente. +Más detalles sobre políticas específicas de aplicación pueden ser publicados por separado. -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +Los mantenedores del proyecto que no sigan o hagan cumplir el Código de Conducta de buena +fe pueden enfrentar repercusiones temporales o permanentes según lo determinen otros +miembros de la dirección del proyecto. -## Attribution +## Atribución -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +Este Código de Conducta está adaptado del [Contributor Covenant][homepage], versión 1.4, +disponible en https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org -For answers to common questions about this code of conduct, see +Respuestas a preguntas frecuentes sobre este Código de Conducta se pueden encontrar en https://www.contributor-covenant.org/faq diff --git a/locales/ja/CODE_OF_CONDUCT.md b/locales/ja/CODE_OF_CONDUCT.md index 3547e4628b..a2c673a94d 100644 --- a/locales/ja/CODE_OF_CONDUCT.md +++ b/locales/ja/CODE_OF_CONDUCT.md @@ -1,76 +1,47 @@ -# Contributor Covenant Code of Conduct +# コントリビューター規約行動規範 -## Our Pledge +## 我々の誓い -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. +オープンで歓迎される環境を育むために、我々はコントリビューターおよびメンテナーとして、年齢、体型、障害、民族、性の特徴、性別のアイデンティティおよび表現、経験のレベル、教育、社会経済的地位、国籍、個人の外見、人種、宗教、または性的アイデンティティおよび指向に関係なく、プロジェクトおよびコミュニティへの参加がハラスメントのない体験となるよう誓います。 -## Our Standards +## 我々の基準 -Examples of behavior that contributes to creating a positive environment -include: +ポジティブな環境を作り出す行動の例としては、以下のものがあります: -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members +- 歓迎的で包括的な言葉を使うこと +- 異なる視点や経験を尊重すること +- 建設的な批判を優雅に受け入れること +- コミュニティのために最善を尽くすことに集中すること +- 他のコミュニティメンバーに対して共感を示すこと -Examples of unacceptable behavior by participants include: +参加者による許容できない行動の例としては、以下のものがあります: -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +- 性的な言葉や画像の使用、望まれない性的関心やアプローチ +- 荒らし、侮辱的/軽蔑的なコメント、個人的または政治的な攻撃 +- 公的または私的なハラスメント +- 明示的な許可なしに他人の個人情報(物理的または電子的な住所など)を公開すること +- プロフェッショナルな環境で不適切と合理的に見なされるその他の行動 -## Our Responsibilities +## 我々の責任 -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +プロジェクトのメンテナーは、許容される行動の基準を明確にする責任があり、不適切な行動の事例に対して適切かつ公平な是正措置を講じることが期待されています。 -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +プロジェクトのメンテナーは、この行動規範に沿わないコメント、コミット、コード、ウィキの編集、問題、およびその他の貢献を削除、編集、または拒否する権利と責任を持ち、また、不適切、脅迫的、攻撃的、または有害と見なされるその他の行動を行ったコントリビューターを一時的または永久に禁止する権利と責任を持ちます。 -## Scope +## 範囲 -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. +この行動規範は、プロジェクトスペース内およびプロジェクトやコミュニティを代表する個人が公の場で行動する場合に適用されます。プロジェクトやコミュニティを代表する例としては、公式のプロジェクトメールアドレスを使用すること、公式のソーシャルメディアアカウントを通じて投稿すること、またはオンラインまたはオフラインのイベントで任命された代表として行動することが含まれます。プロジェクトの代表としての行動は、プロジェクトのメンテナーによってさらに定義および明確化される場合があります。 -## Enforcement +## 執行 -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at hi@cline.bot. All complaints -will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +虐待的、嫌がらせ、またはその他の許容できない行動の事例は、プロジェクトチームに hi@cline.bot まで報告することができます。すべての苦情はレビューおよび調査され、状況に応じて必要かつ適切な対応が行われます。プロジェクトチームは、事件の報告者に関する機密性を保持する義務があります。具体的な執行ポリシーの詳細は別途掲載される場合があります。 -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +行動規範を誠実に遵守または執行しないプロジェクトのメンテナーは、プロジェクトのリーダーシップの他のメンバーによって一時的または永久的な影響を受ける可能性があります。 -## Attribution +## 帰属 -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +この行動規範は、[Contributor Covenant][homepage] バージョン 1.4 から適応されており、https://www.contributor-covenant.org/version/1/4/code-of-conduct.html で入手できます。 [homepage]: https://www.contributor-covenant.org -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq +この行動規範に関する一般的な質問への回答については、https://www.contributor-covenant.org/faq を参照してください。 diff --git a/locales/ja/CONTRIBUTING.md b/locales/ja/CONTRIBUTING.md index 75edd9ed43..62544e27cb 100644 --- a/locales/ja/CONTRIBUTING.md +++ b/locales/ja/CONTRIBUTING.md @@ -1,82 +1,82 @@ -# Contributing to Cline +# Clineへの貢献 -We're thrilled you're interested in contributing to Cline. Whether you're fixing a bug, adding a feature, or improving our docs, every contribution makes Cline smarter! To keep our community vibrant and welcoming, all members must adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). +Clineへの貢献に興味をお持ちいただきありがとうございます。 -## Reporting Bugs or Issues +## バグや問題の報告 -Bug reports help make Cline better for everyone! Before creating a new issue, please [search existing ones](https://github.com/cline/cline/issues) to avoid duplicates. When you're ready to report a bug, head over to our [issues page](https://github.com/cline/cline/issues/new/choose) where you'll find a template to help you with filling out the relevant information. +バグ報告は、Clineを皆さんにとってより良いものにするために役立ちます!新しい問題を作成する前に、重複を避けるために[既存の問題を検索](https://github.com/cline/cline/issues)してください。バグを報告する準備ができたら、[問題ページ](https://github.com/cline/cline/issues/new/choose)に移動し、関連情報を記入するためのテンプレートをご利用ください。
- 🔐 Important: If you discover a security vulnerability, please use the Github security tool to report it privately. + 🔐 重要: セキュリティ脆弱性を発見した場合は、Githubセキュリティツールを使用して非公開で報告してください。
-## Deciding What to Work On +## 作業内容の決定 -Looking for a good first contribution? Check out issues labeled ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) or ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). These are specifically curated for new contributors and areas where we'd love some help! +最初の貢献をお探しですか?["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue)や["help wanted"](https://github.com/cline/cline/labels/help%20wanted)のラベルが付いた問題をチェックしてください。これらは新しい貢献者向けに特に選ばれたもので、私たちが助けを求めている分野です! -We also welcome contributions to our [documentation](https://github.com/cline/cline/tree/main/docs)! Whether it's fixing typos, improving existing guides, or creating new educational content - we'd love to build a community-driven repository of resources that helps everyone get the most out of Cline. You can start by diving into `/docs` and looking for areas that need improvement. +また、[ドキュメント](https://github.com/cline/cline/tree/main/docs)への貢献も歓迎します!誤字の修正、既存のガイドの改善、新しい教育コンテンツの作成など、コミュニティ主導のリソースリポジトリを構築するために皆さんの力をお借りしたいと考えています。`/docs`に飛び込んで、改善が必要な箇所を探してみてください。 -If you're planning to work on a bigger feature, please create a [feature request](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) first so we can discuss whether it aligns with Cline's vision. +大きな機能に取り組む予定がある場合は、まず[機能リクエスト](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop)を作成し、それがClineのビジョンに合致するかどうかを議論しましょう。 -## Development Setup +## 開発環境のセットアップ -1. **VS Code Extensions** +1. **VS Code拡張機能** - - When opening the project, VS Code will prompt you to install recommended extensions - - These extensions are required for development - please accept all installation prompts - - If you dismissed the prompts, you can install them manually from the Extensions panel + - プロジェクトを開くと、VS Codeは推奨される拡張機能のインストールを促します + - これらの拡張機能は開発に必要です - すべてのインストールプロンプトを受け入れてください + - プロンプトを閉じた場合は、拡張機能パネルから手動でインストールできます -2. **Local Development** - - Run `npm run install:all` to install dependencies - - Run `npm run test` to run tests locally - - Before submitting PR, run `npm run format:fix` to format your code +2. **ローカル開発** + - `npm run install:all`を実行して依存関係をインストールします + - `npm run test`を実行してローカルでテストを実行します + - PRを提出する前に、`npm run format:fix`を実行してコードをフォーマットします -## Writing and Submitting Code +## コードの作成と提出 -Anyone can contribute code to Cline, but we ask that you follow these guidelines to ensure your contributions can be smoothly integrated: +誰でもClineにコードを貢献できますが、貢献がスムーズに統合されるように以下のガイドラインに従ってください: -1. **Keep Pull Requests Focused** +1. **プルリクエストを集中させる** - - Limit PRs to a single feature or bug fix - - Split larger changes into smaller, related PRs - - Break changes into logical commits that can be reviewed independently + - PRは単一の機能またはバグ修正に限定してください + - 大きな変更は小さな関連PRに分割してください + - 論理的なコミットに分けて、独立してレビューできるようにしてください -2. **Code Quality** +2. **コード品質** - - Run `npm run lint` to check code style - - Run `npm run format` to automatically format code - - All PRs must pass CI checks which include both linting and formatting - - Address any ESLint warnings or errors before submitting - - Follow TypeScript best practices and maintain type safety + - `npm run lint`を実行してコードスタイルをチェックします + - `npm run format`を実行してコードを自動的にフォーマットします + - すべてのPRは、リンティングとフォーマットを含むCIチェックに合格する必要があります + - 提出前にESLintの警告やエラーをすべて解決してください + - TypeScriptのベストプラクティスに従い、型の安全性を維持してください -3. **Testing** +3. **テスト** - - Add tests for new features - - Run `npm test` to ensure all tests pass - - Update existing tests if your changes affect them - - Include both unit tests and integration tests where appropriate + - 新しい機能にはテストを追加してください + - `npm test`を実行してすべてのテストが合格することを確認してください + - 変更が既存のテストに影響を与える場合は、それらを更新してください + - 適切な場合には、ユニットテストと統合テストの両方を含めてください -4. **Commit Guidelines** +4. **コミットガイドライン** - - Write clear, descriptive commit messages - - Use conventional commit format (e.g., "feat:", "fix:", "docs:") - - Reference relevant issues in commits using #issue-number + - 明確で説明的なコミットメッセージを書いてください + - 従来のコミット形式(例:"feat:", "fix:", "docs:")を使用してください + - コミットで関連する問題を#issue-numberを使用して参照してください -5. **Before Submitting** +5. **提出前に** - - Rebase your branch on the latest main - - Ensure your branch builds successfully - - Double-check all tests are passing - - Review your changes for any debugging code or console logs + - 最新のmainにブランチをリベースしてください + - ブランチが正常にビルドされることを確認してください + - すべてのテストが合格していることを再確認してください + - デバッグコードやコンソールログがないか変更を確認してください -6. **Pull Request Description** - - Clearly describe what your changes do - - Include steps to test the changes - - List any breaking changes - - Add screenshots for UI changes +6. **プルリクエストの説明** + - 変更内容を明確に説明してください + - 変更をテストする手順を含めてください + - 破壊的な変更がある場合はリストしてください + - UIの変更にはスクリーンショットを追加してください -## Contribution Agreement +## 貢献契約 -By submitting a pull request, you agree that your contributions will be licensed under the same license as the project ([Apache 2.0](LICENSE)). +プルリクエストを提出することで、あなたの貢献がプロジェクトと同じライセンス([Apache 2.0](LICENSE))の下でライセンスされることに同意したことになります。 -Remember: Contributing to Cline isn't just about writing code - it's about being part of a community that's shaping the future of AI-assisted development. Let's build something amazing together! 🚀 +覚えておいてください:Clineへの貢献はコードを書くことだけではなく、AI支援開発の未来を形作るコミュニティの一員になることです。一緒に素晴らしいものを作りましょう!🚀 diff --git a/locales/zh-cn/CODE_OF_CONDUCT.md b/locales/zh-cn/CODE_OF_CONDUCT.md index 3547e4628b..41229538e1 100644 --- a/locales/zh-cn/CODE_OF_CONDUCT.md +++ b/locales/zh-cn/CODE_OF_CONDUCT.md @@ -1,76 +1,47 @@ -# Contributor Covenant Code of Conduct +# 贡献者公约行为准则 -## Our Pledge +## 我们的承诺 -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. +为了营造一个开放和欢迎的环境,我们作为贡献者和维护者承诺让我们的项目和社区的参与体验对每个人都无骚扰,无论年龄、体型、残疾、种族、性别特征、性别认同和表达、经验水平、教育程度、社会经济地位、国籍、个人外貌、种族、宗教或性取向。 -## Our Standards +## 我们的标准 -Examples of behavior that contributes to creating a positive environment -include: +有助于创造积极环境的行为示例包括: -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members +- 使用欢迎和包容的语言 +- 尊重不同的观点和经验 +- 优雅地接受建设性的批评 +- 专注于对社区最有利的事情 +- 对其他社区成员表现出同理心 -Examples of unacceptable behavior by participants include: +参与者不可接受的行为示例包括: -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +- 使用性化语言或图像以及不受欢迎的性关注或挑逗 +- 故意挑衅、侮辱/贬低性评论和个人或政治攻击 +- 公开或私下骚扰 +- 未经明确许可发布他人的私人信息,如物理或电子地址 +- 其他在专业环境中合理认为不适当的行为 -## Our Responsibilities +## 我们的责任 -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +项目维护者有责任澄清可接受行为的标准,并期望对任何不可接受行为采取适当和公平的纠正措施。 -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +项目维护者有权利和责任删除、编辑或拒绝与本行为准则不一致的评论、提交、代码、维基编辑、问题和其他贡献,或暂时或永久禁止任何贡献者进行他们认为不适当、威胁、冒犯或有害的其他行为。 -## Scope +## 适用范围 -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. +本行为准则适用于项目空间内和公共空间中代表项目或其社区的个人。代表项目或社区的示例包括使用官方项目电子邮件地址,通过官方社交媒体账户发布,或在在线或离线活动中作为指定代表。项目的代表性可能由项目维护者进一步定义和澄清。 -## Enforcement +## 执行 -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at hi@cline.bot. All complaints -will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +滥用、骚扰或其他不可接受行为的实例可以通过联系项目团队 hi@cline.bot 报告。所有投诉将被审查和调查,并将导致根据情况认为必要和适当的回应。项目团队有义务对事件报告者保密。具体执行政策的详细信息可能会单独发布。 -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +未能善意遵守或执行行为准则的项目维护者可能会面临由项目领导的其他成员决定的临时或永久后果。 -## Attribution +## 归属 -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +本行为准则改编自 [贡献者公约][主页],版本 1.4,可在 https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 获取。 -[homepage]: https://www.contributor-covenant.org +[主页]: https://www.contributor-covenant.org -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq +有关此行为准则的常见问题的答案,请参见 https://www.contributor-covenant.org/faq diff --git a/locales/zh-cn/CONTRIBUTING.md b/locales/zh-cn/CONTRIBUTING.md index 75edd9ed43..f528d7c33f 100644 --- a/locales/zh-cn/CONTRIBUTING.md +++ b/locales/zh-cn/CONTRIBUTING.md @@ -1,82 +1,82 @@ -# Contributing to Cline +# 贡献到 Cline -We're thrilled you're interested in contributing to Cline. Whether you're fixing a bug, adding a feature, or improving our docs, every contribution makes Cline smarter! To keep our community vibrant and welcoming, all members must adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). +我们很高兴您有兴趣为 Cline 做出贡献。无论您是修复错误、添加功能还是改进我们的文档,每一份贡献都让 Cline 更加智能!为了保持我们的社区充满活力和欢迎,所有成员必须遵守我们的[行为准则](CODE_OF_CONDUCT.md)。 -## Reporting Bugs or Issues +## 报告错误或问题 -Bug reports help make Cline better for everyone! Before creating a new issue, please [search existing ones](https://github.com/cline/cline/issues) to avoid duplicates. When you're ready to report a bug, head over to our [issues page](https://github.com/cline/cline/issues/new/choose) where you'll find a template to help you with filling out the relevant information. +错误报告有助于让 Cline 对每个人都更好!在创建新问题之前,请先[搜索现有问题](https://github.com/cline/cline/issues)以避免重复。当您准备好报告错误时,请前往我们的[问题页面](https://github.com/cline/cline/issues/new/choose),在那里您会找到一个模板来帮助您填写相关信息。
- 🔐 Important: If you discover a security vulnerability, please use the Github security tool to report it privately. + 🔐 重要:如果您发现安全漏洞,请使用Github 安全工具私下报告
-## Deciding What to Work On +## 决定要做什么 -Looking for a good first contribution? Check out issues labeled ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) or ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). These are specifically curated for new contributors and areas where we'd love some help! +寻找一个好的首次贡献?查看标记为["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue)或["help wanted"](https://github.com/cline/cline/labels/help%20wanted)的问题。这些是专门为新贡献者策划的领域,我们非常欢迎您的帮助! -We also welcome contributions to our [documentation](https://github.com/cline/cline/tree/main/docs)! Whether it's fixing typos, improving existing guides, or creating new educational content - we'd love to build a community-driven repository of resources that helps everyone get the most out of Cline. You can start by diving into `/docs` and looking for areas that need improvement. +我们也欢迎对我们的[文档](https://github.com/cline/cline/tree/main/docs)做出贡献!无论是修正错别字、改进现有指南,还是创建新的教育内容 - 我们希望建立一个社区驱动的资源库,帮助每个人充分利用 Cline。您可以从深入研究 `/docs` 并寻找需要改进的地方开始。 -If you're planning to work on a bigger feature, please create a [feature request](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) first so we can discuss whether it aligns with Cline's vision. +如果您计划开发一个更大的功能,请先创建一个[功能请求](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop),以便我们讨论它是否符合 Cline 的愿景。 -## Development Setup +## 开发设置 -1. **VS Code Extensions** +1. **VS Code 扩展** - - When opening the project, VS Code will prompt you to install recommended extensions - - These extensions are required for development - please accept all installation prompts - - If you dismissed the prompts, you can install them manually from the Extensions panel + - 打开项目时,VS Code 会提示您安装推荐的扩展 + - 这些扩展是开发所必需的 - 请接受所有安装提示 + - 如果您忽略了提示,可以从扩展面板手动安装它们 -2. **Local Development** - - Run `npm run install:all` to install dependencies - - Run `npm run test` to run tests locally - - Before submitting PR, run `npm run format:fix` to format your code +2. **本地开发** + - 运行 `npm run install:all` 安装依赖项 + - 运行 `npm run test` 本地运行测试 + - 提交 PR 之前,运行 `npm run format:fix` 格式化您的代码 -## Writing and Submitting Code +## 编写和提交代码 -Anyone can contribute code to Cline, but we ask that you follow these guidelines to ensure your contributions can be smoothly integrated: +任何人都可以为 Cline 贡献代码,但我们要求您遵循以下指南,以确保您的贡献能够顺利集成: -1. **Keep Pull Requests Focused** +1. **保持 Pull Request 集中** - - Limit PRs to a single feature or bug fix - - Split larger changes into smaller, related PRs - - Break changes into logical commits that can be reviewed independently + - 将 PR 限制为单个功能或错误修复 + - 将较大的更改拆分为较小的相关 PR + - 将更改分为逻辑提交,以便独立审查 -2. **Code Quality** +2. **代码质量** - - Run `npm run lint` to check code style - - Run `npm run format` to automatically format code - - All PRs must pass CI checks which include both linting and formatting - - Address any ESLint warnings or errors before submitting - - Follow TypeScript best practices and maintain type safety + - 运行 `npm run lint` 检查代码风格 + - 运行 `npm run format` 自动格式化代码 + - 所有 PR 必须通过 CI 检查,包括 lint 和格式化 + - 提交前解决所有 ESLint 警告或错误 + - 遵循 TypeScript 最佳实践并保持类型安全 -3. **Testing** +3. **测试** - - Add tests for new features - - Run `npm test` to ensure all tests pass - - Update existing tests if your changes affect them - - Include both unit tests and integration tests where appropriate + - 为新功能添加测试 + - 运行 `npm test` 确保所有测试通过 + - 如果您的更改影响现有测试,请更新它们 + - 在适当的情况下包括单元测试和集成测试 -4. **Commit Guidelines** +4. **提交指南** - - Write clear, descriptive commit messages - - Use conventional commit format (e.g., "feat:", "fix:", "docs:") - - Reference relevant issues in commits using #issue-number + - 编写清晰、描述性的提交消息 + - 使用常规提交格式(例如,“feat:”,“fix:”,“docs:”) + - 在提交中引用相关问题,使用 #issue-number -5. **Before Submitting** +5. **提交前** - - Rebase your branch on the latest main - - Ensure your branch builds successfully - - Double-check all tests are passing - - Review your changes for any debugging code or console logs + - 将您的分支重新基于最新的 main + - 确保您的分支成功构建 + - 仔细检查所有测试是否通过 + - 检查您的更改是否有任何调试代码或控制台日志 -6. **Pull Request Description** - - Clearly describe what your changes do - - Include steps to test the changes - - List any breaking changes - - Add screenshots for UI changes +6. **Pull Request 描述** + - 清楚描述您的更改内容 + - 包括测试更改的步骤 + - 列出任何重大更改 + - 对于 UI 更改,添加截图 -## Contribution Agreement +## 贡献协议 -By submitting a pull request, you agree that your contributions will be licensed under the same license as the project ([Apache 2.0](LICENSE)). +通过提交 pull request,您同意您的贡献将根据与项目相同的许可证([Apache 2.0](LICENSE))进行许可。 -Remember: Contributing to Cline isn't just about writing code - it's about being part of a community that's shaping the future of AI-assisted development. Let's build something amazing together! 🚀 +记住:为 Cline 做贡献不仅仅是编写代码 - 这是成为一个社区的一部分,共同塑造 AI 辅助开发的未来。让我们一起构建一些令人惊叹的东西!🚀 diff --git a/locales/zh-tw/CODE_OF_CONDUCT.md b/locales/zh-tw/CODE_OF_CONDUCT.md index 3547e4628b..9f8791ecd9 100644 --- a/locales/zh-tw/CODE_OF_CONDUCT.md +++ b/locales/zh-tw/CODE_OF_CONDUCT.md @@ -1,76 +1,47 @@ -# Contributor Covenant Code of Conduct +# 貢獻者公約行為準則 -## Our Pledge +## 我們的承諾 -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. +為了促進一個開放和歡迎的環境,我們作為貢獻者和維護者承諾,使我們的項目和社區的參與對每個人來說都是一個無騷擾的體驗,不論年齡、體型、殘疾、種族、性別特徵、性別認同和表達、經驗水平、教育程度、社會經濟地位、國籍、個人外貌、種族、宗教或性取向。 -## Our Standards +## 我們的標準 -Examples of behavior that contributes to creating a positive environment -include: +有助於創造積極環境的行為示例包括: -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members +- 使用歡迎和包容的語言 +- 尊重不同的觀點和經驗 +- 優雅地接受建設性的批評 +- 專注於對社區最有利的事情 +- 對其他社區成員表示同情 -Examples of unacceptable behavior by participants include: +參與者不可接受的行為示例包括: -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +- 使用性化語言或圖像以及不受歡迎的性注意或挑逗 +- 騷擾、侮辱/貶低性評論和個人或政治攻擊 +- 公開或私下騷擾 +- 未經明確許可發布他人的私人信息,例如物理或電子地址 +- 其他在專業環境中合理認為不適當的行為 -## Our Responsibilities +## 我們的責任 -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +項目維護者有責任澄清可接受行為的標準,並預期對任何不可接受行為的實例採取適當和公平的糾正行動。 -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +項目維護者有權利和責任刪除、編輯或拒絕與本行為準則不符的評論、提交、代碼、維基編輯、問題和其他貢獻,或暫時或永久禁止任何他們認為不適當、威脅、冒犯或有害的貢獻者。 -## Scope +## 範圍 -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. +此行為準則適用於項目空間內以及當個人代表項目或其社區時的公共空間。代表項目或社區的示例包括使用官方項目電子郵件地址、通過官方社交媒體帳戶發布或作為在線或離線活動的指定代表。項目的代表可能由項目維護者進一步定義和澄清。 -## Enforcement +## 執行 -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at hi@cline.bot. All complaints -will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +濫用、騷擾或其他不可接受行為的實例可以通過聯繫項目團隊 hi@cline.bot 來報告。所有投訴將被審查和調查,並將根據情況作出必要和適當的回應。項目團隊有義務對事件的報告者保密。具體執行政策的詳細信息可能會單獨發布。 -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +未能善意遵循或執行行為準則的項目維護者可能會面臨由項目領導層其他成員決定的暫時或永久後果。 -## Attribution +## 歸屬 -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +此行為準則改編自 [Contributor Covenant][homepage],版本 1.4,可在 https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 獲得。 [homepage]: https://www.contributor-covenant.org -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq +有關此行為準則的常見問題的答案,請參見 https://www.contributor-covenant.org/faq From d90e44fc5a122a0aba7f5e3a25c1498235f417d7 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 10:50:27 -1000 Subject: [PATCH 06/74] ja readme --- locales/ja/README.md | 98 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/locales/ja/README.md b/locales/ja/README.md index e69de29bb2..c9e3d131b8 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -0,0 +1,98 @@ +# Cline – OpenRouterでの\#1 + +

+ +

+ + + +Clineは、**CLI**と**エディタ**を使用できるAIアシスタントです。 + +[Claude 3.5 Sonnetのエージェントコーディング機能](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf)のおかげで、Clineは複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成と編集、大規模プロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可後)などのツールを使用して、コード補完や技術サポートを超えた支援を提供します。Clineは、Model Context Protocol (MCP)を使用して新しいツールを作成し、自身の機能を拡張することもできます。従来の自律型AIスクリプトはサンドボックス環境で実行されますが、この拡張機能はファイル変更やターミナルコマンドを承認するための人間のインターフェースを提供し、エージェントAIの可能性を安全かつアクセスしやすい方法で探求できます。 + +1. タスクを入力し、モックアップを機能するアプリに変換するための画像やバグ修正のスクリーンショットを追加します。 +2. Clineはファイル構造とソースコードASTを分析し、正規表現検索を実行し、関連ファイルを読み取って既存プロジェクトに精通します。コンテキストに追加される情報を慎重に管理することで、大規模で複雑なプロジェクトでもコンテキストウィンドウを圧倒することなく貴重な支援を提供できます。 +3. Clineが必要な情報を取得すると、次のことができます: + - ファイルの作成と編集 + リンター/コンパイラーエラーの監視を行い、欠落しているインポートや構文エラーなどの問題を自動的に修正します。 + - ターミナルでコマンドを直接実行し、その出力を監視しながら作業を進め、ファイル編集後の開発サーバーの問題に対応します。 + - ウェブ開発タスクでは、サイトをヘッドレスブラウザで起動し、クリック、入力、スクロール、スクリーンショットのキャプチャ + コンソールログを取得し、ランタイムエラーや視覚的なバグを修正します。 +4. タスクが完了すると、Clineは`open -a "Google Chrome" index.html`のようなターミナルコマンドを提示し、ボタンをクリックして実行できます。 + +> [!TIP] +> `CMD/CTRL + Shift + P`ショートカットを使用してコマンドパレットを開き、「Cline: Open In New Tab」と入力して拡張機能をエディタのタブとして開きます。これにより、ファイルエクスプローラーと並行してClineを使用し、ワークスペースの変更をより明確に確認できます。 + +--- + + + +### 任意のAPIとモデルを使用 + +Clineは、OpenRouter、Anthropic、OpenAI、Google Gemini、AWS Bedrock、Azure、GCP VertexなどのAPIプロバイダーをサポートしています。また、OpenAI互換のAPIを設定したり、LM Studio/Ollamaを通じてローカルモデルを使用することもできます。OpenRouterを使用している場合、拡張機能は最新のモデルリストを取得し、最新のモデルをすぐに使用できるようにします。 + +拡張機能は、タスクループ全体と個々のリクエストのトークン総数とAPI使用コストを追跡し、各ステップでの支出を把握できます。 + + + +
+ + + +### ターミナルでコマンドを実行 + +VSCode v1.93の新しい[シェル統合アップデート](https://code.visualstudio.com/updates/v1_93#_terminal-shell-integration-api)のおかげで、Clineはターミナルでコマンドを直接実行し、出力を受け取ることができます。これにより、パッケージのインストールやビルドスクリプトの実行、アプリケーションのデプロイ、データベースの管理、テストの実行など、幅広いタスクを実行できます。Clineは、開発環境とツールチェーンに適応しながら、タスクを正確に完了します。 + +開発サーバーのような長時間実行されるプロセスの場合、「実行中に続行」ボタンを使用して、コマンドがバックグラウンドで実行されている間にClineがタスクを続行できるようにします。Clineが作業を進める中で、新しいターミナル出力が通知され、ファイル編集時のコンパイルエラーなどの問題に対応できます。 + + + +
+ + + +### ファイルの作成と編集 + +Clineはエディタ内でファイルを作成および編集し、変更の差分ビューを提示します。差分ビューエディタでClineの変更を編集または元に戻すことができ、チャットでフィードバックを提供して満足するまで調整できます。Clineはリンター/コンパイラーエラー(欠落しているインポート、構文エラーなど)も監視し、発生した問題を自動的に修正します。 + +Clineによるすべての変更はファイルのタイムラインに記録され、必要に応じて変更を追跡および元に戻すための簡単な方法を提供します。 + + + +
+ + + +### ブラウザの使用 + +Claude 3.5 Sonnetの新しい[コンピュータ使用](https://www.anthropic.com/news/3-5-models-and-computer-use)機能により、Clineはブラウザを起動し、要素をクリックし、テキストを入力し、スクロールし、各ステップでスクリーンショットとコンソールログをキャプチャできます。これにより、インタラクティブなデバッグ、エンドツーエンドテスト、さらには一般的なウェブ使用が可能になります。これにより、エラーログを手動でコピー&ペーストすることなく、視覚的なバグやランタイムの問題を自律的に修正できます。 + +Clineに「アプリをテストして」と頼んでみてください。彼は`npm run dev`のようなコマンドを実行し、ローカルで実行中の開発サーバーをブラウザで起動し、一連のテストを実行してすべてが正常に動作することを確認します。[デモはこちら。](https://x.com/sdrzn/status/1850880547825823989) + + + +
+ + + +### 「ツールを追加して...」 + +[Model Context Protocol](https://github.com/modelcontextprotocol)のおかげで、Clineはカスタムツールを通じて機能を拡張できます。[コミュニティ製サーバー](https://github.co \ No newline at end of file From ebd6a5e34239b0a4e09794b746c87059260aae38 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 10:55:27 -1000 Subject: [PATCH 07/74] de translations --- locales/de/CODE_OF_CONDUCT.md | 71 +++++++++++++++ locales/de/CONTRIBUTING.md | 82 +++++++++++++++++ locales/de/README.md | 167 ++++++++++++++++++++++++++++++++++ 3 files changed, 320 insertions(+) create mode 100644 locales/de/CODE_OF_CONDUCT.md create mode 100644 locales/de/CONTRIBUTING.md create mode 100644 locales/de/README.md diff --git a/locales/de/CODE_OF_CONDUCT.md b/locales/de/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..82fe929eda --- /dev/null +++ b/locales/de/CODE_OF_CONDUCT.md @@ -0,0 +1,71 @@ +# Código de Conducta para Contribuyentes + +## Nuestro Compromiso + +En el interés de fomentar un entorno abierto y acogedor, nosotros como +contribuyentes y mantenedores nos comprometemos a hacer de la participación en nuestro proyecto y +nuestra comunidad una experiencia libre de acoso para todos, independientemente de la edad, tamaño corporal, +discapacidad, etnia, características sexuales, identidad y expresión de género, +nivel de experiencia, educación, estatus socioeconómico, nacionalidad, apariencia personal, +raza, religión o identidad y orientación sexual. + +## Nuestros Estándares + +Ejemplos de comportamientos que contribuyen a crear un entorno positivo incluyen: + +- Uso de un lenguaje acogedor e inclusivo +- Respeto a diferentes puntos de vista y experiencias +- Aceptar de manera constructiva las críticas +- Centrarse en lo que es mejor para la comunidad +- Mostrar empatía hacia otros miembros de la comunidad + +Ejemplos de comportamientos inaceptables por parte de los participantes incluyen: + +- El uso de lenguaje o imágenes sexualizadas y la atención o avances sexuales no deseados +- Trollear, comentarios insultantes/despectivos y ataques personales o políticos +- Acoso público o privado +- Publicar información privada de otros, como una dirección física o electrónica, + sin permiso explícito +- Otras conductas que podrían considerarse inapropiadas en un entorno profesional + +## Nuestras Responsabilidades + +Los mantenedores del proyecto son responsables de aclarar los estándares de comportamiento aceptable +y se espera que tomen medidas correctivas apropiadas y justas en respuesta a cualquier +caso de comportamiento inaceptable. + +Los mantenedores del proyecto tienen el derecho y la responsabilidad de eliminar, editar o rechazar +comentarios, commits, código, ediciones de wiki, issues y otras contribuciones que no estén alineadas con este Código de Conducta, o de prohibir temporal o permanentemente a cualquier contribuyente cuyo comportamiento sea inapropiado, +amenazante, ofensivo o dañino. + +## Alcance + +Este Código de Conducta se aplica tanto dentro de los espacios del proyecto como en espacios públicos +cuando una persona representa el proyecto o su comunidad. Ejemplos de +representación de un proyecto o comunidad incluyen el uso de una dirección de correo electrónico oficial del proyecto, +publicar en una cuenta oficial de redes sociales o actuar como un representante designado +en un evento en línea o fuera de línea. La representación de un proyecto puede +ser definida y clarificada más específicamente por los mantenedores del proyecto. + +## Aplicación + +Los casos de comportamiento abusivo, acosador o inaceptable de otra manera pueden +ser reportados contactando al equipo del proyecto en hi@cline.bot. Todas las quejas +serán revisadas e investigadas y resultarán en una respuesta que +se considere necesaria y apropiada a las circunstancias. El equipo del proyecto está +obligado a mantener la confidencialidad con respecto al informante de un incidente. +Más detalles sobre políticas específicas de aplicación pueden ser publicados por separado. + +Los mantenedores del proyecto que no sigan o hagan cumplir el Código de Conducta de buena +fe pueden enfrentar repercusiones temporales o permanentes según lo determinen otros +miembros de la dirección del proyecto. + +## Atribución + +Este Código de Conducta está adaptado del [Contributor Covenant][homepage], versión 1.4, +disponible en https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +Respuestas a preguntas frecuentes sobre este Código de Conducta se pueden encontrar en +https://www.contributor-covenant.org/faq diff --git a/locales/de/CONTRIBUTING.md b/locales/de/CONTRIBUTING.md new file mode 100644 index 0000000000..c4ef158090 --- /dev/null +++ b/locales/de/CONTRIBUTING.md @@ -0,0 +1,82 @@ +# Contribuir a Cline + +Nos alegra que estés interesado en contribuir a Cline. Ya sea que corrijas un error, añadas una función o mejores nuestra documentación, ¡cada contribución hace que Cline sea más inteligente! Para mantener nuestra comunidad viva y acogedora, todos los miembros deben cumplir con nuestro [Código de Conducta](CODE_OF_CONDUCT.md). + +## Informar de errores o problemas + +¡Los informes de errores ayudan a mejorar Cline para todos! Antes de crear un nuevo problema, por favor revisa los [problemas existentes](https://github.com/cline/cline/issues) para evitar duplicados. Cuando estés listo para informar un error, dirígete a nuestra [página de Issues](https://github.com/cline/cline/issues/new/choose), donde encontrarás una plantilla que te ayudará a completar la información relevante. + +
+ 🔐 Importante: Si descubres una vulnerabilidad de seguridad, utiliza la herramienta de seguridad de GitHub para informarla de manera privada. +
+ +## Decidir en qué trabajar + +¿Buscas una buena primera contribución? Revisa los issues etiquetados con ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) o ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). ¡Estos están especialmente seleccionados para nuevos colaboradores y son áreas donde nos encantaría recibir ayuda! + +También damos la bienvenida a contribuciones a nuestra [documentación](https://github.com/cline/cline/tree/main/docs). Ya sea corrigiendo errores tipográficos, mejorando guías existentes o creando nuevos contenidos educativos, queremos construir un repositorio de recursos gestionado por la comunidad que ayude a todos a sacar el máximo provecho de Cline. Puedes comenzar explorando `/docs` y buscando áreas que necesiten mejoras. + +Si planeas trabajar en una función más grande, por favor crea primero una [solicitud de función](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) para que podamos discutir si se alinea con la visión de Cline. + +## Configurar el entorno de desarrollo + +1. **Extensiones de VS Code** + + - Al abrir el proyecto, VS Code te pedirá que instales las extensiones recomendadas + - Estas extensiones son necesarias para el desarrollo, por favor acepta todas las solicitudes de instalación + - Si rechazaste las solicitudes, puedes instalarlas manualmente en la sección de extensiones + +2. **Desarrollo local** + - Ejecuta `npm run install:all` para instalar las dependencias + - Ejecuta `npm run test` para ejecutar las pruebas localmente + - Antes de enviar un PR, ejecuta `npm run format:fix` para formatear tu código + +## Escribir y enviar código + +Cualquiera puede contribuir código a Cline, pero te pedimos que sigas estas pautas para asegurar que tus contribuciones se integren sin problemas: + +1. **Mantén los Pull Requests enfocados** + + - Limita los PRs a una sola función o corrección de errores + - Divide los cambios más grandes en PRs más pequeños y coherentes + - Divide los cambios en commits lógicos que puedan ser revisados independientemente + +2. **Calidad del código** + + - Ejecuta `npm run lint` para verificar el estilo del código + - Ejecuta `npm run format` para formatear el código automáticamente + - Todos los PRs deben pasar las verificaciones de CI, que incluyen linting y formateo + - Corrige todas las advertencias o errores de ESLint antes de enviar + - Sigue las mejores prácticas para TypeScript y mantén la seguridad de tipos + +3. **Pruebas** + + - Añade pruebas para nuevas funciones + - Ejecuta `npm test` para asegurarte de que todas las pruebas pasen + - Actualiza las pruebas existentes si tus cambios las afectan + - Añade tanto pruebas unitarias como de integración donde sea apropiado + +4. **Pautas de commits** + + - Escribe mensajes de commit claros y descriptivos + - Usa el formato de commit convencional (por ejemplo, "feat:", "fix:", "docs:") + - Haz referencia a los issues relevantes en los commits con #número-del-issue + +5. **Antes de enviar** + + - Rebasea tu rama con el último Main + - Asegúrate de que tu rama se construya correctamente + - Verifica que todas las pruebas pasen + - Revisa tus cambios para eliminar cualquier código de depuración o registros de consola + +6. **Descripción del Pull Request** + - Describe claramente lo que hacen tus cambios + - Añade pasos para probar los cambios + - Enumera cualquier cambio importante + - Añade capturas de pantalla para cambios en la interfaz de usuario + +## Acuerdo de contribución + +Al enviar un Pull Request, aceptas que tus contribuciones se licencien bajo la misma licencia que el proyecto ([Apache 2.0](LICENSE)). + +Recuerda: Contribuir a Cline no solo significa escribir código, sino ser parte de una comunidad que está dando forma al futuro del desarrollo asistido por IA. ¡Hagamos algo grandioso juntos! 🚀 diff --git a/locales/de/README.md b/locales/de/README.md new file mode 100644 index 0000000000..9f875585c6 --- /dev/null +++ b/locales/de/README.md @@ -0,0 +1,167 @@ +# Cline – \#1 auf OpenRouter + +

+ +

+ + + +Andere Sprachversionen der [README-Dateien](./README.md) sind verfügbar in: +- [Español](./locales/es/README.md) +- [Deutsch](./locales/de/README.md) +- [日本語](./locales/ja/README.md) +- [简体中文](./locales/zh-cn/README.md) +- [繁體中文](./locales/zh-tw/README.md) + +Dank der [agentischen Codierungsfähigkeiten von Claude 3.5 Sonnet](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf) kann Cline komplexe Softwareentwicklungsaufgaben Schritt für Schritt bewältigen. Mit Werkzeugen, die ihm das Erstellen und Bearbeiten von Dateien, das Erkunden großer Projekte, die Nutzung des Browsers und das Ausführen von Terminalbefehlen (nach Ihrer Genehmigung) ermöglichen, kann er Ihnen auf eine Weise helfen, die über die Codevervollständigung oder technischen Support hinausgeht. Cline kann sogar das Model Context Protocol (MCP) verwenden, um neue Werkzeuge zu erstellen und seine eigenen Fähigkeiten zu erweitern. Während autonome KI-Skripte traditionell in sandboxed Umgebungen laufen, bietet diese Erweiterung eine Mensch-in-der-Schleife-GUI, um jede Dateiänderung und jeden Terminalbefehl zu genehmigen, was eine sichere und zugängliche Möglichkeit bietet, das Potenzial agentischer KI zu erkunden. + +1. Geben Sie Ihre Aufgabe ein und fügen Sie Bilder hinzu, um Mockups in funktionale Apps zu konvertieren oder Fehler mit Screenshots zu beheben. +2. Cline beginnt mit der Analyse Ihrer Dateistruktur und Quellcode-ASTs, führt Regex-Suchen durch und liest relevante Dateien, um sich in bestehenden Projekten zurechtzufinden. Durch sorgfältiges Management der hinzugefügten Informationen kann Cline wertvolle Unterstützung auch bei großen, komplexen Projekten bieten, ohne das Kontextfenster zu überladen. +3. Sobald Cline die benötigten Informationen hat, kann er: + - Dateien erstellen und bearbeiten sowie Linter-/Compiler-Fehler überwachen, um proaktiv Probleme wie fehlende Importe und Syntaxfehler selbst zu beheben. + - Befehle direkt in Ihrem Terminal ausführen und deren Ausgabe überwachen, sodass er z.B. auf Dev-Server-Probleme reagieren kann, nachdem er eine Datei bearbeitet hat. + - Für Webentwicklungsaufgaben kann Cline die Website in einem Headless-Browser starten, klicken, tippen, scrollen und Screenshots sowie Konsolenprotokolle erfassen, sodass er Laufzeitfehler und visuelle Fehler beheben kann. +4. Wenn eine Aufgabe abgeschlossen ist, präsentiert Cline das Ergebnis mit einem Terminalbefehl wie `open -a "Google Chrome" index.html`, den Sie mit einem Klick ausführen können. + +> [!TIPP] +> Verwenden Sie die Tastenkombination `CMD/CTRL + Shift + P`, um die Befehls-Palette zu öffnen und geben Sie "Cline: Open In New Tab" ein, um die Erweiterung als Tab in Ihrem Editor zu öffnen. So können Sie Cline neben Ihrem Dateiexplorer verwenden und sehen, wie er Ihren Arbeitsbereich verändert. + +--- + + + +### Verwenden Sie jede API und jedes Modell + +Cline unterstützt API-Anbieter wie OpenRouter, Anthropic, OpenAI, Google Gemini, AWS Bedrock, Azure und GCP Vertex. Sie können auch jede OpenAI-kompatible API konfigurieren oder ein lokales Modell über LM Studio/Ollama verwenden. Wenn Sie OpenRouter verwenden, ruft die Erweiterung deren neueste Modellliste ab, sodass Sie die neuesten Modelle sofort verwenden können, sobald sie verfügbar sind. + +Die Erweiterung verfolgt auch die gesamten Token- und API-Nutzungskosten für den gesamten Aufgabenzyklus und einzelne Anfragen, sodass Sie bei jedem Schritt über die Ausgaben informiert sind. + + + +
+ + + +### Befehle im Terminal ausführen + +Dank der neuen [Shell-Integrations-Updates in VSCode v1.93](https://code.visualstudio.com/updates/v1_93#_terminal-shell-integration-api) kann Cline Befehle direkt in Ihrem Terminal ausführen und die Ausgabe empfangen. Dies ermöglicht ihm eine Vielzahl von Aufgaben, von der Installation von Paketen und dem Ausführen von Build-Skripten bis hin zur Bereitstellung von Anwendungen, Verwaltung von Datenbanken und Ausführung von Tests, während er sich an Ihre Entwicklungsumgebung und Toolchain anpasst, um die Aufgabe richtig zu erledigen. + +Für lang laufende Prozesse wie Dev-Server verwenden Sie die Schaltfläche "Während des Laufens fortfahren", um Cline die Fortsetzung der Aufgabe zu ermöglichen, während der Befehl im Hintergrund läuft. Während Cline arbeitet, wird er über neue Terminalausgaben benachrichtigt, sodass er auf auftretende Probleme reagieren kann, wie z.B. Kompilierungsfehler beim Bearbeiten von Dateien. + + + +
+ + + +### Dateien erstellen und bearbeiten + +Cline kann Dateien direkt in Ihrem Editor erstellen und bearbeiten und Ihnen eine Diff-Ansicht der Änderungen präsentieren. Sie können die Änderungen von Cline direkt im Diff-Ansichts-Editor bearbeiten oder rückgängig machen oder Feedback im Chat geben, bis Sie mit dem Ergebnis zufrieden sind. Cline überwacht auch Linter-/Compiler-Fehler (fehlende Importe, Syntaxfehler usw.), sodass er auftretende Probleme selbst beheben kann. + +Alle von Cline vorgenommenen Änderungen werden in der Timeline Ihrer Datei aufgezeichnet, was eine einfache Möglichkeit bietet, Änderungen nachzuverfolgen und bei Bedarf rückgängig zu machen. + + + +
+ + + +### Den Browser verwenden + +Mit der neuen [Computer Use](https://www.anthropic.com/news/3-5-models-and-computer-use) Fähigkeit von Claude 3.5 Sonnet kann Cline einen Browser starten, Elemente anklicken, Text eingeben und scrollen, dabei Screenshots und Konsolenprotokolle bei jedem Schritt erfassen. Dies ermöglicht interaktives Debugging, End-to-End-Tests und sogar allgemeine Webnutzung! Dies gibt ihm die Autonomie, visuelle Fehler und Laufzeitprobleme zu beheben, ohne dass Sie selbst Fehlerprotokolle kopieren und einfügen müssen. + +Versuchen Sie, Cline zu bitten, "die App zu testen", und sehen Sie zu, wie er einen Befehl wie `npm run dev` ausführt, Ihren lokal laufenden Dev-Server in einem Browser startet und eine Reihe von Tests durchführt, um zu bestätigen, dass alles funktioniert. [Sehen Sie sich hier eine Demo an.](https://x.com/sdrzn/status/1850880547825823989) + + + +
+ + + +### "ein Werkzeug hinzufügen, das..." + +Dank des [Model Context Protocol](https://github.com/modelcontextprotocol) kann Cline seine Fähigkeiten durch benutzerdefinierte Werkzeuge erweitern. Während Sie [community-made servers](https://github.com/modelcontextprotocol/servers) verwenden können, kann Cline stattdessen Werkzeuge erstellen und installieren, die speziell auf Ihren Workflow zugeschnitten sind. Bitten Sie Cline einfach, "ein Werkzeug hinzuzufügen", und er erledigt alles, von der Erstellung eines neuen MCP-Servers bis zur Installation in der Erweiterung. Diese benutzerdefinierten Werkzeuge werden dann Teil von Clines Toolkit und sind bereit, in zukünftigen Aufgaben verwendet zu werden. + +- "ein Werkzeug hinzufügen, das Jira-Tickets abruft": Abrufen von Ticket-ACs und Cline zur Arbeit bringen +- "ein Werkzeug hinzufügen, das AWS EC2s verwaltet": Überprüfen von Servermetriken und Skalieren von Instanzen +- "ein Werkzeug hinzufügen, das die neuesten PagerDuty-Vorfälle abruft": Abrufen von Details und Cline bitten, Fehler zu beheben + + + +
+ + + +### Kontext hinzufügen + +**`@url`:** Fügen Sie eine URL ein, damit die Erweiterung sie abruft und in Markdown konvertiert, nützlich, wenn Sie Cline die neuesten Dokumente geben möchten + +**`@problems`:** Fügen Sie Arbeitsbereichsfehler und -warnungen (Panel 'Probleme') hinzu, die Cline beheben soll + +**`@file`:** Fügt den Inhalt einer Datei hinzu, sodass Sie keine API-Anfragen verschwenden müssen, um das Lesen der Datei zu genehmigen (+ zum Suchen von Dateien tippen) + +**`@folder`:** Fügt die Dateien eines Ordners auf einmal hinzu, um Ihren Workflow noch weiter zu beschleunigen + + + +
+ + + +### Checkpoints: Vergleichen und Wiederherstellen + +Während Cline eine Aufgabe bearbeitet, erstellt die Erweiterung bei jedem Schritt einen Schnappschuss Ihres Arbeitsbereichs. Sie können die Schaltfläche 'Vergleichen' verwenden, um einen Diff zwischen dem Schnappschuss und Ihrem aktuellen Arbeitsbereich zu sehen, und die Schaltfläche 'Wiederherstellen', um zu diesem Punkt zurückzukehren. + +Wenn Sie beispielsweise mit einem lokalen Webserver arbeiten, können Sie 'Nur Arbeitsbereich wiederherstellen' verwenden, um schnell verschiedene Versionen Ihrer App zu testen, und 'Aufgabe und Arbeitsbereich wiederherstellen', wenn Sie die Version gefunden haben, von der aus Sie weiterentwickeln möchten. Dies ermöglicht es Ihnen, sicher verschiedene Ansätze zu erkunden, ohne Fortschritte zu verlieren. + + + +
+ +## Beitrag leisten + +Um zum Projekt beizutragen, beginnen Sie mit unserem [Beitragsleitfaden](CONTRIBUTING.md), um die Grundlagen zu lernen. Sie können auch unserem [Discord](https://discord.gg/cline) beitreten, um im Kanal `#contributors` mit anderen Mitwirkenden zu chatten. Wenn Sie auf der Suche nach einer Vollzeitstelle sind, schauen Sie sich unsere offenen Stellen auf unserer [Karriereseite](https://cline.bot/join-us) an! + +
+Lokale Entwicklungsanweisungen + +1. Klonen Sie das Repository _(Erfordert [git-lfs](https://git-lfs.com/))_: + ```bash + git clone https://github.com/cline/cline.git + ``` +2. Öffnen Sie das Projekt in VSCode: + ```bash + code cline + ``` +3. Installieren Sie die notwendigen Abhängigkeiten für die Erweiterung und das Webview-GUI: + ```bash + npm run install:all + ``` +4. Starten Sie durch Drücken von `F5` (oder `Run`->`Start Debugging`), um ein neues VSCode-Fenster mit der geladenen Erweiterung zu öffnen. (Möglicherweise müssen Sie die [esbuild problem matchers extension](https://marketplace.visualstudio.com/items?itemName=connor4312.esbuild-problem-matchers) installieren, wenn Sie auf Probleme beim Erstellen des Projekts stoßen.) + +
+ +## Lizenz + +[Apache 2.0 © 2024 Cline Bot Inc.](./LICENSE) + From 961c0f87076d2ef1e7f44cce0e2cdae7b2d5d066 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 10:58:33 -1000 Subject: [PATCH 08/74] tweaks --- locales/de/CODE_OF_CONDUCT.md | 88 +++++++++------------------- locales/de/CONTRIBUTING.md | 104 +++++++++++++++++----------------- locales/zh-cn/README.md | 2 +- 3 files changed, 80 insertions(+), 114 deletions(-) diff --git a/locales/de/CODE_OF_CONDUCT.md b/locales/de/CODE_OF_CONDUCT.md index 82fe929eda..f240363c07 100644 --- a/locales/de/CODE_OF_CONDUCT.md +++ b/locales/de/CODE_OF_CONDUCT.md @@ -1,71 +1,37 @@ -# Código de Conducta para Contribuyentes +# Verhaltenskodex für Mitwirkende -## Nuestro Compromiso +## Unser Versprechen -En el interés de fomentar un entorno abierto y acogedor, nosotros como -contribuyentes y mantenedores nos comprometemos a hacer de la participación en nuestro proyecto y -nuestra comunidad una experiencia libre de acoso para todos, independientemente de la edad, tamaño corporal, -discapacidad, etnia, características sexuales, identidad y expresión de género, -nivel de experiencia, educación, estatus socioeconómico, nacionalidad, apariencia personal, -raza, religión o identidad y orientación sexual. +Im Interesse der Förderung einer offenen und einladenden Umgebung verpflichten wir uns als +Mitwirkende und Betreuer, die Teilnahme an unserem Projekt und unserer +Gemeinschaft zu einer belästigungsfreien Erfahrung für alle zu machen, unabhängig von Alter, Körpergröße, +Behinderung, ethnischer Zugehörigkeit, sexuellen Merkmalen, Geschlechtsidentität und -ausdruck, +Erfahrungsniveau, Bildung, sozioökonomischem Status, Nationalität, persönlichem Erscheinungsbild, +Rasse, Religion oder sexueller Identität und Orientierung. -## Nuestros Estándares +## Unsere Standards -Ejemplos de comportamientos que contribuyen a crear un entorno positivo incluyen: +Beispiele für Verhaltensweisen, die dazu beitragen, eine positive Umgebung zu schaffen, sind: -- Uso de un lenguaje acogedor e inclusivo -- Respeto a diferentes puntos de vista y experiencias -- Aceptar de manera constructiva las críticas -- Centrarse en lo que es mejor para la comunidad -- Mostrar empatía hacia otros miembros de la comunidad +- Verwendung einer einladenden und inklusiven Sprache +- Respekt gegenüber unterschiedlichen Standpunkten und Erfahrungen +- Konstruktive Annahme von Kritik +- Fokussierung auf das, was das Beste für die Gemeinschaft ist +- Empathie gegenüber anderen Mitgliedern der Gemeinschaft zeigen -Ejemplos de comportamientos inaceptables por parte de los participantes incluyen: +Beispiele für inakzeptables Verhalten von Teilnehmern sind: -- El uso de lenguaje o imágenes sexualizadas y la atención o avances sexuales no deseados -- Trollear, comentarios insultantes/despectivos y ataques personales o políticos -- Acoso público o privado -- Publicar información privada de otros, como una dirección física o electrónica, - sin permiso explícito -- Otras conductas que podrían considerarse inapropiadas en un entorno profesional +- Die Verwendung von sexualisierter Sprache oder Bildern und unerwünschte sexuelle Aufmerksamkeit oder Annäherungen +- Trollen, beleidigende/abwertende Kommentare und persönliche oder politische Angriffe +- Öffentliche oder private Belästigung +- Veröffentlichen von privaten Informationen anderer, wie eine physische oder elektronische Adresse, + ohne ausdrückliche Erlaubnis +- Andere Verhaltensweisen, die in einem professionellen Umfeld als unangemessen angesehen werden könnten -## Nuestras Responsabilidades +## Unsere Verantwortlichkeiten -Los mantenedores del proyecto son responsables de aclarar los estándares de comportamiento aceptable -y se espera que tomen medidas correctivas apropiadas y justas en respuesta a cualquier -caso de comportamiento inaceptable. +Die Projektbetreuer sind dafür verantwortlich, die Standards für akzeptables Verhalten zu klären +und es wird erwartet, dass sie angemessene und faire Korrekturmaßnahmen als Reaktion auf +jedes Beispiel für inakzeptables Verhalten ergreifen. -Los mantenedores del proyecto tienen el derecho y la responsabilidad de eliminar, editar o rechazar -comentarios, commits, código, ediciones de wiki, issues y otras contribuciones que no estén alineadas con este Código de Conducta, o de prohibir temporal o permanentemente a cualquier contribuyente cuyo comportamiento sea inapropiado, -amenazante, ofensivo o dañino. - -## Alcance - -Este Código de Conducta se aplica tanto dentro de los espacios del proyecto como en espacios públicos -cuando una persona representa el proyecto o su comunidad. Ejemplos de -representación de un proyecto o comunidad incluyen el uso de una dirección de correo electrónico oficial del proyecto, -publicar en una cuenta oficial de redes sociales o actuar como un representante designado -en un evento en línea o fuera de línea. La representación de un proyecto puede -ser definida y clarificada más específicamente por los mantenedores del proyecto. - -## Aplicación - -Los casos de comportamiento abusivo, acosador o inaceptable de otra manera pueden -ser reportados contactando al equipo del proyecto en hi@cline.bot. Todas las quejas -serán revisadas e investigadas y resultarán en una respuesta que -se considere necesaria y apropiada a las circunstancias. El equipo del proyecto está -obligado a mantener la confidencialidad con respecto al informante de un incidente. -Más detalles sobre políticas específicas de aplicación pueden ser publicados por separado. - -Los mantenedores del proyecto que no sigan o hagan cumplir el Código de Conducta de buena -fe pueden enfrentar repercusiones temporales o permanentes según lo determinen otros -miembros de la dirección del proyecto. - -## Atribución - -Este Código de Conducta está adaptado del [Contributor Covenant][homepage], versión 1.4, -disponible en https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -Respuestas a preguntas frecuentes sobre este Código de Conducta se pueden encontrar en -https://www.contributor-covenant.org/faq +Die Projektbetreuer haben das Recht und die Verantwortung, Kommentare, Commits, Code, Wiki-Änderungen, Issues und andere Beiträge zu entfernen, zu bearbeiten oder abzulehnen, die nicht mit diesem Verhaltenskodex übereinstimmen, oder jeden Mitwirkenden vorübergehend oder dauerhaft zu diff --git a/locales/de/CONTRIBUTING.md b/locales/de/CONTRIBUTING.md index c4ef158090..25805ac401 100644 --- a/locales/de/CONTRIBUTING.md +++ b/locales/de/CONTRIBUTING.md @@ -1,82 +1,82 @@ -# Contribuir a Cline +# Beitrag zu Cline -Nos alegra que estés interesado en contribuir a Cline. Ya sea que corrijas un error, añadas una función o mejores nuestra documentación, ¡cada contribución hace que Cline sea más inteligente! Para mantener nuestra comunidad viva y acogedora, todos los miembros deben cumplir con nuestro [Código de Conducta](CODE_OF_CONDUCT.md). +Wir freuen uns, dass du daran interessiert bist, zu Cline beizutragen. Ob du einen Fehler behebst, eine Funktion hinzufügst oder unsere Dokumentation verbesserst – jeder Beitrag macht Cline intelligenter! Um unsere Community lebendig und einladend zu halten, müssen alle Mitglieder unseren [Verhaltenskodex](CODE_OF_CONDUCT.md) einhalten. -## Informar de errores o problemas +## Fehler oder Probleme melden -¡Los informes de errores ayudan a mejorar Cline para todos! Antes de crear un nuevo problema, por favor revisa los [problemas existentes](https://github.com/cline/cline/issues) para evitar duplicados. Cuando estés listo para informar un error, dirígete a nuestra [página de Issues](https://github.com/cline/cline/issues/new/choose), donde encontrarás una plantilla que te ayudará a completar la información relevante. +Fehlermeldungen helfen, Cline für alle zu verbessern! Bevor du ein neues Problem erstellst, überprüfe bitte die [bestehenden Probleme](https://github.com/cline/cline/issues), um Duplikate zu vermeiden. Wenn du bereit bist, einen Fehler zu melden, gehe zu unserer [Issues-Seite](https://github.com/cline/cline/issues/new/choose), wo du eine Vorlage findest, die dir hilft, die relevanten Informationen auszufüllen.
- 🔐 Importante: Si descubres una vulnerabilidad de seguridad, utiliza la herramienta de seguridad de GitHub para informarla de manera privada. + 🔐 Wichtig: Wenn du eine Sicherheitslücke entdeckst, verwende das GitHub-Sicherheitstool, um sie privat zu melden.
-## Decidir en qué trabajar +## Entscheiden, woran man arbeiten möchte -¿Buscas una buena primera contribución? Revisa los issues etiquetados con ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) o ["help wanted"](https://github.com/cline/cline/labels/help%20wanted). ¡Estos están especialmente seleccionados para nuevos colaboradores y son áreas donde nos encantaría recibir ayuda! +Suchst du nach einem guten ersten Beitrag? Schau dir die mit ["good first issue"](https://github.com/cline/cline/labels/good%20first%20issue) oder ["help wanted"](https://github.com/cline/cline/labels/help%20wanted) gekennzeichneten Issues an. Diese sind speziell für neue Mitwirkende ausgewählt und Bereiche, in denen wir gerne Hilfe erhalten würden! -También damos la bienvenida a contribuciones a nuestra [documentación](https://github.com/cline/cline/tree/main/docs). Ya sea corrigiendo errores tipográficos, mejorando guías existentes o creando nuevos contenidos educativos, queremos construir un repositorio de recursos gestionado por la comunidad que ayude a todos a sacar el máximo provecho de Cline. Puedes comenzar explorando `/docs` y buscando áreas que necesiten mejoras. +Wir begrüßen auch Beiträge zu unserer [Dokumentation](https://github.com/cline/cline/tree/main/docs). Ob du Tippfehler korrigierst, bestehende Anleitungen verbesserst oder neue Bildungsinhalte erstellst – wir möchten ein von der Community verwaltetes Ressourcen-Repository aufbauen, das allen hilft, das Beste aus Cline herauszuholen. Du kannst beginnen, indem du `/docs` erkundest und nach Bereichen suchst, die verbessert werden müssen. -Si planeas trabajar en una función más grande, por favor crea primero una [solicitud de función](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) para que podamos discutir si se alinea con la visión de Cline. +Wenn du planst, an einer größeren Funktion zu arbeiten, erstelle bitte zuerst eine [Funktionsanfrage](https://github.com/cline/cline/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop), damit wir besprechen können, ob sie mit der Vision von Cline übereinstimmt. -## Configurar el entorno de desarrollo +## Entwicklungsumgebung einrichten -1. **Extensiones de VS Code** +1. **VS Code Erweiterungen** - - Al abrir el proyecto, VS Code te pedirá que instales las extensiones recomendadas - - Estas extensiones son necesarias para el desarrollo, por favor acepta todas las solicitudes de instalación - - Si rechazaste las solicitudes, puedes instalarlas manualmente en la sección de extensiones + - Beim Öffnen des Projekts wird VS Code dich auffordern, die empfohlenen Erweiterungen zu installieren + - Diese Erweiterungen sind für die Entwicklung erforderlich, bitte akzeptiere alle Installationsanfragen + - Wenn du die Anfragen abgelehnt hast, kannst du sie manuell im Erweiterungsbereich installieren -2. **Desarrollo local** - - Ejecuta `npm run install:all` para instalar las dependencias - - Ejecuta `npm run test` para ejecutar las pruebas localmente - - Antes de enviar un PR, ejecuta `npm run format:fix` para formatear tu código +2. **Lokale Entwicklung** + - Führe `npm run install:all` aus, um die Abhängigkeiten zu installieren + - Führe `npm run test` aus, um die Tests lokal auszuführen + - Bevor du einen PR einreichst, führe `npm run format:fix` aus, um deinen Code zu formatieren -## Escribir y enviar código +## Code schreiben und einreichen -Cualquiera puede contribuir código a Cline, pero te pedimos que sigas estas pautas para asegurar que tus contribuciones se integren sin problemas: +Jeder kann Code zu Cline beitragen, aber wir bitten dich, diese Richtlinien zu befolgen, um sicherzustellen, dass deine Beiträge reibungslos integriert werden: -1. **Mantén los Pull Requests enfocados** +1. **Pull Requests fokussiert halten** - - Limita los PRs a una sola función o corrección de errores - - Divide los cambios más grandes en PRs más pequeños y coherentes - - Divide los cambios en commits lógicos que puedan ser revisados independientemente + - Begrenze PRs auf eine einzelne Funktion oder Fehlerbehebung + - Teile größere Änderungen in kleinere, kohärente PRs auf + - Teile Änderungen in logische Commits auf, die unabhängig überprüft werden können -2. **Calidad del código** +2. **Codequalität** - - Ejecuta `npm run lint` para verificar el estilo del código - - Ejecuta `npm run format` para formatear el código automáticamente - - Todos los PRs deben pasar las verificaciones de CI, que incluyen linting y formateo - - Corrige todas las advertencias o errores de ESLint antes de enviar - - Sigue las mejores prácticas para TypeScript y mantén la seguridad de tipos + - Führe `npm run lint` aus, um den Code-Stil zu überprüfen + - Führe `npm run format` aus, um den Code automatisch zu formatieren + - Alle PRs müssen die CI-Prüfungen bestehen, die Linting und Formatierung umfassen + - Behebe alle ESLint-Warnungen oder -Fehler, bevor du einreichst + - Befolge die Best Practices für TypeScript und halte die Typensicherheit ein -3. **Pruebas** +3. **Tests** - - Añade pruebas para nuevas funciones - - Ejecuta `npm test` para asegurarte de que todas las pruebas pasen - - Actualiza las pruebas existentes si tus cambios las afectan - - Añade tanto pruebas unitarias como de integración donde sea apropiado + - Füge Tests für neue Funktionen hinzu + - Führe `npm test` aus, um sicherzustellen, dass alle Tests bestehen + - Aktualisiere bestehende Tests, wenn deine Änderungen sie beeinflussen + - Füge sowohl Unit- als auch Integrationstests hinzu, wo es angebracht ist -4. **Pautas de commits** +4. **Commit-Richtlinien** - - Escribe mensajes de commit claros y descriptivos - - Usa el formato de commit convencional (por ejemplo, "feat:", "fix:", "docs:") - - Haz referencia a los issues relevantes en los commits con #número-del-issue + - Schreibe klare und beschreibende Commit-Nachrichten + - Verwende das konventionelle Commit-Format (z.B. "feat:", "fix:", "docs:") + - Verweise auf relevante Issues in den Commits mit #Issue-Nummer -5. **Antes de enviar** +5. **Vor dem Einreichen** - - Rebasea tu rama con el último Main - - Asegúrate de que tu rama se construya correctamente - - Verifica que todas las pruebas pasen - - Revisa tus cambios para eliminar cualquier código de depuración o registros de consola + - Rebase deinen Branch mit dem neuesten Main + - Stelle sicher, dass dein Branch korrekt gebaut wird + - Überprüfe, dass alle Tests bestehen + - Überprüfe deine Änderungen, um jeglichen Debug-Code oder Konsolenprotokolle zu entfernen -6. **Descripción del Pull Request** - - Describe claramente lo que hacen tus cambios - - Añade pasos para probar los cambios - - Enumera cualquier cambio importante - - Añade capturas de pantalla para cambios en la interfaz de usuario +6. **Beschreibung des Pull Requests** + - Beschreibe klar, was deine Änderungen bewirken + - Füge Schritte hinzu, um die Änderungen zu testen + - Liste alle wichtigen Änderungen auf + - Füge Screenshots für Änderungen an der Benutzeroberfläche hinzu -## Acuerdo de contribución +## Beitragsvereinbarung -Al enviar un Pull Request, aceptas que tus contribuciones se licencien bajo la misma licencia que el proyecto ([Apache 2.0](LICENSE)). +Durch das Einreichen eines Pull Requests erklärst du dich damit einverstanden, dass deine Beiträge unter derselben Lizenz wie das Projekt ([Apache 2.0](LICENSE)) lizenziert werden. -Recuerda: Contribuir a Cline no solo significa escribir código, sino ser parte de una comunidad que está dando forma al futuro del desarrollo asistido por IA. ¡Hagamos algo grandioso juntos! 🚀 +Denke daran: Zu Cline beizutragen bedeutet nicht nur, Code zu schreiben, sondern Teil einer Community zu sein, die die Zukunft der KI-gestützten Entwicklung gestaltet. Lass uns gemeinsam etwas Großartiges schaffen! 🚀 diff --git a/locales/zh-cn/README.md b/locales/zh-cn/README.md index 6fbe1d8215..0e6fd20d50 100644 --- a/locales/zh-cn/README.md +++ b/locales/zh-cn/README.md @@ -1,4 +1,4 @@ -# Cline – \#1 on OpenRouter +# Cline – OpenRouter 排名第一

From c52866693ca402338587420fff805b1c8e82c0cc Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 11:00:51 -1000 Subject: [PATCH 09/74] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fa8919d10c..d6c3213d85 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ +Meet Cline, an AI assistant that can use your **CLI** a**N**d **E**ditor. + Other language [README files](./README.md) are available in: - [Español](./locales/es/README.md) - [Deutsch](./locales/de/README.md) From 413c4f894201d6fee20074bbce7cef79f7b4911b Mon Sep 17 00:00:00 2001 From: Ocasta Date: Mon, 27 Jan 2025 13:21:18 -0800 Subject: [PATCH 10/74] add test procedure to PR template --- .github/pull_request_template.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a4dc71c669..22a8a9976e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -2,6 +2,10 @@ +### Test Procedure + + + ### Type of Change From 2521607a5e3fb0e2f8b285d3808403a848ccd7b9 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 13:03:38 -1000 Subject: [PATCH 11/74] more i18n --- .../src/components/chat/Announcement.tsx | 4 +- .../src/components/chat/AutoApproveMenu.tsx | 15 +- webview-ui/src/components/chat/ChatRow.tsx | 164 ++++++++-------- .../src/components/chat/ChatTextArea.tsx | 7 +- webview-ui/src/components/chat/ChatView.tsx | 31 ++-- .../src/components/history/HistoryPreview.tsx | 15 +- .../src/components/history/HistoryView.tsx | 49 ++--- .../src/components/settings/ApiOptions.tsx | 4 +- .../components/settings/LanguageOptions.tsx | 1 + .../src/components/welcome/WelcomeView.tsx | 30 +-- webview-ui/src/i18n.ts | 2 + webview-ui/src/locales/de/translation.json | 103 +++++++++++ webview-ui/src/locales/en/translation.json | 103 +++++++++++ webview-ui/src/locales/es/translation.json | 175 ++++++++++++++++++ webview-ui/src/locales/ja/translation.json | 103 +++++++++++ webview-ui/src/locales/zh-cn/translation.json | 103 +++++++++++ webview-ui/src/locales/zh-tw/translation.json | 103 +++++++++++ 17 files changed, 857 insertions(+), 155 deletions(-) create mode 100644 webview-ui/src/locales/es/translation.json diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index 77e8d1774d..96125cc3bf 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -114,8 +114,8 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => { , - RedditLink: , + DiscordLink: , + RedditLink: , }} />

diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index aa3a8a44a7..006e37df51 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -5,6 +5,7 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { AutoApprovalSettings } from "../../../../src/shared/AutoApprovalSettings" import { vscode } from "../../utils/vscode" import { getAsVar, VSC_FOREGROUND, VSC_TITLEBAR_INACTIVE_FOREGROUND, VSC_DESCRIPTION_FOREGROUND } from "../../utils/vscStyles" +import { useTranslation } from "react-i18next" interface AutoApproveMenuProps { style?: React.CSSProperties @@ -50,6 +51,7 @@ const ACTION_METADATA: { ] const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { + const { t } = useTranslation("translation", { keyPrefix: "autoApproveMenu" }) const { autoApprovalSettings } = useExtensionState() const [isExpanded, setIsExpanded] = useState(false) const [isHoveringCollapsibleSection, setIsHoveringCollapsibleSection] = useState(false) @@ -190,7 +192,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { color: getAsVar(VSC_FOREGROUND), whiteSpace: "nowrap", }}> - Auto-approve: + {t("autoApprove")} { overflow: "hidden", textOverflow: "ellipsis", }}> - {enabledActions.length === 0 ? "None" : enabledActionsList} + {enabledActions.length === 0 ? t("none") : enabledActionsList} { color: getAsVar(VSC_DESCRIPTION_FOREGROUND), fontSize: "12px", }}> - Auto-approve allows Cline to perform the following actions without asking for permission. Please use with - caution and only enable if you understand the risks. + {t("autoApproveDescription")} {ACTION_METADATA.map((action) => (
@@ -285,7 +286,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { fontSize: "12px", marginBottom: "10px", }}> - Cline will automatically make this many API requests before asking for approval to proceed with the task. + {t("autoApproveMaxRequestsDescription")}
{ const checked = (e.target as HTMLInputElement).checked updateNotifications(checked) }}> - Enable Notifications + {t("enableNotifications")}
{ color: getAsVar(VSC_DESCRIPTION_FOREGROUND), fontSize: "12px", }}> - Receive system notifications when Cline requires approval to proceed or when a task is completed. + {t("enableNotificationsDescription")}
diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index fed1bb0cf4..e5d912d6ad 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -2,6 +2,7 @@ import { VSCodeBadge, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/reac import deepEqual from "fast-deep-equal" import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from "react" import { useEvent, useSize } from "react-use" +import { useTranslation } from "react-i18next" import styled from "styled-components" import { ClineApiReqInfo, @@ -99,6 +100,7 @@ const ChatRow = memo( export default ChatRow export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessage, isLast }: ChatRowContentProps) => { + const { t } = useTranslation("translation", { keyPrefix: "chatRow" }) const { mcpServers } = useExtensionState() const [seeNewChangesDisabled, setSeeNewChangesDisabled] = useState(false) @@ -151,7 +153,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>
, - Error, + {t("error")}, ] case "mistake_limit_reached": return [ @@ -161,7 +163,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>, - Cline is having trouble..., + {t("mistakeLimitReached")}, ] case "auto_approval_max_req_reached": return [ @@ -171,7 +173,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>, - Maximum Requests Reached, + {t("autoApprovalMaxReqReached")}, ] case "command": return [ @@ -186,7 +188,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi }}> ), - {message.type === "ask" ? "Cline wants to execute this command:" : "Cline executed this command:"} + {message.type === "ask" ? t("command.ask") : t("command.say")} , ] case "use_mcp_server": @@ -205,13 +207,23 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi {message.type === "ask" ? ( <> - Cline wants to {mcpServerUse.type === "use_mcp_tool" ? "use a tool" : "access a resource"} on the{" "} - {mcpServerUse.serverName} MCP server: + {t("useMcpServer.ask", { + type: + mcpServerUse.type === "use_mcp_tool" + ? t("useMcpServer.tool") + : t("useMcpServer.resource"), + serverName: mcpServerUse.serverName, + })} ) : ( <> - Cline {mcpServerUse.type === "use_mcp_tool" ? "used a tool" : "accessed a resource"} on the{" "} - {mcpServerUse.serverName} MCP server: + {t("useMcpServer.say", { + type: + mcpServerUse.type === "use_mcp_tool" + ? t("useMcpServer.tool") + : t("useMcpServer.resource"), + serverName: mcpServerUse.serverName, + })} )} , @@ -224,7 +236,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: successColor, marginBottom: "-1.5px", }}>, - Task Completed, + {t("completionResult")}, ] case "api_req_started": const getIconSpan = (iconName: string, color: string) => ( @@ -266,7 +278,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: normalColor, fontWeight: "bold", }}> - API Request Cancelled + {t("apiReqCancelled")} ) : ( - API Streaming Failed + {t("apiStreamingFailed")} ) ) : cost != null ? ( - API Request + {t("apiRequest")} ) : apiRequestFailedMessage ? ( - API Request Failed + {t("apiRequestFailed")} ) : ( - API Request... + {t("apiRequestInProgress")} ), ] case "followup": @@ -293,7 +305,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: normalColor, marginBottom: "-1.5px", }}>, - Cline has a question:, + {t("followup")}, ] default: return [null, null] @@ -307,6 +319,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi isMcpServerResponding, message.text, message.type, + t, ]) const headerStyle: React.CSSProperties = { @@ -347,7 +360,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
{toolIcon("edit")} - {message.type === "ask" ? "Cline wants to edit this file:" : "Cline is editing this file:"} + {message.type === "ask" ? t("tool.editedExistingFile.ask") : t("tool.editedExistingFile.say")}
{toolIcon("new-file")} - {message.type === "ask" ? "Cline wants to create a new file:" : "Cline is creating a new file:"} + {message.type === "ask" ? t("tool.createdNewFile.ask") : t("tool.createdNewFile.say")} {toolIcon("file-code")} - {message.type === "ask" ? "Cline wants to read this file:" : "Cline read this file:"} + {message.type === "ask" ? t("tool.readExistingFile.ask") : t("tool.readExistingFile.say")} {/*

- It seems like you're having Windows PowerShell issues, please see this{" "} - - troubleshooting guide - - . + {t("troubleshootingGuide")} )}

- {/* {apiProvider === "" && ( -
+ - - - Uh-oh, this could be a problem on end. We've been alerted and - will resolve this ASAP. You can also{" "} - - contact us - - . - -
- )} */} + marginRight: 6, + fontSize: 16, + color: "var(--vscode-errorForeground)", + }}> + + Uh-oh, this could be a problem on end. We've been alerted and + will resolve this ASAP. You can also{" "} + + contact us + + . + + + )} */} )} @@ -923,13 +926,10 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontWeight: 500, color: "#FFA500", }}> - Diff Edit Failed + {t("diffEditFailed")} -
- This usually happens when the model uses search patterns that don't match anything in the - file. Retrying... -
+
{t("diffEditFailedMessage")}
) @@ -969,7 +969,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi cursor: seeNewChangesDisabled ? "wait" : "pointer", }}> - See new changes + {t("seeNewChanges")} )} @@ -1005,23 +1005,10 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontWeight: 500, color: "#FFA500", }}> - Shell Integration Unavailable + {t("shellIntegrationUnavailable")} -
- Cline won't be able to view the command's output. Please update VSCode ( - CMD/CTRL + Shift + P → "Update") and make sure you're using a supported shell: - zsh, bash, fish, or PowerShell (CMD/CTRL + Shift + P → "Terminal: Select Default - Profile").{" "} - - Still having trouble? - -
+
{t("shellIntegrationUnavailableMessage")}
) @@ -1036,14 +1023,15 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontSize: "12px", textTransform: "uppercase", }}> - Response + + {t("response")} + - ) @@ -1136,7 +1124,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi cursor: seeNewChangesDisabled ? "wait" : "pointer", }} /> - See new changes + {t("seeNewChanges")} )} diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 0f11b0a677..a7ff649928 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -4,7 +4,7 @@ import DynamicTextArea from "react-textarea-autosize" import { useClickAway, useWindowSize } from "react-use" import styled from "styled-components" import { mentionRegex, mentionRegexGlobal } from "../../../../src/shared/context-mentions" -import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" +import { useTranslation } from "react-i18next" import { useExtensionState } from "../../context/ExtensionStateContext" import { ContextMenuOptionType, @@ -211,6 +211,7 @@ const ChatTextArea = forwardRef( }, ref, ) => { + const { t } = useTranslation("translation", { keyPrefix: "chatTextArea" }) const { filePaths, chatSettings, apiConfiguration, openRouterModels } = useExtensionState() const [isTextAreaFocused, setIsTextAreaFocused] = useState(false) const [thumbnailsHeight, setThumbnailsHeight] = useState(0) @@ -1063,8 +1064,8 @@ const ChatTextArea = forwardRef( - Plan - Act + {t("plan")} + {t("act")} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index aec4e544a9..1fe0211c52 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -3,6 +3,8 @@ import debounce from "debounce" import { useCallback, useEffect, useMemo, useRef, useState } from "react" import { useDeepCompareEffect, useEvent, useMount } from "react-use" import { Virtuoso, type VirtuosoHandle } from "react-virtuoso" +import { useTranslation } from "react-i18next" +import { Trans } from "react-i18next" import styled from "styled-components" import { ClineAsk, @@ -36,6 +38,7 @@ interface ChatViewProps { export const MAX_IMAGES_PER_MESSAGE = 20 // Anthropic limits to 20 images const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryView }: ChatViewProps) => { + const { t } = useTranslation("translation", { keyPrefix: "chatView" }) const { version, clineMessages: messages, taskHistory, apiConfiguration } = useExtensionState() //const task = messages.length > 0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined @@ -666,9 +669,8 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie useEvent("wheel", handleWheel, window, { passive: true }) // passive improves scrolling performance const placeholderText = useMemo(() => { - const text = task ? "Type a message..." : "Type your task here..." - return text - }, [task]) + return task ? t("typeMessage") : t("typeTask") + }, [task, t]) const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage | ClineMessage[]) => { @@ -743,18 +745,19 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie }}> {showAnnouncement && }
-

What can I do for you?

+

{t("whatCanIDoForYou")}

- Thanks to{" "} - - Claude 3.5 Sonnet's agentic coding capabilities, - {" "} - I can handle complex software development tasks step-by-step. With tools that let me create & edit - files, explore complex projects, use the browser, and execute terminal commands (after you grant - permission), I can assist you in ways that go beyond code completion or tech support. I can even use - MCP to create new tools and extend my own capabilities. + + ), + }} + />

{taskHistory.length > 0 && } diff --git a/webview-ui/src/components/history/HistoryPreview.tsx b/webview-ui/src/components/history/HistoryPreview.tsx index 06a2e9bc62..7725b69404 100644 --- a/webview-ui/src/components/history/HistoryPreview.tsx +++ b/webview-ui/src/components/history/HistoryPreview.tsx @@ -3,12 +3,14 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { vscode } from "../../utils/vscode" import { memo } from "react" import { formatLargeNumber } from "../../utils/format" +import { useTranslation } from "react-i18next" type HistoryPreviewProps = { showHistoryView: () => void } const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { + const { t } = useTranslation("translation", { keyPrefix: "historyPreview" }) const { taskHistory } = useExtensionState() const handleHistorySelect = (id: string) => { vscode.postMessage({ type: "showTaskWithId", text: id }) @@ -69,7 +71,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { fontSize: "0.85em", textTransform: "uppercase", }}> - Recent Tasks + {t("recentTasks")} @@ -112,13 +114,14 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { color: "var(--vscode-descriptionForeground)", }}> - Tokens: ↑{formatLargeNumber(item.tokensIn || 0)} ↓{formatLargeNumber(item.tokensOut || 0)} + {t("tokens")}: ↑{formatLargeNumber(item.tokensIn || 0)} ↓ + {formatLargeNumber(item.tokensOut || 0)} {!!item.cacheWrites && ( <> {" • "} - Cache: +{formatLargeNumber(item.cacheWrites || 0)} →{" "} + {t("cache")}: +{formatLargeNumber(item.cacheWrites || 0)} →{" "} {formatLargeNumber(item.cacheReads || 0)} @@ -126,7 +129,9 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { {!!item.totalCost && ( <> {" • "} - API Cost: ${item.totalCost?.toFixed(4)} + + {t("apiCost")}: ${item.totalCost?.toFixed(4)} + )} @@ -150,7 +155,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { fontSize: "var(--vscode-font-size)", color: "var(--vscode-descriptionForeground)", }}> - View all history + {t("viewAllHistory")} diff --git a/webview-ui/src/components/history/HistoryView.tsx b/webview-ui/src/components/history/HistoryView.tsx index d50b4b39db..fb5d32f956 100644 --- a/webview-ui/src/components/history/HistoryView.tsx +++ b/webview-ui/src/components/history/HistoryView.tsx @@ -6,6 +6,7 @@ import { memo, useMemo, useState, useEffect } from "react" import Fuse, { FuseResult } from "fuse.js" import { formatLargeNumber } from "../../utils/format" import { formatSize } from "../../utils/size" +import { useTranslation } from "react-i18next" type HistoryViewProps = { onDone: () => void @@ -14,6 +15,7 @@ type HistoryViewProps = { type SortOption = "newest" | "oldest" | "mostExpensive" | "mostTokens" | "mostRelevant" const HistoryView = ({ onDone }: HistoryViewProps) => { + const { t } = useTranslation("translation", { keyPrefix: "historyView" }) const { taskHistory } = useExtensionState() const [searchQuery, setSearchQuery] = useState("") const [sortOption, setSortOption] = useState("newest") @@ -142,9 +144,9 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { color: "var(--vscode-foreground)", margin: 0, }}> - History + {t("history")} - Done + {t("done")}
{ }}> { const newValue = (e.target as HTMLInputElement)?.value @@ -192,12 +194,12 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { style={{ display: "flex", flexWrap: "wrap" }} value={sortOption} onChange={(e) => setSortOption((e.target as HTMLInputElement).value as SortOption)}> - Newest - Oldest - Most Expensive - Most Tokens + {t("newest")} + {t("oldest")} + {t("mostExpensive")} + {t("mostTokens")} - Most Relevant + {t("mostRelevant")}
@@ -319,7 +321,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - Tokens: + {t("tokens")} { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - Cache: + {t("cache")} { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - API Cost: + {t("apiCost")} { ) } -const ExportButton = ({ itemId }: { itemId: string }) => ( - { - e.stopPropagation() - vscode.postMessage({ type: "exportTaskWithId", text: itemId }) - }}> -
EXPORT
-
-) +const ExportButton = ({ itemId }: { itemId: string }) => { + const { t } = useTranslation("translation", { keyPrefix: "historyView" }) + return ( + { + e.stopPropagation() + vscode.postMessage({ type: "exportTaskWithId", text: itemId }) + }}> +
{t("export")}
+
+ ) +} // https://gist.github.com/evenfrost/1ba123656ded32fb7a0cd4651efd4db0 export const highlight = (fuseSearchResult: FuseResult[], highlightClassName: string = "history-item-highlight") => { diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index d19443cf93..4451dda4bf 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -75,7 +75,7 @@ declare module "vscode" { } const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, isPopup }: ApiOptionsProps) => { - const { t, ready } = useTranslation("translation", { keyPrefix: "apiOptions", useSuspense: false }) + const { t } = useTranslation("translation", { keyPrefix: "apiOptions" }) const { apiConfiguration, setApiConfiguration, uriScheme } = useExtensionState() const [ollamaModels, setOllamaModels] = useState([]) const [lmStudioModels, setLmStudioModels] = useState([]) @@ -831,7 +831,7 @@ export const ModelInfoView = ({ isPopup?: boolean }) => { const isGemini = Object.keys(geminiModels).includes(selectedModelId) - const { t, ready } = useTranslation("translation", { keyPrefix: "apiOptions", useSuspense: false }) + const { t } = useTranslation("translation", { keyPrefix: "apiOptions" }) const infoItems = [ modelInfo.description && ( diff --git a/webview-ui/src/components/settings/LanguageOptions.tsx b/webview-ui/src/components/settings/LanguageOptions.tsx index 0f9bc1b349..8d66231728 100644 --- a/webview-ui/src/components/settings/LanguageOptions.tsx +++ b/webview-ui/src/components/settings/LanguageOptions.tsx @@ -22,6 +22,7 @@ const LanguageOptions = () => { style={{ width: "100%" }} onChange={changeLanguage}> English + Español Deutsch 中文(简体) 中文(繁體) diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index 7de9200270..498469584f 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -4,8 +4,12 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "../settings/ApiOptions" +import { useTranslation } from "react-i18next" +import { Trans } from "react-i18next" const WelcomeView = () => { + const { t } = useTranslation("translation", { keyPrefix: "welcomeView" }) + const { apiConfiguration } = useExtensionState() const [apiErrorMessage, setApiErrorMessage] = useState(undefined) @@ -30,25 +34,27 @@ const WelcomeView = () => { bottom: 0, padding: "0 20px", }}> -

Hi, I'm Cline

+

{t("greeting")}

- I can do all kinds of tasks thanks to the latest breakthroughs in{" "} - - Claude 3.5 Sonnet's agentic coding capabilities - {" "} - and access to tools that let me create & edit files, explore complex projects, use the browser, and execute - terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own - capabilities. + + ), + }} + />

- To get started, this extension needs an API provider for Claude 3.5 Sonnet. + {t("getStarted")}
- Let's go! + {t("letsGo")}
diff --git a/webview-ui/src/i18n.ts b/webview-ui/src/i18n.ts index 774dbb4fdc..affbac2329 100644 --- a/webview-ui/src/i18n.ts +++ b/webview-ui/src/i18n.ts @@ -2,6 +2,7 @@ import i18n from "i18next" import { initReactI18next } from "react-i18next" import translationEN from "./locales/en/translation.json" +//import translationES from "./locales/es/translation.json" //import translationDE from "./locales/de/translation.json" //import translationZHCN from "./locales/zh-cn/translation.json" //import translationZHTW from "./locales/zh-tw/translation.json" @@ -19,6 +20,7 @@ i18n.use(initReactI18next) // passes i18n down to react-i18next }) i18n.addResourceBundle("en", "translation", translationEN) +//i18n.addResourceBundle("es", "translation", translationES) //i18n.addResourceBundle("de", "translation", translationDE) //i18n.addResourceBundle("zh-CN", "translation", translationZHCN) //i18n.addResourceBundle("zh-TW", "translation", translationZHTW) diff --git a/webview-ui/src/locales/de/translation.json b/webview-ui/src/locales/de/translation.json index 38bd488e24..10b1825b36 100644 --- a/webview-ui/src/locales/de/translation.json +++ b/webview-ui/src/locales/de/translation.json @@ -68,5 +68,108 @@ "geminiInfo": "* Kostenlos bis zu {{selectedModelId}} Anfragen pro Minute. Danach hängt die Abrechnung von der Prompt-Größe ab.", "pricingDetails": "Weitere Informationen finden Sie in den Preisdaten.", "languageModel": "Sprachmodell" + }, + "welcomeView": { + "greeting": "Hallo! Ich bin Cline, dein KI-Assistent.", + "description": "Ich kann alle möglichen Aufgaben dank der neuesten Durchbrüche in Claude 3.5 Sonnets agentischen Codierungsfähigkeiten und dem Zugriff auf Werkzeuge, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit deiner Erlaubnis). Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern.", + "getStarted": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter für Claude 3.5 Sonnet.", + "letsGo": "Los geht's!" + }, + "chatView": { + "typeMessage": "Nachricht eingeben...", + "typeTask": "Aufgabe eingeben...", + "whatCanIDoForYou": "Was kann ich für dich tun?", + "thanksTo": "Dank Claude 3.5 Sonnets agentischen Codierungsfähigkeiten kann ich komplexe Softwareentwicklungsaufgaben Schritt für Schritt bewältigen. Mit Werkzeugen, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (nachdem du die Erlaubnis erteilt hast), kann ich dir auf eine Weise helfen, die über die Codevervollständigung oder den technischen Support hinausgeht. Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern." + }, + "chatTextArea": { + "plan": "Planen", + "act": "Handeln" + }, + "chatRow": { + "error": "Fehler", + "mistakeLimitReached": "Fehlergrenze erreicht", + "autoApprovalMaxReqReached": "Maximale Anzahl automatischer Genehmigungen erreicht", + "command": { + "ask": "Cline möchte diesen Befehl ausführen:", + "say": "Cline hat diesen Befehl ausgeführt:" + }, + "useMcpServer": { + "ask": "Cline möchte dieses {type} auf {serverName} verwenden:", + "say": "Cline hat dieses {type} auf {serverName} verwendet:", + "tool": "Werkzeug", + "resource": "Ressource" + }, + "completionResult": "Abschlussergebnis", + "apiReqCancelled": "API-Anfrage abgebrochen", + "apiStreamingFailed": "API-Streaming fehlgeschlagen", + "apiRequest": "API-Anfrage", + "apiRequestFailed": "API-Anfrage fehlgeschlagen", + "apiRequestInProgress": "API-Anfrage in Bearbeitung", + "followup": "Nachverfolgung", + "tool": { + "editedExistingFile": { + "ask": "Cline möchte diese Datei bearbeiten:", + "say": "Cline bearbeitet diese Datei:" + }, + "createdNewFile": { + "ask": "Cline möchte diese Datei erstellen:", + "say": "Cline hat diese Datei erstellt:" + }, + "readExistingFile": { + "ask": "Cline möchte diese Datei lesen:", + "say": "Cline hat diese Datei gelesen:" + } + }, + "apiReqStarted": "API-Anfrage gestartet", + "userFeedback": "Benutzer-Feedback", + "userFeedbackDiff": "Benutzer-Feedback-Diff", + "diffEditFailed": "Diff-Bearbeitung fehlgeschlagen", + "shellIntegrationUnavailable": "Shell-Integration nicht verfügbar", + "mcpServerResponse": "MCP-Server-Antwort", + "planModeResponse": "Planmodus-Antwort", + "seeNewChanges": "Neue Änderungen anzeigen", + "commandRequiresApproval": "Das Modell hat bestimmt, dass dieser Befehl eine ausdrückliche Genehmigung erfordert.", + "troubleshootingGuide": "Fehlerbehebungshandbuch", + "clineWantsToViewTopLevelFiles": "Cline möchte die obersten Dateien in diesem Verzeichnis anzeigen:", + "clineViewedTopLevelFiles": "Cline hat die obersten Dateien in diesem Verzeichnis angezeigt:", + "clineWantsToRecursivelyViewFiles": "Cline möchte alle Dateien in diesem Verzeichnis rekursiv anzeigen:", + "clineRecursivelyViewedFiles": "Cline hat alle Dateien in diesem Verzeichnis rekursiv angezeigt:", + "clineWantsToViewSourceCodeDefinitions": "Cline möchte die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen anzeigen:", + "clineViewedSourceCodeDefinitions": "Cline hat die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen angezeigt:", + "clineWantsToSearchDirectory": "Cline möchte dieses Verzeichnis nach {{regex}} durchsuchen:", + "clineSearchedDirectory": "Cline hat dieses Verzeichnis nach {{regex}} durchsucht:", + "diffEditFailedMessage": "Dies passiert normalerweise, wenn das Modell Suchmuster verwendet, die nichts in der Datei finden. Erneut versuchen...", + "shellIntegrationUnavailableMessage": "Cline kann die Ausgabe des Befehls nicht anzeigen. Bitte aktualisiere VSCode (CMD/CTRL + Shift + P → \"Update\") und stelle sicher, dass du eine unterstützte Shell verwendest: zsh, bash, fish oder PowerShell (CMD/CTRL + Shift + P → \"Terminal: Standardprofil auswählen\"). Immer noch Probleme?", + "response": "Antwort", + "stillHavingTrouble": "Immer noch Probleme?" + }, + "autoApproveMenu": { + "none": "Keine", + "autoApprove": "Automatische Genehmigung:", + "autoApproveDescription": "Die automatische Genehmigung ermöglicht es Cline, die folgenden Aktionen ohne Erlaubnis auszuführen. Bitte mit Vorsicht verwenden und nur aktivieren, wenn Sie die Risiken verstehen.", + "autoApproveMaxRequestsDescription": "Cline wird automatisch so viele API-Anfragen stellen, bevor eine Genehmigung zur Fortsetzung der Aufgabe erforderlich ist.", + "enableNotifications": "Benachrichtigungen aktivieren", + "enableNotificationsDescription": "Erhalte Systembenachrichtigungen, wenn Cline eine Genehmigung zur Fortsetzung benötigt oder wenn eine Aufgabe abgeschlossen ist." + }, + "historyPreview": { + "recentTasks": "Kürzliche Aufgaben", + "tokens": "Tokens", + "cache": "Cache", + "apiCost": "API-Kosten", + "viewAllHistory": "Alle Verlauf anzeigen" + }, + "historyView": { + "history": "Verlauf", + "done": "Fertig", + "fuzzySearchHistory": "Verlauf unscharf durchsuchen...", + "newest": "Neueste", + "oldest": "Älteste", + "mostExpensive": "Teuerste", + "mostTokens": "Meiste Tokens", + "mostRelevant": "Relevanteste", + "tokens": "Tokens:", + "cache": "Cache:", + "apiCost": "API-Kosten:", + "export": "EXPORTIEREN" } } diff --git a/webview-ui/src/locales/en/translation.json b/webview-ui/src/locales/en/translation.json index 4f7ddd16f9..0d3e428fb8 100644 --- a/webview-ui/src/locales/en/translation.json +++ b/webview-ui/src/locales/en/translation.json @@ -68,5 +68,108 @@ "geminiInfo": "* Free up to {{selectedModelId}} requests per minute. After that, billing depends on prompt size.", "pricingDetails": "For more info, see pricing details.", "languageModel": "Language Model" + }, + "welcomeView": { + "greeting": "Hello! I'm Cline, your AI assistant.", + "description": "I can do all kinds of tasks thanks to the latest breakthroughs in Claude 3.5 Sonnet's agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.", + "getStarted": "To get started, this extension needs an API provider for Claude 3.5 Sonnet.", + "letsGo": "Let's go!" + }, + "chatView": { + "typeMessage": "Type a message...", + "typeTask": "Type a task...", + "whatCanIDoForYou": "What can I do for you?", + "thanksTo": "Thanks to Claude 3.5 Sonnet's agentic coding capabilities, I can handle complex software development tasks step-by-step. With tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (after you grant permission), I can assist you in ways that go beyond code completion or tech support. I can even use MCP to create new tools and extend my own capabilities." + }, + "chatTextArea": { + "plan": "Plan", + "act": "Act" + }, + "chatRow": { + "error": "Error", + "mistakeLimitReached": "Mistake limit reached", + "autoApprovalMaxReqReached": "Auto approval max request reached", + "command": { + "ask": "Cline wants to execute this command:", + "say": "Cline executed this command:" + }, + "useMcpServer": { + "ask": "Cline wants to use this {type} on {serverName}:", + "say": "Cline used this {type} on {serverName}:", + "tool": "tool", + "resource": "resource" + }, + "completionResult": "Completion result", + "apiReqCancelled": "API request cancelled", + "apiStreamingFailed": "API streaming failed", + "apiRequest": "API request", + "apiRequestFailed": "API request failed", + "apiRequestInProgress": "API request in progress", + "followup": "Follow-up", + "tool": { + "editedExistingFile": { + "ask": "Cline wants to edit this file:", + "say": "Cline is editing this file:" + }, + "createdNewFile": { + "ask": "Cline wants to create this file:", + "say": "Cline created this file:" + }, + "readExistingFile": { + "ask": "Cline wants to read this file:", + "say": "Cline read this file:" + } + }, + "apiReqStarted": "API Request Started", + "userFeedback": "User Feedback", + "userFeedbackDiff": "User Feedback Diff", + "diffEditFailed": "Diff Edit Failed", + "shellIntegrationUnavailable": "Shell Integration Unavailable", + "mcpServerResponse": "MCP Server Response", + "planModeResponse": "Plan Mode Response", + "seeNewChanges": "See new changes", + "commandRequiresApproval": "The model has determined this command requires explicit approval.", + "troubleshootingGuide": "troubleshooting guide", + "clineWantsToViewTopLevelFiles": "Cline wants to view the top level files in this directory:", + "clineViewedTopLevelFiles": "Cline viewed the top level files in this directory:", + "clineWantsToRecursivelyViewFiles": "Cline wants to recursively view all files in this directory:", + "clineRecursivelyViewedFiles": "Cline recursively viewed all files in this directory:", + "clineWantsToViewSourceCodeDefinitions": "Cline wants to view source code definition names used in this directory:", + "clineViewedSourceCodeDefinitions": "Cline viewed source code definition names used in this directory:", + "clineWantsToSearchDirectory": "Cline wants to search this directory for {{regex}}:", + "clineSearchedDirectory": "Cline searched this directory for {{regex}}:", + "diffEditFailedMessage": "This usually happens when the model uses search patterns that don't match anything in the file. Retrying...", + "shellIntegrationUnavailableMessage": "Cline won't be able to view the command's output. Please update VSCode (CMD/CTRL + Shift + P → \"Update\") and make sure you're using a supported shell: zsh, bash, fish, or PowerShell (CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\"). Still having trouble?", + "response": "Response", + "stillHavingTrouble": "Still having trouble?" + }, + "autoApproveMenu": { + "none": "None", + "autoApprove": "Auto Approve:", + "autoApproveDescription": "Auto-approve allows Cline to perform the following actions without asking for permission. Please use with caution and only enable if you understand the risks.", + "autoApproveMaxRequestsDescription": "Cline will automatically make this many API requests before asking for approval to proceed with the task.", + "enableNotifications": "Enable Notifications", + "enableNotificationsDescription": "Receive system notifications when Cline requires approval to proceed or when a task is completed." + }, + "historyPreview": { + "recentTasks": "Recent Tasks", + "tokens": "Tokens", + "cache": "Cache", + "apiCost": "API Cost", + "viewAllHistory": "View all history" + }, + "historyView": { + "history": "History", + "done": "Done", + "fuzzySearchHistory": "Fuzzy search history...", + "newest": "Newest", + "oldest": "Oldest", + "mostExpensive": "Most Expensive", + "mostTokens": "Most Tokens", + "mostRelevant": "Most Relevant", + "tokens": "Tokens:", + "cache": "Cache:", + "apiCost": "API Cost:", + "export": "EXPORT" } } diff --git a/webview-ui/src/locales/es/translation.json b/webview-ui/src/locales/es/translation.json new file mode 100644 index 0000000000..df3f5e4eea --- /dev/null +++ b/webview-ui/src/locales/es/translation.json @@ -0,0 +1,175 @@ +{ + "announcement": { + "newInVersion": "Nuevo en la versión {{version}}", + "joinOurCommunities": "Únete a nuestro Discord o Reddit para más actualizaciones!" + }, + "settingsView": { + "settings": "Configuraciones", + "done": "Hecho", + "language": "Idioma", + "customInstructions": "Instrucciones personalizadas", + "customInstructionsPlaceholder": "por ejemplo, \"Realiza pruebas unitarias al final\", \"Usa TypeScript con async/await\", \"Habla en japonés\"", + "customInstructionsDescription": "Estas instrucciones se agregarán al final del prompt del sistema que se envía con cada solicitud.", + "debug": "Depurar", + "resetState": "Restablecer estado", + "resetStateDescription": "Esto restablecerá todo el estado global y el almacenamiento secreto en la extensión.", + "feedback": "Si tienes preguntas o comentarios, no dudes en abrir un issue en", + "version": "v" + }, + "apiOptions": { + "selectModel": "Seleccionar modelo...", + "model": "Modelo", + "apiProvider": "Proveedor de API", + "enterApiKey": "Ingresar clave API...", + "apiKey": "Clave API", + "enterBaseUrl": "Ingresar URL base...", + "baseUrl": "URL base", + "optionalBaseUrl": "URL base (opcional)", + "enterModelId": "Ingresar ID del modelo...", + "modelId": "ID del modelo", + "useCustomBaseUrl": "Usar URL base personalizada", + "apiKeyInfo": "Esta clave se almacena localmente y solo se usa para realizar solicitudes API desde esta extensión.", + "getDefault": "Predeterminado: {{defaultValue}}", + "getApiKeyMessage": "Puedes obtener una clave API de {{vendor}} registrándote aquí.", + "getApiVendorKey": "Clave API de {{vendor}}", + "getCompatibleVendor": "Compatible con {{vendor}}", + "lmStudioInfo": "LM Studio te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su Guía de inicio rápido. También debes iniciar la función de servidor local de LM Studio para usarla con esta extensión. (Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", + "ollamaInfo": "Ollama te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su Guía de inicio rápido. (Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", + "azureInfo": "(Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", + "setAzureApiVersion": "Establecer versión de API de Azure", + "enterGcpProjectId": "Ingresar ID del proyecto...", + "gcpProjectId": "ID del proyecto de Google Cloud", + "gcpLinks": "Para usar Google Cloud Vertex AI, debes 1) crear una cuenta de Google Cloud › habilitar la API de Vertex AI › habilitar los modelos Claude deseados,
2) instalar la CLI de Google Cloud › configurar credenciales predeterminadas de la aplicación. ", + "enterAwsAccessKey": "Ingresar clave de acceso...", + "awsAccessKey": "Clave de acceso de AWS", + "enterAwsSecretKey": "Ingresar clave secreta...", + "awsSecretKey": "Clave secreta de AWS", + "enterAwsSessionToken": "Ingresar token de sesión...", + "awsSessionToken": "Token de sesión de AWS", + "getRegion": "Región de {{vendor}}", + "selectRegion": "Seleccionar región...", + "useCrossRegionInference": "Usar inferencia entre regiones", + "awsInfo": "Autentícate proporcionando las claves mencionadas arriba o usando las credenciales predeterminadas de AWS, es decir, ~/.aws/credentials o variables de entorno. Estas credenciales solo se usan localmente para realizar solicitudes API desde esta extensión.", + "vscodeLanguageModelsInfo": "La API de Modelos de Lenguaje de VS Code te permite usar modelos proporcionados por otras extensiones de VS Code (incluyendo, pero no limitado a GitHub Copilot). La forma más fácil de comenzar es instalar la extensión Copilot desde el VS Marketplace y habilitar Claude 3.5 Sonnet.", + "experimentalFeature": "Nota: Esta es una integración muy experimental y puede no funcionar como se espera.", + "supportsImages": "Soporta imágenes", + "doesNotSupportImages": "No soporta imágenes", + "supportsComputerUse": "Soporta uso de computadora", + "doesNotSupportComputerUse": "No soporta uso de computadora", + "supportsPromptCache": "Soporta caché de prompts", + "doesNotSupportPromptCache": "No soporta caché de prompts", + "maxOutput": "Salida máxima", + "tokens": "Tokens", + "inputPrice": "Precio de entrada", + "millionTokens": "Millones de tokens", + "cacheWritesPrice": "Precio de escritura en caché", + "cacheReadsPrice": "Precio de lectura en caché", + "outputPrice": "Precio de salida", + "geminiInfo": "* Gratis hasta {{selectedModelId}} solicitudes por minuto. Después, la facturación depende del tamaño del prompt.", + "pricingDetails": "Para más información, consulta los detalles de precios.", + "languageModel": "Modelo de lenguaje" + }, + "welcomeView": { + "greeting": "¡Hola! Soy Cline, tu asistente de IA.", + "description": "Puedo realizar todo tipo de tareas gracias a los últimos avances en las habilidades de codificación agencial de Claude 3.5 Sonnet y el acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (por supuesto, con tu permiso). Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades.", + "getStarted": "Para comenzar, esta extensión necesita un proveedor de API para Claude 3.5 Sonnet.", + "letsGo": "¡Vamos allá!" + }, + "chatView": { + "typeMessage": "Escribir mensaje...", + "typeTask": "Escribir tarea...", + "whatCanIDoForYou": "¿Qué puedo hacer por ti?", + "thanksTo": "Gracias a las habilidades de codificación agencial de Claude 3.5 Sonnet, puedo manejar tareas complejas de desarrollo de software paso a paso. Con herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (después de que hayas dado permiso), puedo ayudarte de una manera que va más allá de la autocompletación de código o el soporte técnico. Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades." + }, + "chatTextArea": { + "plan": "Planificar", + "act": "Actuar" + }, + "chatRow": { + "error": "Error", + "mistakeLimitReached": "Límite de errores alcanzado", + "autoApprovalMaxReqReached": "Número máximo de aprobaciones automáticas alcanzado", + "command": { + "ask": "Cline quiere ejecutar este comando:", + "say": "Cline ha ejecutado este comando:" + }, + "useMcpServer": { + "ask": "Cline quiere usar este {type} en {serverName}:", + "say": "Cline ha usado este {type} en {serverName}:", + "tool": "Herramienta", + "resource": "Recurso" + }, + "completionResult": "Resultado de la finalización", + "apiReqCancelled": "Solicitud API cancelada", + "apiStreamingFailed": "Transmisión API fallida", + "apiRequest": "Solicitud API", + "apiRequestFailed": "Solicitud API fallida", + "apiRequestInProgress": "Solicitud API en progreso", + "followup": "Seguimiento", + "tool": { + "editedExistingFile": { + "ask": "Cline quiere editar este archivo:", + "say": "Cline está editando este archivo:" + }, + "createdNewFile": { + "ask": "Cline quiere crear este archivo:", + "say": "Cline ha creado este archivo:" + }, + "readExistingFile": { + "ask": "Cline quiere leer este archivo:", + "say": "Cline ha leído este archivo:" + } + }, + "apiReqStarted": "Solicitud API iniciada", + "userFeedback": "Comentarios del usuario", + "userFeedbackDiff": "Diferencia de comentarios del usuario", + "diffEditFailed": "Edición de diferencia fallida", + "shellIntegrationUnavailable": "Integración de shell no disponible", + "mcpServerResponse": "Respuesta del servidor MCP", + "planModeResponse": "Respuesta del modo plan", + "seeNewChanges": "Ver nuevos cambios", + "commandRequiresApproval": "El modelo ha determinado que este comando requiere aprobación explícita.", + "troubleshootingGuide": "Guía de solución de problemas", + "clineWantsToViewTopLevelFiles": "Cline quiere ver los archivos principales en este directorio:", + "clineViewedTopLevelFiles": "Cline ha visto los archivos principales en este directorio:", + "clineWantsToRecursivelyViewFiles": "Cline quiere ver todos los archivos en este directorio de forma recursiva:", + "clineRecursivelyViewedFiles": "Cline ha visto todos los archivos en este directorio de forma recursiva:", + "clineWantsToViewSourceCodeDefinitions": "Cline quiere ver los nombres de las definiciones de código fuente usadas en este directorio:", + "clineViewedSourceCodeDefinitions": "Cline ha visto los nombres de las definiciones de código fuente usadas en este directorio:", + "clineWantsToSearchDirectory": "Cline quiere buscar en este directorio por {{regex}}:", + "clineSearchedDirectory": "Cline ha buscado en este directorio por {{regex}}:", + "diffEditFailedMessage": "Esto generalmente ocurre cuando el modelo usa patrones de búsqueda que no encuentran nada en el archivo. Intentar de nuevo...", + "shellIntegrationUnavailableMessage": "Cline no puede mostrar la salida del comando. Por favor, actualiza VSCode (CMD/CTRL + Shift + P → \"Update\") y asegúrate de estar usando una shell compatible: zsh, bash, fish o PowerShell (CMD/CTRL + Shift + P → \"Terminal: Seleccionar perfil predeterminado\"). ¿Sigues teniendo problemas?", + "response": "Respuesta", + "stillHavingTrouble": "¿Sigues teniendo problemas?" + }, + "autoApproveMenu": { + "none": "Ninguno", + "autoApprove": "Aprobación automática:", + "autoApproveDescription": "La aprobación automática permite a Cline realizar las siguientes acciones sin pedir permiso. Por favor, úsalo con precaución y solo habilítalo si entiendes los riesgos.", + "autoApproveMaxRequestsDescription": "Cline realizará automáticamente tantas solicitudes API antes de que se requiera una aprobación para continuar con la tarea.", + "enableNotifications": "Habilitar notificaciones", + "enableNotificationsDescription": "Recibe notificaciones del sistema cuando Cline necesita aprobación para continuar o cuando una tarea se ha completado." + }, + "historyPreview": { + "recentTasks": "Tareas recientes", + "tokens": "Tokens", + "cache": "Caché", + "apiCost": "Costo de API", + "viewAllHistory": "Ver todo el historial" + }, + "historyView": { + "history": "Historial", + "done": "Hecho", + "fuzzySearchHistory": "Búsqueda difusa en el historial...", + "newest": "Más reciente", + "oldest": "Más antiguo", + "mostExpensive": "Más caro", + "mostTokens": "Más tokens", + "mostRelevant": "Más relevante", + "tokens": "Tokens:", + "cache": "Caché:", + "apiCost": "Costo de API:", + "export": "EXPORTAR" + } +} diff --git a/webview-ui/src/locales/ja/translation.json b/webview-ui/src/locales/ja/translation.json index 8ad9400e6a..f3211dba10 100644 --- a/webview-ui/src/locales/ja/translation.json +++ b/webview-ui/src/locales/ja/translation.json @@ -68,5 +68,108 @@ "geminiInfo": "* {{selectedModelId}} リクエスト毎分まで無料。その後、料金はプロンプトサイズに基づいて計算されます。", "pricingDetails": "詳細については料金情報をご確認ください。", "languageModel": "言語モデル" + }, + "welcomeView": { + "greeting": "こんにちは!私はあなたのAIアシスタント、クラインです。", + "description": "最新のClaude 3.5 Sonnetのエージェントコーディング機能と、ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろん、あなたの許可が必要です)を可能にするツールのおかげで、あらゆるタスクをこなすことができます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", + "getStarted": "始めるには、この拡張機能にClaude 3.5 SonnetのAPIプロバイダーが必要です。", + "letsGo": "さあ、始めましょう!" + }, + "chatView": { + "typeMessage": "メッセージを入力...", + "typeTask": "タスクを入力...", + "whatCanIDoForYou": "何をお手伝いしましょうか?", + "thanksTo": "Claude 3.5 Sonnetのエージェントコーディング機能のおかげで、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可をいただいた後)を可能にするツールを使用して、コードの補完や技術サポートを超えた支援を提供できます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。" + }, + "chatTextArea": { + "plan": "計画", + "act": "実行" + }, + "chatRow": { + "error": "エラー", + "mistakeLimitReached": "ミスの限界に達しました", + "autoApprovalMaxReqReached": "自動承認の最大リクエストに達しました", + "command": { + "ask": "クラインがこのコマンドを実行したいと考えています:", + "say": "クラインがこのコマンドを実行しました:" + }, + "useMcpServer": { + "ask": "クラインがこの{type}を{serverName}で使用したいと考えています:", + "say": "クラインがこの{type}を{serverName}で使用しました:", + "tool": "ツール", + "resource": "リソース" + }, + "completionResult": "完了結果", + "apiReqCancelled": "APIリクエストがキャンセルされました", + "apiStreamingFailed": "APIストリーミングに失敗しました", + "apiRequest": "APIリクエスト", + "apiRequestFailed": "APIリクエストに失敗しました", + "apiRequestInProgress": "APIリクエスト進行中", + "followup": "フォローアップ", + "tool": { + "editedExistingFile": { + "ask": "クラインがこのファイルを編集したいと考えています:", + "say": "クラインがこのファイルを編集しています:" + }, + "createdNewFile": { + "ask": "クラインがこのファイルを作成したいと考えています:", + "say": "クラインがこのファイルを作成しました:" + }, + "readExistingFile": { + "ask": "クラインがこのファイルを読みたいと考えています:", + "say": "クラインがこのファイルを読みました:" + } + }, + "apiReqStarted": "APIリクエスト開始", + "userFeedback": "ユーザーフィードバック", + "userFeedbackDiff": "ユーザーフィードバック差分", + "diffEditFailed": "差分編集に失敗しました", + "shellIntegrationUnavailable": "シェル統合が利用できません", + "mcpServerResponse": "MCPサーバー応答", + "planModeResponse": "計画モード応答", + "seeNewChanges": "新しい変更を見る", + "commandRequiresApproval": "このコマンドは明示的な承認が必要です。", + "troubleshootingGuide": "トラブルシューティングガイド", + "clineWantsToViewTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示したいと考えています:", + "clineViewedTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示しました:", + "clineWantsToRecursivelyViewFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示したいと考えています:", + "clineRecursivelyViewedFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示しました:", + "clineWantsToViewSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示したいと考えています:", + "clineViewedSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示しました:", + "clineWantsToSearchDirectory": "クラインがこのディレクトリで{{regex}}を検索したいと考えています:", + "clineSearchedDirectory": "クラインがこのディレクトリで{{regex}}を検索しました:", + "diffEditFailedMessage": "これは通常、モデルがファイル内で一致しない検索パターンを使用した場合に発生します。再試行中...", + "shellIntegrationUnavailableMessage": "クラインはコマンドの出力を表示できません。VSCodeを更新し(CMD/CTRL + Shift + P → \"Update\")、サポートされているシェルを使用していることを確認してください:zsh、bash、fish、またはPowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。まだ問題がありますか?", + "response": "応答", + "stillHavingTrouble": "まだ問題がありますか?" + }, + "autoApproveMenu": { + "none": "なし", + "autoApprove": "自動承認:", + "autoApproveDescription": "自動承認を有効にすると、クラインが以下のアクションを許可を求めずに実行できるようになります。リスクを理解した上で、慎重に使用してください。", + "autoApproveMaxRequestsDescription": "クラインは、このタスクを進めるために承認を求める前に、この数のAPIリクエストを自動的に行います。", + "enableNotifications": "通知を有効にする", + "enableNotificationsDescription": "クラインがタスクを進めるために承認を求めるとき、またはタスクが完了したときにシステム通知を受け取ります。" + }, + "historyPreview": { + "recentTasks": "最近のタスク", + "tokens": "トークン", + "cache": "キャッシュ", + "apiCost": "APIコスト", + "viewAllHistory": "すべての履歴を見る" + }, + "historyView": { + "history": "履歴", + "done": "完了", + "fuzzySearchHistory": "履歴をあいまい検索...", + "newest": "最新", + "oldest": "最古", + "mostExpensive": "最も高価", + "mostTokens": "最も多いトークン", + "mostRelevant": "最も関連性が高い", + "tokens": "トークン:", + "cache": "キャッシュ:", + "apiCost": "APIコスト:", + "export": "エクスポート" } } diff --git a/webview-ui/src/locales/zh-cn/translation.json b/webview-ui/src/locales/zh-cn/translation.json index 7466011cd2..ddbacceef8 100644 --- a/webview-ui/src/locales/zh-cn/translation.json +++ b/webview-ui/src/locales/zh-cn/translation.json @@ -63,5 +63,108 @@ "geminiInfo": "* 每分钟最多 {{selectedModelId}} 次请求免费。之后,费用取决于提示大小。", "pricingDetails": "有关更多信息,请参阅定价详情。", "languageModel": "语言模型" + }, + "welcomeView": { + "greeting": "你好!我是 Cline,你的 AI 助手。", + "description": "感谢 Claude 3.5 Sonnet 的代理编码能力 和访问工具,我可以执行各种任务,这些工具让我可以创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令(当然,需要你的许可)。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。", + "getStarted": "要开始使用,此扩展需要 Claude 3.5 Sonnet 的 API 提供商。", + "letsGo": "开始吧!" + }, + "chatView": { + "typeMessage": "输入消息...", + "typeTask": "输入任务...", + "whatCanIDoForYou": "我能为你做什么?", + "thanksTo": "感谢 Claude 3.5 Sonnet 的代理编码能力, 我可以一步步处理复杂的软件开发任务。通过允许我创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令的工具(在你授予权限后),我可以以超越代码完成或技术支持的方式帮助你。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。" + }, + "chatTextArea": { + "plan": "计划", + "act": "行动" + }, + "chatRow": { + "error": "错误", + "mistakeLimitReached": "错误次数达到上限", + "autoApprovalMaxReqReached": "自动批准请求次数达到上限", + "command": { + "ask": "Cline 想执行此命令:", + "say": "Cline 执行了此命令:" + }, + "useMcpServer": { + "ask": "Cline 想在 {serverName} 上使用此 {type}:", + "say": "Cline 在 {serverName} 上使用了此 {type}:", + "tool": "工具", + "resource": "资源" + }, + "completionResult": "完成结果", + "apiReqCancelled": "API 请求已取消", + "apiStreamingFailed": "API 流式传输失败", + "apiRequest": "API 请求", + "apiRequestFailed": "API 请求失败", + "apiRequestInProgress": "API 请求进行中", + "followup": "跟进", + "tool": { + "editedExistingFile": { + "ask": "Cline 想编辑此文件:", + "say": "Cline 正在编辑此文件:" + }, + "createdNewFile": { + "ask": "Cline 想创建此文件:", + "say": "Cline 创建了此文件:" + }, + "readExistingFile": { + "ask": "Cline 想读取此文件:", + "say": "Cline 读取了此文件:" + } + }, + "apiReqStarted": "API 请求已启动", + "userFeedback": "用户反馈", + "userFeedbackDiff": "用户反馈差异", + "diffEditFailed": "差异编辑失败", + "shellIntegrationUnavailable": "Shell 集成不可用", + "mcpServerResponse": "MCP 服务器响应", + "planModeResponse": "计划模式响应", + "seeNewChanges": "查看新更改", + "commandRequiresApproval": "模型已确定此命令需要明确批准。", + "troubleshootingGuide": "故障排除指南", + "clineWantsToViewTopLevelFiles": "Cline 想查看此目录中的顶级文件:", + "clineViewedTopLevelFiles": "Cline 查看了此目录中的顶级文件:", + "clineWantsToRecursivelyViewFiles": "Cline 想递归查看此目录中的所有文件:", + "clineRecursivelyViewedFiles": "Cline 递归查看了此目录中的所有文件:", + "clineWantsToViewSourceCodeDefinitions": "Cline 想查看此目录中使用的源代码定义名称:", + "clineViewedSourceCodeDefinitions": "Cline 查看了此目录中使用的源代码定义名称:", + "clineWantsToSearchDirectory": "Cline 想在此目录中搜索 {{regex}}:", + "clineSearchedDirectory": "Cline 在此目录中搜索了 {{regex}}:", + "diffEditFailedMessage": "这通常发生在模型使用的搜索模式与文件中的任何内容不匹配时。重试中...", + "shellIntegrationUnavailableMessage": "Cline 将无法查看命令的输出。请更新 VSCode(CMD/CTRL + Shift + P → \"Update\")并确保你使用的是受支持的 shell:zsh、bash、fish 或 PowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有问题?", + "response": "响应", + "stillHavingTrouble": "仍有问题?" + }, + "autoApproveMenu": { + "none": "无", + "autoApprove": "自动批准:", + "autoApproveDescription": "自动批准允许 Cline 在不请求许可的情况下执行以下操作。请谨慎使用,并仅在了解风险的情况下启用。", + "autoApproveMaxRequestsDescription": "Cline 将自动发出此数量的 API 请求,然后再请求批准以继续任务。", + "enableNotifications": "启用通知", + "enableNotificationsDescription": "当 Cline 需要批准以继续或任务完成时接收系统通知。" + }, + "historyPreview": { + "recentTasks": "最近任务", + "tokens": "令牌", + "cache": "缓存", + "apiCost": "API 成本", + "viewAllHistory": "查看所有历史记录" + }, + "historyView": { + "history": "历史", + "done": "完成", + "fuzzySearchHistory": "模糊搜索历史...", + "newest": "最新", + "oldest": "最旧", + "mostExpensive": "最昂贵", + "mostTokens": "最多令牌", + "mostRelevant": "最相关", + "tokens": "令牌:", + "cache": "缓存:", + "apiCost": "API 成本:", + "export": "导出" } } diff --git a/webview-ui/src/locales/zh-tw/translation.json b/webview-ui/src/locales/zh-tw/translation.json index 7b3fe5a89c..a79716116d 100644 --- a/webview-ui/src/locales/zh-tw/translation.json +++ b/webview-ui/src/locales/zh-tw/translation.json @@ -63,5 +63,108 @@ "geminiInfo": "* 每分鐘最多免費 {{selectedModelId}} 次請求。之後,計費取決於提示大小。", "pricingDetails": "更多信息,請參見定價詳情。", "languageModel": "語言模型" + }, + "welcomeView": { + "greeting": "您好!我是 Cline,您的 AI 助手。", + "description": "得益於 Claude 3.5 Sonnet 的代理編碼能力 和訪問各種工具,我可以執行各種任務,這些工具讓我能夠創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(當然是在您的許可下)。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。", + "getStarted": "要開始使用,這個擴展需要 Claude 3.5 Sonnet 的 API 提供者。", + "letsGo": "讓我們開始吧!" + }, + "chatView": { + "typeMessage": "輸入消息...", + "typeTask": "輸入任務...", + "whatCanIDoForYou": "我能為您做什麼?", + "thanksTo": "感謝 Claude 3.5 Sonnet 的代理編碼能力, 我可以逐步處理複雜的軟件開發任務。通過這些工具,我可以創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(在您授權後),我可以幫助您完成超越代碼補全或技術支持的任務。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。" + }, + "chatTextArea": { + "plan": "計劃", + "act": "行動" + }, + "chatRow": { + "error": "錯誤", + "mistakeLimitReached": "錯誤次數達到上限", + "autoApprovalMaxReqReached": "自動批准請求次數達到上限", + "command": { + "ask": "Cline 想要執行此命令:", + "say": "Cline 執行了此命令:" + }, + "useMcpServer": { + "ask": "Cline 想要在 {serverName} 上使用此 {type}:", + "say": "Cline 在 {serverName} 上使用了此 {type}:", + "tool": "工具", + "resource": "資源" + }, + "completionResult": "完成結果", + "apiReqCancelled": "API 請求已取消", + "apiStreamingFailed": "API 流式傳輸失敗", + "apiRequest": "API 請求", + "apiRequestFailed": "API 請求失敗", + "apiRequestInProgress": "API 請求進行中", + "followup": "後續", + "tool": { + "editedExistingFile": { + "ask": "Cline 想要編輯此文件:", + "say": "Cline 正在編輯此文件:" + }, + "createdNewFile": { + "ask": "Cline 想要創建此文件:", + "say": "Cline 創建了此文件:" + }, + "readExistingFile": { + "ask": "Cline 想要閱讀此文件:", + "say": "Cline 閱讀了此文件:" + } + }, + "apiReqStarted": "API 請求已開始", + "userFeedback": "用戶反饋", + "userFeedbackDiff": "用戶反饋差異", + "diffEditFailed": "差異編輯失敗", + "shellIntegrationUnavailable": "Shell 集成不可用", + "mcpServerResponse": "MCP 服務器響應", + "planModeResponse": "計劃模式響應", + "seeNewChanges": "查看新變更", + "commandRequiresApproval": "模型已確定此命令需要明確批准。", + "troubleshootingGuide": "故障排除指南", + "clineWantsToViewTopLevelFiles": "Cline 想要查看此目錄中的頂層文件:", + "clineViewedTopLevelFiles": "Cline 查看了此目錄中的頂層文件:", + "clineWantsToRecursivelyViewFiles": "Cline 想要遞歸查看此目錄中的所有文件:", + "clineRecursivelyViewedFiles": "Cline 遞歸查看了此目錄中的所有文件:", + "clineWantsToViewSourceCodeDefinitions": "Cline 想要查看此目錄中使用的源代碼定義名稱:", + "clineViewedSourceCodeDefinitions": "Cline 查看了此目錄中使用的源代碼定義名稱:", + "clineWantsToSearchDirectory": "Cline 想要在此目錄中搜索 {{regex}}:", + "clineSearchedDirectory": "Cline 在此目錄中搜索了 {{regex}}:", + "diffEditFailedMessage": "這通常發生在模型使用的搜索模式與文件中的任何內容不匹配時。重試中...", + "shellIntegrationUnavailableMessage": "Cline 將無法查看命令的輸出。請更新 VSCode(CMD/CTRL + Shift + P → \"Update\")並確保您使用的是受支持的 shell:zsh、bash、fish 或 PowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有問題?", + "response": "響應", + "stillHavingTrouble": "仍有問題?" + }, + "autoApproveMenu": { + "none": "無", + "autoApprove": "自動批准:", + "autoApproveDescription": "自動批准允許 Cline 執行以下操作而無需請求許可。請謹慎使用,僅在您了解風險的情況下啟用。", + "autoApproveMaxRequestsDescription": "Cline 將自動發出這麼多 API 請求,然後再請求批准以繼續任務。", + "enableNotifications": "啟用通知", + "enableNotificationsDescription": "當 Cline 需要批准以繼續或任務完成時接收系統通知。" + }, + "historyPreview": { + "recentTasks": "最近任務", + "tokens": "標記", + "cache": "緩存", + "apiCost": "API 成本", + "viewAllHistory": "查看所有歷史記錄" + }, + "historyView": { + "history": "歷史", + "done": "完成", + "fuzzySearchHistory": "模糊搜索歷史...", + "newest": "最新", + "oldest": "最舊", + "mostExpensive": "最昂貴", + "mostTokens": "最多標記", + "mostRelevant": "最相關", + "tokens": "標記:", + "cache": "緩存:", + "apiCost": "API 成本:", + "export": "導出" } } From 30d6b0e2232005f5d6e2cbf5086a4257ed2b7a0f Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 13:24:59 -1000 Subject: [PATCH 12/74] translations fix --- webview-ui/src/components/chat/ChatRow.tsx | 23 ++++++++++++++++++- webview-ui/src/locales/en/translation.json | 20 ++++++++-------- webview-ui/src/locales/ja/translation.json | 2 +- webview-ui/src/locales/zh-cn/translation.json | 2 +- webview-ui/src/locales/zh-tw/translation.json | 2 +- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index e5d912d6ad..979bf3b274 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -3,6 +3,7 @@ import deepEqual from "fast-deep-equal" import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from "react" import { useEvent, useSize } from "react-use" import { useTranslation } from "react-i18next" +import { Trans } from "react-i18next" import styled from "styled-components" import { ClineApiReqInfo, @@ -786,7 +787,21 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi <>

- {t("troubleshootingGuide")} + + PowerShell + + ), + }} + /> )}

@@ -1032,6 +1047,12 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi {t("response")} + ) diff --git a/webview-ui/src/locales/en/translation.json b/webview-ui/src/locales/en/translation.json index 0d3e428fb8..0578d51c48 100644 --- a/webview-ui/src/locales/en/translation.json +++ b/webview-ui/src/locales/en/translation.json @@ -87,8 +87,8 @@ }, "chatRow": { "error": "Error", - "mistakeLimitReached": "Mistake limit reached", - "autoApprovalMaxReqReached": "Auto approval max request reached", + "mistakeLimitReached": "Cline is having trouble...", + "autoApprovalMaxReqReached": "Maximum Requests Reached", "command": { "ask": "Cline wants to execute this command:", "say": "Cline executed this command:" @@ -99,13 +99,13 @@ "tool": "tool", "resource": "resource" }, - "completionResult": "Completion result", - "apiReqCancelled": "API request cancelled", - "apiStreamingFailed": "API streaming failed", - "apiRequest": "API request", - "apiRequestFailed": "API request failed", - "apiRequestInProgress": "API request in progress", - "followup": "Follow-up", + "completionResult": "Task Completed", + "apiReqCancelled": "API Request Cancelled", + "apiStreamingFailed": "API Streaming Failed", + "apiRequest": "API Request", + "apiRequestFailed": "API Request Failed", + "apiRequestInProgress": "API Request...", + "followup": "Cline has a question:", "tool": { "editedExistingFile": { "ask": "Cline wants to edit this file:", @@ -129,7 +129,7 @@ "planModeResponse": "Plan Mode Response", "seeNewChanges": "See new changes", "commandRequiresApproval": "The model has determined this command requires explicit approval.", - "troubleshootingGuide": "troubleshooting guide", + "troubleshootingGuide": "It seems like you're having Windows PowerShell issues, please see this troubleshooting guide", "clineWantsToViewTopLevelFiles": "Cline wants to view the top level files in this directory:", "clineViewedTopLevelFiles": "Cline viewed the top level files in this directory:", "clineWantsToRecursivelyViewFiles": "Cline wants to recursively view all files in this directory:", diff --git a/webview-ui/src/locales/ja/translation.json b/webview-ui/src/locales/ja/translation.json index f3211dba10..353979f572 100644 --- a/webview-ui/src/locales/ja/translation.json +++ b/webview-ui/src/locales/ja/translation.json @@ -129,7 +129,7 @@ "planModeResponse": "計画モード応答", "seeNewChanges": "新しい変更を見る", "commandRequiresApproval": "このコマンドは明示的な承認が必要です。", - "troubleshootingGuide": "トラブルシューティングガイド", + "troubleshootingGuide": "Windows PowerShellの問題が発生しているようです。このトラブルシューティングガイドをご覧ください。", "clineWantsToViewTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示したいと考えています:", "clineViewedTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示しました:", "clineWantsToRecursivelyViewFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示したいと考えています:", diff --git a/webview-ui/src/locales/zh-cn/translation.json b/webview-ui/src/locales/zh-cn/translation.json index ddbacceef8..5faed68afa 100644 --- a/webview-ui/src/locales/zh-cn/translation.json +++ b/webview-ui/src/locales/zh-cn/translation.json @@ -124,7 +124,7 @@ "planModeResponse": "计划模式响应", "seeNewChanges": "查看新更改", "commandRequiresApproval": "模型已确定此命令需要明确批准。", - "troubleshootingGuide": "故障排除指南", + "troubleshootingGuide": "看起来你遇到了 Windows PowerShell 问题,请参阅此 故障排除指南", "clineWantsToViewTopLevelFiles": "Cline 想查看此目录中的顶级文件:", "clineViewedTopLevelFiles": "Cline 查看了此目录中的顶级文件:", "clineWantsToRecursivelyViewFiles": "Cline 想递归查看此目录中的所有文件:", diff --git a/webview-ui/src/locales/zh-tw/translation.json b/webview-ui/src/locales/zh-tw/translation.json index a79716116d..1245b4d343 100644 --- a/webview-ui/src/locales/zh-tw/translation.json +++ b/webview-ui/src/locales/zh-tw/translation.json @@ -124,7 +124,7 @@ "planModeResponse": "計劃模式響應", "seeNewChanges": "查看新變更", "commandRequiresApproval": "模型已確定此命令需要明確批准。", - "troubleshootingGuide": "故障排除指南", + "troubleshootingGuide": "看起來您遇到了 Windows PowerShell 問題,請參閱此 故障排除指南", "clineWantsToViewTopLevelFiles": "Cline 想要查看此目錄中的頂層文件:", "clineViewedTopLevelFiles": "Cline 查看了此目錄中的頂層文件:", "clineWantsToRecursivelyViewFiles": "Cline 想要遞歸查看此目錄中的所有文件:", From 98fd2c010c1a85936e4a7faf28b9c419061fe3f0 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 13:27:23 -1000 Subject: [PATCH 13/74] de tweak --- webview-ui/src/locales/de/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/locales/de/translation.json b/webview-ui/src/locales/de/translation.json index 10b1825b36..921469994a 100644 --- a/webview-ui/src/locales/de/translation.json +++ b/webview-ui/src/locales/de/translation.json @@ -129,7 +129,7 @@ "planModeResponse": "Planmodus-Antwort", "seeNewChanges": "Neue Änderungen anzeigen", "commandRequiresApproval": "Das Modell hat bestimmt, dass dieser Befehl eine ausdrückliche Genehmigung erfordert.", - "troubleshootingGuide": "Fehlerbehebungshandbuch", + "troubleshootingGuide": "Es scheint, dass Sie Probleme mit Windows PowerShell haben. Bitte sehen Sie sich diesen Fehlerbehebungsleitfaden an.", "clineWantsToViewTopLevelFiles": "Cline möchte die obersten Dateien in diesem Verzeichnis anzeigen:", "clineViewedTopLevelFiles": "Cline hat die obersten Dateien in diesem Verzeichnis angezeigt:", "clineWantsToRecursivelyViewFiles": "Cline möchte alle Dateien in diesem Verzeichnis rekursiv anzeigen:", From 32069f2882ba69249a758104c3c88aa9bda127da Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 13:43:19 -1000 Subject: [PATCH 14/74] Additional i18n-l10n for Welcome/Home/Chat/History + Spanish language translations (#1494) * more i18n * translations fix * de tweak --- .../src/components/chat/Announcement.tsx | 4 +- .../src/components/chat/AutoApproveMenu.tsx | 15 +- webview-ui/src/components/chat/ChatRow.tsx | 173 +++++++++-------- .../src/components/chat/ChatTextArea.tsx | 7 +- webview-ui/src/components/chat/ChatView.tsx | 31 ++-- .../src/components/history/HistoryPreview.tsx | 15 +- .../src/components/history/HistoryView.tsx | 49 ++--- .../src/components/settings/ApiOptions.tsx | 4 +- .../components/settings/LanguageOptions.tsx | 1 + .../src/components/welcome/WelcomeView.tsx | 30 +-- webview-ui/src/i18n.ts | 2 + webview-ui/src/locales/de/translation.json | 103 +++++++++++ webview-ui/src/locales/en/translation.json | 103 +++++++++++ webview-ui/src/locales/es/translation.json | 175 ++++++++++++++++++ webview-ui/src/locales/ja/translation.json | 103 +++++++++++ webview-ui/src/locales/zh-cn/translation.json | 103 +++++++++++ webview-ui/src/locales/zh-tw/translation.json | 103 +++++++++++ 17 files changed, 872 insertions(+), 149 deletions(-) create mode 100644 webview-ui/src/locales/es/translation.json diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index 77e8d1774d..96125cc3bf 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -114,8 +114,8 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => { , - RedditLink: , + DiscordLink: , + RedditLink: , }} />

diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index aa3a8a44a7..006e37df51 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -5,6 +5,7 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { AutoApprovalSettings } from "../../../../src/shared/AutoApprovalSettings" import { vscode } from "../../utils/vscode" import { getAsVar, VSC_FOREGROUND, VSC_TITLEBAR_INACTIVE_FOREGROUND, VSC_DESCRIPTION_FOREGROUND } from "../../utils/vscStyles" +import { useTranslation } from "react-i18next" interface AutoApproveMenuProps { style?: React.CSSProperties @@ -50,6 +51,7 @@ const ACTION_METADATA: { ] const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { + const { t } = useTranslation("translation", { keyPrefix: "autoApproveMenu" }) const { autoApprovalSettings } = useExtensionState() const [isExpanded, setIsExpanded] = useState(false) const [isHoveringCollapsibleSection, setIsHoveringCollapsibleSection] = useState(false) @@ -190,7 +192,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { color: getAsVar(VSC_FOREGROUND), whiteSpace: "nowrap", }}> - Auto-approve: + {t("autoApprove")} { overflow: "hidden", textOverflow: "ellipsis", }}> - {enabledActions.length === 0 ? "None" : enabledActionsList} + {enabledActions.length === 0 ? t("none") : enabledActionsList} { color: getAsVar(VSC_DESCRIPTION_FOREGROUND), fontSize: "12px", }}> - Auto-approve allows Cline to perform the following actions without asking for permission. Please use with - caution and only enable if you understand the risks. + {t("autoApproveDescription")} {ACTION_METADATA.map((action) => (
@@ -285,7 +286,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { fontSize: "12px", marginBottom: "10px", }}> - Cline will automatically make this many API requests before asking for approval to proceed with the task. + {t("autoApproveMaxRequestsDescription")}
{ const checked = (e.target as HTMLInputElement).checked updateNotifications(checked) }}> - Enable Notifications + {t("enableNotifications")}
{ color: getAsVar(VSC_DESCRIPTION_FOREGROUND), fontSize: "12px", }}> - Receive system notifications when Cline requires approval to proceed or when a task is completed. + {t("enableNotificationsDescription")}
diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index fed1bb0cf4..979bf3b274 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -2,6 +2,8 @@ import { VSCodeBadge, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/reac import deepEqual from "fast-deep-equal" import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from "react" import { useEvent, useSize } from "react-use" +import { useTranslation } from "react-i18next" +import { Trans } from "react-i18next" import styled from "styled-components" import { ClineApiReqInfo, @@ -99,6 +101,7 @@ const ChatRow = memo( export default ChatRow export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessage, isLast }: ChatRowContentProps) => { + const { t } = useTranslation("translation", { keyPrefix: "chatRow" }) const { mcpServers } = useExtensionState() const [seeNewChangesDisabled, setSeeNewChangesDisabled] = useState(false) @@ -151,7 +154,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>
, - Error, + {t("error")}, ] case "mistake_limit_reached": return [ @@ -161,7 +164,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>, - Cline is having trouble..., + {t("mistakeLimitReached")}, ] case "auto_approval_max_req_reached": return [ @@ -171,7 +174,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>, - Maximum Requests Reached, + {t("autoApprovalMaxReqReached")}, ] case "command": return [ @@ -186,7 +189,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi }}> ), - {message.type === "ask" ? "Cline wants to execute this command:" : "Cline executed this command:"} + {message.type === "ask" ? t("command.ask") : t("command.say")} , ] case "use_mcp_server": @@ -205,13 +208,23 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi {message.type === "ask" ? ( <> - Cline wants to {mcpServerUse.type === "use_mcp_tool" ? "use a tool" : "access a resource"} on the{" "} - {mcpServerUse.serverName} MCP server: + {t("useMcpServer.ask", { + type: + mcpServerUse.type === "use_mcp_tool" + ? t("useMcpServer.tool") + : t("useMcpServer.resource"), + serverName: mcpServerUse.serverName, + })} ) : ( <> - Cline {mcpServerUse.type === "use_mcp_tool" ? "used a tool" : "accessed a resource"} on the{" "} - {mcpServerUse.serverName} MCP server: + {t("useMcpServer.say", { + type: + mcpServerUse.type === "use_mcp_tool" + ? t("useMcpServer.tool") + : t("useMcpServer.resource"), + serverName: mcpServerUse.serverName, + })} )} , @@ -224,7 +237,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: successColor, marginBottom: "-1.5px", }}>, - Task Completed, + {t("completionResult")}, ] case "api_req_started": const getIconSpan = (iconName: string, color: string) => ( @@ -266,7 +279,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: normalColor, fontWeight: "bold", }}> - API Request Cancelled + {t("apiReqCancelled")} ) : ( - API Streaming Failed + {t("apiStreamingFailed")} ) ) : cost != null ? ( - API Request + {t("apiRequest")} ) : apiRequestFailedMessage ? ( - API Request Failed + {t("apiRequestFailed")} ) : ( - API Request... + {t("apiRequestInProgress")} ), ] case "followup": @@ -293,7 +306,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: normalColor, marginBottom: "-1.5px", }}>, - Cline has a question:, + {t("followup")}, ] default: return [null, null] @@ -307,6 +320,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi isMcpServerResponding, message.text, message.type, + t, ]) const headerStyle: React.CSSProperties = { @@ -347,7 +361,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
{toolIcon("edit")} - {message.type === "ask" ? "Cline wants to edit this file:" : "Cline is editing this file:"} + {message.type === "ask" ? t("tool.editedExistingFile.ask") : t("tool.editedExistingFile.say")}
{toolIcon("new-file")} - {message.type === "ask" ? "Cline wants to create a new file:" : "Cline is creating a new file:"} + {message.type === "ask" ? t("tool.createdNewFile.ask") : t("tool.createdNewFile.say")} {toolIcon("file-code")} - {message.type === "ask" ? "Cline wants to read this file:" : "Cline read this file:"} + {message.type === "ask" ? t("tool.readExistingFile.ask") : t("tool.readExistingFile.say")} {/*

- It seems like you're having Windows PowerShell issues, please see this{" "} - - troubleshooting guide - - . + + PowerShell + + ), + }} + /> )}

- {/* {apiProvider === "" && ( -
+ - - - Uh-oh, this could be a problem on end. We've been alerted and - will resolve this ASAP. You can also{" "} - - contact us - - . - -
- )} */} + marginRight: 6, + fontSize: 16, + color: "var(--vscode-errorForeground)", + }}> + + Uh-oh, this could be a problem on end. We've been alerted and + will resolve this ASAP. You can also{" "} + + contact us + + . + + + )} */} )} @@ -923,13 +941,10 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontWeight: 500, color: "#FFA500", }}> - Diff Edit Failed + {t("diffEditFailed")} -
- This usually happens when the model uses search patterns that don't match anything in the - file. Retrying... -
+
{t("diffEditFailedMessage")}
) @@ -969,7 +984,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi cursor: seeNewChangesDisabled ? "wait" : "pointer", }}> - See new changes + {t("seeNewChanges")} )} @@ -1005,23 +1020,10 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontWeight: 500, color: "#FFA500", }}> - Shell Integration Unavailable + {t("shellIntegrationUnavailable")} -
- Cline won't be able to view the command's output. Please update VSCode ( - CMD/CTRL + Shift + P → "Update") and make sure you're using a supported shell: - zsh, bash, fish, or PowerShell (CMD/CTRL + Shift + P → "Terminal: Select Default - Profile").{" "} - - Still having trouble? - -
+
{t("shellIntegrationUnavailableMessage")}
) @@ -1036,7 +1038,14 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontSize: "12px", textTransform: "uppercase", }}> - Response + + {t("response")} + - See new changes + {t("seeNewChanges")} )} diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 0f11b0a677..a7ff649928 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -4,7 +4,7 @@ import DynamicTextArea from "react-textarea-autosize" import { useClickAway, useWindowSize } from "react-use" import styled from "styled-components" import { mentionRegex, mentionRegexGlobal } from "../../../../src/shared/context-mentions" -import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" +import { useTranslation } from "react-i18next" import { useExtensionState } from "../../context/ExtensionStateContext" import { ContextMenuOptionType, @@ -211,6 +211,7 @@ const ChatTextArea = forwardRef( }, ref, ) => { + const { t } = useTranslation("translation", { keyPrefix: "chatTextArea" }) const { filePaths, chatSettings, apiConfiguration, openRouterModels } = useExtensionState() const [isTextAreaFocused, setIsTextAreaFocused] = useState(false) const [thumbnailsHeight, setThumbnailsHeight] = useState(0) @@ -1063,8 +1064,8 @@ const ChatTextArea = forwardRef( - Plan - Act + {t("plan")} + {t("act")} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index aec4e544a9..1fe0211c52 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -3,6 +3,8 @@ import debounce from "debounce" import { useCallback, useEffect, useMemo, useRef, useState } from "react" import { useDeepCompareEffect, useEvent, useMount } from "react-use" import { Virtuoso, type VirtuosoHandle } from "react-virtuoso" +import { useTranslation } from "react-i18next" +import { Trans } from "react-i18next" import styled from "styled-components" import { ClineAsk, @@ -36,6 +38,7 @@ interface ChatViewProps { export const MAX_IMAGES_PER_MESSAGE = 20 // Anthropic limits to 20 images const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryView }: ChatViewProps) => { + const { t } = useTranslation("translation", { keyPrefix: "chatView" }) const { version, clineMessages: messages, taskHistory, apiConfiguration } = useExtensionState() //const task = messages.length > 0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined @@ -666,9 +669,8 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie useEvent("wheel", handleWheel, window, { passive: true }) // passive improves scrolling performance const placeholderText = useMemo(() => { - const text = task ? "Type a message..." : "Type your task here..." - return text - }, [task]) + return task ? t("typeMessage") : t("typeTask") + }, [task, t]) const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage | ClineMessage[]) => { @@ -743,18 +745,19 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie }}> {showAnnouncement && }
-

What can I do for you?

+

{t("whatCanIDoForYou")}

- Thanks to{" "} - - Claude 3.5 Sonnet's agentic coding capabilities, - {" "} - I can handle complex software development tasks step-by-step. With tools that let me create & edit - files, explore complex projects, use the browser, and execute terminal commands (after you grant - permission), I can assist you in ways that go beyond code completion or tech support. I can even use - MCP to create new tools and extend my own capabilities. + + ), + }} + />

{taskHistory.length > 0 && } diff --git a/webview-ui/src/components/history/HistoryPreview.tsx b/webview-ui/src/components/history/HistoryPreview.tsx index 06a2e9bc62..7725b69404 100644 --- a/webview-ui/src/components/history/HistoryPreview.tsx +++ b/webview-ui/src/components/history/HistoryPreview.tsx @@ -3,12 +3,14 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { vscode } from "../../utils/vscode" import { memo } from "react" import { formatLargeNumber } from "../../utils/format" +import { useTranslation } from "react-i18next" type HistoryPreviewProps = { showHistoryView: () => void } const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { + const { t } = useTranslation("translation", { keyPrefix: "historyPreview" }) const { taskHistory } = useExtensionState() const handleHistorySelect = (id: string) => { vscode.postMessage({ type: "showTaskWithId", text: id }) @@ -69,7 +71,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { fontSize: "0.85em", textTransform: "uppercase", }}> - Recent Tasks + {t("recentTasks")} @@ -112,13 +114,14 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { color: "var(--vscode-descriptionForeground)", }}> - Tokens: ↑{formatLargeNumber(item.tokensIn || 0)} ↓{formatLargeNumber(item.tokensOut || 0)} + {t("tokens")}: ↑{formatLargeNumber(item.tokensIn || 0)} ↓ + {formatLargeNumber(item.tokensOut || 0)} {!!item.cacheWrites && ( <> {" • "} - Cache: +{formatLargeNumber(item.cacheWrites || 0)} →{" "} + {t("cache")}: +{formatLargeNumber(item.cacheWrites || 0)} →{" "} {formatLargeNumber(item.cacheReads || 0)} @@ -126,7 +129,9 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { {!!item.totalCost && ( <> {" • "} - API Cost: ${item.totalCost?.toFixed(4)} + + {t("apiCost")}: ${item.totalCost?.toFixed(4)} + )} @@ -150,7 +155,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { fontSize: "var(--vscode-font-size)", color: "var(--vscode-descriptionForeground)", }}> - View all history + {t("viewAllHistory")} diff --git a/webview-ui/src/components/history/HistoryView.tsx b/webview-ui/src/components/history/HistoryView.tsx index d50b4b39db..fb5d32f956 100644 --- a/webview-ui/src/components/history/HistoryView.tsx +++ b/webview-ui/src/components/history/HistoryView.tsx @@ -6,6 +6,7 @@ import { memo, useMemo, useState, useEffect } from "react" import Fuse, { FuseResult } from "fuse.js" import { formatLargeNumber } from "../../utils/format" import { formatSize } from "../../utils/size" +import { useTranslation } from "react-i18next" type HistoryViewProps = { onDone: () => void @@ -14,6 +15,7 @@ type HistoryViewProps = { type SortOption = "newest" | "oldest" | "mostExpensive" | "mostTokens" | "mostRelevant" const HistoryView = ({ onDone }: HistoryViewProps) => { + const { t } = useTranslation("translation", { keyPrefix: "historyView" }) const { taskHistory } = useExtensionState() const [searchQuery, setSearchQuery] = useState("") const [sortOption, setSortOption] = useState("newest") @@ -142,9 +144,9 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { color: "var(--vscode-foreground)", margin: 0, }}> - History + {t("history")} - Done + {t("done")}
{ }}> { const newValue = (e.target as HTMLInputElement)?.value @@ -192,12 +194,12 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { style={{ display: "flex", flexWrap: "wrap" }} value={sortOption} onChange={(e) => setSortOption((e.target as HTMLInputElement).value as SortOption)}> - Newest - Oldest - Most Expensive - Most Tokens + {t("newest")} + {t("oldest")} + {t("mostExpensive")} + {t("mostTokens")} - Most Relevant + {t("mostRelevant")}
@@ -319,7 +321,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - Tokens: + {t("tokens")} { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - Cache: + {t("cache")} { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - API Cost: + {t("apiCost")} { ) } -const ExportButton = ({ itemId }: { itemId: string }) => ( - { - e.stopPropagation() - vscode.postMessage({ type: "exportTaskWithId", text: itemId }) - }}> -
EXPORT
-
-) +const ExportButton = ({ itemId }: { itemId: string }) => { + const { t } = useTranslation("translation", { keyPrefix: "historyView" }) + return ( + { + e.stopPropagation() + vscode.postMessage({ type: "exportTaskWithId", text: itemId }) + }}> +
{t("export")}
+
+ ) +} // https://gist.github.com/evenfrost/1ba123656ded32fb7a0cd4651efd4db0 export const highlight = (fuseSearchResult: FuseResult[], highlightClassName: string = "history-item-highlight") => { diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index d19443cf93..4451dda4bf 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -75,7 +75,7 @@ declare module "vscode" { } const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, isPopup }: ApiOptionsProps) => { - const { t, ready } = useTranslation("translation", { keyPrefix: "apiOptions", useSuspense: false }) + const { t } = useTranslation("translation", { keyPrefix: "apiOptions" }) const { apiConfiguration, setApiConfiguration, uriScheme } = useExtensionState() const [ollamaModels, setOllamaModels] = useState([]) const [lmStudioModels, setLmStudioModels] = useState([]) @@ -831,7 +831,7 @@ export const ModelInfoView = ({ isPopup?: boolean }) => { const isGemini = Object.keys(geminiModels).includes(selectedModelId) - const { t, ready } = useTranslation("translation", { keyPrefix: "apiOptions", useSuspense: false }) + const { t } = useTranslation("translation", { keyPrefix: "apiOptions" }) const infoItems = [ modelInfo.description && ( diff --git a/webview-ui/src/components/settings/LanguageOptions.tsx b/webview-ui/src/components/settings/LanguageOptions.tsx index 0f9bc1b349..8d66231728 100644 --- a/webview-ui/src/components/settings/LanguageOptions.tsx +++ b/webview-ui/src/components/settings/LanguageOptions.tsx @@ -22,6 +22,7 @@ const LanguageOptions = () => { style={{ width: "100%" }} onChange={changeLanguage}> English + Español Deutsch 中文(简体) 中文(繁體) diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index 7de9200270..498469584f 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -4,8 +4,12 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "../settings/ApiOptions" +import { useTranslation } from "react-i18next" +import { Trans } from "react-i18next" const WelcomeView = () => { + const { t } = useTranslation("translation", { keyPrefix: "welcomeView" }) + const { apiConfiguration } = useExtensionState() const [apiErrorMessage, setApiErrorMessage] = useState(undefined) @@ -30,25 +34,27 @@ const WelcomeView = () => { bottom: 0, padding: "0 20px", }}> -

Hi, I'm Cline

+

{t("greeting")}

- I can do all kinds of tasks thanks to the latest breakthroughs in{" "} - - Claude 3.5 Sonnet's agentic coding capabilities - {" "} - and access to tools that let me create & edit files, explore complex projects, use the browser, and execute - terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own - capabilities. + + ), + }} + />

- To get started, this extension needs an API provider for Claude 3.5 Sonnet. + {t("getStarted")}
- Let's go! + {t("letsGo")}
diff --git a/webview-ui/src/i18n.ts b/webview-ui/src/i18n.ts index 774dbb4fdc..affbac2329 100644 --- a/webview-ui/src/i18n.ts +++ b/webview-ui/src/i18n.ts @@ -2,6 +2,7 @@ import i18n from "i18next" import { initReactI18next } from "react-i18next" import translationEN from "./locales/en/translation.json" +//import translationES from "./locales/es/translation.json" //import translationDE from "./locales/de/translation.json" //import translationZHCN from "./locales/zh-cn/translation.json" //import translationZHTW from "./locales/zh-tw/translation.json" @@ -19,6 +20,7 @@ i18n.use(initReactI18next) // passes i18n down to react-i18next }) i18n.addResourceBundle("en", "translation", translationEN) +//i18n.addResourceBundle("es", "translation", translationES) //i18n.addResourceBundle("de", "translation", translationDE) //i18n.addResourceBundle("zh-CN", "translation", translationZHCN) //i18n.addResourceBundle("zh-TW", "translation", translationZHTW) diff --git a/webview-ui/src/locales/de/translation.json b/webview-ui/src/locales/de/translation.json index 38bd488e24..921469994a 100644 --- a/webview-ui/src/locales/de/translation.json +++ b/webview-ui/src/locales/de/translation.json @@ -68,5 +68,108 @@ "geminiInfo": "* Kostenlos bis zu {{selectedModelId}} Anfragen pro Minute. Danach hängt die Abrechnung von der Prompt-Größe ab.", "pricingDetails": "Weitere Informationen finden Sie in den Preisdaten.", "languageModel": "Sprachmodell" + }, + "welcomeView": { + "greeting": "Hallo! Ich bin Cline, dein KI-Assistent.", + "description": "Ich kann alle möglichen Aufgaben dank der neuesten Durchbrüche in Claude 3.5 Sonnets agentischen Codierungsfähigkeiten und dem Zugriff auf Werkzeuge, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit deiner Erlaubnis). Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern.", + "getStarted": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter für Claude 3.5 Sonnet.", + "letsGo": "Los geht's!" + }, + "chatView": { + "typeMessage": "Nachricht eingeben...", + "typeTask": "Aufgabe eingeben...", + "whatCanIDoForYou": "Was kann ich für dich tun?", + "thanksTo": "Dank Claude 3.5 Sonnets agentischen Codierungsfähigkeiten kann ich komplexe Softwareentwicklungsaufgaben Schritt für Schritt bewältigen. Mit Werkzeugen, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (nachdem du die Erlaubnis erteilt hast), kann ich dir auf eine Weise helfen, die über die Codevervollständigung oder den technischen Support hinausgeht. Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern." + }, + "chatTextArea": { + "plan": "Planen", + "act": "Handeln" + }, + "chatRow": { + "error": "Fehler", + "mistakeLimitReached": "Fehlergrenze erreicht", + "autoApprovalMaxReqReached": "Maximale Anzahl automatischer Genehmigungen erreicht", + "command": { + "ask": "Cline möchte diesen Befehl ausführen:", + "say": "Cline hat diesen Befehl ausgeführt:" + }, + "useMcpServer": { + "ask": "Cline möchte dieses {type} auf {serverName} verwenden:", + "say": "Cline hat dieses {type} auf {serverName} verwendet:", + "tool": "Werkzeug", + "resource": "Ressource" + }, + "completionResult": "Abschlussergebnis", + "apiReqCancelled": "API-Anfrage abgebrochen", + "apiStreamingFailed": "API-Streaming fehlgeschlagen", + "apiRequest": "API-Anfrage", + "apiRequestFailed": "API-Anfrage fehlgeschlagen", + "apiRequestInProgress": "API-Anfrage in Bearbeitung", + "followup": "Nachverfolgung", + "tool": { + "editedExistingFile": { + "ask": "Cline möchte diese Datei bearbeiten:", + "say": "Cline bearbeitet diese Datei:" + }, + "createdNewFile": { + "ask": "Cline möchte diese Datei erstellen:", + "say": "Cline hat diese Datei erstellt:" + }, + "readExistingFile": { + "ask": "Cline möchte diese Datei lesen:", + "say": "Cline hat diese Datei gelesen:" + } + }, + "apiReqStarted": "API-Anfrage gestartet", + "userFeedback": "Benutzer-Feedback", + "userFeedbackDiff": "Benutzer-Feedback-Diff", + "diffEditFailed": "Diff-Bearbeitung fehlgeschlagen", + "shellIntegrationUnavailable": "Shell-Integration nicht verfügbar", + "mcpServerResponse": "MCP-Server-Antwort", + "planModeResponse": "Planmodus-Antwort", + "seeNewChanges": "Neue Änderungen anzeigen", + "commandRequiresApproval": "Das Modell hat bestimmt, dass dieser Befehl eine ausdrückliche Genehmigung erfordert.", + "troubleshootingGuide": "Es scheint, dass Sie Probleme mit Windows PowerShell haben. Bitte sehen Sie sich diesen Fehlerbehebungsleitfaden an.", + "clineWantsToViewTopLevelFiles": "Cline möchte die obersten Dateien in diesem Verzeichnis anzeigen:", + "clineViewedTopLevelFiles": "Cline hat die obersten Dateien in diesem Verzeichnis angezeigt:", + "clineWantsToRecursivelyViewFiles": "Cline möchte alle Dateien in diesem Verzeichnis rekursiv anzeigen:", + "clineRecursivelyViewedFiles": "Cline hat alle Dateien in diesem Verzeichnis rekursiv angezeigt:", + "clineWantsToViewSourceCodeDefinitions": "Cline möchte die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen anzeigen:", + "clineViewedSourceCodeDefinitions": "Cline hat die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen angezeigt:", + "clineWantsToSearchDirectory": "Cline möchte dieses Verzeichnis nach {{regex}} durchsuchen:", + "clineSearchedDirectory": "Cline hat dieses Verzeichnis nach {{regex}} durchsucht:", + "diffEditFailedMessage": "Dies passiert normalerweise, wenn das Modell Suchmuster verwendet, die nichts in der Datei finden. Erneut versuchen...", + "shellIntegrationUnavailableMessage": "Cline kann die Ausgabe des Befehls nicht anzeigen. Bitte aktualisiere VSCode (CMD/CTRL + Shift + P → \"Update\") und stelle sicher, dass du eine unterstützte Shell verwendest: zsh, bash, fish oder PowerShell (CMD/CTRL + Shift + P → \"Terminal: Standardprofil auswählen\"). Immer noch Probleme?", + "response": "Antwort", + "stillHavingTrouble": "Immer noch Probleme?" + }, + "autoApproveMenu": { + "none": "Keine", + "autoApprove": "Automatische Genehmigung:", + "autoApproveDescription": "Die automatische Genehmigung ermöglicht es Cline, die folgenden Aktionen ohne Erlaubnis auszuführen. Bitte mit Vorsicht verwenden und nur aktivieren, wenn Sie die Risiken verstehen.", + "autoApproveMaxRequestsDescription": "Cline wird automatisch so viele API-Anfragen stellen, bevor eine Genehmigung zur Fortsetzung der Aufgabe erforderlich ist.", + "enableNotifications": "Benachrichtigungen aktivieren", + "enableNotificationsDescription": "Erhalte Systembenachrichtigungen, wenn Cline eine Genehmigung zur Fortsetzung benötigt oder wenn eine Aufgabe abgeschlossen ist." + }, + "historyPreview": { + "recentTasks": "Kürzliche Aufgaben", + "tokens": "Tokens", + "cache": "Cache", + "apiCost": "API-Kosten", + "viewAllHistory": "Alle Verlauf anzeigen" + }, + "historyView": { + "history": "Verlauf", + "done": "Fertig", + "fuzzySearchHistory": "Verlauf unscharf durchsuchen...", + "newest": "Neueste", + "oldest": "Älteste", + "mostExpensive": "Teuerste", + "mostTokens": "Meiste Tokens", + "mostRelevant": "Relevanteste", + "tokens": "Tokens:", + "cache": "Cache:", + "apiCost": "API-Kosten:", + "export": "EXPORTIEREN" } } diff --git a/webview-ui/src/locales/en/translation.json b/webview-ui/src/locales/en/translation.json index 4f7ddd16f9..0578d51c48 100644 --- a/webview-ui/src/locales/en/translation.json +++ b/webview-ui/src/locales/en/translation.json @@ -68,5 +68,108 @@ "geminiInfo": "* Free up to {{selectedModelId}} requests per minute. After that, billing depends on prompt size.", "pricingDetails": "For more info, see pricing details.", "languageModel": "Language Model" + }, + "welcomeView": { + "greeting": "Hello! I'm Cline, your AI assistant.", + "description": "I can do all kinds of tasks thanks to the latest breakthroughs in Claude 3.5 Sonnet's agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.", + "getStarted": "To get started, this extension needs an API provider for Claude 3.5 Sonnet.", + "letsGo": "Let's go!" + }, + "chatView": { + "typeMessage": "Type a message...", + "typeTask": "Type a task...", + "whatCanIDoForYou": "What can I do for you?", + "thanksTo": "Thanks to Claude 3.5 Sonnet's agentic coding capabilities, I can handle complex software development tasks step-by-step. With tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (after you grant permission), I can assist you in ways that go beyond code completion or tech support. I can even use MCP to create new tools and extend my own capabilities." + }, + "chatTextArea": { + "plan": "Plan", + "act": "Act" + }, + "chatRow": { + "error": "Error", + "mistakeLimitReached": "Cline is having trouble...", + "autoApprovalMaxReqReached": "Maximum Requests Reached", + "command": { + "ask": "Cline wants to execute this command:", + "say": "Cline executed this command:" + }, + "useMcpServer": { + "ask": "Cline wants to use this {type} on {serverName}:", + "say": "Cline used this {type} on {serverName}:", + "tool": "tool", + "resource": "resource" + }, + "completionResult": "Task Completed", + "apiReqCancelled": "API Request Cancelled", + "apiStreamingFailed": "API Streaming Failed", + "apiRequest": "API Request", + "apiRequestFailed": "API Request Failed", + "apiRequestInProgress": "API Request...", + "followup": "Cline has a question:", + "tool": { + "editedExistingFile": { + "ask": "Cline wants to edit this file:", + "say": "Cline is editing this file:" + }, + "createdNewFile": { + "ask": "Cline wants to create this file:", + "say": "Cline created this file:" + }, + "readExistingFile": { + "ask": "Cline wants to read this file:", + "say": "Cline read this file:" + } + }, + "apiReqStarted": "API Request Started", + "userFeedback": "User Feedback", + "userFeedbackDiff": "User Feedback Diff", + "diffEditFailed": "Diff Edit Failed", + "shellIntegrationUnavailable": "Shell Integration Unavailable", + "mcpServerResponse": "MCP Server Response", + "planModeResponse": "Plan Mode Response", + "seeNewChanges": "See new changes", + "commandRequiresApproval": "The model has determined this command requires explicit approval.", + "troubleshootingGuide": "It seems like you're having Windows PowerShell issues, please see this troubleshooting guide", + "clineWantsToViewTopLevelFiles": "Cline wants to view the top level files in this directory:", + "clineViewedTopLevelFiles": "Cline viewed the top level files in this directory:", + "clineWantsToRecursivelyViewFiles": "Cline wants to recursively view all files in this directory:", + "clineRecursivelyViewedFiles": "Cline recursively viewed all files in this directory:", + "clineWantsToViewSourceCodeDefinitions": "Cline wants to view source code definition names used in this directory:", + "clineViewedSourceCodeDefinitions": "Cline viewed source code definition names used in this directory:", + "clineWantsToSearchDirectory": "Cline wants to search this directory for {{regex}}:", + "clineSearchedDirectory": "Cline searched this directory for {{regex}}:", + "diffEditFailedMessage": "This usually happens when the model uses search patterns that don't match anything in the file. Retrying...", + "shellIntegrationUnavailableMessage": "Cline won't be able to view the command's output. Please update VSCode (CMD/CTRL + Shift + P → \"Update\") and make sure you're using a supported shell: zsh, bash, fish, or PowerShell (CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\"). Still having trouble?", + "response": "Response", + "stillHavingTrouble": "Still having trouble?" + }, + "autoApproveMenu": { + "none": "None", + "autoApprove": "Auto Approve:", + "autoApproveDescription": "Auto-approve allows Cline to perform the following actions without asking for permission. Please use with caution and only enable if you understand the risks.", + "autoApproveMaxRequestsDescription": "Cline will automatically make this many API requests before asking for approval to proceed with the task.", + "enableNotifications": "Enable Notifications", + "enableNotificationsDescription": "Receive system notifications when Cline requires approval to proceed or when a task is completed." + }, + "historyPreview": { + "recentTasks": "Recent Tasks", + "tokens": "Tokens", + "cache": "Cache", + "apiCost": "API Cost", + "viewAllHistory": "View all history" + }, + "historyView": { + "history": "History", + "done": "Done", + "fuzzySearchHistory": "Fuzzy search history...", + "newest": "Newest", + "oldest": "Oldest", + "mostExpensive": "Most Expensive", + "mostTokens": "Most Tokens", + "mostRelevant": "Most Relevant", + "tokens": "Tokens:", + "cache": "Cache:", + "apiCost": "API Cost:", + "export": "EXPORT" } } diff --git a/webview-ui/src/locales/es/translation.json b/webview-ui/src/locales/es/translation.json new file mode 100644 index 0000000000..df3f5e4eea --- /dev/null +++ b/webview-ui/src/locales/es/translation.json @@ -0,0 +1,175 @@ +{ + "announcement": { + "newInVersion": "Nuevo en la versión {{version}}", + "joinOurCommunities": "Únete a nuestro Discord o Reddit para más actualizaciones!" + }, + "settingsView": { + "settings": "Configuraciones", + "done": "Hecho", + "language": "Idioma", + "customInstructions": "Instrucciones personalizadas", + "customInstructionsPlaceholder": "por ejemplo, \"Realiza pruebas unitarias al final\", \"Usa TypeScript con async/await\", \"Habla en japonés\"", + "customInstructionsDescription": "Estas instrucciones se agregarán al final del prompt del sistema que se envía con cada solicitud.", + "debug": "Depurar", + "resetState": "Restablecer estado", + "resetStateDescription": "Esto restablecerá todo el estado global y el almacenamiento secreto en la extensión.", + "feedback": "Si tienes preguntas o comentarios, no dudes en abrir un issue en", + "version": "v" + }, + "apiOptions": { + "selectModel": "Seleccionar modelo...", + "model": "Modelo", + "apiProvider": "Proveedor de API", + "enterApiKey": "Ingresar clave API...", + "apiKey": "Clave API", + "enterBaseUrl": "Ingresar URL base...", + "baseUrl": "URL base", + "optionalBaseUrl": "URL base (opcional)", + "enterModelId": "Ingresar ID del modelo...", + "modelId": "ID del modelo", + "useCustomBaseUrl": "Usar URL base personalizada", + "apiKeyInfo": "Esta clave se almacena localmente y solo se usa para realizar solicitudes API desde esta extensión.", + "getDefault": "Predeterminado: {{defaultValue}}", + "getApiKeyMessage": "Puedes obtener una clave API de {{vendor}} registrándote aquí.", + "getApiVendorKey": "Clave API de {{vendor}}", + "getCompatibleVendor": "Compatible con {{vendor}}", + "lmStudioInfo": "LM Studio te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su Guía de inicio rápido. También debes iniciar la función de servidor local de LM Studio para usarla con esta extensión. (Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", + "ollamaInfo": "Ollama te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su Guía de inicio rápido. (Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", + "azureInfo": "(Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", + "setAzureApiVersion": "Establecer versión de API de Azure", + "enterGcpProjectId": "Ingresar ID del proyecto...", + "gcpProjectId": "ID del proyecto de Google Cloud", + "gcpLinks": "Para usar Google Cloud Vertex AI, debes 1) crear una cuenta de Google Cloud › habilitar la API de Vertex AI › habilitar los modelos Claude deseados,
2) instalar la CLI de Google Cloud › configurar credenciales predeterminadas de la aplicación. ", + "enterAwsAccessKey": "Ingresar clave de acceso...", + "awsAccessKey": "Clave de acceso de AWS", + "enterAwsSecretKey": "Ingresar clave secreta...", + "awsSecretKey": "Clave secreta de AWS", + "enterAwsSessionToken": "Ingresar token de sesión...", + "awsSessionToken": "Token de sesión de AWS", + "getRegion": "Región de {{vendor}}", + "selectRegion": "Seleccionar región...", + "useCrossRegionInference": "Usar inferencia entre regiones", + "awsInfo": "Autentícate proporcionando las claves mencionadas arriba o usando las credenciales predeterminadas de AWS, es decir, ~/.aws/credentials o variables de entorno. Estas credenciales solo se usan localmente para realizar solicitudes API desde esta extensión.", + "vscodeLanguageModelsInfo": "La API de Modelos de Lenguaje de VS Code te permite usar modelos proporcionados por otras extensiones de VS Code (incluyendo, pero no limitado a GitHub Copilot). La forma más fácil de comenzar es instalar la extensión Copilot desde el VS Marketplace y habilitar Claude 3.5 Sonnet.", + "experimentalFeature": "Nota: Esta es una integración muy experimental y puede no funcionar como se espera.", + "supportsImages": "Soporta imágenes", + "doesNotSupportImages": "No soporta imágenes", + "supportsComputerUse": "Soporta uso de computadora", + "doesNotSupportComputerUse": "No soporta uso de computadora", + "supportsPromptCache": "Soporta caché de prompts", + "doesNotSupportPromptCache": "No soporta caché de prompts", + "maxOutput": "Salida máxima", + "tokens": "Tokens", + "inputPrice": "Precio de entrada", + "millionTokens": "Millones de tokens", + "cacheWritesPrice": "Precio de escritura en caché", + "cacheReadsPrice": "Precio de lectura en caché", + "outputPrice": "Precio de salida", + "geminiInfo": "* Gratis hasta {{selectedModelId}} solicitudes por minuto. Después, la facturación depende del tamaño del prompt.", + "pricingDetails": "Para más información, consulta los detalles de precios.", + "languageModel": "Modelo de lenguaje" + }, + "welcomeView": { + "greeting": "¡Hola! Soy Cline, tu asistente de IA.", + "description": "Puedo realizar todo tipo de tareas gracias a los últimos avances en las habilidades de codificación agencial de Claude 3.5 Sonnet y el acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (por supuesto, con tu permiso). Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades.", + "getStarted": "Para comenzar, esta extensión necesita un proveedor de API para Claude 3.5 Sonnet.", + "letsGo": "¡Vamos allá!" + }, + "chatView": { + "typeMessage": "Escribir mensaje...", + "typeTask": "Escribir tarea...", + "whatCanIDoForYou": "¿Qué puedo hacer por ti?", + "thanksTo": "Gracias a las habilidades de codificación agencial de Claude 3.5 Sonnet, puedo manejar tareas complejas de desarrollo de software paso a paso. Con herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (después de que hayas dado permiso), puedo ayudarte de una manera que va más allá de la autocompletación de código o el soporte técnico. Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades." + }, + "chatTextArea": { + "plan": "Planificar", + "act": "Actuar" + }, + "chatRow": { + "error": "Error", + "mistakeLimitReached": "Límite de errores alcanzado", + "autoApprovalMaxReqReached": "Número máximo de aprobaciones automáticas alcanzado", + "command": { + "ask": "Cline quiere ejecutar este comando:", + "say": "Cline ha ejecutado este comando:" + }, + "useMcpServer": { + "ask": "Cline quiere usar este {type} en {serverName}:", + "say": "Cline ha usado este {type} en {serverName}:", + "tool": "Herramienta", + "resource": "Recurso" + }, + "completionResult": "Resultado de la finalización", + "apiReqCancelled": "Solicitud API cancelada", + "apiStreamingFailed": "Transmisión API fallida", + "apiRequest": "Solicitud API", + "apiRequestFailed": "Solicitud API fallida", + "apiRequestInProgress": "Solicitud API en progreso", + "followup": "Seguimiento", + "tool": { + "editedExistingFile": { + "ask": "Cline quiere editar este archivo:", + "say": "Cline está editando este archivo:" + }, + "createdNewFile": { + "ask": "Cline quiere crear este archivo:", + "say": "Cline ha creado este archivo:" + }, + "readExistingFile": { + "ask": "Cline quiere leer este archivo:", + "say": "Cline ha leído este archivo:" + } + }, + "apiReqStarted": "Solicitud API iniciada", + "userFeedback": "Comentarios del usuario", + "userFeedbackDiff": "Diferencia de comentarios del usuario", + "diffEditFailed": "Edición de diferencia fallida", + "shellIntegrationUnavailable": "Integración de shell no disponible", + "mcpServerResponse": "Respuesta del servidor MCP", + "planModeResponse": "Respuesta del modo plan", + "seeNewChanges": "Ver nuevos cambios", + "commandRequiresApproval": "El modelo ha determinado que este comando requiere aprobación explícita.", + "troubleshootingGuide": "Guía de solución de problemas", + "clineWantsToViewTopLevelFiles": "Cline quiere ver los archivos principales en este directorio:", + "clineViewedTopLevelFiles": "Cline ha visto los archivos principales en este directorio:", + "clineWantsToRecursivelyViewFiles": "Cline quiere ver todos los archivos en este directorio de forma recursiva:", + "clineRecursivelyViewedFiles": "Cline ha visto todos los archivos en este directorio de forma recursiva:", + "clineWantsToViewSourceCodeDefinitions": "Cline quiere ver los nombres de las definiciones de código fuente usadas en este directorio:", + "clineViewedSourceCodeDefinitions": "Cline ha visto los nombres de las definiciones de código fuente usadas en este directorio:", + "clineWantsToSearchDirectory": "Cline quiere buscar en este directorio por {{regex}}:", + "clineSearchedDirectory": "Cline ha buscado en este directorio por {{regex}}:", + "diffEditFailedMessage": "Esto generalmente ocurre cuando el modelo usa patrones de búsqueda que no encuentran nada en el archivo. Intentar de nuevo...", + "shellIntegrationUnavailableMessage": "Cline no puede mostrar la salida del comando. Por favor, actualiza VSCode (CMD/CTRL + Shift + P → \"Update\") y asegúrate de estar usando una shell compatible: zsh, bash, fish o PowerShell (CMD/CTRL + Shift + P → \"Terminal: Seleccionar perfil predeterminado\"). ¿Sigues teniendo problemas?", + "response": "Respuesta", + "stillHavingTrouble": "¿Sigues teniendo problemas?" + }, + "autoApproveMenu": { + "none": "Ninguno", + "autoApprove": "Aprobación automática:", + "autoApproveDescription": "La aprobación automática permite a Cline realizar las siguientes acciones sin pedir permiso. Por favor, úsalo con precaución y solo habilítalo si entiendes los riesgos.", + "autoApproveMaxRequestsDescription": "Cline realizará automáticamente tantas solicitudes API antes de que se requiera una aprobación para continuar con la tarea.", + "enableNotifications": "Habilitar notificaciones", + "enableNotificationsDescription": "Recibe notificaciones del sistema cuando Cline necesita aprobación para continuar o cuando una tarea se ha completado." + }, + "historyPreview": { + "recentTasks": "Tareas recientes", + "tokens": "Tokens", + "cache": "Caché", + "apiCost": "Costo de API", + "viewAllHistory": "Ver todo el historial" + }, + "historyView": { + "history": "Historial", + "done": "Hecho", + "fuzzySearchHistory": "Búsqueda difusa en el historial...", + "newest": "Más reciente", + "oldest": "Más antiguo", + "mostExpensive": "Más caro", + "mostTokens": "Más tokens", + "mostRelevant": "Más relevante", + "tokens": "Tokens:", + "cache": "Caché:", + "apiCost": "Costo de API:", + "export": "EXPORTAR" + } +} diff --git a/webview-ui/src/locales/ja/translation.json b/webview-ui/src/locales/ja/translation.json index 8ad9400e6a..353979f572 100644 --- a/webview-ui/src/locales/ja/translation.json +++ b/webview-ui/src/locales/ja/translation.json @@ -68,5 +68,108 @@ "geminiInfo": "* {{selectedModelId}} リクエスト毎分まで無料。その後、料金はプロンプトサイズに基づいて計算されます。", "pricingDetails": "詳細については料金情報をご確認ください。", "languageModel": "言語モデル" + }, + "welcomeView": { + "greeting": "こんにちは!私はあなたのAIアシスタント、クラインです。", + "description": "最新のClaude 3.5 Sonnetのエージェントコーディング機能と、ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろん、あなたの許可が必要です)を可能にするツールのおかげで、あらゆるタスクをこなすことができます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", + "getStarted": "始めるには、この拡張機能にClaude 3.5 SonnetのAPIプロバイダーが必要です。", + "letsGo": "さあ、始めましょう!" + }, + "chatView": { + "typeMessage": "メッセージを入力...", + "typeTask": "タスクを入力...", + "whatCanIDoForYou": "何をお手伝いしましょうか?", + "thanksTo": "Claude 3.5 Sonnetのエージェントコーディング機能のおかげで、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可をいただいた後)を可能にするツールを使用して、コードの補完や技術サポートを超えた支援を提供できます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。" + }, + "chatTextArea": { + "plan": "計画", + "act": "実行" + }, + "chatRow": { + "error": "エラー", + "mistakeLimitReached": "ミスの限界に達しました", + "autoApprovalMaxReqReached": "自動承認の最大リクエストに達しました", + "command": { + "ask": "クラインがこのコマンドを実行したいと考えています:", + "say": "クラインがこのコマンドを実行しました:" + }, + "useMcpServer": { + "ask": "クラインがこの{type}を{serverName}で使用したいと考えています:", + "say": "クラインがこの{type}を{serverName}で使用しました:", + "tool": "ツール", + "resource": "リソース" + }, + "completionResult": "完了結果", + "apiReqCancelled": "APIリクエストがキャンセルされました", + "apiStreamingFailed": "APIストリーミングに失敗しました", + "apiRequest": "APIリクエスト", + "apiRequestFailed": "APIリクエストに失敗しました", + "apiRequestInProgress": "APIリクエスト進行中", + "followup": "フォローアップ", + "tool": { + "editedExistingFile": { + "ask": "クラインがこのファイルを編集したいと考えています:", + "say": "クラインがこのファイルを編集しています:" + }, + "createdNewFile": { + "ask": "クラインがこのファイルを作成したいと考えています:", + "say": "クラインがこのファイルを作成しました:" + }, + "readExistingFile": { + "ask": "クラインがこのファイルを読みたいと考えています:", + "say": "クラインがこのファイルを読みました:" + } + }, + "apiReqStarted": "APIリクエスト開始", + "userFeedback": "ユーザーフィードバック", + "userFeedbackDiff": "ユーザーフィードバック差分", + "diffEditFailed": "差分編集に失敗しました", + "shellIntegrationUnavailable": "シェル統合が利用できません", + "mcpServerResponse": "MCPサーバー応答", + "planModeResponse": "計画モード応答", + "seeNewChanges": "新しい変更を見る", + "commandRequiresApproval": "このコマンドは明示的な承認が必要です。", + "troubleshootingGuide": "Windows PowerShellの問題が発生しているようです。このトラブルシューティングガイドをご覧ください。", + "clineWantsToViewTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示したいと考えています:", + "clineViewedTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示しました:", + "clineWantsToRecursivelyViewFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示したいと考えています:", + "clineRecursivelyViewedFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示しました:", + "clineWantsToViewSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示したいと考えています:", + "clineViewedSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示しました:", + "clineWantsToSearchDirectory": "クラインがこのディレクトリで{{regex}}を検索したいと考えています:", + "clineSearchedDirectory": "クラインがこのディレクトリで{{regex}}を検索しました:", + "diffEditFailedMessage": "これは通常、モデルがファイル内で一致しない検索パターンを使用した場合に発生します。再試行中...", + "shellIntegrationUnavailableMessage": "クラインはコマンドの出力を表示できません。VSCodeを更新し(CMD/CTRL + Shift + P → \"Update\")、サポートされているシェルを使用していることを確認してください:zsh、bash、fish、またはPowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。まだ問題がありますか?", + "response": "応答", + "stillHavingTrouble": "まだ問題がありますか?" + }, + "autoApproveMenu": { + "none": "なし", + "autoApprove": "自動承認:", + "autoApproveDescription": "自動承認を有効にすると、クラインが以下のアクションを許可を求めずに実行できるようになります。リスクを理解した上で、慎重に使用してください。", + "autoApproveMaxRequestsDescription": "クラインは、このタスクを進めるために承認を求める前に、この数のAPIリクエストを自動的に行います。", + "enableNotifications": "通知を有効にする", + "enableNotificationsDescription": "クラインがタスクを進めるために承認を求めるとき、またはタスクが完了したときにシステム通知を受け取ります。" + }, + "historyPreview": { + "recentTasks": "最近のタスク", + "tokens": "トークン", + "cache": "キャッシュ", + "apiCost": "APIコスト", + "viewAllHistory": "すべての履歴を見る" + }, + "historyView": { + "history": "履歴", + "done": "完了", + "fuzzySearchHistory": "履歴をあいまい検索...", + "newest": "最新", + "oldest": "最古", + "mostExpensive": "最も高価", + "mostTokens": "最も多いトークン", + "mostRelevant": "最も関連性が高い", + "tokens": "トークン:", + "cache": "キャッシュ:", + "apiCost": "APIコスト:", + "export": "エクスポート" } } diff --git a/webview-ui/src/locales/zh-cn/translation.json b/webview-ui/src/locales/zh-cn/translation.json index 7466011cd2..5faed68afa 100644 --- a/webview-ui/src/locales/zh-cn/translation.json +++ b/webview-ui/src/locales/zh-cn/translation.json @@ -63,5 +63,108 @@ "geminiInfo": "* 每分钟最多 {{selectedModelId}} 次请求免费。之后,费用取决于提示大小。", "pricingDetails": "有关更多信息,请参阅定价详情。", "languageModel": "语言模型" + }, + "welcomeView": { + "greeting": "你好!我是 Cline,你的 AI 助手。", + "description": "感谢 Claude 3.5 Sonnet 的代理编码能力 和访问工具,我可以执行各种任务,这些工具让我可以创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令(当然,需要你的许可)。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。", + "getStarted": "要开始使用,此扩展需要 Claude 3.5 Sonnet 的 API 提供商。", + "letsGo": "开始吧!" + }, + "chatView": { + "typeMessage": "输入消息...", + "typeTask": "输入任务...", + "whatCanIDoForYou": "我能为你做什么?", + "thanksTo": "感谢 Claude 3.5 Sonnet 的代理编码能力, 我可以一步步处理复杂的软件开发任务。通过允许我创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令的工具(在你授予权限后),我可以以超越代码完成或技术支持的方式帮助你。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。" + }, + "chatTextArea": { + "plan": "计划", + "act": "行动" + }, + "chatRow": { + "error": "错误", + "mistakeLimitReached": "错误次数达到上限", + "autoApprovalMaxReqReached": "自动批准请求次数达到上限", + "command": { + "ask": "Cline 想执行此命令:", + "say": "Cline 执行了此命令:" + }, + "useMcpServer": { + "ask": "Cline 想在 {serverName} 上使用此 {type}:", + "say": "Cline 在 {serverName} 上使用了此 {type}:", + "tool": "工具", + "resource": "资源" + }, + "completionResult": "完成结果", + "apiReqCancelled": "API 请求已取消", + "apiStreamingFailed": "API 流式传输失败", + "apiRequest": "API 请求", + "apiRequestFailed": "API 请求失败", + "apiRequestInProgress": "API 请求进行中", + "followup": "跟进", + "tool": { + "editedExistingFile": { + "ask": "Cline 想编辑此文件:", + "say": "Cline 正在编辑此文件:" + }, + "createdNewFile": { + "ask": "Cline 想创建此文件:", + "say": "Cline 创建了此文件:" + }, + "readExistingFile": { + "ask": "Cline 想读取此文件:", + "say": "Cline 读取了此文件:" + } + }, + "apiReqStarted": "API 请求已启动", + "userFeedback": "用户反馈", + "userFeedbackDiff": "用户反馈差异", + "diffEditFailed": "差异编辑失败", + "shellIntegrationUnavailable": "Shell 集成不可用", + "mcpServerResponse": "MCP 服务器响应", + "planModeResponse": "计划模式响应", + "seeNewChanges": "查看新更改", + "commandRequiresApproval": "模型已确定此命令需要明确批准。", + "troubleshootingGuide": "看起来你遇到了 Windows PowerShell 问题,请参阅此 故障排除指南", + "clineWantsToViewTopLevelFiles": "Cline 想查看此目录中的顶级文件:", + "clineViewedTopLevelFiles": "Cline 查看了此目录中的顶级文件:", + "clineWantsToRecursivelyViewFiles": "Cline 想递归查看此目录中的所有文件:", + "clineRecursivelyViewedFiles": "Cline 递归查看了此目录中的所有文件:", + "clineWantsToViewSourceCodeDefinitions": "Cline 想查看此目录中使用的源代码定义名称:", + "clineViewedSourceCodeDefinitions": "Cline 查看了此目录中使用的源代码定义名称:", + "clineWantsToSearchDirectory": "Cline 想在此目录中搜索 {{regex}}:", + "clineSearchedDirectory": "Cline 在此目录中搜索了 {{regex}}:", + "diffEditFailedMessage": "这通常发生在模型使用的搜索模式与文件中的任何内容不匹配时。重试中...", + "shellIntegrationUnavailableMessage": "Cline 将无法查看命令的输出。请更新 VSCode(CMD/CTRL + Shift + P → \"Update\")并确保你使用的是受支持的 shell:zsh、bash、fish 或 PowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有问题?", + "response": "响应", + "stillHavingTrouble": "仍有问题?" + }, + "autoApproveMenu": { + "none": "无", + "autoApprove": "自动批准:", + "autoApproveDescription": "自动批准允许 Cline 在不请求许可的情况下执行以下操作。请谨慎使用,并仅在了解风险的情况下启用。", + "autoApproveMaxRequestsDescription": "Cline 将自动发出此数量的 API 请求,然后再请求批准以继续任务。", + "enableNotifications": "启用通知", + "enableNotificationsDescription": "当 Cline 需要批准以继续或任务完成时接收系统通知。" + }, + "historyPreview": { + "recentTasks": "最近任务", + "tokens": "令牌", + "cache": "缓存", + "apiCost": "API 成本", + "viewAllHistory": "查看所有历史记录" + }, + "historyView": { + "history": "历史", + "done": "完成", + "fuzzySearchHistory": "模糊搜索历史...", + "newest": "最新", + "oldest": "最旧", + "mostExpensive": "最昂贵", + "mostTokens": "最多令牌", + "mostRelevant": "最相关", + "tokens": "令牌:", + "cache": "缓存:", + "apiCost": "API 成本:", + "export": "导出" } } diff --git a/webview-ui/src/locales/zh-tw/translation.json b/webview-ui/src/locales/zh-tw/translation.json index 7b3fe5a89c..1245b4d343 100644 --- a/webview-ui/src/locales/zh-tw/translation.json +++ b/webview-ui/src/locales/zh-tw/translation.json @@ -63,5 +63,108 @@ "geminiInfo": "* 每分鐘最多免費 {{selectedModelId}} 次請求。之後,計費取決於提示大小。", "pricingDetails": "更多信息,請參見定價詳情。", "languageModel": "語言模型" + }, + "welcomeView": { + "greeting": "您好!我是 Cline,您的 AI 助手。", + "description": "得益於 Claude 3.5 Sonnet 的代理編碼能力 和訪問各種工具,我可以執行各種任務,這些工具讓我能夠創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(當然是在您的許可下)。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。", + "getStarted": "要開始使用,這個擴展需要 Claude 3.5 Sonnet 的 API 提供者。", + "letsGo": "讓我們開始吧!" + }, + "chatView": { + "typeMessage": "輸入消息...", + "typeTask": "輸入任務...", + "whatCanIDoForYou": "我能為您做什麼?", + "thanksTo": "感謝 Claude 3.5 Sonnet 的代理編碼能力, 我可以逐步處理複雜的軟件開發任務。通過這些工具,我可以創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(在您授權後),我可以幫助您完成超越代碼補全或技術支持的任務。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。" + }, + "chatTextArea": { + "plan": "計劃", + "act": "行動" + }, + "chatRow": { + "error": "錯誤", + "mistakeLimitReached": "錯誤次數達到上限", + "autoApprovalMaxReqReached": "自動批准請求次數達到上限", + "command": { + "ask": "Cline 想要執行此命令:", + "say": "Cline 執行了此命令:" + }, + "useMcpServer": { + "ask": "Cline 想要在 {serverName} 上使用此 {type}:", + "say": "Cline 在 {serverName} 上使用了此 {type}:", + "tool": "工具", + "resource": "資源" + }, + "completionResult": "完成結果", + "apiReqCancelled": "API 請求已取消", + "apiStreamingFailed": "API 流式傳輸失敗", + "apiRequest": "API 請求", + "apiRequestFailed": "API 請求失敗", + "apiRequestInProgress": "API 請求進行中", + "followup": "後續", + "tool": { + "editedExistingFile": { + "ask": "Cline 想要編輯此文件:", + "say": "Cline 正在編輯此文件:" + }, + "createdNewFile": { + "ask": "Cline 想要創建此文件:", + "say": "Cline 創建了此文件:" + }, + "readExistingFile": { + "ask": "Cline 想要閱讀此文件:", + "say": "Cline 閱讀了此文件:" + } + }, + "apiReqStarted": "API 請求已開始", + "userFeedback": "用戶反饋", + "userFeedbackDiff": "用戶反饋差異", + "diffEditFailed": "差異編輯失敗", + "shellIntegrationUnavailable": "Shell 集成不可用", + "mcpServerResponse": "MCP 服務器響應", + "planModeResponse": "計劃模式響應", + "seeNewChanges": "查看新變更", + "commandRequiresApproval": "模型已確定此命令需要明確批准。", + "troubleshootingGuide": "看起來您遇到了 Windows PowerShell 問題,請參閱此 故障排除指南", + "clineWantsToViewTopLevelFiles": "Cline 想要查看此目錄中的頂層文件:", + "clineViewedTopLevelFiles": "Cline 查看了此目錄中的頂層文件:", + "clineWantsToRecursivelyViewFiles": "Cline 想要遞歸查看此目錄中的所有文件:", + "clineRecursivelyViewedFiles": "Cline 遞歸查看了此目錄中的所有文件:", + "clineWantsToViewSourceCodeDefinitions": "Cline 想要查看此目錄中使用的源代碼定義名稱:", + "clineViewedSourceCodeDefinitions": "Cline 查看了此目錄中使用的源代碼定義名稱:", + "clineWantsToSearchDirectory": "Cline 想要在此目錄中搜索 {{regex}}:", + "clineSearchedDirectory": "Cline 在此目錄中搜索了 {{regex}}:", + "diffEditFailedMessage": "這通常發生在模型使用的搜索模式與文件中的任何內容不匹配時。重試中...", + "shellIntegrationUnavailableMessage": "Cline 將無法查看命令的輸出。請更新 VSCode(CMD/CTRL + Shift + P → \"Update\")並確保您使用的是受支持的 shell:zsh、bash、fish 或 PowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有問題?", + "response": "響應", + "stillHavingTrouble": "仍有問題?" + }, + "autoApproveMenu": { + "none": "無", + "autoApprove": "自動批准:", + "autoApproveDescription": "自動批准允許 Cline 執行以下操作而無需請求許可。請謹慎使用,僅在您了解風險的情況下啟用。", + "autoApproveMaxRequestsDescription": "Cline 將自動發出這麼多 API 請求,然後再請求批准以繼續任務。", + "enableNotifications": "啟用通知", + "enableNotificationsDescription": "當 Cline 需要批准以繼續或任務完成時接收系統通知。" + }, + "historyPreview": { + "recentTasks": "最近任務", + "tokens": "標記", + "cache": "緩存", + "apiCost": "API 成本", + "viewAllHistory": "查看所有歷史記錄" + }, + "historyView": { + "history": "歷史", + "done": "完成", + "fuzzySearchHistory": "模糊搜索歷史...", + "newest": "最新", + "oldest": "最舊", + "mostExpensive": "最昂貴", + "mostTokens": "最多標記", + "mostRelevant": "最相關", + "tokens": "標記:", + "cache": "緩存:", + "apiCost": "API 成本:", + "export": "導出" } } From 5d86ac412ac8c5dd0f6e97574d0aa82ebed1d6f9 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Mon, 27 Jan 2025 13:47:49 -1000 Subject: [PATCH 15/74] uncomment dropdown + add to Welcome --- .../src/components/settings/SettingsView.tsx | 6 +++--- .../src/components/welcome/WelcomeView.tsx | 2 ++ webview-ui/src/i18n.ts | 20 +++++++++---------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index a5293bdc4e..16707bae3f 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -5,7 +5,7 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration, validateModelId } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "./ApiOptions" -//import LanguageOptions from "./LanguageOptions" +import LanguageOptions from "./LanguageOptions" import SettingsButton from "../common/SettingsButton" const IS_DEV = false // FIXME: use flags when packaging @@ -117,9 +117,9 @@ const SettingsView = ({ onDone }: SettingsViewProps) => { {t("customInstructionsDescription")}

- {/*
+
-
*/} +
{IS_DEV && ( <> diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index 498469584f..d3bbfbb9dc 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -5,6 +5,7 @@ import { validateApiConfiguration } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "../settings/ApiOptions" import { useTranslation } from "react-i18next" +import LanguageOptions from "../settings/LanguageOptions" import { Trans } from "react-i18next" const WelcomeView = () => { @@ -53,6 +54,7 @@ const WelcomeView = () => {
+ {t("letsGo")} diff --git a/webview-ui/src/i18n.ts b/webview-ui/src/i18n.ts index affbac2329..e52c8e66fc 100644 --- a/webview-ui/src/i18n.ts +++ b/webview-ui/src/i18n.ts @@ -2,11 +2,11 @@ import i18n from "i18next" import { initReactI18next } from "react-i18next" import translationEN from "./locales/en/translation.json" -//import translationES from "./locales/es/translation.json" -//import translationDE from "./locales/de/translation.json" -//import translationZHCN from "./locales/zh-cn/translation.json" -//import translationZHTW from "./locales/zh-tw/translation.json" -//import translationJA from "./locales/ja/translation.json" +import translationES from "./locales/es/translation.json" +import translationDE from "./locales/de/translation.json" +import translationZHCN from "./locales/zh-cn/translation.json" +import translationZHTW from "./locales/zh-tw/translation.json" +import translationJA from "./locales/ja/translation.json" i18n.use(initReactI18next) // passes i18n down to react-i18next .init({ @@ -20,10 +20,10 @@ i18n.use(initReactI18next) // passes i18n down to react-i18next }) i18n.addResourceBundle("en", "translation", translationEN) -//i18n.addResourceBundle("es", "translation", translationES) -//i18n.addResourceBundle("de", "translation", translationDE) -//i18n.addResourceBundle("zh-CN", "translation", translationZHCN) -//i18n.addResourceBundle("zh-TW", "translation", translationZHTW) -//i18n.addResourceBundle("ja", "translation", translationJA) +i18n.addResourceBundle("es", "translation", translationES) +i18n.addResourceBundle("de", "translation", translationDE) +i18n.addResourceBundle("zh-CN", "translation", translationZHCN) +i18n.addResourceBundle("zh-TW", "translation", translationZHTW) +i18n.addResourceBundle("ja", "translation", translationJA) export default i18n From 57a4f2be0ecdcbfa147139b7a960a500fadc1bf0 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Mon, 27 Jan 2025 17:17:33 -0800 Subject: [PATCH 16/74] Add email subscription field to welcome page (#1497) * Add email subscription field to welcome page * Fix merge conflict * Reposition language picker * Fixes --- src/core/webview/ClineProvider.ts | 33 +++++ src/shared/ExtensionMessage.ts | 1 + src/shared/WebviewMessage.ts | 1 + .../src/components/welcome/WelcomeView.tsx | 116 ++++++++++++++---- 4 files changed, 126 insertions(+), 25 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index a54dc97986..4021d6bccf 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -630,6 +630,9 @@ export class ClineProvider implements vscode.WebviewViewProvider { case "getLatestState": await this.postStateToWebview() break + case "subscribeEmail": + this.subscribeEmail(message.text) + break case "accountLoginClicked": { // Generate nonce for state validation const nonce = crypto.randomBytes(32).toString("hex") @@ -699,6 +702,36 @@ export class ClineProvider implements vscode.WebviewViewProvider { ) } + async subscribeEmail(email?: string) { + if (!email) { + return + } + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + if (!emailRegex.test(email)) { + vscode.window.showErrorMessage("Please enter a valid email address") + return + } + console.log("Subscribing email:", email) + this.postMessageToWebview({ type: "emailSubscribed" }) + // Currently ignoring errors to this endpoint, but after accounts we'll remove this anyways + try { + const response = await axios.post( + "https://app.cline.bot/api/mailing-list", + { + email: email, + }, + { + headers: { + "Content-Type": "application/json", + }, + }, + ) + console.log("Email subscribed successfully. Response:", response.data) + } catch (error) { + console.error("Failed to subscribe email:", error) + } + } + async cancelTask() { if (this.cline) { const { historyItem } = await this.getTaskWithId(this.cline.taskId) diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 164b7c101b..306fbd00c0 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -25,6 +25,7 @@ export interface ExtensionMessage { | "relinquishControl" | "vsCodeLmModels" | "requestVsCodeLmModels" + | "emailSubscribed" text?: string action?: | "chatButtonClicked" diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index f5fb6eb9be..a18a3c405a 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -41,6 +41,7 @@ export interface WebviewMessage { | "getLatestState" | "accountLoginClicked" | "accountLogoutClicked" + | "subscribeEmail" // | "relaunchChromeDebugMode" text?: string disabled?: boolean diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index d3bbfbb9dc..a610f827f3 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -1,12 +1,14 @@ -import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react" -import { useEffect, useState } from "react" +import { VSCodeButton, VSCodeLink, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" +import { useEffect, useState, useCallback } from "react" import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "../settings/ApiOptions" import { useTranslation } from "react-i18next" -import LanguageOptions from "../settings/LanguageOptions" import { Trans } from "react-i18next" +import { useEvent } from "react-use" +import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" +import LanguageOptions from "../settings/LanguageOptions" const WelcomeView = () => { const { t } = useTranslation("translation", { keyPrefix: "welcomeView" }) @@ -14,6 +16,8 @@ const WelcomeView = () => { const { apiConfiguration } = useExtensionState() const [apiErrorMessage, setApiErrorMessage] = useState(undefined) + const [email, setEmail] = useState("") + const [isSubscribed, setIsSubscribed] = useState(false) const disableLetsGoButton = apiErrorMessage != null @@ -21,10 +25,27 @@ const WelcomeView = () => { vscode.postMessage({ type: "apiConfiguration", apiConfiguration }) } + const handleSubscribe = () => { + if (email) { + vscode.postMessage({ type: "subscribeEmail", text: email }) + } + } + useEffect(() => { setApiErrorMessage(validateApiConfiguration(apiConfiguration)) }, [apiConfiguration]) + // Add message handler for subscription confirmation + const handleMessage = useCallback((e: MessageEvent) => { + const message: ExtensionMessage = e.data + if (message.type === "emailSubscribed") { + setIsSubscribed(true) + setEmail("") + } + }, []) + + useEvent("message", handleMessage) + return (
{ left: 0, right: 0, bottom: 0, - padding: "0 20px", }}> -

{t("greeting")}

-

- - ), - }} - /> -

+
+

{t("greeting")}

- {t("getStarted")} +
+ +
-
- - - - {t("letsGo")} - +

+ + ), + }} + /> +

+ + {t("getStarted")} + +
+ {isSubscribed ? ( +

+ + Thanks for subscribing! We'll keep you updated on new features. +

+ ) : ( + <> +

+ While Cline currently requires you bring your own API key, we are working on an official accounts + system with additional capabilities. Subscribe to our mailing list to get updates! +

+
+ setEmail(e.target.value)} + placeholder="Enter your email" + style={{ flex: 1 }} + /> + + Subscribe + +
+ + )} +
+ +
+ + + {t("letsGo")} + +
) From 7380d77ef321979b062ef5b8e831c243a2a4aa59 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Mon, 27 Jan 2025 17:46:11 -0800 Subject: [PATCH 17/74] Revert OpenAI model picker --- .../src/components/settings/ApiOptions.tsx | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 4451dda4bf..350cb1c7e0 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -8,7 +8,10 @@ import { VSCodeTextField, } from "@vscode/webview-ui-toolkit/react" import { Fragment, memo, useCallback, useEffect, useMemo, useState } from "react" +import { Trans, useTranslation } from "react-i18next" import { useEvent, useInterval } from "react-use" +import styled from "styled-components" +import * as vscodemodels from "vscode" import { ApiConfiguration, ApiProvider, @@ -32,16 +35,11 @@ import { vertexDefaultModelId, vertexModels, } from "../../../../src/shared/api" -import { useTranslation } from "react-i18next" -import { Trans } from "react-i18next" import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" import { useExtensionState } from "../../context/ExtensionStateContext" import { vscode } from "../../utils/vscode" import VSCodeButtonLink from "../common/VSCodeButtonLink" -import styled from "styled-components" -import * as vscodemodels from "vscode" -import OpenRouterModelPicker, { ModelDescriptionMarkdown, OPENROUTER_MODEL_PICKER_Z_INDEX } from "./OpenRouterModelPicker" -import OpenAiModelPicker from "./OpenAiModelPicker" +import OpenRouterModelPicker, { ModelDescriptionMarkdown } from "./OpenRouterModelPicker" interface ApiOptionsProps { showModelOptions: boolean @@ -169,7 +167,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is id="api-provider" value={selectedProvider} onChange={handleInputChange("apiProvider")} - style={{ minWidth: 130, position: "relative", zIndex: OPENROUTER_MODEL_PICKER_Z_INDEX + 1 }}> + style={{ minWidth: 130, position: "relative" }}> OpenRouter Anthropic Google Gemini @@ -534,8 +532,13 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is placeholder={t("enterApiKey")}> {t("apiKey")} - {t("model")} - + + {t("modelId")} + { From bb967128b825aa478be350cb0a67a58dac47ea7c Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:14:05 -0800 Subject: [PATCH 18/74] Fix copy for mcp settings --- package.json | 16 ++++++++-------- src/core/prompts/system.ts | 14 +++++++------- src/services/mcp/McpHub.ts | 2 +- src/shared/mcp.ts | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index c5018ffd14..c7b95a1fec 100644 --- a/package.json +++ b/package.json @@ -145,22 +145,22 @@ "cline.mcp.mode": { "type": "string", "enum": [ - "enabled", - "mcp-tools-only", - "disabled" + "full", + "server-use-only", + "off" ], "enumDescriptions": [ - "Full MCP functionality including server use and build instructions", - "Enable MCP server use but exclude build instructions from AI prompts to save tokens", + "Enable all MCP functionality (server use and build instructions)", + "Enable MCP server use only (excludes instructions about building MCP servers)", "Disable all MCP functionality" ], - "default": "enabled", - "description": "Control MCP server functionality and its inclusion in AI prompts. When disabled, Cline will not be aware of MCP capabilities, saving model context window tokens." + "default": "full", + "description": "Controls MCP inclusion in prompts, reduces token usage if you only need access to certain functionality." }, "cline.enableCheckpoints": { "type": "boolean", "default": true, - "description": "Enable checkpoint creation during task execution" + "description": "Enables extension to save checkpoints of workspace throughout the task." } } } diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index 213ce107a3..3c26f70d75 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -178,7 +178,7 @@ Usage: } ${ - mcpHub.getMode() !== "disabled" + mcpHub.getMode() !== "off" ? ` ## use_mcp_tool Description: Request to use a tool provided by a connected MCP server. Each MCP server can provide multiple tools with different capabilities. Tools have defined input schemas that specify required and optional parameters. @@ -310,7 +310,7 @@ return ( ${ - mcpHub.getMode() !== "disabled" + mcpHub.getMode() !== "off" ? ` ## Example 4: Requesting to use an MCP tool @@ -357,7 +357,7 @@ It is crucial to proceed step-by-step, waiting for the user's message after each By waiting for and carefully considering the user's response after each tool use, you can react accordingly and make informed decisions about how to proceed with the task. This iterative process helps ensure the overall success and accuracy of your work. ${ - mcpHub.getMode() !== "disabled" + mcpHub.getMode() !== "off" ? ` ==== @@ -410,7 +410,7 @@ ${ } ${ - mcpHub.getMode() === "enabled" + mcpHub.getMode() === "full" ? ` ## Creating an MCP Server @@ -887,7 +887,7 @@ CAPABILITIES : "" } ${ - mcpHub.getMode() !== "disabled" + mcpHub.getMode() !== "off" ? ` - You have access to MCP servers that may provide additional tools and resources. Each server may provide different capabilities that you can use to accomplish tasks more effectively. ` @@ -913,7 +913,7 @@ RULES - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation.${ supportsComputerUse - ? `\n- The user may ask generic non-development tasks, such as "what\'s the latest news" or "look up the weather in San Diego", in which case you might use the browser_action tool to complete the task if it makes sense to do so, rather than trying to create a website or using curl to answer the question.${mcpHub.getMode() !== "disabled" ? "However, if an available MCP server tool or resource can be used instead, you should prefer to use it over browser_action." : ""}` + ? `\n- The user may ask generic non-development tasks, such as "what\'s the latest news" or "look up the weather in San Diego", in which case you might use the browser_action tool to complete the task if it makes sense to do so, rather than trying to create a website or using curl to answer the question.${mcpHub.getMode() !== "off" ? "However, if an available MCP server tool or resource can be used instead, you should prefer to use it over browser_action." : ""}` : "" } - NEVER end attempt_completion result with a question or request to engage in further conversation! Formulate the end of your result in a way that is final and does not require further input from the user. @@ -929,7 +929,7 @@ RULES : "" } ${ - mcpHub.getMode() !== "disabled" + mcpHub.getMode() !== "off" ? ` - MCP operations should be used one at a time, similar to other tool usage. Wait for confirmation of success before proceeding with additional operations. ` diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index ab58b18582..9c6fee3a56 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -68,7 +68,7 @@ export class McpHub { } getMode(): McpMode { - return vscode.workspace.getConfiguration("cline.mcp").get("mode", "enabled") + return vscode.workspace.getConfiguration("cline.mcp").get("mode", "full") } async getMcpServersPath(): Promise { diff --git a/src/shared/mcp.ts b/src/shared/mcp.ts index 863a93201b..a8ae7f70f6 100644 --- a/src/shared/mcp.ts +++ b/src/shared/mcp.ts @@ -1,4 +1,4 @@ -export type McpMode = "enabled" | "mcp-tools-only" | "disabled" +export type McpMode = "full" | "server-use-only" | "off" export type McpServer = { name: string From f9bc6f3446762c7773ed785c922405335b2c67eb Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:30:59 -0800 Subject: [PATCH 19/74] Fix READMEs --- README.md | 11 ++++------- locales/de/README.md | 7 +------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d6c3213d85..669421ab13 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ + + # Cline – \#1 on OpenRouter

@@ -28,13 +32,6 @@ Meet Cline, an AI assistant that can use your **CLI** a**N**d **E**ditor. -Other language [README files](./README.md) are available in: -- [Español](./locales/es/README.md) -- [Deutsch](./locales/de/README.md) -- [日本語](./locales/ja/README.md) -- [简体中文](./locales/zh-cn/README.md) -- [繁體中文](./locales/zh-tw/README.md) - Thanks to [Claude 3.5 Sonnet's agentic coding capabilities](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf), Cline can handle complex software development tasks step-by-step. With tools that let him create & edit files, explore large projects, use the browser, and execute terminal commands (after you grant permission), he can assist you in ways that go beyond code completion or tech support. Cline can even use the Model Context Protocol (MCP) to create new tools and extend his own capabilities. While autonomous AI scripts traditionally run in sandboxed environments, this extension provides a human-in-the-loop GUI to approve every file change and terminal command, providing a safe and accessible way to explore the potential of agentic AI. 1. Enter your task and add images to convert mockups into functional apps or fix bugs with screenshots. diff --git a/locales/de/README.md b/locales/de/README.md index 9f875585c6..a1e81263fc 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -26,12 +26,7 @@

-Andere Sprachversionen der [README-Dateien](./README.md) sind verfügbar in: -- [Español](./locales/es/README.md) -- [Deutsch](./locales/de/README.md) -- [日本語](./locales/ja/README.md) -- [简体中文](./locales/zh-cn/README.md) -- [繁體中文](./locales/zh-tw/README.md) +Lernen Sie Cline kennen, einen KI-Assistenten, der Ihre **CLI** u**N**d **E**ditor nutzen kann. Dank der [agentischen Codierungsfähigkeiten von Claude 3.5 Sonnet](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf) kann Cline komplexe Softwareentwicklungsaufgaben Schritt für Schritt bewältigen. Mit Werkzeugen, die ihm das Erstellen und Bearbeiten von Dateien, das Erkunden großer Projekte, die Nutzung des Browsers und das Ausführen von Terminalbefehlen (nach Ihrer Genehmigung) ermöglichen, kann er Ihnen auf eine Weise helfen, die über die Codevervollständigung oder technischen Support hinausgeht. Cline kann sogar das Model Context Protocol (MCP) verwenden, um neue Werkzeuge zu erstellen und seine eigenen Fähigkeiten zu erweitern. Während autonome KI-Skripte traditionell in sandboxed Umgebungen laufen, bietet diese Erweiterung eine Mensch-in-der-Schleife-GUI, um jede Dateiänderung und jeden Terminalbefehl zu genehmigen, was eine sichere und zugängliche Möglichkeit bietet, das Potenzial agentischer KI zu erkunden. From e8c649a21562172ce98b9ce803af684a96009746 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:34:37 -0800 Subject: [PATCH 20/74] Prepare for release --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b37724af2..3c003c7ece 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## [3.2.6] + +- Save last used API/model when switching between Plan and Act, for users that like to use different models for each mode +- Localize READMEs and add language selector for English, Spanish, German, Chinese, and Japanese +- Add Advanced Settings to remove MCP prompts from requests to save tokens, enable/disable checkpoints for users that don't use git (more coming soon!) +- Add Gemini 2.0 Flash Thinking experimental model +- Allow new users to subscribe to mailing list to get notified when new Accounts option is available + ## [3.2.5] - Use yellow textfield outline in Plan mode to better distinguish from Act mode diff --git a/package.json b/package.json index c7b95a1fec..ab5612ae1f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "claude-dev", "displayName": "Cline", "description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.", - "version": "3.2.5", + "version": "3.2.6", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 971489990cc310904ad51d6a01c684ae460d63e5 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:15:35 -0800 Subject: [PATCH 21/74] Fix language persistence across sessions; update system prompt for non-english languages --- src/core/Cline.ts | 18 +++++++++++++-- src/core/prompts/system.ts | 10 +++++++- src/core/webview/ClineProvider.ts | 23 ++++++++++++++++--- src/shared/WebviewMessage.ts | 1 + .../components/settings/LanguageOptions.tsx | 7 +++++- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 947a5fae6f..6c0f6beff3 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -75,6 +75,7 @@ export class Cline { browserSession: BrowserSession private didEditFile: boolean = false customInstructions?: string + localeLanguage?: string autoApprovalSettings: AutoApprovalSettings private browserSettings: BrowserSettings private chatSettings: ChatSettings @@ -119,6 +120,7 @@ export class Cline { browserSettings: BrowserSettings, chatSettings: ChatSettings, customInstructions?: string, + localeLanguage?: string, task?: string, images?: string[], historyItem?: HistoryItem, @@ -130,6 +132,7 @@ export class Cline { this.browserSession = new BrowserSession(provider.context, browserSettings) this.diffViewProvider = new DiffViewProvider(cwd) this.customInstructions = customInstructions + this.localeLanguage = localeLanguage this.autoApprovalSettings = autoApprovalSettings this.browserSettings = browserSettings this.chatSettings = chatSettings @@ -1212,6 +1215,13 @@ export class Cline { this.browserSettings, ) + let userSelectedNonEnglishLanguage: string | undefined + // While we check vscode for preferred language, it's likely not giving us one of the language options + console.log("this.localeLanguage", this.localeLanguage) + if (this.localeLanguage && this.localeLanguage !== "en") { + userSelectedNonEnglishLanguage = this.localeLanguage + } + let settingsCustomInstructions = this.customInstructions?.trim() const clineRulesFilePath = path.resolve(cwd, GlobalFileNames.clineRules) let clineRulesFileInstructions: string | undefined @@ -1226,9 +1236,13 @@ export class Cline { } } - if (settingsCustomInstructions || clineRulesFileInstructions) { + if (settingsCustomInstructions || clineRulesFileInstructions || userSelectedNonEnglishLanguage) { // altering the system prompt mid-task will break the prompt cache, but in the grand scheme this will not change often so it's better to not pollute user messages with it the way we have to with - systemPrompt += addUserInstructions(settingsCustomInstructions, clineRulesFileInstructions) + systemPrompt += addUserInstructions( + settingsCustomInstructions, + clineRulesFileInstructions, + userSelectedNonEnglishLanguage, + ) } // If the previous API request's total token usage is close to the context window, truncate the conversation history to free up space for the new request diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index 3c26f70d75..8ef7d89a9c 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -957,8 +957,16 @@ You accomplish a given task iteratively, breaking it down into clear steps and w 4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built. 5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance.` -export function addUserInstructions(settingsCustomInstructions?: string, clineRulesFileInstructions?: string) { +export function addUserInstructions( + settingsCustomInstructions?: string, + clineRulesFileInstructions?: string, + chosenLanguage?: string, +) { let customInstructions = "" + if (chosenLanguage) { + // Will only be provided for non-english languages + customInstructions += `Speak in this language: ${chosenLanguage}.` + "\n\n" + } if (settingsCustomInstructions) { customInstructions += settingsCustomInstructions + "\n\n" } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 4021d6bccf..3f1acb9a2d 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -244,7 +244,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { async initClineWithTask(task?: string, images?: string[]) { await this.clearTask() // ensures that an exising task doesn't exist before starting a new one, although this shouldn't be possible since user must clear task before starting a new one - const { apiConfiguration, customInstructions, autoApprovalSettings, browserSettings, chatSettings } = + const { apiConfiguration, customInstructions, localeLanguage, autoApprovalSettings, browserSettings, chatSettings } = await this.getState() this.cline = new Cline( this, @@ -253,6 +253,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { browserSettings, chatSettings, customInstructions, + localeLanguage, task, images, ) @@ -260,7 +261,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { async initClineWithHistoryItem(historyItem: HistoryItem) { await this.clearTask() - const { apiConfiguration, customInstructions, autoApprovalSettings, browserSettings, chatSettings } = + const { apiConfiguration, customInstructions, localeLanguage, autoApprovalSettings, browserSettings, chatSettings } = await this.getState() this.cline = new Cline( this, @@ -269,6 +270,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { browserSettings, chatSettings, customInstructions, + localeLanguage, undefined, undefined, historyItem, @@ -677,6 +679,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { } break } + case "changeLanguage": { + await this.updateLocaleLanguage(message.text) + break + } case "restartMcpServer": { try { await this.mcpHub?.restartConnection(message.text!) @@ -770,6 +776,14 @@ export class ClineProvider implements vscode.WebviewViewProvider { await this.postStateToWebview() } + async updateLocaleLanguage(language?: string) { + await this.updateGlobalState("localeLanguage", language || undefined) + if (this.cline) { + this.cline.localeLanguage = language || undefined + } + await this.postStateToWebview() + } + // MCP async getDocumentsPath(): Promise { @@ -1184,6 +1198,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { browserSettings, chatSettings, userInfo, + localeLanguage, } = await this.getState() const authToken = await this.getSecret("authToken") @@ -1200,7 +1215,8 @@ export class ClineProvider implements vscode.WebviewViewProvider { autoApprovalSettings, browserSettings, chatSettings, - localeLanguage: vscode.env.language, + // FIXME: the vscode.env.language doesn't translate to the language specifiers we use in i18n. We need to know what values vscode uses and transform. For now this will always just lead to defaulting to English (see i18n.ts) + localeLanguage: localeLanguage || vscode.env.language, isLoggedIn: !!authToken, userInfo, } @@ -1382,6 +1398,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { autoApprovalSettings: autoApprovalSettings || DEFAULT_AUTO_APPROVAL_SETTINGS, // default value can be 0 or empty string browserSettings: browserSettings || DEFAULT_BROWSER_SETTINGS, chatSettings: chatSettings || DEFAULT_CHAT_SETTINGS, + localeLanguage, userInfo, } } diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index a18a3c405a..bf20145498 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -42,6 +42,7 @@ export interface WebviewMessage { | "accountLoginClicked" | "accountLogoutClicked" | "subscribeEmail" + | "changeLanguage" // | "relaunchChromeDebugMode" text?: string disabled?: boolean diff --git a/webview-ui/src/components/settings/LanguageOptions.tsx b/webview-ui/src/components/settings/LanguageOptions.tsx index 8d66231728..f06b4fa5d1 100644 --- a/webview-ui/src/components/settings/LanguageOptions.tsx +++ b/webview-ui/src/components/settings/LanguageOptions.tsx @@ -1,13 +1,18 @@ import { VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react" import { memo } from "react" import { useTranslation } from "react-i18next" +import { vscode } from "../../utils/vscode" const LanguageOptions = () => { const { t, i18n } = useTranslation("translation", { keyPrefix: "settingsView", useSuspense: false }) const changeLanguage = (e: any) => { const language = e.target.value - i18n.changeLanguage(language) + // i18n.changeLanguage(language) + vscode.postMessage({ + type: "changeLanguage", + text: language, + }) } return ( From b181007509282482dfb06960444dfa61dc1acd18 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:18:24 -0800 Subject: [PATCH 22/74] Remove log --- src/core/Cline.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 6c0f6beff3..c1c5bf186a 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1217,7 +1217,6 @@ export class Cline { let userSelectedNonEnglishLanguage: string | undefined // While we check vscode for preferred language, it's likely not giving us one of the language options - console.log("this.localeLanguage", this.localeLanguage) if (this.localeLanguage && this.localeLanguage !== "en") { userSelectedNonEnglishLanguage = this.localeLanguage } From 07d3f3798ce1d2f49bc450f033a7f38c505ab10c Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Tue, 28 Jan 2025 09:07:10 -0800 Subject: [PATCH 23/74] Change language size --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 669421ab13..b742fefcef 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ - # Cline – \#1 on OpenRouter From 21eddabc58cb80fc06b2710aa75374a12f763a7e Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Tue, 28 Jan 2025 08:35:01 -1000 Subject: [PATCH 24/74] fix:ja README update (#1512) * fix:ja README update * remove --- locales/ja/README.md | 95 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 16 deletions(-) diff --git a/locales/ja/README.md b/locales/ja/README.md index c9e3d131b8..399b3a9a98 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -1,4 +1,4 @@ -# Cline – OpenRouterでの\#1 +# Cline – OpenRouterでのナンバーワン

@@ -26,30 +26,30 @@

-Clineは、**CLI**と**エディタ**を使用できるAIアシスタントです。 +Clineは、**CLI**と**エディター**を使用できるAIアシスタントです。 -[Claude 3.5 Sonnetのエージェントコーディング機能](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf)のおかげで、Clineは複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成と編集、大規模プロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可後)などのツールを使用して、コード補完や技術サポートを超えた支援を提供します。Clineは、Model Context Protocol (MCP)を使用して新しいツールを作成し、自身の機能を拡張することもできます。従来の自律型AIスクリプトはサンドボックス環境で実行されますが、この拡張機能はファイル変更やターミナルコマンドを承認するための人間のインターフェースを提供し、エージェントAIの可能性を安全かつアクセスしやすい方法で探求できます。 +[Claude 3.5 Sonnetのエージェント的コーディング機能](https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf)のおかげで、Clineは複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成と編集、大規模プロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可後)などのツールを使用して、コード補完や技術サポートを超えた支援を提供します。Clineは、Model Context Protocol (MCP)を使用して新しいツールを作成し、自身の機能を拡張することもできます。自律的なAIスクリプトは通常サンドボックス環境で実行されますが、この拡張機能はファイル変更やターミナルコマンドを承認するための人間インターフェースを提供し、エージェント的AIの可能性を安全かつアクセスしやすい方法で探求できます。 -1. タスクを入力し、モックアップを機能するアプリに変換するための画像やバグ修正のスクリーンショットを追加します。 -2. Clineはファイル構造とソースコードASTを分析し、正規表現検索を実行し、関連ファイルを読み取って既存プロジェクトに精通します。コンテキストに追加される情報を慎重に管理することで、大規模で複雑なプロジェクトでもコンテキストウィンドウを圧倒することなく貴重な支援を提供できます。 +1. タスクを入力し、モックアップを機能するアプリに変換したり、スクリーンショットでバグを修正したりします。 +2. Clineは、ファイル構造とソースコードASTの分析、正規表現検索の実行、関連ファイルの読み取りから始め、既存プロジェクトに精通します。コンテキストに追加される情報を慎重に管理することで、大規模で複雑なプロジェクトでもコンテキストウィンドウを圧倒することなく貴重な支援を提供できます。 3. Clineが必要な情報を取得すると、次のことができます: - - ファイルの作成と編集 + リンター/コンパイラーエラーの監視を行い、欠落しているインポートや構文エラーなどの問題を自動的に修正します。 - - ターミナルでコマンドを直接実行し、その出力を監視しながら作業を進め、ファイル編集後の開発サーバーの問題に対応します。 - - ウェブ開発タスクでは、サイトをヘッドレスブラウザで起動し、クリック、入力、スクロール、スクリーンショットのキャプチャ + コンソールログを取得し、ランタイムエラーや視覚的なバグを修正します。 + - ファイルの作成と編集 + リンター/コンパイラーエラーの監視を行い、欠落したインポートや構文エラーなどの問題を自動的に修正します。 + - ターミナルでコマンドを直接実行し、作業中に出力を監視します。これにより、ファイル編集後の開発サーバーの問題に対応できます。 + - ウェブ開発タスクでは、ヘッドレスブラウザでサイトを起動し、クリック、入力、スクロール、スクリーンショットとコンソールログのキャプチャを行い、ランタイムエラーや視覚的なバグを修正します。 4. タスクが完了すると、Clineは`open -a "Google Chrome" index.html`のようなターミナルコマンドを提示し、ボタンをクリックして実行できます。 > [!TIP] -> `CMD/CTRL + Shift + P`ショートカットを使用してコマンドパレットを開き、「Cline: Open In New Tab」と入力して拡張機能をエディタのタブとして開きます。これにより、ファイルエクスプローラーと並行してClineを使用し、ワークスペースの変更をより明確に確認できます。 +> `CMD/CTRL + Shift + P`ショートカットを使用してコマンドパレットを開き、「Cline: Open In New Tab」と入力して、エディターのタブとして拡張機能を開きます。これにより、ファイルエクスプローラーと並行してClineを使用し、ワークスペースの変更をより明確に確認できます。 --- -### 任意のAPIとモデルを使用 +### どのAPIやモデルでも使用可能 Clineは、OpenRouter、Anthropic、OpenAI、Google Gemini、AWS Bedrock、Azure、GCP VertexなどのAPIプロバイダーをサポートしています。また、OpenAI互換のAPIを設定したり、LM Studio/Ollamaを通じてローカルモデルを使用することもできます。OpenRouterを使用している場合、拡張機能は最新のモデルリストを取得し、最新のモデルをすぐに使用できるようにします。 -拡張機能は、タスクループ全体と個々のリクエストのトークン総数とAPI使用コストを追跡し、各ステップでの支出を把握できます。 +拡張機能は、タスクループ全体と個々のリクエストのトークン総数とAPI使用コストを追跡し、各ステップで支出を把握できます。 @@ -59,7 +59,7 @@ Clineは、OpenRouter、Anthropic、OpenAI、Google Gemini、AWS Bedrock、Azure ### ターミナルでコマンドを実行 -VSCode v1.93の新しい[シェル統合アップデート](https://code.visualstudio.com/updates/v1_93#_terminal-shell-integration-api)のおかげで、Clineはターミナルでコマンドを直接実行し、出力を受け取ることができます。これにより、パッケージのインストールやビルドスクリプトの実行、アプリケーションのデプロイ、データベースの管理、テストの実行など、幅広いタスクを実行できます。Clineは、開発環境とツールチェーンに適応しながら、タスクを正確に完了します。 +VSCode v1.93の新しい[シェル統合アップデート](https://code.visualstudio.com/updates/v1_93#_terminal-shell-integration-api)のおかげで、Clineはターミナルでコマンドを直接実行し、出力を受け取ることができます。これにより、パッケージのインストールやビルドスクリプトの実行からアプリケーションのデプロイ、データベースの管理、テストの実行まで、幅広いタスクを実行できます。Clineは、開発環境とツールチェーンに適応して、タスクを正確に実行します。 開発サーバーのような長時間実行されるプロセスの場合、「実行中に続行」ボタンを使用して、コマンドがバックグラウンドで実行されている間にClineがタスクを続行できるようにします。Clineが作業を進める中で、新しいターミナル出力が通知され、ファイル編集時のコンパイルエラーなどの問題に対応できます。 @@ -71,9 +71,9 @@ VSCode v1.93の新しい[シェル統合アップデート](https://code.visuals ### ファイルの作成と編集 -Clineはエディタ内でファイルを作成および編集し、変更の差分ビューを提示します。差分ビューエディタでClineの変更を編集または元に戻すことができ、チャットでフィードバックを提供して満足するまで調整できます。Clineはリンター/コンパイラーエラー(欠落しているインポート、構文エラーなど)も監視し、発生した問題を自動的に修正します。 +Clineはエディター内でファイルを作成および編集し、変更の差分ビューを提示します。差分ビューエディターでClineの変更を直接編集または元に戻すことができ、チャットでフィードバックを提供して満足するまで調整できます。Clineはリンター/コンパイラーエラー(欠落したインポート、構文エラーなど)も監視し、発生した問題を自動的に修正します。 -Clineによるすべての変更はファイルのタイムラインに記録され、必要に応じて変更を追跡および元に戻すための簡単な方法を提供します。 +Clineによるすべての変更はファイルのタイムラインに記録され、必要に応じて変更を追跡および元に戻す簡単な方法を提供します。 @@ -83,7 +83,7 @@ Clineによるすべての変更はファイルのタイムラインに記録さ ### ブラウザの使用 -Claude 3.5 Sonnetの新しい[コンピュータ使用](https://www.anthropic.com/news/3-5-models-and-computer-use)機能により、Clineはブラウザを起動し、要素をクリックし、テキストを入力し、スクロールし、各ステップでスクリーンショットとコンソールログをキャプチャできます。これにより、インタラクティブなデバッグ、エンドツーエンドテスト、さらには一般的なウェブ使用が可能になります。これにより、エラーログを手動でコピー&ペーストすることなく、視覚的なバグやランタイムの問題を自律的に修正できます。 +Claude 3.5 Sonnetの新しい[コンピュータ使用](https://www.anthropic.com/news/3-5-models-and-computer-use)機能により、Clineはブラウザを起動し、要素をクリック、テキストを入力、スクロールし、各ステップでスクリーンショットとコンソールログをキャプチャできます。これにより、インタラクティブなデバッグ、エンドツーエンドテスト、さらには一般的なウェブ使用が可能になります。これにより、エラーログを手動でコピー&ペーストすることなく、視覚的なバグやランタイムの問題を自律的に修正できます。 Clineに「アプリをテストして」と頼んでみてください。彼は`npm run dev`のようなコマンドを実行し、ローカルで実行中の開発サーバーをブラウザで起動し、一連のテストを実行してすべてが正常に動作することを確認します。[デモはこちら。](https://x.com/sdrzn/status/1850880547825823989) @@ -95,4 +95,67 @@ Clineに「アプリをテストして」と頼んでみてください。彼は ### 「ツールを追加して...」 -[Model Context Protocol](https://github.com/modelcontextprotocol)のおかげで、Clineはカスタムツールを通じて機能を拡張できます。[コミュニティ製サーバー](https://github.co \ No newline at end of file +[Model Context Protocol](https://github.com/modelcontextprotocol)のおかげで、Clineはカスタムツールを通じて機能を拡張できます。[コミュニティ製サーバー](https://github.com/modelcontextprotocol/servers)を使用することもできますが、Clineは代わりに特定のワークフローに合わせたツールを作成してインストールできます。「ツールを追加して」と頼むだけで、Clineは新しいMCPサーバーの作成から拡張機能へのインストールまでをすべて処理します。これらのカスタムツールはClineのツールキットの一部となり、将来のタスクで使用できるようになります。 + +- 「Jiraチケットを取得するツールを追加して」:チケットACを取得し、Clineに作業を依頼 +- 「AWS EC2を管理するツールを追加して」:サーバーメトリクスを確認し、インスタンスをスケールアップまたはダウン +- 「最新のPagerDutyインシデントを取得するツールを追加して」:詳細を取得し、Clineにバグ修正を依頼 + + + +
+ + + +### コンテキストを追加 + +**`@url`:** 最新のドキュメントをClineに提供したい場合に、URLを貼り付けて拡張機能が取得し、Markdownに変換します。 + +**`@problems`:** Clineが修正するためのワークスペースエラーと警告(「問題」パネル)を追加します。 + +**`@file`:** ファイルの内容を追加し、読み取りファイルを承認するAPIリクエストを節約します(+ファイルを検索して入力)。 + +**`@folder`:** フォルダーのファイルを一度に追加して、ワークフローをさらにスピードアップします。 + + + +
+ + + +### チェックポイント:比較と復元 + +Clineがタスクを進める中で、拡張機能は各ステップでワークスペースのスナップショットを撮ります。「比較」ボタンを使用してスナップショットと現在のワークスペースの差分を確認し、「復元」ボタンを使用してそのポイントにロールバックできます。 + +たとえば、ローカルウェブサーバーで作業している場合、「ワークスペースのみを復元」を使用して異なるバージョンのアプリを迅速にテストし、「タスクとワークスペースを復元」を使用して続行したいバージョンを見つけたときに使用します。これにより、進行状況を失うことなく異なるアプローチを安全に探求できます。 + + + +
+ +## 貢献 + +プロジェクトに貢献するには、[貢献ガイド](CONTRIBUTING.md)から基本を学び始めてください。また、[Discord](https://discord.gg/cline)に参加して、`#contributors`チャンネルで他の貢献者とチャットすることもできます。フルタイムの仕事を探している場合は、[採用ページ](https://cline.bot/join-us)でオープンポジションを確認してください。 + +
+ローカル開発の手順 + +1. リポジトリをクローンします _(Requires [git-lfs](https://git-lfs.com/))_: + ```bash + git clone https://github.com/cline/cline.git + ``` +2. プロジェクトをVSCodeで開きます: + ```bash + code cline + ``` +3. 拡張機能とwebview-guiの必要な依存関係をインストールします: + ```bash + npm run install:all + ``` +4. `F5`を押して(または`Run`->`Start Debugging`)、拡張機能が読み込まれた新しいVSCodeウィンドウを開きます。(プロジェクトのビルドに問題がある場合は、[esbuild problem matchers extension](https://marketplace.visualstudio.com/items?itemName=connor4312.esbuild-problem-matchers)をインストールする必要があるかもしれません。) + +
+ +## ライセンス + +[Apache 2.0 © 2024 Cline Bot Inc.](./LICENSE) From d5fc9d7eb2b4aba82156a1d034d2ba4aa8326466 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Tue, 28 Jan 2025 08:35:38 -1000 Subject: [PATCH 25/74] un-translate version "v" (#1513) --- webview-ui/src/components/settings/SettingsView.tsx | 2 +- webview-ui/src/locales/de/translation.json | 3 +-- webview-ui/src/locales/en/translation.json | 3 +-- webview-ui/src/locales/es/translation.json | 3 +-- webview-ui/src/locales/ja/translation.json | 3 +-- webview-ui/src/locales/zh-cn/translation.json | 3 +-- webview-ui/src/locales/zh-tw/translation.json | 3 +-- 7 files changed, 7 insertions(+), 13 deletions(-) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 16707bae3f..ae7ee4e99e 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -179,7 +179,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => { margin: "10px 0 0 0", padding: 0, }}> - {t("version")} {version} + v{version}

diff --git a/webview-ui/src/locales/de/translation.json b/webview-ui/src/locales/de/translation.json index 921469994a..6173e57c38 100644 --- a/webview-ui/src/locales/de/translation.json +++ b/webview-ui/src/locales/de/translation.json @@ -13,8 +13,7 @@ "debug": "Debuggen", "resetState": "Zustand zurücksetzen", "resetStateDescription": "Dies setzt den gesamten globalen Zustand und die geheime Speicherung in der Erweiterung zurück.", - "feedback": "Wenn Sie Fragen oder Feedback haben, können Sie gerne ein Issue eröffnen unter", - "version": "v" + "feedback": "Wenn Sie Fragen oder Feedback haben, können Sie gerne ein Issue eröffnen unter" }, "apiOptions": { "selectModel": "Modell auswählen...", diff --git a/webview-ui/src/locales/en/translation.json b/webview-ui/src/locales/en/translation.json index 0578d51c48..1f29b62ee8 100644 --- a/webview-ui/src/locales/en/translation.json +++ b/webview-ui/src/locales/en/translation.json @@ -13,8 +13,7 @@ "debug": "Debug", "resetState": "Reset State", "resetStateDescription": "This will reset all global state and secret storage in the extension.", - "feedback": "If you have any questions or feedback, feel free to open an issue at", - "version": "v" + "feedback": "If you have any questions or feedback, feel free to open an issue at" }, "apiOptions": { "selectModel": "Select a Model...", diff --git a/webview-ui/src/locales/es/translation.json b/webview-ui/src/locales/es/translation.json index df3f5e4eea..f63e893597 100644 --- a/webview-ui/src/locales/es/translation.json +++ b/webview-ui/src/locales/es/translation.json @@ -13,8 +13,7 @@ "debug": "Depurar", "resetState": "Restablecer estado", "resetStateDescription": "Esto restablecerá todo el estado global y el almacenamiento secreto en la extensión.", - "feedback": "Si tienes preguntas o comentarios, no dudes en abrir un issue en", - "version": "v" + "feedback": "Si tienes preguntas o comentarios, no dudes en abrir un issue en" }, "apiOptions": { "selectModel": "Seleccionar modelo...", diff --git a/webview-ui/src/locales/ja/translation.json b/webview-ui/src/locales/ja/translation.json index 353979f572..4586809879 100644 --- a/webview-ui/src/locales/ja/translation.json +++ b/webview-ui/src/locales/ja/translation.json @@ -13,8 +13,7 @@ "debug": "デバッグ", "resetState": "状態をリセット", "resetStateDescription": "拡張機能のすべてのグローバル状態とシークレットストレージがリセットされます。", - "feedback": "ご質問やフィードバックがある場合は、ご自由にイシューを作成してください。", - "version": "バージョン" + "feedback": "ご質問やフィードバックがある場合は、ご自由にイシューを作成してください。" }, "apiOptions": { "selectModel": "モデルを選択...", diff --git a/webview-ui/src/locales/zh-cn/translation.json b/webview-ui/src/locales/zh-cn/translation.json index 5faed68afa..4045c6a8c4 100644 --- a/webview-ui/src/locales/zh-cn/translation.json +++ b/webview-ui/src/locales/zh-cn/translation.json @@ -13,8 +13,7 @@ "debug": "调试", "resetState": "重置状态", "resetStateDescription": "这将重置扩展中的所有全局状态和秘密存储。", - "feedback": "如果您有任何问题或反馈,请随时在以下网址提交问题", - "version": "版本" + "feedback": "如果您有任何问题或反馈,请随时在以下网址提交问题" }, "apiOptions": { "selectModel": "选择模型...", diff --git a/webview-ui/src/locales/zh-tw/translation.json b/webview-ui/src/locales/zh-tw/translation.json index 1245b4d343..89cdc8b5fd 100644 --- a/webview-ui/src/locales/zh-tw/translation.json +++ b/webview-ui/src/locales/zh-tw/translation.json @@ -13,8 +13,7 @@ "debug": "調試", "resetState": "重置狀態", "resetStateDescription": "這將重置擴展中的所有全局狀態和秘密存儲。", - "feedback": "如果您有任何問題或反饋,請隨時在以下網址提交問題", - "version": "版本" + "feedback": "如果您有任何問題或反饋,請隨時在以下網址提交問題" }, "apiOptions": { "selectModel": "選擇模型...", From 97b37640639a30922d56fd010bb6a9a68f0498ef Mon Sep 17 00:00:00 2001 From: Mark Percival Date: Tue, 28 Jan 2025 16:28:57 -0500 Subject: [PATCH 26/74] Chore: Add OVSX to the pre-release --- .github/workflows/prerelease-publish.yml | 5 ++--- .github/workflows/release.yml | 2 +- package.json | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/prerelease-publish.yml b/.github/workflows/prerelease-publish.yml index 863ab921c9..62ab66371e 100644 --- a/.github/workflows/prerelease-publish.yml +++ b/.github/workflows/prerelease-publish.yml @@ -72,9 +72,8 @@ jobs: OVSX_PAT: ${{ secrets.OVSX_PAT }} run: | current_package_version=$(node -p "require('./package.json').version") - vsce package - vsce publish --pre-release -p ${{ secrets.VSCE_PAT }} - echo "Successfully published pre-release version $current_package_version to VS Code Marketplace" + npm run publish:marketplace:prerelease + echo "Successfully published pre-release version $current_package_version to VS Code Marketplace and Open VSX Registry" - name: Create GitHub Pre-release uses: softprops/action-gh-release@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1ae76f18ad..09c0c4eedf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -72,7 +72,7 @@ jobs: run: | current_package_version=$(node -p "require('./package.json').version") npm run publish:marketplace - echo "Successfully published version $current_package_version to VS Code Marketplace" + echo "Successfully published version $current_package_version to VS Code Marketplace and Open VSX Registry" - name: Create GitHub Release uses: softprops/action-gh-release@v1 diff --git a/package.json b/package.json index ab5612ae1f..ec56603bc3 100644 --- a/package.json +++ b/package.json @@ -185,6 +185,7 @@ "build:webview": "cd webview-ui && npm run build", "test:webview": "cd webview-ui && npm run test", "publish:marketplace": "vsce publish && ovsx publish", + "publish:marketplace:prerelease": "vsce publish --pre-release && ovsx publish --pre-release", "prepare": "husky" }, "devDependencies": { From fc5d0bdb5a449feeb21ea2f99aa1d65b8fe6e6aa Mon Sep 17 00:00:00 2001 From: Evan Fannin <58194240+evan-fannin@users.noreply.github.com> Date: Wed, 29 Jan 2025 06:45:13 +0800 Subject: [PATCH 27/74] Add simple backend logging service (#1517) * formatting * inefficient import * remove redundant initialization check --- src/extension.ts | 10 ++++++---- src/services/logging/Logger.ts | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/services/logging/Logger.ts diff --git a/src/extension.ts b/src/extension.ts index 1faee0133b..ed9cff31e9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,6 +3,7 @@ import delay from "delay" import * as vscode from "vscode" import { ClineProvider } from "./core/webview/ClineProvider" +import { Logger } from "./services/logging/Logger" import { createClineAPI } from "./exports" import "./utils/path" // necessary to have access to String.prototype.toPosix import { DIFF_VIEW_URI_SCHEME } from "./integrations/editor/DiffViewProvider" @@ -24,7 +25,8 @@ export function activate(context: vscode.ExtensionContext) { outputChannel = vscode.window.createOutputChannel("Cline") context.subscriptions.push(outputChannel) - outputChannel.appendLine("Cline extension activated") + Logger.initialize(outputChannel) + Logger.log("Cline extension activated") const sidebarProvider = new ClineProvider(context, outputChannel) @@ -36,7 +38,7 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( vscode.commands.registerCommand("cline.plusButtonClicked", async () => { - outputChannel.appendLine("Plus button Clicked") + Logger.log("Plus button Clicked") await sidebarProvider.clearTask() await sidebarProvider.postStateToWebview() await sidebarProvider.postMessageToWebview({ @@ -56,7 +58,7 @@ export function activate(context: vscode.ExtensionContext) { ) const openClineInNewTab = async () => { - outputChannel.appendLine("Opening Cline in new tab") + Logger.log("Opening Cline in new tab") // (this example uses webviewProvider activation event which is necessary to deserialize cached webview, but since we use retainContextWhenHidden, we don't need to use that event) // https://github.com/microsoft/vscode-extension-samples/blob/main/webview-sample/src/extension.ts const tabProvider = new ClineProvider(context, outputChannel) @@ -186,5 +188,5 @@ export function activate(context: vscode.ExtensionContext) { // This method is called when your extension is deactivated export function deactivate() { - outputChannel.appendLine("Cline extension deactivated") + Logger.log("Cline extension deactivated") } diff --git a/src/services/logging/Logger.ts b/src/services/logging/Logger.ts new file mode 100644 index 0000000000..0c94952ae6 --- /dev/null +++ b/src/services/logging/Logger.ts @@ -0,0 +1,18 @@ +import type { OutputChannel } from "vscode" + +/** + * Simple logging utility for the extension's backend code. + * Uses VS Code's OutputChannel which must be initialized from extension.ts + * to ensure proper registration with the extension context. + */ +export class Logger { + private static outputChannel: OutputChannel + + static initialize(outputChannel: OutputChannel) { + Logger.outputChannel = outputChannel + } + + static log(message: string) { + Logger.outputChannel.appendLine(message) + } +} From 907ad483710c1d5271e7d16cfa7f36a53a774fa9 Mon Sep 17 00:00:00 2001 From: vivek-kothandapani Date: Tue, 28 Jan 2025 17:57:51 -0500 Subject: [PATCH 28/74] fix: Diff Edit Failed --- src/core/Cline.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index c1c5bf186a..7a118d10a8 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1602,6 +1602,13 @@ export class Cline { diff = fixModelHtmlEscaping(diff) diff = removeInvalidChars(diff) } + + // open the editor if not done already. This is to fix diff error when model provides correct search-replace text but Cline throws error + // because file is not open. + if (!this.diffViewProvider.isEditing) { + await this.diffViewProvider.open(relPath) + } + try { newContent = await constructNewFileContent( diff, From c587c6f7ac6792bf2e2a2bf44e2c8c8fe673b654 Mon Sep 17 00:00:00 2001 From: vivek-kothandapani Date: Tue, 28 Jan 2025 18:14:56 -0500 Subject: [PATCH 29/74] format fix --- src/core/Cline.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 7a118d10a8..ec0a9b1bce 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1604,7 +1604,7 @@ export class Cline { } // open the editor if not done already. This is to fix diff error when model provides correct search-replace text but Cline throws error - // because file is not open. + // because file is not open. if (!this.diffViewProvider.isEditing) { await this.diffViewProvider.open(relPath) } From ac53dbb12209e0eb66c0036865273bf4694bc50a Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Tue, 28 Jan 2025 15:26:42 -0800 Subject: [PATCH 30/74] Persist provider/model between plan/act mode (#1525) Fix truncation algorithm Fix Fix --- src/core/Cline.ts | 6 ++ src/core/sliding-window/index.ts | 12 ++- src/core/webview/ClineProvider.ts | 82 ++++++++++++++++++- .../src/components/chat/ChatTextArea.tsx | 54 ++++++------ 4 files changed, 128 insertions(+), 26 deletions(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index c1c5bf186a..bbaa03d62a 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1272,10 +1272,16 @@ export class Cline { // This is the most reliable way to know when we're close to hitting the context window. if (totalTokens >= maxAllowedSize) { + // Since the user may switch between models with different context windows, truncating half may not be enough (ie if switching from claude 200k to deepseek 64k, half truncation will only remove 100k tokens, but we need to remove much more) + // So if totalTokens/2 is greater than maxAllowedSize, we truncate 3/4 instead of 1/2 + // FIXME: truncating the conversation in a way that is optimal for prompt caching AND takes into account multi-context window complexity is something we need to improve + const keep = totalTokens / 2 > maxAllowedSize ? "quarter" : "half" + // NOTE: it's okay that we overwriteConversationHistory in resume task since we're only ever removing the last user message and not anything in the middle which would affect this range this.conversationHistoryDeletedRange = getNextTruncationRange( this.apiConversationHistory, this.conversationHistoryDeletedRange, + keep, ) await this.saveClineMessages() // saves task history item which we use to keep track of conversation history deleted range // await this.overwriteApiConversationHistory(truncatedMessages) diff --git a/src/core/sliding-window/index.ts b/src/core/sliding-window/index.ts index 83b91eb381..45d4875bfd 100644 --- a/src/core/sliding-window/index.ts +++ b/src/core/sliding-window/index.ts @@ -55,13 +55,21 @@ truncated = getTruncatedMessages(messages, deletedRange); export function getNextTruncationRange( messages: Anthropic.Messages.MessageParam[], currentDeletedRange: [number, number] | undefined = undefined, + keep: "half" | "quarter" = "half", ): [number, number] { // Since we always keep the first message, currentDeletedRange[0] will always be 1 (for now until we have a smarter truncation algorithm) const rangeStartIndex = 1 const startOfRest = currentDeletedRange ? currentDeletedRange[1] + 1 : 1 - // Remove half of user-assistant pairs - const messagesToRemove = Math.floor((messages.length - startOfRest) / 4) * 2 // Keep even number + let messagesToRemove: number + if (keep === "half") { + // Remove half of user-assistant pairs + messagesToRemove = Math.floor((messages.length - startOfRest) / 4) * 2 // Keep even number + } else { + // Remove 3/4 of user-assistant pairs + messagesToRemove = Math.floor((messages.length - startOfRest) / 8) * 3 * 2 + } + let rangeEndIndex = startOfRest + messagesToRemove - 1 // Make sure the last message being removed is a user message, so that the next message after the initial task message is an assistant message. This preservers the user-assistant-user-assistant structure. diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 3f1acb9a2d..559d2220d5 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -74,6 +74,9 @@ type GlobalStateKey = | "vsCodeLmModelSelector" | "localeLanguage" | "userInfo" + | "previousModeApiProvider" + | "previousModeModelId" + | "previousModeModelInfo" export const GlobalFileNames = { apiConversationHistory: "api_conversation_history.json", @@ -501,6 +504,71 @@ export class ClineProvider implements vscode.WebviewViewProvider { case "chatSettings": if (message.chatSettings) { const didSwitchToActMode = message.chatSettings.mode === "act" + + // Get previous model info that we will revert to after saving current mode api info + const { + apiConfiguration, + previousModeApiProvider: newApiProvider, + previousModeModelId: newModelId, + previousModeModelInfo: newModelInfo, + } = await this.getState() + + // Save the last model used in this mode + await this.updateGlobalState("previousModeApiProvider", apiConfiguration.apiProvider) + switch (apiConfiguration.apiProvider) { + case "anthropic": + case "bedrock": + case "vertex": + case "gemini": + await this.updateGlobalState("previousModeModelId", apiConfiguration.apiModelId) + break + case "openrouter": + await this.updateGlobalState("previousModeModelId", apiConfiguration.openRouterModelId) + await this.updateGlobalState("previousModeModelInfo", apiConfiguration.openRouterModelInfo) + break + case "vscode-lm": + await this.updateGlobalState("previousModeModelId", apiConfiguration.vsCodeLmModelSelector) + break + case "openai": + await this.updateGlobalState("previousModeModelId", apiConfiguration.openAiModelId) + break + case "ollama": + await this.updateGlobalState("previousModeModelId", apiConfiguration.ollamaModelId) + break + case "lmstudio": + await this.updateGlobalState("previousModeModelId", apiConfiguration.lmStudioModelId) + break + } + + // Restore the model used in previous mode + if (newApiProvider && newModelId) { + await this.updateGlobalState("apiProvider", newApiProvider) + switch (newApiProvider) { + case "anthropic": + case "bedrock": + case "vertex": + case "gemini": + await this.updateGlobalState("apiModelId", newModelId) + break + case "openrouter": + await this.updateGlobalState("openRouterModelId", newModelId) + await this.updateGlobalState("openRouterModelInfo", newModelInfo) + break + case "vscode-lm": + await this.updateGlobalState("vsCodeLmModelSelector", newModelId) + break + case "openai": + await this.updateGlobalState("openAiModelId", newModelId) + break + case "ollama": + await this.updateGlobalState("ollamaModelId", newModelId) + break + case "lmstudio": + await this.updateGlobalState("lmStudioModelId", newModelId) + break + } + } + await this.updateGlobalState("chatSettings", message.chatSettings) await this.postStateToWebview() if (this.cline) { @@ -1198,10 +1266,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { browserSettings, chatSettings, userInfo, + authToken, localeLanguage, } = await this.getState() - const authToken = await this.getSecret("authToken") return { version: this.context.extension?.packageJSON?.version ?? "", apiConfiguration, @@ -1310,6 +1378,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { vsCodeLmModelSelector, localeLanguage, userInfo, + authToken, + previousModeApiProvider, + previousModeModelId, + previousModeModelInfo, ] = await Promise.all([ this.getGlobalState("apiProvider") as Promise, this.getGlobalState("apiModelId") as Promise, @@ -1346,6 +1418,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { this.getGlobalState("vsCodeLmModelSelector") as Promise, this.getGlobalState("localeLanguage") as Promise, this.getGlobalState("userInfo") as Promise, + this.getSecret("authToken") as Promise, + this.getGlobalState("previousModeApiProvider") as Promise, + this.getGlobalState("previousModeModelId") as Promise, + this.getGlobalState("previousModeModelInfo") as Promise, ]) let apiProvider: ApiProvider @@ -1400,6 +1476,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { chatSettings: chatSettings || DEFAULT_CHAT_SETTINGS, localeLanguage, userInfo, + authToken, + previousModeApiProvider, + previousModeModelId, + previousModeModelInfo, } } diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index a7ff649928..ad125600b7 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -586,20 +586,40 @@ const ChatTextArea = forwardRef( [updateCursorPosition], ) + // Separate the API config submission logic + const submitApiConfig = useCallback(() => { + const apiValidationResult = validateApiConfiguration(apiConfiguration) + const modelIdValidationResult = validateModelId(apiConfiguration, openRouterModels) + + if (!apiValidationResult && !modelIdValidationResult) { + vscode.postMessage({ type: "apiConfiguration", apiConfiguration }) + } else { + vscode.postMessage({ type: "getLatestState" }) + } + }, [apiConfiguration, openRouterModels]) + const onModeToggle = useCallback(() => { if (textAreaDisabled) return - const newMode = chatSettings.mode === "plan" ? "act" : "plan" - vscode.postMessage({ - type: "chatSettings", - chatSettings: { - mode: newMode, - }, - }) - // Focus the textarea after mode toggle with slight delay + let changeModeDelay = 0 + if (showModelSelector) { + // user has model selector open, so we should save it before switching modes + submitApiConfig() + changeModeDelay = 250 // necessary to let the api config update (we send message and wait for it to be saved) FIXME: this is a hack and we ideally should check for api config changes, then wait for it to be saved, before switching modes + } setTimeout(() => { - textAreaRef.current?.focus() - }, 100) - }, [chatSettings.mode, textAreaDisabled]) + const newMode = chatSettings.mode === "plan" ? "act" : "plan" + vscode.postMessage({ + type: "chatSettings", + chatSettings: { + mode: newMode, + }, + }) + // Focus the textarea after mode toggle with slight delay + setTimeout(() => { + textAreaRef.current?.focus() + }, 100) + }, changeModeDelay) + }, [chatSettings.mode, textAreaDisabled, showModelSelector, submitApiConfig]) const handleContextButtonClick = useCallback(() => { if (textAreaDisabled) return @@ -644,18 +664,6 @@ const ChatTextArea = forwardRef( updateHighlights() }, [inputValue, textAreaDisabled, handleInputChange, updateHighlights]) - // Separate the API config submission logic - const submitApiConfig = useCallback(() => { - const apiValidationResult = validateApiConfiguration(apiConfiguration) - const modelIdValidationResult = validateModelId(apiConfiguration, openRouterModels) - - if (!apiValidationResult && !modelIdValidationResult) { - vscode.postMessage({ type: "apiConfiguration", apiConfiguration }) - } else { - vscode.postMessage({ type: "getLatestState" }) - } - }, [apiConfiguration, openRouterModels]) - // Use an effect to detect menu close useEffect(() => { if (prevShowModelSelector.current && !showModelSelector) { From 65a860e75e43b88075eab3d12347587044d20f37 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:50:45 -0800 Subject: [PATCH 31/74] Revert localization --- src/core/Cline.ts | 17 +- src/core/prompts/system.ts | 10 +- src/core/webview/ClineProvider.ts | 25 +- src/shared/ExtensionMessage.ts | 1 - src/shared/WebviewMessage.ts | 1 - webview-ui/package-lock.json | 73 ----- webview-ui/package.json | 1 - webview-ui/src/App.tsx | 10 +- .../src/components/chat/Announcement.tsx | 24 +- .../src/components/chat/AutoApproveMenu.tsx | 15 +- webview-ui/src/components/chat/ChatRow.tsx | 173 +++++----- .../src/components/chat/ChatTextArea.tsx | 6 +- webview-ui/src/components/chat/ChatView.tsx | 31 +- .../src/components/history/HistoryPreview.tsx | 15 +- .../src/components/history/HistoryView.tsx | 49 ++- .../src/components/settings/ApiOptions.tsx | 297 +++++++++++------- .../components/settings/LanguageOptions.tsx | 41 --- .../src/components/settings/SettingsView.tsx | 27 +- .../src/components/welcome/WelcomeView.tsx | 36 +-- .../src/context/ExtensionStateContext.tsx | 1 - webview-ui/src/i18n.ts | 29 -- webview-ui/src/index.tsx | 1 - webview-ui/src/locales/de/translation.json | 174 ---------- webview-ui/src/locales/en/translation.json | 174 ---------- webview-ui/src/locales/es/translation.json | 174 ---------- webview-ui/src/locales/ja/translation.json | 174 ---------- webview-ui/src/locales/zh-cn/translation.json | 169 ---------- webview-ui/src/locales/zh-tw/translation.json | 169 ---------- 28 files changed, 349 insertions(+), 1568 deletions(-) delete mode 100644 webview-ui/src/components/settings/LanguageOptions.tsx delete mode 100644 webview-ui/src/i18n.ts delete mode 100644 webview-ui/src/locales/de/translation.json delete mode 100644 webview-ui/src/locales/en/translation.json delete mode 100644 webview-ui/src/locales/es/translation.json delete mode 100644 webview-ui/src/locales/ja/translation.json delete mode 100644 webview-ui/src/locales/zh-cn/translation.json delete mode 100644 webview-ui/src/locales/zh-tw/translation.json diff --git a/src/core/Cline.ts b/src/core/Cline.ts index bbaa03d62a..c234b721b8 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -75,7 +75,6 @@ export class Cline { browserSession: BrowserSession private didEditFile: boolean = false customInstructions?: string - localeLanguage?: string autoApprovalSettings: AutoApprovalSettings private browserSettings: BrowserSettings private chatSettings: ChatSettings @@ -120,7 +119,6 @@ export class Cline { browserSettings: BrowserSettings, chatSettings: ChatSettings, customInstructions?: string, - localeLanguage?: string, task?: string, images?: string[], historyItem?: HistoryItem, @@ -132,7 +130,6 @@ export class Cline { this.browserSession = new BrowserSession(provider.context, browserSettings) this.diffViewProvider = new DiffViewProvider(cwd) this.customInstructions = customInstructions - this.localeLanguage = localeLanguage this.autoApprovalSettings = autoApprovalSettings this.browserSettings = browserSettings this.chatSettings = chatSettings @@ -1215,12 +1212,6 @@ export class Cline { this.browserSettings, ) - let userSelectedNonEnglishLanguage: string | undefined - // While we check vscode for preferred language, it's likely not giving us one of the language options - if (this.localeLanguage && this.localeLanguage !== "en") { - userSelectedNonEnglishLanguage = this.localeLanguage - } - let settingsCustomInstructions = this.customInstructions?.trim() const clineRulesFilePath = path.resolve(cwd, GlobalFileNames.clineRules) let clineRulesFileInstructions: string | undefined @@ -1235,13 +1226,9 @@ export class Cline { } } - if (settingsCustomInstructions || clineRulesFileInstructions || userSelectedNonEnglishLanguage) { + if (settingsCustomInstructions || clineRulesFileInstructions) { // altering the system prompt mid-task will break the prompt cache, but in the grand scheme this will not change often so it's better to not pollute user messages with it the way we have to with - systemPrompt += addUserInstructions( - settingsCustomInstructions, - clineRulesFileInstructions, - userSelectedNonEnglishLanguage, - ) + systemPrompt += addUserInstructions(settingsCustomInstructions, clineRulesFileInstructions) } // If the previous API request's total token usage is close to the context window, truncate the conversation history to free up space for the new request diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index 8ef7d89a9c..3c26f70d75 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -957,16 +957,8 @@ You accomplish a given task iteratively, breaking it down into clear steps and w 4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built. 5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance.` -export function addUserInstructions( - settingsCustomInstructions?: string, - clineRulesFileInstructions?: string, - chosenLanguage?: string, -) { +export function addUserInstructions(settingsCustomInstructions?: string, clineRulesFileInstructions?: string) { let customInstructions = "" - if (chosenLanguage) { - // Will only be provided for non-english languages - customInstructions += `Speak in this language: ${chosenLanguage}.` + "\n\n" - } if (settingsCustomInstructions) { customInstructions += settingsCustomInstructions + "\n\n" } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 559d2220d5..1e2e309359 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -72,7 +72,6 @@ type GlobalStateKey = | "browserSettings" | "chatSettings" | "vsCodeLmModelSelector" - | "localeLanguage" | "userInfo" | "previousModeApiProvider" | "previousModeModelId" @@ -247,7 +246,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { async initClineWithTask(task?: string, images?: string[]) { await this.clearTask() // ensures that an exising task doesn't exist before starting a new one, although this shouldn't be possible since user must clear task before starting a new one - const { apiConfiguration, customInstructions, localeLanguage, autoApprovalSettings, browserSettings, chatSettings } = + const { apiConfiguration, customInstructions, autoApprovalSettings, browserSettings, chatSettings } = await this.getState() this.cline = new Cline( this, @@ -256,7 +255,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { browserSettings, chatSettings, customInstructions, - localeLanguage, task, images, ) @@ -264,7 +262,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { async initClineWithHistoryItem(historyItem: HistoryItem) { await this.clearTask() - const { apiConfiguration, customInstructions, localeLanguage, autoApprovalSettings, browserSettings, chatSettings } = + const { apiConfiguration, customInstructions, autoApprovalSettings, browserSettings, chatSettings } = await this.getState() this.cline = new Cline( this, @@ -273,7 +271,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { browserSettings, chatSettings, customInstructions, - localeLanguage, undefined, undefined, historyItem, @@ -747,10 +744,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { } break } - case "changeLanguage": { - await this.updateLocaleLanguage(message.text) - break - } case "restartMcpServer": { try { await this.mcpHub?.restartConnection(message.text!) @@ -844,14 +837,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { await this.postStateToWebview() } - async updateLocaleLanguage(language?: string) { - await this.updateGlobalState("localeLanguage", language || undefined) - if (this.cline) { - this.cline.localeLanguage = language || undefined - } - await this.postStateToWebview() - } - // MCP async getDocumentsPath(): Promise { @@ -1267,7 +1252,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { chatSettings, userInfo, authToken, - localeLanguage, } = await this.getState() return { @@ -1283,8 +1267,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { autoApprovalSettings, browserSettings, chatSettings, - // FIXME: the vscode.env.language doesn't translate to the language specifiers we use in i18n. We need to know what values vscode uses and transform. For now this will always just lead to defaulting to English (see i18n.ts) - localeLanguage: localeLanguage || vscode.env.language, isLoggedIn: !!authToken, userInfo, } @@ -1376,7 +1358,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { browserSettings, chatSettings, vsCodeLmModelSelector, - localeLanguage, userInfo, authToken, previousModeApiProvider, @@ -1416,7 +1397,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { this.getGlobalState("browserSettings") as Promise, this.getGlobalState("chatSettings") as Promise, this.getGlobalState("vsCodeLmModelSelector") as Promise, - this.getGlobalState("localeLanguage") as Promise, this.getGlobalState("userInfo") as Promise, this.getSecret("authToken") as Promise, this.getGlobalState("previousModeApiProvider") as Promise, @@ -1474,7 +1454,6 @@ export class ClineProvider implements vscode.WebviewViewProvider { autoApprovalSettings: autoApprovalSettings || DEFAULT_AUTO_APPROVAL_SETTINGS, // default value can be 0 or empty string browserSettings: browserSettings || DEFAULT_BROWSER_SETTINGS, chatSettings: chatSettings || DEFAULT_CHAT_SETTINGS, - localeLanguage, userInfo, authToken, previousModeApiProvider, diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 306fbd00c0..e45c912ba7 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -61,7 +61,6 @@ export interface ExtensionState { autoApprovalSettings: AutoApprovalSettings browserSettings: BrowserSettings chatSettings: ChatSettings - localeLanguage: string isLoggedIn: boolean userInfo?: { displayName: string | null diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index bf20145498..a18a3c405a 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -42,7 +42,6 @@ export interface WebviewMessage { | "accountLoginClicked" | "accountLogoutClicked" | "subscribeEmail" - | "changeLanguage" // | "relaunchChromeDebugMode" text?: string disabled?: boolean diff --git a/webview-ui/package-lock.json b/webview-ui/package-lock.json index 87a586b798..d2b9114d9d 100644 --- a/webview-ui/package-lock.json +++ b/webview-ui/package-lock.json @@ -22,7 +22,6 @@ "pretty-bytes": "^6.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-i18next": "^15.4.0", "react-remark": "^2.1.0", "react-scripts": "^5.0.1", "react-textarea-autosize": "^8.5.3", @@ -9326,15 +9325,6 @@ "node": ">=12" } }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "license": "MIT", - "dependencies": { - "void-elements": "3.1.0" - } - }, "node_modules/html-webpack-plugin": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", @@ -9506,38 +9496,6 @@ "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", "license": "BSD-3-Clause" }, - "node_modules/i18next": { - "version": "24.2.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.1.tgz", - "integrity": "sha512-Q2wC1TjWcSikn1VAJg13UGIjc+okpFxQTxjVAymOnSA3RpttBQNMPf2ovcgoFVsV4QNxTfNZMAxorXZXsk4fBA==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.23.2" - }, - "peerDependencies": { - "typescript": "^5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -14646,28 +14604,6 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "license": "MIT" }, - "node_modules/react-i18next": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.0.tgz", - "integrity": "sha512-Py6UkX3zV08RTvL6ZANRoBh9sL/ne6rQq79XlkHEdd82cZr2H9usbWpUNVadJntIZP2pu3M2rL1CN+5rQYfYFw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.0", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 23.2.3", - "react": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -18043,15 +17979,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/webview-ui/package.json b/webview-ui/package.json index 4353f03baa..7a6b6f4639 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -17,7 +17,6 @@ "pretty-bytes": "^6.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-i18next": "^15.4.0", "react-remark": "^2.1.0", "react-scripts": "^5.0.1", "react-textarea-autosize": "^8.5.3", diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index 9d9f7796a5..0043ef330b 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -9,11 +9,9 @@ import AccountView from "./components/account/AccountView" import { ExtensionStateContextProvider, useExtensionState } from "./context/ExtensionStateContext" import { vscode } from "./utils/vscode" import McpView from "./components/mcp/McpView" -import { useTranslation } from "react-i18next" const AppContent = () => { - const { didHydrateState, showWelcome, shouldShowAnnouncement, localeLanguage } = useExtensionState() - const { i18n } = useTranslation() + const { didHydrateState, showWelcome, shouldShowAnnouncement } = useExtensionState() const [showSettings, setShowSettings] = useState(false) const [showHistory, setShowHistory] = useState(false) const [showMcp, setShowMcp] = useState(false) @@ -69,12 +67,6 @@ const AppContent = () => { } }, [shouldShowAnnouncement]) - useEffect(() => { - if (localeLanguage) { - i18n.changeLanguage(localeLanguage) - } - }, [i18n, localeLanguage]) - if (!didHydrateState) { return null } diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index 96125cc3bf..da528089a4 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -1,7 +1,5 @@ import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react" import { memo } from "react" -import { useTranslation } from "react-i18next" -import { Trans } from "react-i18next" import { getAsVar, VSC_DESCRIPTION_FOREGROUND, VSC_INACTIVE_SELECTION_BACKGROUND } from "../../utils/vscStyles" interface AnnouncementProps { @@ -13,8 +11,6 @@ interface AnnouncementProps { You must update the latestAnnouncementId in ClineProvider for new announcements to show to users. This new id will be compared with whats in state for the 'last announcement shown', and if it's different then the announcement will render. As soon as an announcement is shown, the id will be updated in state. This ensures that announcements are not shown more than once, even if the user doesn't close it themselves. */ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => { - const { t } = useTranslation("translation", { keyPrefix: "announcement" }) - const minorVersion = version.split(".").slice(0, 2).join(".") // 2.0.0 -> 2.0 return (
{ -

{t("newInVersion", { version: minorVersion })}

+

+ 🎉{" "}New in v{minorVersion} +

  • Plan/Act mode toggle: Plan mode turns Cline into an architect that gathers information, asks clarifying @@ -111,13 +109,15 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => { }} />

    - , - RedditLink: , - }} - /> + Join our{" "} + + discord + {" "} + or{" "} + + r/cline + + for more updates!

) diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index 006e37df51..aa3a8a44a7 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -5,7 +5,6 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { AutoApprovalSettings } from "../../../../src/shared/AutoApprovalSettings" import { vscode } from "../../utils/vscode" import { getAsVar, VSC_FOREGROUND, VSC_TITLEBAR_INACTIVE_FOREGROUND, VSC_DESCRIPTION_FOREGROUND } from "../../utils/vscStyles" -import { useTranslation } from "react-i18next" interface AutoApproveMenuProps { style?: React.CSSProperties @@ -51,7 +50,6 @@ const ACTION_METADATA: { ] const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { - const { t } = useTranslation("translation", { keyPrefix: "autoApproveMenu" }) const { autoApprovalSettings } = useExtensionState() const [isExpanded, setIsExpanded] = useState(false) const [isHoveringCollapsibleSection, setIsHoveringCollapsibleSection] = useState(false) @@ -192,7 +190,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { color: getAsVar(VSC_FOREGROUND), whiteSpace: "nowrap", }}> - {t("autoApprove")} + Auto-approve: { overflow: "hidden", textOverflow: "ellipsis", }}> - {enabledActions.length === 0 ? t("none") : enabledActionsList} + {enabledActions.length === 0 ? "None" : enabledActionsList} { color: getAsVar(VSC_DESCRIPTION_FOREGROUND), fontSize: "12px", }}> - {t("autoApproveDescription")} + Auto-approve allows Cline to perform the following actions without asking for permission. Please use with + caution and only enable if you understand the risks. {ACTION_METADATA.map((action) => (
@@ -286,7 +285,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { fontSize: "12px", marginBottom: "10px", }}> - {t("autoApproveMaxRequestsDescription")} + Cline will automatically make this many API requests before asking for approval to proceed with the task.
{ const checked = (e.target as HTMLInputElement).checked updateNotifications(checked) }}> - {t("enableNotifications")} + Enable Notifications
{ color: getAsVar(VSC_DESCRIPTION_FOREGROUND), fontSize: "12px", }}> - {t("enableNotificationsDescription")} + Receive system notifications when Cline requires approval to proceed or when a task is completed.
diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 979bf3b274..fed1bb0cf4 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -2,8 +2,6 @@ import { VSCodeBadge, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/reac import deepEqual from "fast-deep-equal" import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from "react" import { useEvent, useSize } from "react-use" -import { useTranslation } from "react-i18next" -import { Trans } from "react-i18next" import styled from "styled-components" import { ClineApiReqInfo, @@ -101,7 +99,6 @@ const ChatRow = memo( export default ChatRow export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessage, isLast }: ChatRowContentProps) => { - const { t } = useTranslation("translation", { keyPrefix: "chatRow" }) const { mcpServers } = useExtensionState() const [seeNewChangesDisabled, setSeeNewChangesDisabled] = useState(false) @@ -154,7 +151,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>
, - {t("error")}, + Error, ] case "mistake_limit_reached": return [ @@ -164,7 +161,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>, - {t("mistakeLimitReached")}, + Cline is having trouble..., ] case "auto_approval_max_req_reached": return [ @@ -174,7 +171,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: errorColor, marginBottom: "-1.5px", }}>, - {t("autoApprovalMaxReqReached")}, + Maximum Requests Reached, ] case "command": return [ @@ -189,7 +186,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi }}> ), - {message.type === "ask" ? t("command.ask") : t("command.say")} + {message.type === "ask" ? "Cline wants to execute this command:" : "Cline executed this command:"} , ] case "use_mcp_server": @@ -208,23 +205,13 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi {message.type === "ask" ? ( <> - {t("useMcpServer.ask", { - type: - mcpServerUse.type === "use_mcp_tool" - ? t("useMcpServer.tool") - : t("useMcpServer.resource"), - serverName: mcpServerUse.serverName, - })} + Cline wants to {mcpServerUse.type === "use_mcp_tool" ? "use a tool" : "access a resource"} on the{" "} + {mcpServerUse.serverName} MCP server: ) : ( <> - {t("useMcpServer.say", { - type: - mcpServerUse.type === "use_mcp_tool" - ? t("useMcpServer.tool") - : t("useMcpServer.resource"), - serverName: mcpServerUse.serverName, - })} + Cline {mcpServerUse.type === "use_mcp_tool" ? "used a tool" : "accessed a resource"} on the{" "} + {mcpServerUse.serverName} MCP server: )} , @@ -237,7 +224,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: successColor, marginBottom: "-1.5px", }}>, - {t("completionResult")}, + Task Completed, ] case "api_req_started": const getIconSpan = (iconName: string, color: string) => ( @@ -279,7 +266,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: normalColor, fontWeight: "bold", }}> - {t("apiReqCancelled")} + API Request Cancelled ) : ( - {t("apiStreamingFailed")} + API Streaming Failed ) ) : cost != null ? ( - {t("apiRequest")} + API Request ) : apiRequestFailedMessage ? ( - {t("apiRequestFailed")} + API Request Failed ) : ( - {t("apiRequestInProgress")} + API Request... ), ] case "followup": @@ -306,7 +293,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi color: normalColor, marginBottom: "-1.5px", }}>, - {t("followup")}, + Cline has a question:, ] default: return [null, null] @@ -320,7 +307,6 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi isMcpServerResponding, message.text, message.type, - t, ]) const headerStyle: React.CSSProperties = { @@ -361,7 +347,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
{toolIcon("edit")} - {message.type === "ask" ? t("tool.editedExistingFile.ask") : t("tool.editedExistingFile.say")} + {message.type === "ask" ? "Cline wants to edit this file:" : "Cline is editing this file:"}
{toolIcon("new-file")} - {message.type === "ask" ? t("tool.createdNewFile.ask") : t("tool.createdNewFile.say")} + {message.type === "ask" ? "Cline wants to create a new file:" : "Cline is creating a new file:"} {toolIcon("file-code")} - {message.type === "ask" ? t("tool.readExistingFile.ask") : t("tool.readExistingFile.say")} + {message.type === "ask" ? "Cline wants to read this file:" : "Cline read this file:"} {/*

- - PowerShell - - ), - }} - /> + It seems like you're having Windows PowerShell issues, please see this{" "} + + troubleshooting guide + + . )}

+ {/* {apiProvider === "" && ( -
- - - Uh-oh, this could be a problem on end. We've been alerted and - will resolve this ASAP. You can also{" "} - - contact us - - . - -
- )} */} + display: "flex", + alignItems: "center", + backgroundColor: + "color-mix(in srgb, var(--vscode-errorForeground) 20%, transparent)", + color: "var(--vscode-editor-foreground)", + padding: "6px 8px", + borderRadius: "3px", + margin: "10px 0 0 0", + fontSize: "12px", + }}> + + + Uh-oh, this could be a problem on end. We've been alerted and + will resolve this ASAP. You can also{" "} + + contact us + + . + + + )} */} )} @@ -941,10 +923,13 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontWeight: 500, color: "#FFA500", }}> - {t("diffEditFailed")} + Diff Edit Failed -
{t("diffEditFailedMessage")}
+
+ This usually happens when the model uses search patterns that don't match anything in the + file. Retrying... +
) @@ -984,7 +969,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi cursor: seeNewChangesDisabled ? "wait" : "pointer", }}> - {t("seeNewChanges")} + See new changes )} @@ -1020,10 +1005,23 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontWeight: 500, color: "#FFA500", }}> - {t("shellIntegrationUnavailable")} + Shell Integration Unavailable -
{t("shellIntegrationUnavailableMessage")}
+
+ Cline won't be able to view the command's output. Please update VSCode ( + CMD/CTRL + Shift + P → "Update") and make sure you're using a supported shell: + zsh, bash, fish, or PowerShell (CMD/CTRL + Shift + P → "Terminal: Select Default + Profile").{" "} + + Still having trouble? + +
) @@ -1038,14 +1036,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi fontSize: "12px", textTransform: "uppercase", }}> - - {t("response")} - + Response - {t("seeNewChanges")} + See new changes )} diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index ad125600b7..c7183bd464 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -4,7 +4,6 @@ import DynamicTextArea from "react-textarea-autosize" import { useClickAway, useWindowSize } from "react-use" import styled from "styled-components" import { mentionRegex, mentionRegexGlobal } from "../../../../src/shared/context-mentions" -import { useTranslation } from "react-i18next" import { useExtensionState } from "../../context/ExtensionStateContext" import { ContextMenuOptionType, @@ -211,7 +210,6 @@ const ChatTextArea = forwardRef( }, ref, ) => { - const { t } = useTranslation("translation", { keyPrefix: "chatTextArea" }) const { filePaths, chatSettings, apiConfiguration, openRouterModels } = useExtensionState() const [isTextAreaFocused, setIsTextAreaFocused] = useState(false) const [thumbnailsHeight, setThumbnailsHeight] = useState(0) @@ -1072,8 +1070,8 @@ const ChatTextArea = forwardRef( - {t("plan")} - {t("act")} + Plan + Act diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 1fe0211c52..aec4e544a9 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -3,8 +3,6 @@ import debounce from "debounce" import { useCallback, useEffect, useMemo, useRef, useState } from "react" import { useDeepCompareEffect, useEvent, useMount } from "react-use" import { Virtuoso, type VirtuosoHandle } from "react-virtuoso" -import { useTranslation } from "react-i18next" -import { Trans } from "react-i18next" import styled from "styled-components" import { ClineAsk, @@ -38,7 +36,6 @@ interface ChatViewProps { export const MAX_IMAGES_PER_MESSAGE = 20 // Anthropic limits to 20 images const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryView }: ChatViewProps) => { - const { t } = useTranslation("translation", { keyPrefix: "chatView" }) const { version, clineMessages: messages, taskHistory, apiConfiguration } = useExtensionState() //const task = messages.length > 0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined @@ -669,8 +666,9 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie useEvent("wheel", handleWheel, window, { passive: true }) // passive improves scrolling performance const placeholderText = useMemo(() => { - return task ? t("typeMessage") : t("typeTask") - }, [task, t]) + const text = task ? "Type a message..." : "Type your task here..." + return text + }, [task]) const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage | ClineMessage[]) => { @@ -745,19 +743,18 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie }}> {showAnnouncement && }
-

{t("whatCanIDoForYou")}

+

What can I do for you?

- - ), - }} - /> + Thanks to{" "} + + Claude 3.5 Sonnet's agentic coding capabilities, + {" "} + I can handle complex software development tasks step-by-step. With tools that let me create & edit + files, explore complex projects, use the browser, and execute terminal commands (after you grant + permission), I can assist you in ways that go beyond code completion or tech support. I can even use + MCP to create new tools and extend my own capabilities.

{taskHistory.length > 0 && } diff --git a/webview-ui/src/components/history/HistoryPreview.tsx b/webview-ui/src/components/history/HistoryPreview.tsx index 7725b69404..06a2e9bc62 100644 --- a/webview-ui/src/components/history/HistoryPreview.tsx +++ b/webview-ui/src/components/history/HistoryPreview.tsx @@ -3,14 +3,12 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { vscode } from "../../utils/vscode" import { memo } from "react" import { formatLargeNumber } from "../../utils/format" -import { useTranslation } from "react-i18next" type HistoryPreviewProps = { showHistoryView: () => void } const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { - const { t } = useTranslation("translation", { keyPrefix: "historyPreview" }) const { taskHistory } = useExtensionState() const handleHistorySelect = (id: string) => { vscode.postMessage({ type: "showTaskWithId", text: id }) @@ -71,7 +69,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { fontSize: "0.85em", textTransform: "uppercase", }}> - {t("recentTasks")} + Recent Tasks @@ -114,14 +112,13 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { color: "var(--vscode-descriptionForeground)", }}> - {t("tokens")}: ↑{formatLargeNumber(item.tokensIn || 0)} ↓ - {formatLargeNumber(item.tokensOut || 0)} + Tokens: ↑{formatLargeNumber(item.tokensIn || 0)} ↓{formatLargeNumber(item.tokensOut || 0)} {!!item.cacheWrites && ( <> {" • "} - {t("cache")}: +{formatLargeNumber(item.cacheWrites || 0)} →{" "} + Cache: +{formatLargeNumber(item.cacheWrites || 0)} →{" "} {formatLargeNumber(item.cacheReads || 0)} @@ -129,9 +126,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { {!!item.totalCost && ( <> {" • "} - - {t("apiCost")}: ${item.totalCost?.toFixed(4)} - + API Cost: ${item.totalCost?.toFixed(4)} )} @@ -155,7 +150,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { fontSize: "var(--vscode-font-size)", color: "var(--vscode-descriptionForeground)", }}> - {t("viewAllHistory")} + View all history diff --git a/webview-ui/src/components/history/HistoryView.tsx b/webview-ui/src/components/history/HistoryView.tsx index fb5d32f956..d50b4b39db 100644 --- a/webview-ui/src/components/history/HistoryView.tsx +++ b/webview-ui/src/components/history/HistoryView.tsx @@ -6,7 +6,6 @@ import { memo, useMemo, useState, useEffect } from "react" import Fuse, { FuseResult } from "fuse.js" import { formatLargeNumber } from "../../utils/format" import { formatSize } from "../../utils/size" -import { useTranslation } from "react-i18next" type HistoryViewProps = { onDone: () => void @@ -15,7 +14,6 @@ type HistoryViewProps = { type SortOption = "newest" | "oldest" | "mostExpensive" | "mostTokens" | "mostRelevant" const HistoryView = ({ onDone }: HistoryViewProps) => { - const { t } = useTranslation("translation", { keyPrefix: "historyView" }) const { taskHistory } = useExtensionState() const [searchQuery, setSearchQuery] = useState("") const [sortOption, setSortOption] = useState("newest") @@ -144,9 +142,9 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { color: "var(--vscode-foreground)", margin: 0, }}> - {t("history")} + History - {t("done")} + Done
{ }}> { const newValue = (e.target as HTMLInputElement)?.value @@ -194,12 +192,12 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { style={{ display: "flex", flexWrap: "wrap" }} value={sortOption} onChange={(e) => setSortOption((e.target as HTMLInputElement).value as SortOption)}> - {t("newest")} - {t("oldest")} - {t("mostExpensive")} - {t("mostTokens")} + Newest + Oldest + Most Expensive + Most Tokens - {t("mostRelevant")} + Most Relevant
@@ -321,7 +319,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - {t("tokens")} + Tokens: { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - {t("cache")} + Cache: { fontWeight: 500, color: "var(--vscode-descriptionForeground)", }}> - {t("apiCost")} + API Cost: { ) } -const ExportButton = ({ itemId }: { itemId: string }) => { - const { t } = useTranslation("translation", { keyPrefix: "historyView" }) - return ( - { - e.stopPropagation() - vscode.postMessage({ type: "exportTaskWithId", text: itemId }) - }}> -
{t("export")}
-
- ) -} +const ExportButton = ({ itemId }: { itemId: string }) => ( + { + e.stopPropagation() + vscode.postMessage({ type: "exportTaskWithId", text: itemId }) + }}> +
EXPORT
+
+) // https://gist.github.com/evenfrost/1ba123656ded32fb7a0cd4651efd4db0 export const highlight = (fuseSearchResult: FuseResult[], highlightClassName: string = "history-item-highlight") => { diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 350cb1c7e0..ceb75a0ee4 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -8,10 +8,7 @@ import { VSCodeTextField, } from "@vscode/webview-ui-toolkit/react" import { Fragment, memo, useCallback, useEffect, useMemo, useState } from "react" -import { Trans, useTranslation } from "react-i18next" import { useEvent, useInterval } from "react-use" -import styled from "styled-components" -import * as vscodemodels from "vscode" import { ApiConfiguration, ApiProvider, @@ -40,6 +37,8 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { vscode } from "../../utils/vscode" import VSCodeButtonLink from "../common/VSCodeButtonLink" import OpenRouterModelPicker, { ModelDescriptionMarkdown } from "./OpenRouterModelPicker" +import styled from "styled-components" +import * as vscodemodels from "vscode" interface ApiOptionsProps { showModelOptions: boolean @@ -73,7 +72,6 @@ declare module "vscode" { } const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, isPopup }: ApiOptionsProps) => { - const { t } = useTranslation("translation", { keyPrefix: "apiOptions" }) const { apiConfiguration, setApiConfiguration, uriScheme } = useExtensionState() const [ollamaModels, setOllamaModels] = useState([]) const [lmStudioModels, setLmStudioModels] = useState([]) @@ -83,7 +81,10 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false) const handleInputChange = (field: keyof ApiConfiguration) => (event: any) => { - setApiConfiguration({ ...apiConfiguration, [field]: event.target.value }) + setApiConfiguration({ + ...apiConfiguration, + [field]: event.target.value, + }) } const { selectedProvider, selectedModelId, selectedModelInfo } = useMemo(() => { @@ -93,7 +94,10 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is // Poll ollama/lmstudio models const requestLocalModels = useCallback(() => { if (selectedProvider === "ollama") { - vscode.postMessage({ type: "requestOllamaModels", text: apiConfiguration?.ollamaBaseUrl }) + vscode.postMessage({ + type: "requestOllamaModels", + text: apiConfiguration?.ollamaBaseUrl, + }) } else if (selectedProvider === "lmstudio") { vscode.postMessage({ type: "requestLmStudioModels", @@ -140,7 +144,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is value={selectedModelId} onChange={handleInputChange("apiModelId")} style={{ width: "100%" }}> - {t("selectModel")} + Select a model... {Object.keys(models).map((modelId) => ( + style={{ + minWidth: 130, + position: "relative", + }}> OpenRouter Anthropic Google Gemini @@ -176,7 +183,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is GCP Vertex AI AWS Bedrock OpenAI - {t("getCompatibleVendor", { vendor: "OpenAI" })} + OpenAI Compatible VS Code LM API LM Studio Ollama @@ -190,7 +197,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="password" onInput={handleInputChange("apiKey")} - placeholder={t("enterApiKey")}> + placeholder="Enter API Key..."> Anthropic API Key @@ -200,10 +207,13 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is const isChecked = e.target.checked === true setAnthropicBaseUrlSelected(isChecked) if (!isChecked) { - setApiConfiguration({ ...apiConfiguration, anthropicBaseUrl: "" }) + setApiConfiguration({ + ...apiConfiguration, + anthropicBaseUrl: "", + }) } }}> - {t("useCustomBaseUrl")} + Use custom base URL {anthropicBaseUrlSelected && ( @@ -222,7 +232,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is marginTop: 3, color: "var(--vscode-descriptionForeground)", }}> - {t("apiKeyInfo")} + This key is stored locally and only used to make API requests from this extension. {!apiConfiguration?.apiKey && ( - {t("getApiKeyMessage", { vendor: "Anthropic" })} + You can get an Anthropic API key by signing up here. )}

@@ -244,8 +254,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="password" onInput={handleInputChange("openAiNativeApiKey")} - placeholder={t("enterApiKey")}> - {t("getApiVendorKey", { vendor: "OpenAI" })} + placeholder="Enter API Key..."> + OpenAI API Key

- {t("apiKeyInfo")} + This key is stored locally and only used to make API requests from this extension. {!apiConfiguration?.openAiNativeApiKey && ( - {t("getApiKeyMessage", { vendor: "OpenAI" })} + You can get an OpenAI API key by signing up here. )}

@@ -275,8 +285,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="password" onInput={handleInputChange("deepSeekApiKey")} - placeholder={t("enterApiKey")}> - {t("getApiVendorKey", { vendor: "DeepSeek" })} + placeholder="Enter API Key..."> + DeepSeek API Key

- {t("apiKeyInfo")} + This key is stored locally and only used to make API requests from this extension. {!apiConfiguration?.deepSeekApiKey && ( - {t("getApiKeyMessage", { vendor: "DeepSeek" })} + You can get a DeepSeek API key by signing up here. )}

@@ -306,8 +316,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="password" onInput={handleInputChange("mistralApiKey")} - placeholder={t("enterApiKey")}> - {t("getApiVendorKey", { vendor: "Mistral" })} + placeholder="Enter API Key..."> + Mistral API Key

- {t("apiKeyInfo")} + This key is stored locally and only used to make API requests from this extension. {!apiConfiguration?.mistralApiKey && ( - {t("getApiKeyMessage", { vendor: "Mistral" })} + You can get a Mistral API key by signing up here. )}

@@ -337,15 +347,15 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="password" onInput={handleInputChange("openRouterApiKey")} - placeholder={t("enterApiKey")}> - {t("getApiVendorKey", { vendor: "OpenRouter" })} + placeholder="Enter API Key..."> + OpenRouter API Key {!apiConfiguration?.openRouterApiKey && ( - {t("getApiKeyMessage", { vendor: "OpenRouter" })} + Get OpenRouter API Key )}

- {t("apiKeyInfo")} + This key is stored locally and only used to make API requests from this extension.{" "} + {/* {!apiConfiguration?.openRouterApiKey && ( + + (Note: OpenRouter is recommended for high rate + limits, prompt caching, and wider selection of models.) + + )} */}

)} {selectedProvider === "bedrock" && ( -
+
- {t("awsAccessKey")} + placeholder="Enter Access Key..."> + AWS Access Key - {t("awsSecretKey")} + placeholder="Enter Secret Key..."> + AWS Secret Key - {t("awsSessionToken")} + placeholder="Enter Session Token..."> + AWS Session Token - {t("selectRegion")} + Select a region... {/* The user will have to choose a region that supports the model they use, but this shouldn't be a problem since they'd have to request access for it in that region in the first place. */} us-east-1 us-east-2 @@ -426,9 +447,12 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is checked={apiConfiguration?.awsUseCrossRegionInference || false} onChange={(e: any) => { const isChecked = e.target.checked === true - setApiConfiguration({ ...apiConfiguration, awsUseCrossRegionInference: isChecked }) + setApiConfiguration({ + ...apiConfiguration, + awsUseCrossRegionInference: isChecked, + }) }}> - {t("useCrossRegionInference")} + Use cross-region inference

- {t("awsInfo")} + Authenticate by either providing the keys above or use the default AWS credential providers, i.e. + ~/.aws/credentials or environment variables. These credentials are only used locally to make API requests + from this extension.

)} {apiConfiguration?.apiProvider === "vertex" && ( -
+
- {t("gcpProjectId")} + placeholder="Enter Project ID..."> + Google Cloud Project ID - {t("selectRegion")} + Select a region... us-east5 us-central1 europe-west1 @@ -473,12 +504,17 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is marginTop: "5px", color: "var(--vscode-descriptionForeground)", }}> - , - }} - /> + To use Google Cloud Vertex AI, you need to + + {"1) create a Google Cloud account › enable the Vertex AI API › enable the desired Claude models,"} + {" "} + + {"2) install the Google Cloud CLI › configure Application Default Credentials."} +

)} @@ -490,8 +526,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="password" onInput={handleInputChange("geminiApiKey")} - placeholder={t("enterApiKey")}> - {t("getApiVendorKey", { vendor: "Gemini" })} + placeholder="Enter API Key..."> + Gemini API Key

- {t("apiKeyInfo")} + This key is stored locally and only used to make API requests from this extension. {!apiConfiguration?.geminiApiKey && ( - {t("getApiKeyMessage", { vendor: "Gemini" })} + You can get a Gemini API key by signing up here. )}

@@ -521,23 +557,23 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="url" onInput={handleInputChange("openAiBaseUrl")} - placeholder={t("enterBaseUrl")}> - {t("baseUrl")} + placeholder={"Enter base URL..."}> + Base URL - {t("apiKey")} + placeholder="Enter API Key..."> + API Key - {t("modelId")} + placeholder={"Enter Model ID..."}> + Model ID - {t("setAzureApiVersion")} + Set Azure API version {azureApiVersionSelected && ( )}

- , - ErrSpan: , - }} - /> + + (Note: Cline uses complex prompts and works best with Claude + models. Less capable models may not work as expected.) +

)} @@ -579,7 +615,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
{vsCodeLmModels.length > 0 ? ( - {t("selectModel")} + Select a model... {vsCodeLmModels.map((model) => ( - {t("vscodeLanguageModelsInfo")} + The VS Code Language Model API allows you to run models provided by other VS Code extensions + (including but not limited to GitHub Copilot). The easiest way to get started is to install the + Copilot extension from the VS Marketplace and enabling Claude 3.5 Sonnet.

)} @@ -629,7 +667,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is color: "var(--vscode-errorForeground)", fontWeight: 500, }}> - {t("experimentalFeature")} + Note: This is a very experimental integration and may not work as expected.

@@ -642,15 +680,15 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="url" onInput={handleInputChange("lmStudioBaseUrl")} - placeholder={t("getDefault", { defaultValue: "http://localhost/1234" })}> - {t("optionalBaseUrl")} + placeholder={"Default: http://localhost:1234"}> + Base URL (optional) - {t("modelId")} + Model ID {lmStudioModels.length > 0 && ( - , - ErrSpan: , - }} - /> + LM Studio allows you to run models locally on your computer. For instructions on how to get started, see + their + + quickstart guide. + + You will also need to start LM Studio's{" "} + + local server + {" "} + feature to use it with this extension.{" "} + + (Note: Cline uses complex prompts and works best with Claude + models. Less capable models may not work as expected.) +

)} @@ -699,8 +746,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is style={{ width: "100%" }} type="url" onInput={handleInputChange("ollamaBaseUrl")} - placeholder={t("getDefault", { defaultValue: "http://localhost:11434" })}> - {t("optionalBaseUrl")} + placeholder={"Default: http://localhost:11434"}> + Base URL (optional) - { - , - ErrorSpan: , - }} - /> - } + Ollama allows you to run models locally on your computer. For instructions on how to get started, see + their + + quickstart guide. + + + (Note: Cline uses complex prompts and works best with Claude + models. Less capable models may not work as expected.) +

)} @@ -771,7 +820,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is <> {selectedProvider === "anthropic" && createDropdown(anthropicModels)} {selectedProvider === "bedrock" && createDropdown(bedrockModels)} @@ -811,6 +860,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is export function getOpenRouterAuthUrl(uriScheme?: string) { return `https://openrouter.ai/auth?callback_url=${uriScheme || "vscode"}://saoudrizwan.claude-dev/openrouter` } + export const formatPrice = (price: number) => { return new Intl.NumberFormat("en-US", { style: "currency", @@ -834,7 +884,6 @@ export const ModelInfoView = ({ isPopup?: boolean }) => { const isGemini = Object.keys(geminiModels).includes(selectedModelId) - const { t } = useTranslation("translation", { keyPrefix: "apiOptions" }) const infoItems = [ modelInfo.description && ( @@ -849,64 +898,68 @@ export const ModelInfoView = ({ , , !isGemini && ( ), modelInfo.maxTokens !== undefined && modelInfo.maxTokens > 0 && ( - {t("maxOutput")}: {modelInfo.maxTokens?.toLocaleString()} {t("tokens")} + Max output: {modelInfo.maxTokens?.toLocaleString()} tokens ), modelInfo.inputPrice !== undefined && modelInfo.inputPrice > 0 && ( - {t("inputPrice")}: {formatPrice(modelInfo.inputPrice)}/ - {t("millionTokens")} + Input price: {formatPrice(modelInfo.inputPrice)}/million tokens ), modelInfo.supportsPromptCache && modelInfo.cacheWritesPrice && ( - {t("cacheWritesPrice")}: {formatPrice(modelInfo.cacheWritesPrice || 0)}/ - {t("millionTokens")} + Cache writes price: {formatPrice(modelInfo.cacheWritesPrice || 0)} + /million tokens ), modelInfo.supportsPromptCache && modelInfo.cacheReadsPrice && ( - {t("cacheReadsPrice")}: {formatPrice(modelInfo.cacheReadsPrice || 0)}/ - {t("millionTokens")} + Cache reads price: {formatPrice(modelInfo.cacheReadsPrice || 0)}/million + tokens ), modelInfo.outputPrice !== undefined && modelInfo.outputPrice > 0 && ( - {t("outputPrice")}: {formatPrice(modelInfo.outputPrice)}/ - {t("millionTokens")} + Output price: {formatPrice(modelInfo.outputPrice)}/million tokens ), isGemini && ( - {t("geminiInfo", { selectedModelId })}{" "} + * Free up to {selectedModelId && selectedModelId.includes("flash") ? "15" : "2"} requests per minute. After that, + billing depends on prompt size.{" "} - {t("pricingDetails")} + For more info, see pricing details. ), ].filter(Boolean) return ( -

+

{infoItems.map((item, index) => ( {item} @@ -963,7 +1016,11 @@ export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration): selectedModelId = defaultId selectedModelInfo = models[defaultId] } - return { selectedProvider: provider, selectedModelId, selectedModelInfo } + return { + selectedProvider: provider, + selectedModelId, + selectedModelInfo, + } } switch (provider) { case "anthropic": diff --git a/webview-ui/src/components/settings/LanguageOptions.tsx b/webview-ui/src/components/settings/LanguageOptions.tsx deleted file mode 100644 index f06b4fa5d1..0000000000 --- a/webview-ui/src/components/settings/LanguageOptions.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react" -import { memo } from "react" -import { useTranslation } from "react-i18next" -import { vscode } from "../../utils/vscode" - -const LanguageOptions = () => { - const { t, i18n } = useTranslation("translation", { keyPrefix: "settingsView", useSuspense: false }) - - const changeLanguage = (e: any) => { - const language = e.target.value - // i18n.changeLanguage(language) - vscode.postMessage({ - type: "changeLanguage", - text: language, - }) - } - - return ( -

-
- - - English - Español - Deutsch - 中文(简体) - 中文(繁體) - 日本語 - -
-
- ) -} - -export default memo(LanguageOptions) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index ae7ee4e99e..ad1e141fa5 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -1,13 +1,10 @@ import { VSCodeButton, VSCodeLink, VSCodeTextArea } from "@vscode/webview-ui-toolkit/react" import { memo, useEffect, useState } from "react" -import { useTranslation } from "react-i18next" import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration, validateModelId } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "./ApiOptions" -import LanguageOptions from "./LanguageOptions" import SettingsButton from "../common/SettingsButton" - const IS_DEV = false // FIXME: use flags when packaging type SettingsViewProps = { @@ -15,7 +12,6 @@ type SettingsViewProps = { } const SettingsView = ({ onDone }: SettingsViewProps) => { - const { t } = useTranslation("translation", { keyPrefix: "settingsView", useSuspense: false }) const { apiConfiguration, version, customInstructions, setCustomInstructions, openRouterModels } = useExtensionState() const [apiErrorMessage, setApiErrorMessage] = useState(undefined) const [modelIdErrorMessage, setModelIdErrorMessage] = useState(undefined) @@ -45,7 +41,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => { // validate as soon as the component is mounted /* useEffect will use stale values of variables if they are not included in the dependency array. so trying to use useEffect with a dependency array of only one value for example will use any other variables' old values. In most cases you don't want this, and should opt to use react-use hooks. - + useEffect(() => { // uses someVar and anotherVar // eslint-disable-next-line react-hooks/exhaustive-deps @@ -79,8 +75,8 @@ const SettingsView = ({ onDone }: SettingsViewProps) => { marginBottom: "17px", paddingRight: 17, }}> -

{t("settings")}

- {t("done")} +

Settings

+ Done
{ style={{ width: "100%" }} resize="vertical" rows={4} - placeholder={t("customInstructionsPlaceholder")} + placeholder={'e.g. "Run unit tests at the end", "Use TypeScript with async/await", "Speak in Spanish"'} onInput={(e: any) => setCustomInstructions(e.target?.value ?? "")}> - {t("customInstructions")} + Custom Instructions

{ marginTop: "5px", color: "var(--vscode-descriptionForeground)", }}> - {t("customInstructionsDescription")} + These instructions are added to the end of the system prompt sent with every request.

-
- -
{IS_DEV && ( <> -
{t("debug")}
+
Debug
- {t("resetState")} + Reset State

{ marginTop: "5px", color: "var(--vscode-descriptionForeground)", }}> - {t("resetStateDescription")} + This will reset all global state and secret storage in the extension.

)} @@ -168,7 +161,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => { margin: 0, padding: 0, }}> - {t("feedback")}{" "} + If you have any questions or feedback, feel free to open an issue at{" "} https://github.com/cline/cline diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index a610f827f3..330870f56a 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -4,15 +4,10 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "../settings/ApiOptions" -import { useTranslation } from "react-i18next" -import { Trans } from "react-i18next" import { useEvent } from "react-use" import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" -import LanguageOptions from "../settings/LanguageOptions" const WelcomeView = () => { - const { t } = useTranslation("translation", { keyPrefix: "welcomeView" }) - const { apiConfiguration } = useExtensionState() const [apiErrorMessage, setApiErrorMessage] = useState(undefined) @@ -61,27 +56,20 @@ const WelcomeView = () => { padding: "0 20px", overflow: "auto", }}> -

{t("greeting")}

- -
- -
- +

Hi, I'm Cline

- - ), - }} - /> + I can do all kinds of tasks thanks to the latest breakthroughs in{" "} + + Claude 3.5 Sonnet's agentic coding capabilities + {" "} + and access to tools that let me create & edit files, explore complex projects, use the browser, and execute + terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own + capabilities.

- {t("getStarted")} + To get started, this extension needs an API provider for Claude 3.5 Sonnet.
{
- {t("letsGo")} + Let's go!
diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 4bb141e7b7..626e9e6606 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -35,7 +35,6 @@ export const ExtensionStateContextProvider: React.FC<{ shouldShowAnnouncement: false, autoApprovalSettings: DEFAULT_AUTO_APPROVAL_SETTINGS, browserSettings: DEFAULT_BROWSER_SETTINGS, - localeLanguage: "en", chatSettings: DEFAULT_CHAT_SETTINGS, isLoggedIn: false, }) diff --git a/webview-ui/src/i18n.ts b/webview-ui/src/i18n.ts deleted file mode 100644 index e52c8e66fc..0000000000 --- a/webview-ui/src/i18n.ts +++ /dev/null @@ -1,29 +0,0 @@ -import i18n from "i18next" -import { initReactI18next } from "react-i18next" - -import translationEN from "./locales/en/translation.json" -import translationES from "./locales/es/translation.json" -import translationDE from "./locales/de/translation.json" -import translationZHCN from "./locales/zh-cn/translation.json" -import translationZHTW from "./locales/zh-tw/translation.json" -import translationJA from "./locales/ja/translation.json" - -i18n.use(initReactI18next) // passes i18n down to react-i18next - .init({ - fallbackLng: "en", - debug: true, - react: { - bindI18n: "languageChanged", - transSupportBasicHtmlNodes: true, - transKeepBasicHtmlNodesFor: ["b", "i", "strong", "em", "br"], - }, - }) - -i18n.addResourceBundle("en", "translation", translationEN) -i18n.addResourceBundle("es", "translation", translationES) -i18n.addResourceBundle("de", "translation", translationDE) -i18n.addResourceBundle("zh-CN", "translation", translationZHCN) -i18n.addResourceBundle("zh-TW", "translation", translationZHTW) -i18n.addResourceBundle("ja", "translation", translationJA) - -export default i18n diff --git a/webview-ui/src/index.tsx b/webview-ui/src/index.tsx index 65ac04a660..934a81f6dc 100644 --- a/webview-ui/src/index.tsx +++ b/webview-ui/src/index.tsx @@ -4,7 +4,6 @@ import "./index.css" import App from "./App" import reportWebVitals from "./reportWebVitals" import "../../node_modules/@vscode/codicons/dist/codicon.css" -import "./i18n" const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement) root.render( diff --git a/webview-ui/src/locales/de/translation.json b/webview-ui/src/locales/de/translation.json deleted file mode 100644 index 6173e57c38..0000000000 --- a/webview-ui/src/locales/de/translation.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "announcement": { - "newInVersion": "Neu in Version {{version}}", - "joinOurCommunities": "Treten Sie unserem Discord oder Reddit für weitere Updates bei!" - }, - "settingsView": { - "settings": "Einstellungen", - "done": "Fertig", - "language": "Sprache", - "customInstructions": "Benutzerdefinierte Anweisungen", - "customInstructionsPlaceholder": "z.B. \"Führen Sie am Ende Unit-Tests durch\", \"Verwenden Sie TypeScript mit async/await\", \"Sprechen Sie auf Japanisch\"", - "customInstructionsDescription": "Diese Anweisungen werden am Ende des Systemprompts hinzugefügt, der mit jeder Anfrage gesendet wird.", - "debug": "Debuggen", - "resetState": "Zustand zurücksetzen", - "resetStateDescription": "Dies setzt den gesamten globalen Zustand und die geheime Speicherung in der Erweiterung zurück.", - "feedback": "Wenn Sie Fragen oder Feedback haben, können Sie gerne ein Issue eröffnen unter" - }, - "apiOptions": { - "selectModel": "Modell auswählen...", - "model": "Modell", - "apiProvider": "API-Anbieter", - "enterApiKey": "API-Schlüssel eingeben...", - "apiKey": "API-Schlüssel", - "enterBaseUrl": "Basis-URL eingeben...", - "baseUrl": "Basis-URL", - "optionalBaseUrl": "Basis-URL (optional)", - "enterModelId": "Modell-ID eingeben...", - "modelId": "Modell-ID", - "useCustomBaseUrl": "Benutzerdefinierte Basis-URL verwenden", - "apiKeyInfo": "Dieser Schlüssel wird lokal gespeichert und nur verwendet, um API-Anfragen von dieser Erweiterung zu stellen.", - "getDefault": "Standard: {{defaultValue}}", - "getApiKeyMessage": "Sie können einen {{vendor}} API-Schlüssel erhalten, indem Sie sich hier anmelden.", - "getApiVendorKey": "{{vendor}} API-Schlüssel", - "getCompatibleVendor": "{{vendor}} kompatibel", - "lmStudioInfo": "LM Studio ermöglicht es Ihnen, Modelle lokal auf Ihrem Computer auszuführen. Anweisungen zum Einstieg finden Sie in ihrem Schnellstart-Handbuch. Sie müssen auch die lokale Server-Funktion von LM Studio starten, um sie mit dieser Erweiterung zu verwenden. (Hinweis: Cline verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet.)", - "ollamaInfo": "Ollama ermöglicht es Ihnen, Modelle lokal auf Ihrem Computer auszuführen. Anweisungen zum Einstieg finden Sie in ihrem Schnellstart-Handbuch. (Hinweis: Cline verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet.)", - "azureInfo": "(Hinweis: Cline verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet.)", - "setAzureApiVersion": "Azure API-Version festlegen", - "enterGcpProjectId": "Projekt-ID eingeben...", - "gcpProjectId": "Google Cloud Projekt-ID", - "gcpLinks": "Um Google Cloud Vertex AI zu verwenden, müssen Sie 1) ein Google Cloud-Konto erstellen › die Vertex AI API aktivieren › die gewünschten Claude-Modelle aktivieren,
2) die Google Cloud CLI installieren › Anwendungsstandardanmeldeinformationen konfigurieren. ", - "enterAwsAccessKey": "Zugangsschlüssel eingeben...", - "awsAccessKey": "AWS Zugangsschlüssel", - "enterAwsSecretKey": "Geheimschlüssel eingeben...", - "awsSecretKey": "AWS Geheimschlüssel", - "enterAwsSessionToken": "Sitzungstoken eingeben...", - "awsSessionToken": "AWS Sitzungstoken", - "getRegion": "{{vendor}} Region", - "selectRegion": "Region auswählen...", - "useCrossRegionInference": "Regionsübergreifende Inferenz verwenden", - "awsInfo": "Authentifizieren Sie sich entweder durch die Angabe der oben genannten Schlüssel oder verwenden Sie die Standard-AWS-Anmeldeinformationen, d.h. ~/.aws/credentials oder Umgebungsvariablen. Diese Anmeldeinformationen werden nur lokal verwendet, um API-Anfragen von dieser Erweiterung zu stellen.", - "vscodeLanguageModelsInfo": "Die VS Code Language Model API ermöglicht es Ihnen, Modelle zu verwenden, die von anderen VS Code-Erweiterungen bereitgestellt werden (einschließlich, aber nicht beschränkt auf GitHub Copilot). Der einfachste Weg, um loszulegen, ist die Installation der Copilot-Erweiterung aus dem VS Marketplace und die Aktivierung von Claude 3.5 Sonnet.", - "experimentalFeature": "Hinweis: Dies ist eine sehr experimentelle Integration und funktioniert möglicherweise nicht wie erwartet.", - "supportsImages": "Unterstützt Bilder", - "doesNotSupportImages": "Unterstützt keine Bilder", - "supportsComputerUse": "Unterstützt Computernutzung", - "doesNotSupportComputerUse": "Unterstützt keine Computernutzung", - "supportsPromptCache": "Unterstützt Prompt-Caching", - "doesNotSupportPromptCache": "Unterstützt kein Prompt-Caching", - "maxOutput": "Maximale Ausgabe", - "tokens": "Tokens", - "inputPrice": "Eingabepreis", - "millionTokens": "Millionen Tokens", - "cacheWritesPrice": "Cache-Schreibpreis", - "cacheReadsPrice": "Cache-Lesepreis", - "outputPrice": "Ausgabepreis", - "geminiInfo": "* Kostenlos bis zu {{selectedModelId}} Anfragen pro Minute. Danach hängt die Abrechnung von der Prompt-Größe ab.", - "pricingDetails": "Weitere Informationen finden Sie in den Preisdaten.", - "languageModel": "Sprachmodell" - }, - "welcomeView": { - "greeting": "Hallo! Ich bin Cline, dein KI-Assistent.", - "description": "Ich kann alle möglichen Aufgaben dank der neuesten Durchbrüche in Claude 3.5 Sonnets agentischen Codierungsfähigkeiten und dem Zugriff auf Werkzeuge, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit deiner Erlaubnis). Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern.", - "getStarted": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter für Claude 3.5 Sonnet.", - "letsGo": "Los geht's!" - }, - "chatView": { - "typeMessage": "Nachricht eingeben...", - "typeTask": "Aufgabe eingeben...", - "whatCanIDoForYou": "Was kann ich für dich tun?", - "thanksTo": "Dank Claude 3.5 Sonnets agentischen Codierungsfähigkeiten kann ich komplexe Softwareentwicklungsaufgaben Schritt für Schritt bewältigen. Mit Werkzeugen, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (nachdem du die Erlaubnis erteilt hast), kann ich dir auf eine Weise helfen, die über die Codevervollständigung oder den technischen Support hinausgeht. Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern." - }, - "chatTextArea": { - "plan": "Planen", - "act": "Handeln" - }, - "chatRow": { - "error": "Fehler", - "mistakeLimitReached": "Fehlergrenze erreicht", - "autoApprovalMaxReqReached": "Maximale Anzahl automatischer Genehmigungen erreicht", - "command": { - "ask": "Cline möchte diesen Befehl ausführen:", - "say": "Cline hat diesen Befehl ausgeführt:" - }, - "useMcpServer": { - "ask": "Cline möchte dieses {type} auf {serverName} verwenden:", - "say": "Cline hat dieses {type} auf {serverName} verwendet:", - "tool": "Werkzeug", - "resource": "Ressource" - }, - "completionResult": "Abschlussergebnis", - "apiReqCancelled": "API-Anfrage abgebrochen", - "apiStreamingFailed": "API-Streaming fehlgeschlagen", - "apiRequest": "API-Anfrage", - "apiRequestFailed": "API-Anfrage fehlgeschlagen", - "apiRequestInProgress": "API-Anfrage in Bearbeitung", - "followup": "Nachverfolgung", - "tool": { - "editedExistingFile": { - "ask": "Cline möchte diese Datei bearbeiten:", - "say": "Cline bearbeitet diese Datei:" - }, - "createdNewFile": { - "ask": "Cline möchte diese Datei erstellen:", - "say": "Cline hat diese Datei erstellt:" - }, - "readExistingFile": { - "ask": "Cline möchte diese Datei lesen:", - "say": "Cline hat diese Datei gelesen:" - } - }, - "apiReqStarted": "API-Anfrage gestartet", - "userFeedback": "Benutzer-Feedback", - "userFeedbackDiff": "Benutzer-Feedback-Diff", - "diffEditFailed": "Diff-Bearbeitung fehlgeschlagen", - "shellIntegrationUnavailable": "Shell-Integration nicht verfügbar", - "mcpServerResponse": "MCP-Server-Antwort", - "planModeResponse": "Planmodus-Antwort", - "seeNewChanges": "Neue Änderungen anzeigen", - "commandRequiresApproval": "Das Modell hat bestimmt, dass dieser Befehl eine ausdrückliche Genehmigung erfordert.", - "troubleshootingGuide": "Es scheint, dass Sie Probleme mit Windows PowerShell haben. Bitte sehen Sie sich diesen Fehlerbehebungsleitfaden an.", - "clineWantsToViewTopLevelFiles": "Cline möchte die obersten Dateien in diesem Verzeichnis anzeigen:", - "clineViewedTopLevelFiles": "Cline hat die obersten Dateien in diesem Verzeichnis angezeigt:", - "clineWantsToRecursivelyViewFiles": "Cline möchte alle Dateien in diesem Verzeichnis rekursiv anzeigen:", - "clineRecursivelyViewedFiles": "Cline hat alle Dateien in diesem Verzeichnis rekursiv angezeigt:", - "clineWantsToViewSourceCodeDefinitions": "Cline möchte die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen anzeigen:", - "clineViewedSourceCodeDefinitions": "Cline hat die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen angezeigt:", - "clineWantsToSearchDirectory": "Cline möchte dieses Verzeichnis nach {{regex}} durchsuchen:", - "clineSearchedDirectory": "Cline hat dieses Verzeichnis nach {{regex}} durchsucht:", - "diffEditFailedMessage": "Dies passiert normalerweise, wenn das Modell Suchmuster verwendet, die nichts in der Datei finden. Erneut versuchen...", - "shellIntegrationUnavailableMessage": "Cline kann die Ausgabe des Befehls nicht anzeigen. Bitte aktualisiere VSCode (CMD/CTRL + Shift + P → \"Update\") und stelle sicher, dass du eine unterstützte Shell verwendest: zsh, bash, fish oder PowerShell (CMD/CTRL + Shift + P → \"Terminal: Standardprofil auswählen\"). Immer noch Probleme?", - "response": "Antwort", - "stillHavingTrouble": "Immer noch Probleme?" - }, - "autoApproveMenu": { - "none": "Keine", - "autoApprove": "Automatische Genehmigung:", - "autoApproveDescription": "Die automatische Genehmigung ermöglicht es Cline, die folgenden Aktionen ohne Erlaubnis auszuführen. Bitte mit Vorsicht verwenden und nur aktivieren, wenn Sie die Risiken verstehen.", - "autoApproveMaxRequestsDescription": "Cline wird automatisch so viele API-Anfragen stellen, bevor eine Genehmigung zur Fortsetzung der Aufgabe erforderlich ist.", - "enableNotifications": "Benachrichtigungen aktivieren", - "enableNotificationsDescription": "Erhalte Systembenachrichtigungen, wenn Cline eine Genehmigung zur Fortsetzung benötigt oder wenn eine Aufgabe abgeschlossen ist." - }, - "historyPreview": { - "recentTasks": "Kürzliche Aufgaben", - "tokens": "Tokens", - "cache": "Cache", - "apiCost": "API-Kosten", - "viewAllHistory": "Alle Verlauf anzeigen" - }, - "historyView": { - "history": "Verlauf", - "done": "Fertig", - "fuzzySearchHistory": "Verlauf unscharf durchsuchen...", - "newest": "Neueste", - "oldest": "Älteste", - "mostExpensive": "Teuerste", - "mostTokens": "Meiste Tokens", - "mostRelevant": "Relevanteste", - "tokens": "Tokens:", - "cache": "Cache:", - "apiCost": "API-Kosten:", - "export": "EXPORTIEREN" - } -} diff --git a/webview-ui/src/locales/en/translation.json b/webview-ui/src/locales/en/translation.json deleted file mode 100644 index 1f29b62ee8..0000000000 --- a/webview-ui/src/locales/en/translation.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "announcement": { - "newInVersion": "New in version {{version}}", - "joinOurCommunities": "Join our Discord or Reddit for more updates!" - }, - "settingsView": { - "settings": "Settings", - "done": "Done", - "language": "Language", - "customInstructions": "Custom Instructions", - "customInstructionsPlaceholder": "e.g. \"Run unit tests at the end\", \"Use TypeScript with async/await\", \"Speak in Japanese\"", - "customInstructionsDescription": "These instructions are added to the end of the system prompt sent with every request.", - "debug": "Debug", - "resetState": "Reset State", - "resetStateDescription": "This will reset all global state and secret storage in the extension.", - "feedback": "If you have any questions or feedback, feel free to open an issue at" - }, - "apiOptions": { - "selectModel": "Select a Model...", - "model": "Model", - "apiProvider": "API Provider", - "enterApiKey": "Enter API Key...", - "apiKey": "API Key", - "enterBaseUrl": "Enter Base URL...", - "baseUrl": "Base URL", - "optionalBaseUrl": "Base URL (optional)", - "enterModelId": "Enter Model ID...", - "modelId": "Model ID", - "useCustomBaseUrl": "Use custom base URL", - "apiKeyInfo": "This key is stored locally and only used to make API requests from this extension.", - "getDefault": "Default: {{defaultValue}}", - "getApiKeyMessage": "You can get an {{vendor}} API key by signing up here.", - "getApiVendorKey": "{{vendor}} API Key", - "getCompatibleVendor": "{{vendor}} Compatible", - "lmStudioInfo": "LM Studio allows you to run models locally on your computer. For instructions on how to get started, see their quickstart guide. You will also need to start LM Studio's local server feature to use it with this extension. (Note: Cline uses complex prompts and works best with Claude models. Less capable models may not work as expected.)", - "ollamaInfo": "Ollama allows you to run models locally on your computer. For instructions on how to get started, see their quickstart guide. (Note: Cline uses complex prompts and works best with Claude models. Less capable models may not work as expected.)", - "azureInfo": "(Note: Cline uses complex prompts and works best with Claude models. Less capable models may not work as expected.)", - "setAzureApiVersion": "Set Azure API version", - "enterGcpProjectId": "Enter Project ID...", - "gcpProjectId": "Google Cloud Project ID", - "gcpLinks": "To use Google Cloud Vertex AI, you need to 1) create a Google Cloud account › enable the Vertex AI API › enable the desired Claude models,
2) install the Google Cloud CLI › configure Application Default Credentials. ", - "enterAwsAccessKey": "Enter Access Key...", - "awsAccessKey": "AWS Access Key", - "enterAwsSecretKey": "Enter Secret Key...", - "awsSecretKey": "AWS Secret Key", - "enterAwsSessionToken": "Enter Session Token...", - "awsSessionToken": "AWS Session Token", - "getRegion": "{{vendor}} Region", - "selectRegion": "Select a Region...", - "useCrossRegionInference": "Use cross-region inference", - "awsInfo": "Authenticate by either providing the keys above or use the default AWS credential providers, i.e. ~/.aws/credentials or environment variables. These credentials are only used locally to make API requests from this extension.", - "vscodeLanguageModelsInfo": "The VS Code Language Model API allows you to run models provided by other VS Code extensions (including but not limited to GitHub Copilot). The easiest way to get started is to install the Copilot extension from the VS Marketplace and enabling Claude 3.5 Sonnet.", - "experimentalFeature": "Note: This is a very experimental integration and may not work as expected.", - "supportsImages": "Supports images", - "doesNotSupportImages": "Does not support images", - "supportsComputerUse": "Supports computer use", - "doesNotSupportComputerUse": "Does not support computer use", - "supportsPromptCache": "Supports prompt caching", - "doesNotSupportPromptCache": "Does not support prompt caching", - "maxOutput": "Max output", - "tokens": "tokens", - "inputPrice": "Input price", - "millionTokens": "million tokens", - "cacheWritesPrice": "Cache writes price", - "cacheReadsPrice": "Cache reads price", - "outputPrice": "Output price", - "geminiInfo": "* Free up to {{selectedModelId}} requests per minute. After that, billing depends on prompt size.", - "pricingDetails": "For more info, see pricing details.", - "languageModel": "Language Model" - }, - "welcomeView": { - "greeting": "Hello! I'm Cline, your AI assistant.", - "description": "I can do all kinds of tasks thanks to the latest breakthroughs in Claude 3.5 Sonnet's agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.", - "getStarted": "To get started, this extension needs an API provider for Claude 3.5 Sonnet.", - "letsGo": "Let's go!" - }, - "chatView": { - "typeMessage": "Type a message...", - "typeTask": "Type a task...", - "whatCanIDoForYou": "What can I do for you?", - "thanksTo": "Thanks to Claude 3.5 Sonnet's agentic coding capabilities, I can handle complex software development tasks step-by-step. With tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (after you grant permission), I can assist you in ways that go beyond code completion or tech support. I can even use MCP to create new tools and extend my own capabilities." - }, - "chatTextArea": { - "plan": "Plan", - "act": "Act" - }, - "chatRow": { - "error": "Error", - "mistakeLimitReached": "Cline is having trouble...", - "autoApprovalMaxReqReached": "Maximum Requests Reached", - "command": { - "ask": "Cline wants to execute this command:", - "say": "Cline executed this command:" - }, - "useMcpServer": { - "ask": "Cline wants to use this {type} on {serverName}:", - "say": "Cline used this {type} on {serverName}:", - "tool": "tool", - "resource": "resource" - }, - "completionResult": "Task Completed", - "apiReqCancelled": "API Request Cancelled", - "apiStreamingFailed": "API Streaming Failed", - "apiRequest": "API Request", - "apiRequestFailed": "API Request Failed", - "apiRequestInProgress": "API Request...", - "followup": "Cline has a question:", - "tool": { - "editedExistingFile": { - "ask": "Cline wants to edit this file:", - "say": "Cline is editing this file:" - }, - "createdNewFile": { - "ask": "Cline wants to create this file:", - "say": "Cline created this file:" - }, - "readExistingFile": { - "ask": "Cline wants to read this file:", - "say": "Cline read this file:" - } - }, - "apiReqStarted": "API Request Started", - "userFeedback": "User Feedback", - "userFeedbackDiff": "User Feedback Diff", - "diffEditFailed": "Diff Edit Failed", - "shellIntegrationUnavailable": "Shell Integration Unavailable", - "mcpServerResponse": "MCP Server Response", - "planModeResponse": "Plan Mode Response", - "seeNewChanges": "See new changes", - "commandRequiresApproval": "The model has determined this command requires explicit approval.", - "troubleshootingGuide": "It seems like you're having Windows PowerShell issues, please see this troubleshooting guide", - "clineWantsToViewTopLevelFiles": "Cline wants to view the top level files in this directory:", - "clineViewedTopLevelFiles": "Cline viewed the top level files in this directory:", - "clineWantsToRecursivelyViewFiles": "Cline wants to recursively view all files in this directory:", - "clineRecursivelyViewedFiles": "Cline recursively viewed all files in this directory:", - "clineWantsToViewSourceCodeDefinitions": "Cline wants to view source code definition names used in this directory:", - "clineViewedSourceCodeDefinitions": "Cline viewed source code definition names used in this directory:", - "clineWantsToSearchDirectory": "Cline wants to search this directory for {{regex}}:", - "clineSearchedDirectory": "Cline searched this directory for {{regex}}:", - "diffEditFailedMessage": "This usually happens when the model uses search patterns that don't match anything in the file. Retrying...", - "shellIntegrationUnavailableMessage": "Cline won't be able to view the command's output. Please update VSCode (CMD/CTRL + Shift + P → \"Update\") and make sure you're using a supported shell: zsh, bash, fish, or PowerShell (CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\"). Still having trouble?", - "response": "Response", - "stillHavingTrouble": "Still having trouble?" - }, - "autoApproveMenu": { - "none": "None", - "autoApprove": "Auto Approve:", - "autoApproveDescription": "Auto-approve allows Cline to perform the following actions without asking for permission. Please use with caution and only enable if you understand the risks.", - "autoApproveMaxRequestsDescription": "Cline will automatically make this many API requests before asking for approval to proceed with the task.", - "enableNotifications": "Enable Notifications", - "enableNotificationsDescription": "Receive system notifications when Cline requires approval to proceed or when a task is completed." - }, - "historyPreview": { - "recentTasks": "Recent Tasks", - "tokens": "Tokens", - "cache": "Cache", - "apiCost": "API Cost", - "viewAllHistory": "View all history" - }, - "historyView": { - "history": "History", - "done": "Done", - "fuzzySearchHistory": "Fuzzy search history...", - "newest": "Newest", - "oldest": "Oldest", - "mostExpensive": "Most Expensive", - "mostTokens": "Most Tokens", - "mostRelevant": "Most Relevant", - "tokens": "Tokens:", - "cache": "Cache:", - "apiCost": "API Cost:", - "export": "EXPORT" - } -} diff --git a/webview-ui/src/locales/es/translation.json b/webview-ui/src/locales/es/translation.json deleted file mode 100644 index f63e893597..0000000000 --- a/webview-ui/src/locales/es/translation.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "announcement": { - "newInVersion": "Nuevo en la versión {{version}}", - "joinOurCommunities": "Únete a nuestro Discord o Reddit para más actualizaciones!" - }, - "settingsView": { - "settings": "Configuraciones", - "done": "Hecho", - "language": "Idioma", - "customInstructions": "Instrucciones personalizadas", - "customInstructionsPlaceholder": "por ejemplo, \"Realiza pruebas unitarias al final\", \"Usa TypeScript con async/await\", \"Habla en japonés\"", - "customInstructionsDescription": "Estas instrucciones se agregarán al final del prompt del sistema que se envía con cada solicitud.", - "debug": "Depurar", - "resetState": "Restablecer estado", - "resetStateDescription": "Esto restablecerá todo el estado global y el almacenamiento secreto en la extensión.", - "feedback": "Si tienes preguntas o comentarios, no dudes en abrir un issue en" - }, - "apiOptions": { - "selectModel": "Seleccionar modelo...", - "model": "Modelo", - "apiProvider": "Proveedor de API", - "enterApiKey": "Ingresar clave API...", - "apiKey": "Clave API", - "enterBaseUrl": "Ingresar URL base...", - "baseUrl": "URL base", - "optionalBaseUrl": "URL base (opcional)", - "enterModelId": "Ingresar ID del modelo...", - "modelId": "ID del modelo", - "useCustomBaseUrl": "Usar URL base personalizada", - "apiKeyInfo": "Esta clave se almacena localmente y solo se usa para realizar solicitudes API desde esta extensión.", - "getDefault": "Predeterminado: {{defaultValue}}", - "getApiKeyMessage": "Puedes obtener una clave API de {{vendor}} registrándote aquí.", - "getApiVendorKey": "Clave API de {{vendor}}", - "getCompatibleVendor": "Compatible con {{vendor}}", - "lmStudioInfo": "LM Studio te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su Guía de inicio rápido. También debes iniciar la función de servidor local de LM Studio para usarla con esta extensión. (Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", - "ollamaInfo": "Ollama te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su Guía de inicio rápido. (Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", - "azureInfo": "(Nota: Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)", - "setAzureApiVersion": "Establecer versión de API de Azure", - "enterGcpProjectId": "Ingresar ID del proyecto...", - "gcpProjectId": "ID del proyecto de Google Cloud", - "gcpLinks": "Para usar Google Cloud Vertex AI, debes 1) crear una cuenta de Google Cloud › habilitar la API de Vertex AI › habilitar los modelos Claude deseados,
2) instalar la CLI de Google Cloud › configurar credenciales predeterminadas de la aplicación. ", - "enterAwsAccessKey": "Ingresar clave de acceso...", - "awsAccessKey": "Clave de acceso de AWS", - "enterAwsSecretKey": "Ingresar clave secreta...", - "awsSecretKey": "Clave secreta de AWS", - "enterAwsSessionToken": "Ingresar token de sesión...", - "awsSessionToken": "Token de sesión de AWS", - "getRegion": "Región de {{vendor}}", - "selectRegion": "Seleccionar región...", - "useCrossRegionInference": "Usar inferencia entre regiones", - "awsInfo": "Autentícate proporcionando las claves mencionadas arriba o usando las credenciales predeterminadas de AWS, es decir, ~/.aws/credentials o variables de entorno. Estas credenciales solo se usan localmente para realizar solicitudes API desde esta extensión.", - "vscodeLanguageModelsInfo": "La API de Modelos de Lenguaje de VS Code te permite usar modelos proporcionados por otras extensiones de VS Code (incluyendo, pero no limitado a GitHub Copilot). La forma más fácil de comenzar es instalar la extensión Copilot desde el VS Marketplace y habilitar Claude 3.5 Sonnet.", - "experimentalFeature": "Nota: Esta es una integración muy experimental y puede no funcionar como se espera.", - "supportsImages": "Soporta imágenes", - "doesNotSupportImages": "No soporta imágenes", - "supportsComputerUse": "Soporta uso de computadora", - "doesNotSupportComputerUse": "No soporta uso de computadora", - "supportsPromptCache": "Soporta caché de prompts", - "doesNotSupportPromptCache": "No soporta caché de prompts", - "maxOutput": "Salida máxima", - "tokens": "Tokens", - "inputPrice": "Precio de entrada", - "millionTokens": "Millones de tokens", - "cacheWritesPrice": "Precio de escritura en caché", - "cacheReadsPrice": "Precio de lectura en caché", - "outputPrice": "Precio de salida", - "geminiInfo": "* Gratis hasta {{selectedModelId}} solicitudes por minuto. Después, la facturación depende del tamaño del prompt.", - "pricingDetails": "Para más información, consulta los detalles de precios.", - "languageModel": "Modelo de lenguaje" - }, - "welcomeView": { - "greeting": "¡Hola! Soy Cline, tu asistente de IA.", - "description": "Puedo realizar todo tipo de tareas gracias a los últimos avances en las habilidades de codificación agencial de Claude 3.5 Sonnet y el acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (por supuesto, con tu permiso). Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades.", - "getStarted": "Para comenzar, esta extensión necesita un proveedor de API para Claude 3.5 Sonnet.", - "letsGo": "¡Vamos allá!" - }, - "chatView": { - "typeMessage": "Escribir mensaje...", - "typeTask": "Escribir tarea...", - "whatCanIDoForYou": "¿Qué puedo hacer por ti?", - "thanksTo": "Gracias a las habilidades de codificación agencial de Claude 3.5 Sonnet, puedo manejar tareas complejas de desarrollo de software paso a paso. Con herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (después de que hayas dado permiso), puedo ayudarte de una manera que va más allá de la autocompletación de código o el soporte técnico. Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades." - }, - "chatTextArea": { - "plan": "Planificar", - "act": "Actuar" - }, - "chatRow": { - "error": "Error", - "mistakeLimitReached": "Límite de errores alcanzado", - "autoApprovalMaxReqReached": "Número máximo de aprobaciones automáticas alcanzado", - "command": { - "ask": "Cline quiere ejecutar este comando:", - "say": "Cline ha ejecutado este comando:" - }, - "useMcpServer": { - "ask": "Cline quiere usar este {type} en {serverName}:", - "say": "Cline ha usado este {type} en {serverName}:", - "tool": "Herramienta", - "resource": "Recurso" - }, - "completionResult": "Resultado de la finalización", - "apiReqCancelled": "Solicitud API cancelada", - "apiStreamingFailed": "Transmisión API fallida", - "apiRequest": "Solicitud API", - "apiRequestFailed": "Solicitud API fallida", - "apiRequestInProgress": "Solicitud API en progreso", - "followup": "Seguimiento", - "tool": { - "editedExistingFile": { - "ask": "Cline quiere editar este archivo:", - "say": "Cline está editando este archivo:" - }, - "createdNewFile": { - "ask": "Cline quiere crear este archivo:", - "say": "Cline ha creado este archivo:" - }, - "readExistingFile": { - "ask": "Cline quiere leer este archivo:", - "say": "Cline ha leído este archivo:" - } - }, - "apiReqStarted": "Solicitud API iniciada", - "userFeedback": "Comentarios del usuario", - "userFeedbackDiff": "Diferencia de comentarios del usuario", - "diffEditFailed": "Edición de diferencia fallida", - "shellIntegrationUnavailable": "Integración de shell no disponible", - "mcpServerResponse": "Respuesta del servidor MCP", - "planModeResponse": "Respuesta del modo plan", - "seeNewChanges": "Ver nuevos cambios", - "commandRequiresApproval": "El modelo ha determinado que este comando requiere aprobación explícita.", - "troubleshootingGuide": "Guía de solución de problemas", - "clineWantsToViewTopLevelFiles": "Cline quiere ver los archivos principales en este directorio:", - "clineViewedTopLevelFiles": "Cline ha visto los archivos principales en este directorio:", - "clineWantsToRecursivelyViewFiles": "Cline quiere ver todos los archivos en este directorio de forma recursiva:", - "clineRecursivelyViewedFiles": "Cline ha visto todos los archivos en este directorio de forma recursiva:", - "clineWantsToViewSourceCodeDefinitions": "Cline quiere ver los nombres de las definiciones de código fuente usadas en este directorio:", - "clineViewedSourceCodeDefinitions": "Cline ha visto los nombres de las definiciones de código fuente usadas en este directorio:", - "clineWantsToSearchDirectory": "Cline quiere buscar en este directorio por {{regex}}:", - "clineSearchedDirectory": "Cline ha buscado en este directorio por {{regex}}:", - "diffEditFailedMessage": "Esto generalmente ocurre cuando el modelo usa patrones de búsqueda que no encuentran nada en el archivo. Intentar de nuevo...", - "shellIntegrationUnavailableMessage": "Cline no puede mostrar la salida del comando. Por favor, actualiza VSCode (CMD/CTRL + Shift + P → \"Update\") y asegúrate de estar usando una shell compatible: zsh, bash, fish o PowerShell (CMD/CTRL + Shift + P → \"Terminal: Seleccionar perfil predeterminado\"). ¿Sigues teniendo problemas?", - "response": "Respuesta", - "stillHavingTrouble": "¿Sigues teniendo problemas?" - }, - "autoApproveMenu": { - "none": "Ninguno", - "autoApprove": "Aprobación automática:", - "autoApproveDescription": "La aprobación automática permite a Cline realizar las siguientes acciones sin pedir permiso. Por favor, úsalo con precaución y solo habilítalo si entiendes los riesgos.", - "autoApproveMaxRequestsDescription": "Cline realizará automáticamente tantas solicitudes API antes de que se requiera una aprobación para continuar con la tarea.", - "enableNotifications": "Habilitar notificaciones", - "enableNotificationsDescription": "Recibe notificaciones del sistema cuando Cline necesita aprobación para continuar o cuando una tarea se ha completado." - }, - "historyPreview": { - "recentTasks": "Tareas recientes", - "tokens": "Tokens", - "cache": "Caché", - "apiCost": "Costo de API", - "viewAllHistory": "Ver todo el historial" - }, - "historyView": { - "history": "Historial", - "done": "Hecho", - "fuzzySearchHistory": "Búsqueda difusa en el historial...", - "newest": "Más reciente", - "oldest": "Más antiguo", - "mostExpensive": "Más caro", - "mostTokens": "Más tokens", - "mostRelevant": "Más relevante", - "tokens": "Tokens:", - "cache": "Caché:", - "apiCost": "Costo de API:", - "export": "EXPORTAR" - } -} diff --git a/webview-ui/src/locales/ja/translation.json b/webview-ui/src/locales/ja/translation.json deleted file mode 100644 index 4586809879..0000000000 --- a/webview-ui/src/locales/ja/translation.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "announcement": { - "newInVersion": "バージョン{{version}}の新機能", - "joinOurCommunities": "最新情報については、Discord または Reddit にぜひご参加ください!" - }, - "settingsView": { - "settings": "設定", - "done": "完了", - "language": "言語", - "customInstructions": "カスタム指示", - "customInstructionsPlaceholder": "例: 「最後にユニットテストを実行する」、「async/awaitでTypeScriptを使用する」、「英語で話す」", - "customInstructionsDescription": "これらの指示は、各リクエストで送信されるシステムプロンプトの末尾に追加されます。", - "debug": "デバッグ", - "resetState": "状態をリセット", - "resetStateDescription": "拡張機能のすべてのグローバル状態とシークレットストレージがリセットされます。", - "feedback": "ご質問やフィードバックがある場合は、ご自由にイシューを作成してください。" - }, - "apiOptions": { - "selectModel": "モデルを選択...", - "model": "モデル", - "apiProvider": "APIプロバイダー", - "enterApiKey": "APIキーを入力...", - "apiKey": "APIキー", - "enterBaseUrl": "ベースURLを入力...", - "baseUrl": "ベースURL", - "optionalBaseUrl": "ベースURL(任意)", - "enterModelId": "モデルIDを入力...", - "modelId": "モデルID", - "useCustomBaseUrl": "カスタムベースURLを使用", - "apiKeyInfo": "このキーはローカル環境にのみ保存され、拡張機能によるAPIリクエストでのみ使用されます。", - "getDefault": "デフォルト: {{defaultValue}}", - "getApiKeyMessage": "{{vendor}}のAPIキーは、こちらでサインアップして取得できます。", - "getApiVendorKey": "{{vendor}} APIキー", - "getCompatibleVendor": "{{vendor}}互換", - "lmStudioInfo": "LM Studioを使用すると、モデルをローカルコンピューターで実行できます。始め方については、クイックスタートガイドをご覧ください。また、この拡張機能で使用するには、LM Studioのローカルサーバー機能を起動する必要があります。(注意: Clineは複雑なプロンプトを使用するため、Claudeモデルで最適に動作します。処理能力の低いモデルでは、期待通りに動作しない可能性があります。)", - "ollamaInfo": "Ollamaを使用すると、モデルをローカルコンピューターで実行できます。始め方については、クイックスタートガイドをご覧ください。(注意: Clineは複雑なプロンプトを使用するため、Claudeモデルで最適に動作します。処理能力の低いモデルでは、期待通りに動作しない可能性があります。)", - "azureInfo": "(注意: Clineは複雑なプロンプトを使用するため、Claudeモデルで最適に動作します。処理能力の低いモデルでは、期待通りに動作しない可能性があります。)", - "setAzureApiVersion": "Azure APIバージョンを設定", - "enterGcpProjectId": "プロジェクトIDを入力...", - "gcpProjectId": "Google CloudプロジェクトID", - "gcpLinks": "Google Cloud Vertex AIを使用するには、 1) Google Cloudアカウントを作成 › Vertex AI APIを有効化 › Claudeモデルを有効化
2) Google Cloud CLIをインストール › アプリケーションデフォルト認証情報を設定が必要です。", - "enterAwsAccessKey": "アクセスキーを入力...", - "awsAccessKey": "AWSアクセスキー", - "enterAwsSecretKey": "シークレットキーを入力...", - "awsSecretKey": "AWSシークレットキー", - "enterAwsSessionToken": "セッショントークンを入力...", - "awsSessionToken": "AWSセッショントークン", - "getRegion": "{{vendor}} リージョン", - "selectRegion": "リージョンを選択...", - "useCrossRegionInference": "クロスリージョン推論を使用", - "awsInfo": "上記のキーを入力するか、デフォルトのAWS認証プロバイダー (例: ~/.aws/credentials または環境変数) を使用して認証してください。これらの認証情報は、この拡張機能からのAPIリクエストにのみローカルで使用されます。", - "vscodeLanguageModelsInfo": "VS Code Language Model APIを使用すると、他のVS Code拡張機能 (GitHub Copilotなど) が提供するモデルを実行できます。始める最も簡単な方法は、VSマーケットプレイスからCopilot拡張機能をインストールし、Claude 3.5 Sonnetを有効化することです。", - "experimentalFeature": "注意: これは試験的な統合機能であり、意図した通りに動作しない場合があります。", - "supportsImages": "画像サポートあり", - "doesNotSupportImages": "画像サポートなし", - "supportsComputerUse": "コンピューター利用サポートあり", - "doesNotSupportComputerUse": "コンピューター利用サポートなし", - "supportsPromptCache": "プロンプトキャッシュサポートあり", - "doesNotSupportPromptCache": "プロンプトキャッシュサポートなし", - "maxOutput": "最大出力", - "tokens": "トークン", - "inputPrice": "入力価格", - "millionTokens": "百万トークン", - "cacheWritesPrice": "キャッシュ書き込み価格", - "cacheReadsPrice": "キャッシュ読み取り価格", - "outputPrice": "出力価格", - "geminiInfo": "* {{selectedModelId}} リクエスト毎分まで無料。その後、料金はプロンプトサイズに基づいて計算されます。", - "pricingDetails": "詳細については料金情報をご確認ください。", - "languageModel": "言語モデル" - }, - "welcomeView": { - "greeting": "こんにちは!私はあなたのAIアシスタント、クラインです。", - "description": "最新のClaude 3.5 Sonnetのエージェントコーディング機能と、ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろん、あなたの許可が必要です)を可能にするツールのおかげで、あらゆるタスクをこなすことができます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", - "getStarted": "始めるには、この拡張機能にClaude 3.5 SonnetのAPIプロバイダーが必要です。", - "letsGo": "さあ、始めましょう!" - }, - "chatView": { - "typeMessage": "メッセージを入力...", - "typeTask": "タスクを入力...", - "whatCanIDoForYou": "何をお手伝いしましょうか?", - "thanksTo": "Claude 3.5 Sonnetのエージェントコーディング機能のおかげで、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可をいただいた後)を可能にするツールを使用して、コードの補完や技術サポートを超えた支援を提供できます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。" - }, - "chatTextArea": { - "plan": "計画", - "act": "実行" - }, - "chatRow": { - "error": "エラー", - "mistakeLimitReached": "ミスの限界に達しました", - "autoApprovalMaxReqReached": "自動承認の最大リクエストに達しました", - "command": { - "ask": "クラインがこのコマンドを実行したいと考えています:", - "say": "クラインがこのコマンドを実行しました:" - }, - "useMcpServer": { - "ask": "クラインがこの{type}を{serverName}で使用したいと考えています:", - "say": "クラインがこの{type}を{serverName}で使用しました:", - "tool": "ツール", - "resource": "リソース" - }, - "completionResult": "完了結果", - "apiReqCancelled": "APIリクエストがキャンセルされました", - "apiStreamingFailed": "APIストリーミングに失敗しました", - "apiRequest": "APIリクエスト", - "apiRequestFailed": "APIリクエストに失敗しました", - "apiRequestInProgress": "APIリクエスト進行中", - "followup": "フォローアップ", - "tool": { - "editedExistingFile": { - "ask": "クラインがこのファイルを編集したいと考えています:", - "say": "クラインがこのファイルを編集しています:" - }, - "createdNewFile": { - "ask": "クラインがこのファイルを作成したいと考えています:", - "say": "クラインがこのファイルを作成しました:" - }, - "readExistingFile": { - "ask": "クラインがこのファイルを読みたいと考えています:", - "say": "クラインがこのファイルを読みました:" - } - }, - "apiReqStarted": "APIリクエスト開始", - "userFeedback": "ユーザーフィードバック", - "userFeedbackDiff": "ユーザーフィードバック差分", - "diffEditFailed": "差分編集に失敗しました", - "shellIntegrationUnavailable": "シェル統合が利用できません", - "mcpServerResponse": "MCPサーバー応答", - "planModeResponse": "計画モード応答", - "seeNewChanges": "新しい変更を見る", - "commandRequiresApproval": "このコマンドは明示的な承認が必要です。", - "troubleshootingGuide": "Windows PowerShellの問題が発生しているようです。このトラブルシューティングガイドをご覧ください。", - "clineWantsToViewTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示したいと考えています:", - "clineViewedTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示しました:", - "clineWantsToRecursivelyViewFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示したいと考えています:", - "clineRecursivelyViewedFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示しました:", - "clineWantsToViewSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示したいと考えています:", - "clineViewedSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示しました:", - "clineWantsToSearchDirectory": "クラインがこのディレクトリで{{regex}}を検索したいと考えています:", - "clineSearchedDirectory": "クラインがこのディレクトリで{{regex}}を検索しました:", - "diffEditFailedMessage": "これは通常、モデルがファイル内で一致しない検索パターンを使用した場合に発生します。再試行中...", - "shellIntegrationUnavailableMessage": "クラインはコマンドの出力を表示できません。VSCodeを更新し(CMD/CTRL + Shift + P → \"Update\")、サポートされているシェルを使用していることを確認してください:zsh、bash、fish、またはPowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。まだ問題がありますか?", - "response": "応答", - "stillHavingTrouble": "まだ問題がありますか?" - }, - "autoApproveMenu": { - "none": "なし", - "autoApprove": "自動承認:", - "autoApproveDescription": "自動承認を有効にすると、クラインが以下のアクションを許可を求めずに実行できるようになります。リスクを理解した上で、慎重に使用してください。", - "autoApproveMaxRequestsDescription": "クラインは、このタスクを進めるために承認を求める前に、この数のAPIリクエストを自動的に行います。", - "enableNotifications": "通知を有効にする", - "enableNotificationsDescription": "クラインがタスクを進めるために承認を求めるとき、またはタスクが完了したときにシステム通知を受け取ります。" - }, - "historyPreview": { - "recentTasks": "最近のタスク", - "tokens": "トークン", - "cache": "キャッシュ", - "apiCost": "APIコスト", - "viewAllHistory": "すべての履歴を見る" - }, - "historyView": { - "history": "履歴", - "done": "完了", - "fuzzySearchHistory": "履歴をあいまい検索...", - "newest": "最新", - "oldest": "最古", - "mostExpensive": "最も高価", - "mostTokens": "最も多いトークン", - "mostRelevant": "最も関連性が高い", - "tokens": "トークン:", - "cache": "キャッシュ:", - "apiCost": "APIコスト:", - "export": "エクスポート" - } -} diff --git a/webview-ui/src/locales/zh-cn/translation.json b/webview-ui/src/locales/zh-cn/translation.json deleted file mode 100644 index 4045c6a8c4..0000000000 --- a/webview-ui/src/locales/zh-cn/translation.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "announcement": { - "newInVersion": "版本 {{version}} 中的新功能", - "joinOurCommunities": "加入我们的 DiscordReddit 获取更多更新!" - }, - "settingsView": { - "settings": "设置", - "done": "完成", - "language": "语言", - "customInstructions": "自定义指令", - "customInstructionsPlaceholder": "例如 \"在结束时运行单元测试\", \"使用 TypeScript 和 async/await\", \"用日语交流\"", - "customInstructionsDescription": "这些指令会添加到每个请求发送的系统提示的末尾。", - "debug": "调试", - "resetState": "重置状态", - "resetStateDescription": "这将重置扩展中的所有全局状态和秘密存储。", - "feedback": "如果您有任何问题或反馈,请随时在以下网址提交问题" - }, - "apiOptions": { - "selectModel": "选择模型...", - "model": "模型", - "apiProvider": "API 提供商", - "enterApiKey": "请输入 API 密钥...", - "apiKey": "API 密钥", - "enterBaseUrl": "输入基本 URL...", - "baseUrl": "基本 URL", - "enterModelId": "输入模型 ID...", - "modelId": "模型 ID", - "useCustomBaseUrl": "使用自定义基本 URL", - "apiKeyInfo": "此密钥存储在本地,仅用于从此扩展进行 API 请求。", - "getApiKeyMessage": "您可以通过在此处注册来获取 {{vendor}} API 密钥。", - "getApiVendorKey": "{{vendor}} API 密钥", - "getCompatibleVendor": "{{vendor}} 兼容", - "enterGcpProjectId": "输入项目 ID...", - "gcpProjectId": "Google Cloud 项目 ID", - "gcpLinks": "要使用 Google Cloud Vertex AI,您需要 1) 创建一个 Google Cloud 帐户 › 启用 Vertex AI API › 启用所需的 Claude 模型,
2) 安装 Google Cloud CLI › 配置应用程序默认凭据。", - "enterAwsAccessKey": "输入访问密钥...", - "awsAccessKey": "AWS 访问密钥", - "enterAwsSecretKey": "输入秘密密钥...", - "awsSecretKey": "AWS 密钥", - "enterAwsSessionToken": "输入会话令牌...", - "awsSessionToken": "AWS 会话令牌", - "awsRegion": "AWS 区域", - "getRegion": "{{vendor}} 区域", - "selectRegion": "选择区域...", - "useCrossRegionInference": "使用跨区域推理", - "awsInfo": "通过提供上述密钥或使用默认的 AWS 凭证提供程序进行身份验证,即 ~/.aws/credentials 或环境变量。这些凭证仅在本地用于从此扩展进行 API 请求。", - "vscodeLanguageModelsInfo": "VS Code 语言模型 API 允许您运行其他 VS Code 扩展提供的模型(包括但不限于 GitHub Copilot)。最简单的方法是从 VS Marketplace 安装 Copilot 扩展并启用 Claude 3.5 Sonnet。", - "experimentalFeature": "注意:这是一个非常实验性功能,可能无法按预期工作。", - "supportsImages": "支持图像", - "doesNotSupportImages": "不支持图像", - "supportsComputerUse": "支持计算机使用", - "doesNotSupportComputerUse": "不支持计算机使用", - "supportsPromptCache": "支持提示缓存", - "doesNotSupportPromptCache": "不支持提示缓存", - "maxOutput": "最大输出", - "tokens": "令牌", - "inputPrice": "输入价格", - "millionTokens": "百万令牌", - "cacheWritesPrice": "缓存写入价格", - "cacheReadsPrice": "缓存读取价格", - "outputPrice": "输出价格", - "geminiInfo": "* 每分钟最多 {{selectedModelId}} 次请求免费。之后,费用取决于提示大小。", - "pricingDetails": "有关更多信息,请参阅定价详情。", - "languageModel": "语言模型" - }, - "welcomeView": { - "greeting": "你好!我是 Cline,你的 AI 助手。", - "description": "感谢 Claude 3.5 Sonnet 的代理编码能力 和访问工具,我可以执行各种任务,这些工具让我可以创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令(当然,需要你的许可)。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。", - "getStarted": "要开始使用,此扩展需要 Claude 3.5 Sonnet 的 API 提供商。", - "letsGo": "开始吧!" - }, - "chatView": { - "typeMessage": "输入消息...", - "typeTask": "输入任务...", - "whatCanIDoForYou": "我能为你做什么?", - "thanksTo": "感谢 Claude 3.5 Sonnet 的代理编码能力, 我可以一步步处理复杂的软件开发任务。通过允许我创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令的工具(在你授予权限后),我可以以超越代码完成或技术支持的方式帮助你。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。" - }, - "chatTextArea": { - "plan": "计划", - "act": "行动" - }, - "chatRow": { - "error": "错误", - "mistakeLimitReached": "错误次数达到上限", - "autoApprovalMaxReqReached": "自动批准请求次数达到上限", - "command": { - "ask": "Cline 想执行此命令:", - "say": "Cline 执行了此命令:" - }, - "useMcpServer": { - "ask": "Cline 想在 {serverName} 上使用此 {type}:", - "say": "Cline 在 {serverName} 上使用了此 {type}:", - "tool": "工具", - "resource": "资源" - }, - "completionResult": "完成结果", - "apiReqCancelled": "API 请求已取消", - "apiStreamingFailed": "API 流式传输失败", - "apiRequest": "API 请求", - "apiRequestFailed": "API 请求失败", - "apiRequestInProgress": "API 请求进行中", - "followup": "跟进", - "tool": { - "editedExistingFile": { - "ask": "Cline 想编辑此文件:", - "say": "Cline 正在编辑此文件:" - }, - "createdNewFile": { - "ask": "Cline 想创建此文件:", - "say": "Cline 创建了此文件:" - }, - "readExistingFile": { - "ask": "Cline 想读取此文件:", - "say": "Cline 读取了此文件:" - } - }, - "apiReqStarted": "API 请求已启动", - "userFeedback": "用户反馈", - "userFeedbackDiff": "用户反馈差异", - "diffEditFailed": "差异编辑失败", - "shellIntegrationUnavailable": "Shell 集成不可用", - "mcpServerResponse": "MCP 服务器响应", - "planModeResponse": "计划模式响应", - "seeNewChanges": "查看新更改", - "commandRequiresApproval": "模型已确定此命令需要明确批准。", - "troubleshootingGuide": "看起来你遇到了 Windows PowerShell 问题,请参阅此 故障排除指南", - "clineWantsToViewTopLevelFiles": "Cline 想查看此目录中的顶级文件:", - "clineViewedTopLevelFiles": "Cline 查看了此目录中的顶级文件:", - "clineWantsToRecursivelyViewFiles": "Cline 想递归查看此目录中的所有文件:", - "clineRecursivelyViewedFiles": "Cline 递归查看了此目录中的所有文件:", - "clineWantsToViewSourceCodeDefinitions": "Cline 想查看此目录中使用的源代码定义名称:", - "clineViewedSourceCodeDefinitions": "Cline 查看了此目录中使用的源代码定义名称:", - "clineWantsToSearchDirectory": "Cline 想在此目录中搜索 {{regex}}:", - "clineSearchedDirectory": "Cline 在此目录中搜索了 {{regex}}:", - "diffEditFailedMessage": "这通常发生在模型使用的搜索模式与文件中的任何内容不匹配时。重试中...", - "shellIntegrationUnavailableMessage": "Cline 将无法查看命令的输出。请更新 VSCode(CMD/CTRL + Shift + P → \"Update\")并确保你使用的是受支持的 shell:zsh、bash、fish 或 PowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有问题?", - "response": "响应", - "stillHavingTrouble": "仍有问题?" - }, - "autoApproveMenu": { - "none": "无", - "autoApprove": "自动批准:", - "autoApproveDescription": "自动批准允许 Cline 在不请求许可的情况下执行以下操作。请谨慎使用,并仅在了解风险的情况下启用。", - "autoApproveMaxRequestsDescription": "Cline 将自动发出此数量的 API 请求,然后再请求批准以继续任务。", - "enableNotifications": "启用通知", - "enableNotificationsDescription": "当 Cline 需要批准以继续或任务完成时接收系统通知。" - }, - "historyPreview": { - "recentTasks": "最近任务", - "tokens": "令牌", - "cache": "缓存", - "apiCost": "API 成本", - "viewAllHistory": "查看所有历史记录" - }, - "historyView": { - "history": "历史", - "done": "完成", - "fuzzySearchHistory": "模糊搜索历史...", - "newest": "最新", - "oldest": "最旧", - "mostExpensive": "最昂贵", - "mostTokens": "最多令牌", - "mostRelevant": "最相关", - "tokens": "令牌:", - "cache": "缓存:", - "apiCost": "API 成本:", - "export": "导出" - } -} diff --git a/webview-ui/src/locales/zh-tw/translation.json b/webview-ui/src/locales/zh-tw/translation.json deleted file mode 100644 index 89cdc8b5fd..0000000000 --- a/webview-ui/src/locales/zh-tw/translation.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "announcement": { - "newInVersion": "版本 {{version}} 中的新功能", - "joinOurCommunities": "加入我們的 DiscordReddit 獲取更多更新!" - }, - "settingsView": { - "settings": "設置", - "done": "完成", - "language": "語言", - "customInstructions": "自定義指令", - "customInstructionsPlaceholder": "例如 \"在結束時運行單元測試\", \"使用 TypeScript 和 async/await\", \"用日語交流\"", - "customInstructionsDescription": "這些指令會添加到每個請求發送的系統提示的末尾。", - "debug": "調試", - "resetState": "重置狀態", - "resetStateDescription": "這將重置擴展中的所有全局狀態和秘密存儲。", - "feedback": "如果您有任何問題或反饋,請隨時在以下網址提交問題" - }, - "apiOptions": { - "selectModel": "選擇模型...", - "model": "模型", - "apiProvider": "API 提供者", - "enterApiKey": "請輸入 API 密鑰...", - "apiKey": "API 密鑰", - "enterBaseUrl": "輸入基本 URL...", - "baseUrl": "基本 URL", - "enterModelId": "輸入模型 ID...", - "modelId": "模型 ID", - "useCustomBaseUrl": "使用自定義基本 URL", - "apiKeyInfo": "此密鑰僅存儲在本地,僅用於從此擴展進行 API 請求。", - "getApiKeyMessage": "您可以通過在此處註冊來獲取 {{vendor}} API 金鑰。", - "getApiVendorKey": "{{vendor}} API 金鑰", - "getCompatibleVendor": "{{vendor}} 兼容", - "enterGcpProjectId": "輸入項目 ID...", - "gcpProjectId": "Google Cloud 項目 ID", - "gcpLinks": "要使用 Google Cloud Vertex AI,您需要 1) 創建 Google Cloud 帳戶 › 啟用 Vertex AI API › 啟用所需的 Claude 模型,
2) 安裝 Google Cloud CLI › 配置應用程序默認憑據。 ", - "enterAwsAccessKey": "輸入訪問金鑰...", - "awsAccessKey": "AWS 訪問金鑰", - "enterAwsSecretKey": "輸入秘密金鑰...", - "awsSecretKey": "AWS 秘密金鑰", - "enterAwsSessionToken": "輸入會話令牌...", - "awsSessionToken": "AWS 會話令牌", - "awsRegion": "AWS 區域", - "getRegion": "{{vendor}} 區域", - "selectRegion": "選擇區域...", - "useCrossRegionInference": "使用跨區域推理", - "awsInfo": "通過提供上述金鑰或使用默認的 AWS 憑據提供者進行身份驗證,即 ~/.aws/credentials 或環境變量。這些憑據僅在本地用於從此擴展進行 API 請求。", - "vscodeLanguageModelsInfo": "VS Code 語言模型 API 允許您運行其他 VS Code 擴展提供的模型(包括但不限於 GitHub Copilot)。最簡單的入門方法是從 VS Marketplace 安裝 Copilot 擴展並啟用 Claude 3.5 Sonnet。", - "experimentalFeature": "注意:這是一個非常實驗性的集成,可能無法按預期工作。", - "supportsImages": "支持圖片", - "doesNotSupportImages": "不支持圖片", - "supportsComputerUse": "支持電腦使用", - "doesNotSupportComputerUse": "不支持電腦使用", - "supportsPromptCache": "支持提示緩存", - "doesNotSupportPromptCache": "不支持提示緩存", - "maxOutput": "最大輸出", - "tokens": "標記", - "inputPrice": "輸入價格", - "millionTokens": "百萬標記", - "cacheWritesPrice": "緩存寫入價格", - "cacheReadsPrice": "緩存讀取價格", - "outputPrice": "輸出價格", - "geminiInfo": "* 每分鐘最多免費 {{selectedModelId}} 次請求。之後,計費取決於提示大小。", - "pricingDetails": "更多信息,請參見定價詳情。", - "languageModel": "語言模型" - }, - "welcomeView": { - "greeting": "您好!我是 Cline,您的 AI 助手。", - "description": "得益於 Claude 3.5 Sonnet 的代理編碼能力 和訪問各種工具,我可以執行各種任務,這些工具讓我能夠創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(當然是在您的許可下)。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。", - "getStarted": "要開始使用,這個擴展需要 Claude 3.5 Sonnet 的 API 提供者。", - "letsGo": "讓我們開始吧!" - }, - "chatView": { - "typeMessage": "輸入消息...", - "typeTask": "輸入任務...", - "whatCanIDoForYou": "我能為您做什麼?", - "thanksTo": "感謝 Claude 3.5 Sonnet 的代理編碼能力, 我可以逐步處理複雜的軟件開發任務。通過這些工具,我可以創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(在您授權後),我可以幫助您完成超越代碼補全或技術支持的任務。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。" - }, - "chatTextArea": { - "plan": "計劃", - "act": "行動" - }, - "chatRow": { - "error": "錯誤", - "mistakeLimitReached": "錯誤次數達到上限", - "autoApprovalMaxReqReached": "自動批准請求次數達到上限", - "command": { - "ask": "Cline 想要執行此命令:", - "say": "Cline 執行了此命令:" - }, - "useMcpServer": { - "ask": "Cline 想要在 {serverName} 上使用此 {type}:", - "say": "Cline 在 {serverName} 上使用了此 {type}:", - "tool": "工具", - "resource": "資源" - }, - "completionResult": "完成結果", - "apiReqCancelled": "API 請求已取消", - "apiStreamingFailed": "API 流式傳輸失敗", - "apiRequest": "API 請求", - "apiRequestFailed": "API 請求失敗", - "apiRequestInProgress": "API 請求進行中", - "followup": "後續", - "tool": { - "editedExistingFile": { - "ask": "Cline 想要編輯此文件:", - "say": "Cline 正在編輯此文件:" - }, - "createdNewFile": { - "ask": "Cline 想要創建此文件:", - "say": "Cline 創建了此文件:" - }, - "readExistingFile": { - "ask": "Cline 想要閱讀此文件:", - "say": "Cline 閱讀了此文件:" - } - }, - "apiReqStarted": "API 請求已開始", - "userFeedback": "用戶反饋", - "userFeedbackDiff": "用戶反饋差異", - "diffEditFailed": "差異編輯失敗", - "shellIntegrationUnavailable": "Shell 集成不可用", - "mcpServerResponse": "MCP 服務器響應", - "planModeResponse": "計劃模式響應", - "seeNewChanges": "查看新變更", - "commandRequiresApproval": "模型已確定此命令需要明確批准。", - "troubleshootingGuide": "看起來您遇到了 Windows PowerShell 問題,請參閱此 故障排除指南", - "clineWantsToViewTopLevelFiles": "Cline 想要查看此目錄中的頂層文件:", - "clineViewedTopLevelFiles": "Cline 查看了此目錄中的頂層文件:", - "clineWantsToRecursivelyViewFiles": "Cline 想要遞歸查看此目錄中的所有文件:", - "clineRecursivelyViewedFiles": "Cline 遞歸查看了此目錄中的所有文件:", - "clineWantsToViewSourceCodeDefinitions": "Cline 想要查看此目錄中使用的源代碼定義名稱:", - "clineViewedSourceCodeDefinitions": "Cline 查看了此目錄中使用的源代碼定義名稱:", - "clineWantsToSearchDirectory": "Cline 想要在此目錄中搜索 {{regex}}:", - "clineSearchedDirectory": "Cline 在此目錄中搜索了 {{regex}}:", - "diffEditFailedMessage": "這通常發生在模型使用的搜索模式與文件中的任何內容不匹配時。重試中...", - "shellIntegrationUnavailableMessage": "Cline 將無法查看命令的輸出。請更新 VSCode(CMD/CTRL + Shift + P → \"Update\")並確保您使用的是受支持的 shell:zsh、bash、fish 或 PowerShell(CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有問題?", - "response": "響應", - "stillHavingTrouble": "仍有問題?" - }, - "autoApproveMenu": { - "none": "無", - "autoApprove": "自動批准:", - "autoApproveDescription": "自動批准允許 Cline 執行以下操作而無需請求許可。請謹慎使用,僅在您了解風險的情況下啟用。", - "autoApproveMaxRequestsDescription": "Cline 將自動發出這麼多 API 請求,然後再請求批准以繼續任務。", - "enableNotifications": "啟用通知", - "enableNotificationsDescription": "當 Cline 需要批准以繼續或任務完成時接收系統通知。" - }, - "historyPreview": { - "recentTasks": "最近任務", - "tokens": "標記", - "cache": "緩存", - "apiCost": "API 成本", - "viewAllHistory": "查看所有歷史記錄" - }, - "historyView": { - "history": "歷史", - "done": "完成", - "fuzzySearchHistory": "模糊搜索歷史...", - "newest": "最新", - "oldest": "最舊", - "mostExpensive": "最昂貴", - "mostTokens": "最多標記", - "mostRelevant": "最相關", - "tokens": "標記:", - "cache": "緩存:", - "apiCost": "API 成本:", - "export": "導出" - } -} From cb3e278695c5985f9d4689abb1fcb534ded33913 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:37:37 -0800 Subject: [PATCH 32/74] chore: add changesets --- .changeset/README.md | 8 + .changeset/config.json | 11 + package-lock.json | 825 ++++++++++++++++++++++++++++++++++++++++- package.json | 6 +- 4 files changed, 847 insertions(+), 3 deletions(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000000..e5b6d8d6a6 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000000..42efc1c834 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.5/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/package-lock.json b/package-lock.json index 8962955abe..9f3906f1d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "claude-dev", - "version": "3.2.5", + "version": "3.2.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "claude-dev", - "version": "3.2.5", + "version": "3.2.6", "license": "Apache-2.0", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", @@ -50,6 +50,7 @@ "zod": "^3.23.8" }, "devDependencies": { + "@changesets/cli": "^2.27.12", "@types/chai": "^5.0.1", "@types/diff": "^5.2.1", "@types/mocha": "^10.0.7", @@ -2176,6 +2177,19 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, + "node_modules/@babel/runtime": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", @@ -2183,6 +2197,341 @@ "dev": true, "license": "MIT" }, + "node_modules/@changesets/apply-release-plan": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.8.tgz", + "integrity": "sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/config": "^3.0.5", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.2", + "@changesets/should-skip-package": "^0.1.1", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.5.tgz", + "integrity": "sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.2", + "@changesets/should-skip-package": "^0.1.1", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", + "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.27.12", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.12.tgz", + "integrity": "sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.0.8", + "@changesets/assemble-release-plan": "^6.0.5", + "@changesets/changelog-git": "^0.2.0", + "@changesets/config": "^3.0.5", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.2", + "@changesets/get-release-plan": "^4.0.6", + "@changesets/git": "^3.0.2", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.1", + "@changesets/read": "^0.6.2", + "@changesets/should-skip-package": "^0.1.1", + "@changesets/types": "^6.0.0", + "@changesets/write": "^0.3.2", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "ci-info": "^3.7.0", + "enquirer": "^2.4.1", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "p-limit": "^2.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@changesets/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/config": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.5.tgz", + "integrity": "sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.2", + "@changesets/logger": "^0.1.1", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" + } + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "dev": true, + "license": "MIT", + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.2.tgz", + "integrity": "sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.6.tgz", + "integrity": "sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.5", + "@changesets/config": "^3.0.5", + "@changesets/pre": "^2.0.1", + "@changesets/read": "^0.6.2", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.2.tgz", + "integrity": "sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", + "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@changesets/parse/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@changesets/pre": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.1.tgz", + "integrity": "sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.2.tgz", + "integrity": "sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/git": "^3.0.2", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.0", + "@changesets/types": "^6.0.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.1.tgz", + "integrity": "sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", + "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.2.tgz", + "integrity": "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", @@ -3162,6 +3511,165 @@ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT" }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/get-packages/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@mistralai/mistralai": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.4.0.tgz", @@ -5749,6 +6257,19 @@ "node": ">=10.0.0" } }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -6007,6 +6528,13 @@ "node": ">=8" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -6090,6 +6618,22 @@ "devtools-protocol": "*" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -6522,6 +7066,16 @@ "node": ">= 0.8" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/devtools-protocol": { "version": "0.0.1342118", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", @@ -6705,6 +7259,33 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -7268,6 +7849,41 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -8221,6 +8837,13 @@ "node": ">= 14" } }, + "node_modules/human-id": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", + "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", + "dev": true, + "license": "MIT" + }, "node_modules/human-signals": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", @@ -8686,6 +9309,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -8744,6 +9380,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -9027,6 +9673,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9481,6 +10134,16 @@ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10062,6 +10725,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10094,6 +10787,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/p-timeout": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", @@ -10106,6 +10809,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/p-wait-for": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.2.tgz", @@ -10160,6 +10873,13 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/package-manager-detector": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.8.tgz", + "integrity": "sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==", + "dev": true, + "license": "MIT" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -10342,6 +11062,13 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -10643,6 +11370,56 @@ "node": ">=4" } }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/read-yaml-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -10671,6 +11448,13 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -11204,6 +11988,17 @@ "node": ">=0.10.0" } }, + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -11561,6 +12356,19 @@ "streamx": "^2.15.0" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -11644,6 +12452,19 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index ec56603bc3..03f7948473 100644 --- a/package.json +++ b/package.json @@ -186,9 +186,13 @@ "test:webview": "cd webview-ui && npm run test", "publish:marketplace": "vsce publish && ovsx publish", "publish:marketplace:prerelease": "vsce publish --pre-release && ovsx publish --pre-release", - "prepare": "husky" + "prepare": "husky", + "changeset": "changeset", + "version-packages": "changeset version && npm install --package-lock-only", + "publish": "npm run build && changeset publish && npm install --package-lock-only" }, "devDependencies": { + "@changesets/cli": "^2.27.12", "@types/chai": "^5.0.1", "@types/diff": "^5.2.1", "@types/mocha": "^10.0.7", From 6da887754c9247d99c2921181fcf9c3f21a56b46 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 00:15:36 -0800 Subject: [PATCH 33/74] Revert "chore: add changesets" This reverts commit cb3e278695c5985f9d4689abb1fcb534ded33913. --- .changeset/README.md | 8 - .changeset/config.json | 11 - package-lock.json | 825 +---------------------------------------- package.json | 6 +- 4 files changed, 3 insertions(+), 847 deletions(-) delete mode 100644 .changeset/README.md delete mode 100644 .changeset/config.json diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index e5b6d8d6a6..0000000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index 42efc1c834..0000000000 --- a/.changeset/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@3.0.5/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [] -} diff --git a/package-lock.json b/package-lock.json index 9f3906f1d4..8962955abe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "claude-dev", - "version": "3.2.6", + "version": "3.2.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "claude-dev", - "version": "3.2.6", + "version": "3.2.5", "license": "Apache-2.0", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", @@ -50,7 +50,6 @@ "zod": "^3.23.8" }, "devDependencies": { - "@changesets/cli": "^2.27.12", "@types/chai": "^5.0.1", "@types/diff": "^5.2.1", "@types/mocha": "^10.0.7", @@ -2177,19 +2176,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "node_modules/@babel/runtime": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", - "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", @@ -2197,341 +2183,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.8.tgz", - "integrity": "sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/config": "^3.0.5", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.2", - "@changesets/should-skip-package": "^0.1.1", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.5.tgz", - "integrity": "sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.2", - "@changesets/should-skip-package": "^0.1.1", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", - "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.0.0" - } - }, - "node_modules/@changesets/cli": { - "version": "2.27.12", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.12.tgz", - "integrity": "sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/apply-release-plan": "^7.0.8", - "@changesets/assemble-release-plan": "^6.0.5", - "@changesets/changelog-git": "^0.2.0", - "@changesets/config": "^3.0.5", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.2", - "@changesets/get-release-plan": "^4.0.6", - "@changesets/git": "^3.0.2", - "@changesets/logger": "^0.1.1", - "@changesets/pre": "^2.0.1", - "@changesets/read": "^0.6.2", - "@changesets/should-skip-package": "^0.1.1", - "@changesets/types": "^6.0.0", - "@changesets/write": "^0.3.2", - "@manypkg/get-packages": "^1.1.3", - "ansi-colors": "^4.1.3", - "ci-info": "^3.7.0", - "enquirer": "^2.4.1", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "mri": "^1.2.0", - "p-limit": "^2.2.0", - "package-manager-detector": "^0.2.0", - "picocolors": "^1.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^3.0.1", - "term-size": "^2.1.0" - }, - "bin": { - "changeset": "bin.js" - } - }, - "node_modules/@changesets/cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@changesets/cli/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@changesets/config": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.5.tgz", - "integrity": "sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.2", - "@changesets/logger": "^0.1.1", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.8" - } - }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", - "dev": true, - "license": "MIT", - "dependencies": { - "extendable-error": "^0.1.5" - } - }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.2.tgz", - "integrity": "sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "picocolors": "^1.1.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.6.tgz", - "integrity": "sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/assemble-release-plan": "^6.0.5", - "@changesets/config": "^3.0.5", - "@changesets/pre": "^2.0.1", - "@changesets/read": "^0.6.2", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.2.tgz", - "integrity": "sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.8", - "spawndamnit": "^3.0.1" - } - }, - "node_modules/@changesets/logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/parse": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", - "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@changesets/parse/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@changesets/parse/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@changesets/pre": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.1.tgz", - "integrity": "sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - } - }, - "node_modules/@changesets/read": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.2.tgz", - "integrity": "sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/git": "^3.0.2", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/should-skip-package": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.1.tgz", - "integrity": "sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/write": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.2.tgz", - "integrity": "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "prettier": "^2.7.1" - } - }, - "node_modules/@changesets/write/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", @@ -3511,165 +3162,6 @@ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT" }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/find-root/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@manypkg/find-root/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@manypkg/find-root/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@manypkg/find-root/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" - } - }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@manypkg/get-packages/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@manypkg/get-packages/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@mistralai/mistralai": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.4.0.tgz", @@ -6257,19 +5749,6 @@ "node": ">=10.0.0" } }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -6528,13 +6007,6 @@ "node": ">=8" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -6618,22 +6090,6 @@ "devtools-protocol": "*" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -7066,16 +6522,6 @@ "node": ">= 0.8" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/devtools-protocol": { "version": "0.0.1342118", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", @@ -7259,33 +6705,6 @@ "node": ">=10.13.0" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/enquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -7849,41 +7268,6 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -8837,13 +8221,6 @@ "node": ">= 14" } }, - "node_modules/human-id": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", - "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", - "dev": true, - "license": "MIT" - }, "node_modules/human-signals": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", @@ -9309,19 +8686,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -9380,16 +8744,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -9673,13 +9027,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -10134,16 +9481,6 @@ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10725,36 +10062,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10787,16 +10094,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/p-timeout": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", @@ -10809,16 +10106,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/p-wait-for": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.2.tgz", @@ -10873,13 +10160,6 @@ "dev": true, "license": "BlueOak-1.0.0" }, - "node_modules/package-manager-detector": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.8.tgz", - "integrity": "sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==", - "dev": true, - "license": "MIT" - }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -11062,13 +10342,6 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -11370,56 +10643,6 @@ "node": ">=4" } }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/read-yaml-file/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -11448,13 +10671,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -11988,17 +11204,6 @@ "node": ">=0.10.0" } }, - "node_modules/spawndamnit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", - "dev": true, - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "cross-spawn": "^7.0.5", - "signal-exit": "^4.0.1" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -12356,19 +11561,6 @@ "streamx": "^2.15.0" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -12452,19 +11644,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index 03f7948473..ec56603bc3 100644 --- a/package.json +++ b/package.json @@ -186,13 +186,9 @@ "test:webview": "cd webview-ui && npm run test", "publish:marketplace": "vsce publish && ovsx publish", "publish:marketplace:prerelease": "vsce publish --pre-release && ovsx publish --pre-release", - "prepare": "husky", - "changeset": "changeset", - "version-packages": "changeset version && npm install --package-lock-only", - "publish": "npm run build && changeset publish && npm install --package-lock-only" + "prepare": "husky" }, "devDependencies": { - "@changesets/cli": "^2.27.12", "@types/chai": "^5.0.1", "@types/diff": "^5.2.1", "@types/mocha": "^10.0.7", From b2dd04cff3385a95967f0407f8e31edc693e8156 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 00:31:34 -0800 Subject: [PATCH 34/74] chore: add changie --- .changes/header.tpl.md | 6 ++++++ .changes/unreleased/.gitkeep | 0 .changie.yaml | 26 ++++++++++++++++++++++++++ CHANGELOG.md | 8 +++++++- package-lock.json | 15 +++++++++++++-- package.json | 4 +++- 6 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 .changes/header.tpl.md create mode 100644 .changes/unreleased/.gitkeep create mode 100644 .changie.yaml diff --git a/.changes/header.tpl.md b/.changes/header.tpl.md new file mode 100644 index 0000000000..df8faa7b2d --- /dev/null +++ b/.changes/header.tpl.md @@ -0,0 +1,6 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), +and is generated by [Changie](https://github.com/miniscruff/changie). diff --git a/.changes/unreleased/.gitkeep b/.changes/unreleased/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.changie.yaml b/.changie.yaml new file mode 100644 index 0000000000..bf5f72b64c --- /dev/null +++ b/.changie.yaml @@ -0,0 +1,26 @@ +changesDir: .changes +unreleasedDir: unreleased +headerPath: header.tpl.md +changelogPath: CHANGELOG.md +versionExt: md +versionFormat: '## {{.Version}} - {{.Time.Format "2006-01-02"}}' +kindFormat: "### {{.Kind}}" +changeFormat: "* {{.Body}}" +kinds: + - label: Added + auto: minor + - label: Changed + auto: major + - label: Deprecated + auto: minor + - label: Removed + auto: major + - label: Fixed + auto: patch + - label: Security + auto: patch +newlines: + afterChangelogHeader: 1 + beforeChangelogVersion: 1 + endOfVersion: 1 +envPrefix: CHANGIE_ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c003c7ece..8a1473d1e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ -# Change Log +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), +and is generated by [Changie](https://github.com/miniscruff/changie). + ## [3.2.6] diff --git a/package-lock.json b/package-lock.json index 8962955abe..d1201009db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "claude-dev", - "version": "3.2.5", + "version": "3.2.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "claude-dev", - "version": "3.2.5", + "version": "3.2.6", "license": "Apache-2.0", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", @@ -61,6 +61,7 @@ "@vscode/test-cli": "^0.0.9", "@vscode/test-electron": "^2.4.0", "chai": "^4.3.10", + "changie": "^1.21.0", "esbuild": "^0.21.5", "eslint": "^8.57.0", "husky": "^9.1.7", @@ -6007,6 +6008,16 @@ "node": ">=8" } }, + "node_modules/changie": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/changie/-/changie-1.21.0.tgz", + "integrity": "sha512-fLK0oRtjImao22BDjaaXLq9w/hMh7mGdzpRrJ5ADzT0SOSIghT0SrVOhSs9tUCoyPa2fjG05ueVZSLcSXGBeVg==", + "dev": true, + "license": "MIT", + "bin": { + "changie": "npm/changie.js" + } + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", diff --git a/package.json b/package.json index ec56603bc3..efa62b0216 100644 --- a/package.json +++ b/package.json @@ -186,7 +186,8 @@ "test:webview": "cd webview-ui && npm run test", "publish:marketplace": "vsce publish && ovsx publish", "publish:marketplace:prerelease": "vsce publish --pre-release && ovsx publish --pre-release", - "prepare": "husky" + "prepare": "husky", + "changie": "changie" }, "devDependencies": { "@types/chai": "^5.0.1", @@ -200,6 +201,7 @@ "@vscode/test-cli": "^0.0.9", "@vscode/test-electron": "^2.4.0", "chai": "^4.3.10", + "changie": "^1.21.0", "esbuild": "^0.21.5", "eslint": "^8.57.0", "husky": "^9.1.7", From dae36f65405943b8bc613654d0e94d5b73ec63a0 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 00:58:16 -0800 Subject: [PATCH 35/74] Create workflows for changie PR and publish --- .github/workflows/changie-pr.yml | 68 ++++++++++++++ .github/workflows/prerelease-publish.yml | 85 ------------------ .github/workflows/publish.yml | 108 +++++++++++++++++++++++ .github/workflows/release.yml | 83 ----------------- 4 files changed, 176 insertions(+), 168 deletions(-) create mode 100644 .github/workflows/changie-pr.yml delete mode 100644 .github/workflows/prerelease-publish.yml create mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml new file mode 100644 index 0000000000..412ee8b5b9 --- /dev/null +++ b/.github/workflows/changie-pr.yml @@ -0,0 +1,68 @@ +name: "Changie Version PR" + +on: + push: + branches: + - main + +jobs: + version-pr: + name: Create/Update Version PR + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Important for changelog history + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.15.1 + + - name: Install dependencies + run: npm ci + + # Use Changie to batch changes and get the next version + - name: Batch changes + id: batch + uses: miniscruff/changie-action@v2 + with: + args: batch auto + + # If no changes, stop here + - name: Check for changes + id: check + run: | + if [ -z "$(git status --porcelain)" ]; then + echo "No changes to process" + echo "has_changes=false" >> $GITHUB_OUTPUT + else + echo "has_changes=true" >> $GITHUB_OUTPUT + fi + + # If we have changes, merge them and create/update PR + - name: Merge changes + if: steps.check.outputs.has_changes == 'true' + uses: miniscruff/changie-action@v2 + with: + args: merge + + - name: Get latest version + if: steps.check.outputs.has_changes == 'true' + id: latest + uses: miniscruff/changie-action@v2 + with: + args: latest + + - name: Create Pull Request + if: steps.check.outputs.has_changes == 'true' + uses: peter-evans/create-pull-request@v4 + with: + title: "Release ${{ steps.latest.outputs.output }}" + branch: "release/${{ steps.latest.outputs.output }}" + commit-message: "chore: update changelog for ${{ steps.latest.outputs.output }}" + body: | + This PR was automatically created by the Changie workflow. + - Updates CHANGELOG.md + - Bumps version to ${{ steps.latest.outputs.output }} diff --git a/.github/workflows/prerelease-publish.yml b/.github/workflows/prerelease-publish.yml deleted file mode 100644 index 62ab66371e..0000000000 --- a/.github/workflows/prerelease-publish.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Pre-release Publisher - -on: - release: - types: [prereleased] - workflow_dispatch: - -permissions: - contents: write - packages: write - actions: read - checks: read - deployments: read - discussions: read - issues: read - pages: read - pull-requests: read - repository-projects: read - security-events: read - statuses: read - -jobs: - test: - uses: ./.github/workflows/test.yml - - publish-prerelease: - needs: test - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.15.1" - cache: "npm" - - # Cache root dependencies - - name: Cache root dependencies - uses: actions/cache@v4 - id: root-cache - with: - path: node_modules - key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} - - # Cache webview-ui dependencies - - name: Cache webview-ui dependencies - uses: actions/cache@v4 - id: webview-cache - with: - path: webview-ui/node_modules - key: ${{ runner.os }}-npm-webview-${{ hashFiles('webview-ui/package-lock.json') }} - - - name: Install root dependencies - if: steps.root-cache.outputs.cache-hit != 'true' - run: npm ci - - - name: Install webview-ui dependencies - if: steps.webview-cache.outputs.cache-hit != 'true' - run: cd webview-ui && npm ci - - - name: Build Extension - run: npm run build - - - name: Install Publishing Tools - run: npm install -g vsce ovsx - - - name: Package and Publish Pre-release - env: - VSCE_PAT: ${{ secrets.VSCE_PAT }} - OVSX_PAT: ${{ secrets.OVSX_PAT }} - run: | - current_package_version=$(node -p "require('./package.json').version") - npm run publish:marketplace:prerelease - echo "Successfully published pre-release version $current_package_version to VS Code Marketplace and Open VSX Registry" - - - name: Create GitHub Pre-release - uses: softprops/action-gh-release@v1 - with: - files: "*.vsix" - generate_release_notes: true - prerelease: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000000..8098129eb9 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,108 @@ +name: "Publish Release" + +on: + workflow_dispatch: + inputs: + release-type: + description: "Choose release type (release or pre-release)" + required: true + default: "release" + type: choice + options: + - pre-release + - release + +permissions: + contents: write + packages: write + +jobs: + test: + uses: ./.github/workflows/test.yml + + publish: + needs: test + name: Publish Extension + runs-on: ubuntu-latest + environment: publish + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.15.1 + + # Cache root dependencies - only reuse if package-lock.json exactly matches + - name: Cache root dependencies + uses: actions/cache@v4 + id: root-cache + with: + path: node_modules + key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} + + # Cache webview-ui dependencies - only reuse if package-lock.json exactly matches + - name: Cache webview-ui dependencies + uses: actions/cache@v4 + id: webview-cache + with: + path: webview-ui/node_modules + key: ${{ runner.os }}-npm-webview-${{ hashFiles('webview-ui/package-lock.json') }} + + - name: Install root dependencies + if: steps.root-cache.outputs.cache-hit != 'true' + run: npm ci + + - name: Install webview-ui dependencies + if: steps.webview-cache.outputs.cache-hit != 'true' + run: cd webview-ui && npm ci + + - name: Install Publishing Tools + run: npm install -g vsce ovsx + + - name: Get Version + id: get_version + run: echo "version=$(node -p \"require('./package.json').version\")" >> $GITHUB_OUTPUT + + - name: Create Git Tag + run: | + VERSION=v${{ steps.get_version.outputs.version }} + echo "Tagging with $VERSION" + git tag "$VERSION" + git push origin "$VERSION" + + - name: Package and Publish Extension + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + OVSX_PAT: ${{ secrets.OVSX_PAT }} + run: | + # Required to generate the .vsix + vsce package --out "cline-${{ steps.get_version.outputs.version }}.vsix" + + if [ "${{ github.event.inputs.release-type }}" = "pre-release" ]; then + npm run publish:marketplace:prerelease + echo "Successfully published pre-release version ${{ steps.get_version.outputs.version }} to VS Code Marketplace and Open VSX Registry" + else + npm run publish:marketplace + echo "Successfully published release version ${{ steps.get_version.outputs.version }} to VS Code Marketplace and Open VSX Registry" + fi + + - name: Get Changelog Entry + id: changelog + uses: mindsers/changelog-reader-action@v2 + with: + # This expects a standard Keep a Changelog format + # "latest" means it will read whichever is the most recent version + # set in "## [1.2.3] - 2025-01-28" style + version: latest + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + files: "*.vsix" + body: ${{ steps.changelog.outputs.content }} + generate_release_notes: false + prerelease: ${{ github.event.inputs.release-type == 'pre-release' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 09c0c4eedf..0000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Release & Publish - -on: - release: - types: [published] - workflow_dispatch: - -permissions: - contents: write - packages: write - actions: read - checks: read - deployments: read - discussions: read - issues: read - pages: read - pull-requests: read - repository-projects: read - security-events: read - statuses: read - -jobs: - test: - uses: ./.github/workflows/test.yml - - release: - needs: test - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js environment - uses: actions/setup-node@v4 - with: - node-version: 20.15.1 - - # Cache root dependencies - only reuse if package-lock.json exactly matches - - name: Cache root dependencies - uses: actions/cache@v4 - id: root-cache - with: - path: node_modules - key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} - - # Cache webview-ui dependencies - only reuse if package-lock.json exactly matches - - name: Cache webview-ui dependencies - uses: actions/cache@v4 - id: webview-cache - with: - path: webview-ui/node_modules - key: ${{ runner.os }}-npm-webview-${{ hashFiles('webview-ui/package-lock.json') }} - - - name: Install root dependencies - if: steps.root-cache.outputs.cache-hit != 'true' - run: npm ci - - - name: Install webview-ui dependencies - if: steps.webview-cache.outputs.cache-hit != 'true' - run: cd webview-ui && npm ci - - - name: Build Extension - run: npm run build - - - name: Install Publishing Tools - run: npm install -g vsce ovsx - - - name: Package and Publish Extension - env: - VSCE_PAT: ${{ secrets.VSCE_PAT }} - OVSX_PAT: ${{ secrets.OVSX_PAT }} - run: | - current_package_version=$(node -p "require('./package.json').version") - npm run publish:marketplace - echo "Successfully published version $current_package_version to VS Code Marketplace and Open VSX Registry" - - - name: Create GitHub Release - uses: softprops/action-gh-release@v1 - with: - files: "*.vsix" - generate_release_notes: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9351c239aa60841ae02f00f6bd6120649297ce37 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:21:05 -0800 Subject: [PATCH 36/74] Validate changie for merges to main --- .github/workflows/changie-pr.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml index 412ee8b5b9..4cf8e651ae 100644 --- a/.github/workflows/changie-pr.yml +++ b/.github/workflows/changie-pr.yml @@ -23,6 +23,15 @@ jobs: - name: Install dependencies run: npm ci + # Validate that changes exist + - name: Check for Changie entries + run: | + if [ -z "$(ls -A .changes/unreleased 2>/dev/null)" ]; then + echo "Error: No Changie entries found in .changes/unreleased/" + echo "Please run 'npm run changie new' and commit the generated change file" + exit 1 + fi + # Use Changie to batch changes and get the next version - name: Batch changes id: batch From 5c8ea9fafaefc54b3466d0dada12cbeb2980357b Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:23:44 -0800 Subject: [PATCH 37/74] Fix validation --- .github/workflows/changie-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml index 4cf8e651ae..74249ff319 100644 --- a/.github/workflows/changie-pr.yml +++ b/.github/workflows/changie-pr.yml @@ -26,7 +26,7 @@ jobs: # Validate that changes exist - name: Check for Changie entries run: | - if [ -z "$(ls -A .changes/unreleased 2>/dev/null)" ]; then + if [ -z "$(find .changes/unreleased -name "*.yaml" -o -name "*.yml" 2>/dev/null)" ]; then echo "Error: No Changie entries found in .changes/unreleased/" echo "Please run 'npm run changie new' and commit the generated change file" exit 1 From c0a2edf8bbcf3bbf19c41a7766a0d795ca0623b8 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:27:40 -0800 Subject: [PATCH 38/74] Update readme (#1532) * Add 'Creating a PR' section * Added tip about versioning --- .../unreleased/Added-20250129-010730.yaml | 3 +++ README.md | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 .changes/unreleased/Added-20250129-010730.yaml diff --git a/.changes/unreleased/Added-20250129-010730.yaml b/.changes/unreleased/Added-20250129-010730.yaml new file mode 100644 index 0000000000..231d5baee1 --- /dev/null +++ b/.changes/unreleased/Added-20250129-010730.yaml @@ -0,0 +1,3 @@ +kind: Added +body: new section to README about Changie +time: 2025-01-29T01:07:30.285298-08:00 diff --git a/README.md b/README.md index b742fefcef..ca284cdfb0 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,31 @@ To contribute to the project, start with our [Contributing Guide](CONTRIBUTING.m +
+Creating a Pull Request + +1. Before creating a PR, generate a changelog entry using [Changie](https://changie.dev/): + ```bash + npm run changie new + ``` + This will prompt you for: + - Kind of change (Added, Changed, Deprecated, Removed, Fixed, Security) + - `Added` → triggers minor version bump (1.0.0 → 1.1.0) + - `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security` → triggers patch version bump (1.0.0 → 1.0.1) + - Breaking changes → triggers major version bump (1.0.0 → 2.0.0) + - Description of your changes + - Issue number (if applicable) + +2. Commit your changes and the generated `.changes` file + +3. Push your branch and create a PR on GitHub. Our CI will: + - Run tests and checks + - When merged to main, automatically batch changelog entries + - Create a version PR with the updated CHANGELOG.md + +
+ + ## License [Apache 2.0 © 2024 Cline Bot Inc.](./LICENSE) From d51ae7c2397df50c0efb12b343a275ffbe8bbeb7 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:31:24 -0800 Subject: [PATCH 39/74] Update workflow action --- .github/workflows/changie-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml index 74249ff319..a797e0e8f4 100644 --- a/.github/workflows/changie-pr.yml +++ b/.github/workflows/changie-pr.yml @@ -66,7 +66,7 @@ jobs: - name: Create Pull Request if: steps.check.outputs.has_changes == 'true' - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v5 with: title: "Release ${{ steps.latest.outputs.output }}" branch: "release/${{ steps.latest.outputs.output }}" From 8eb317e560024aad4bedf4655b5a17e4a70695c8 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:33:58 -0800 Subject: [PATCH 40/74] Update workflow action --- .github/workflows/changie-pr.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml index a797e0e8f4..538979caa8 100644 --- a/.github/workflows/changie-pr.yml +++ b/.github/workflows/changie-pr.yml @@ -66,11 +66,12 @@ jobs: - name: Create Pull Request if: steps.check.outputs.has_changes == 'true' - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v7 with: title: "Release ${{ steps.latest.outputs.output }}" branch: "release/${{ steps.latest.outputs.output }}" commit-message: "chore: update changelog for ${{ steps.latest.outputs.output }}" + branch-token: ${{ secrets.GITHUB_TOKEN }} body: | This PR was automatically created by the Changie workflow. - Updates CHANGELOG.md From ab42d680ccdc36df13d8605b4c18884d1743d1e4 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:36:48 -0800 Subject: [PATCH 41/74] Fix changie workflow --- .github/workflows/changie-pr.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml index 538979caa8..05c5e91a4f 100644 --- a/.github/workflows/changie-pr.yml +++ b/.github/workflows/changie-pr.yml @@ -5,6 +5,10 @@ on: branches: - main +permissions: + contents: write + pull-requests: write + jobs: version-pr: name: Create/Update Version PR From 0cad62f2233e747083c0cf9ed67c2b14a1022bc9 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 02:03:50 -0800 Subject: [PATCH 42/74] Ignore change workflow until we set up bot --- .github/workflows/changie-pr.yml | 140 +++++++++++++++---------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml index 05c5e91a4f..7b66302f59 100644 --- a/.github/workflows/changie-pr.yml +++ b/.github/workflows/changie-pr.yml @@ -1,82 +1,82 @@ -name: "Changie Version PR" +# name: "Changie Version PR" -on: - push: - branches: - - main +# on: +# push: +# branches: +# - main -permissions: - contents: write - pull-requests: write +# permissions: +# contents: write +# pull-requests: write -jobs: - version-pr: - name: Create/Update Version PR - runs-on: ubuntu-latest +# jobs: +# version-pr: +# name: Create/Update Version PR +# runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 # Important for changelog history +# steps: +# - uses: actions/checkout@v3 +# with: +# fetch-depth: 0 # Important for changelog history - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20.15.1 +# - name: Setup Node.js +# uses: actions/setup-node@v4 +# with: +# node-version: 20.15.1 - - name: Install dependencies - run: npm ci +# - name: Install dependencies +# run: npm ci - # Validate that changes exist - - name: Check for Changie entries - run: | - if [ -z "$(find .changes/unreleased -name "*.yaml" -o -name "*.yml" 2>/dev/null)" ]; then - echo "Error: No Changie entries found in .changes/unreleased/" - echo "Please run 'npm run changie new' and commit the generated change file" - exit 1 - fi +# # Validate that changes exist +# - name: Check for Changie entries +# run: | +# if [ -z "$(find .changes/unreleased -name "*.yaml" -o -name "*.yml" 2>/dev/null)" ]; then +# echo "Error: No Changie entries found in .changes/unreleased/" +# echo "Please run 'npm run changie new' and commit the generated change file" +# exit 1 +# fi - # Use Changie to batch changes and get the next version - - name: Batch changes - id: batch - uses: miniscruff/changie-action@v2 - with: - args: batch auto +# # Use Changie to batch changes and get the next version +# - name: Batch changes +# id: batch +# uses: miniscruff/changie-action@v2 +# with: +# args: batch auto - # If no changes, stop here - - name: Check for changes - id: check - run: | - if [ -z "$(git status --porcelain)" ]; then - echo "No changes to process" - echo "has_changes=false" >> $GITHUB_OUTPUT - else - echo "has_changes=true" >> $GITHUB_OUTPUT - fi +# # If no changes, stop here +# - name: Check for changes +# id: check +# run: | +# if [ -z "$(git status --porcelain)" ]; then +# echo "No changes to process" +# echo "has_changes=false" >> $GITHUB_OUTPUT +# else +# echo "has_changes=true" >> $GITHUB_OUTPUT +# fi - # If we have changes, merge them and create/update PR - - name: Merge changes - if: steps.check.outputs.has_changes == 'true' - uses: miniscruff/changie-action@v2 - with: - args: merge +# # If we have changes, merge them and create/update PR +# - name: Merge changes +# if: steps.check.outputs.has_changes == 'true' +# uses: miniscruff/changie-action@v2 +# with: +# args: merge - - name: Get latest version - if: steps.check.outputs.has_changes == 'true' - id: latest - uses: miniscruff/changie-action@v2 - with: - args: latest +# - name: Get latest version +# if: steps.check.outputs.has_changes == 'true' +# id: latest +# uses: miniscruff/changie-action@v2 +# with: +# args: latest - - name: Create Pull Request - if: steps.check.outputs.has_changes == 'true' - uses: peter-evans/create-pull-request@v7 - with: - title: "Release ${{ steps.latest.outputs.output }}" - branch: "release/${{ steps.latest.outputs.output }}" - commit-message: "chore: update changelog for ${{ steps.latest.outputs.output }}" - branch-token: ${{ secrets.GITHUB_TOKEN }} - body: | - This PR was automatically created by the Changie workflow. - - Updates CHANGELOG.md - - Bumps version to ${{ steps.latest.outputs.output }} +# - name: Create Pull Request +# if: steps.check.outputs.has_changes == 'true' +# uses: peter-evans/create-pull-request@v7 +# with: +# title: "Release ${{ steps.latest.outputs.output }}" +# branch: "release/${{ steps.latest.outputs.output }}" +# commit-message: "chore: update changelog for ${{ steps.latest.outputs.output }}" +# branch-token: ${{ secrets.GITHUB_TOKEN }} +# body: | +# This PR was automatically created by the Changie workflow. +# - Updates CHANGELOG.md +# - Bumps version to ${{ steps.latest.outputs.output }} From c2eec68e522a5ba83094fdda6f632667d7a61510 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 02:04:54 -0800 Subject: [PATCH 43/74] Delete unused workflow --- .github/workflows/changie-pr.yml | 82 -------------------------------- 1 file changed, 82 deletions(-) delete mode 100644 .github/workflows/changie-pr.yml diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml deleted file mode 100644 index 7b66302f59..0000000000 --- a/.github/workflows/changie-pr.yml +++ /dev/null @@ -1,82 +0,0 @@ -# name: "Changie Version PR" - -# on: -# push: -# branches: -# - main - -# permissions: -# contents: write -# pull-requests: write - -# jobs: -# version-pr: -# name: Create/Update Version PR -# runs-on: ubuntu-latest - -# steps: -# - uses: actions/checkout@v3 -# with: -# fetch-depth: 0 # Important for changelog history - -# - name: Setup Node.js -# uses: actions/setup-node@v4 -# with: -# node-version: 20.15.1 - -# - name: Install dependencies -# run: npm ci - -# # Validate that changes exist -# - name: Check for Changie entries -# run: | -# if [ -z "$(find .changes/unreleased -name "*.yaml" -o -name "*.yml" 2>/dev/null)" ]; then -# echo "Error: No Changie entries found in .changes/unreleased/" -# echo "Please run 'npm run changie new' and commit the generated change file" -# exit 1 -# fi - -# # Use Changie to batch changes and get the next version -# - name: Batch changes -# id: batch -# uses: miniscruff/changie-action@v2 -# with: -# args: batch auto - -# # If no changes, stop here -# - name: Check for changes -# id: check -# run: | -# if [ -z "$(git status --porcelain)" ]; then -# echo "No changes to process" -# echo "has_changes=false" >> $GITHUB_OUTPUT -# else -# echo "has_changes=true" >> $GITHUB_OUTPUT -# fi - -# # If we have changes, merge them and create/update PR -# - name: Merge changes -# if: steps.check.outputs.has_changes == 'true' -# uses: miniscruff/changie-action@v2 -# with: -# args: merge - -# - name: Get latest version -# if: steps.check.outputs.has_changes == 'true' -# id: latest -# uses: miniscruff/changie-action@v2 -# with: -# args: latest - -# - name: Create Pull Request -# if: steps.check.outputs.has_changes == 'true' -# uses: peter-evans/create-pull-request@v7 -# with: -# title: "Release ${{ steps.latest.outputs.output }}" -# branch: "release/${{ steps.latest.outputs.output }}" -# commit-message: "chore: update changelog for ${{ steps.latest.outputs.output }}" -# branch-token: ${{ secrets.GITHUB_TOKEN }} -# body: | -# This PR was automatically created by the Changie workflow. -# - Updates CHANGELOG.md -# - Bumps version to ${{ steps.latest.outputs.output }} From 3ad7b219a1161d2362c95fd17a97a9bbceb50ab0 Mon Sep 17 00:00:00 2001 From: vivek-kothandapani Date: Wed, 29 Jan 2025 09:55:09 -0500 Subject: [PATCH 44/74] changie updates --- .changes/unreleased/Fixed-20250129-095107.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changes/unreleased/Fixed-20250129-095107.yaml diff --git a/.changes/unreleased/Fixed-20250129-095107.yaml b/.changes/unreleased/Fixed-20250129-095107.yaml new file mode 100644 index 0000000000..9404c5fe22 --- /dev/null +++ b/.changes/unreleased/Fixed-20250129-095107.yaml @@ -0,0 +1,3 @@ +kind: Fixed +body: Fix for the "Diff Edit Failed" / "replace_in_file" defects - #1010 #1511 #953 +time: 2025-01-29T09:51:07.5008655-05:00 From df03ec8667e5df60008c62e9cfa19848aab2f59a Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:24:47 -0800 Subject: [PATCH 45/74] Use changesets --- .changes/header.tpl.md | 6 - .changes/unreleased/.gitkeep | 0 .../unreleased/Added-20250129-010730.yaml | 3 - .changeset/README.md | 8 + .changeset/config.json | 11 + README.md | 20 +- package-lock.json | 828 +++++++++++++++++- package.json | 4 +- 8 files changed, 850 insertions(+), 30 deletions(-) delete mode 100644 .changes/header.tpl.md delete mode 100644 .changes/unreleased/.gitkeep delete mode 100644 .changes/unreleased/Added-20250129-010730.yaml create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json diff --git a/.changes/header.tpl.md b/.changes/header.tpl.md deleted file mode 100644 index df8faa7b2d..0000000000 --- a/.changes/header.tpl.md +++ /dev/null @@ -1,6 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), -and is generated by [Changie](https://github.com/miniscruff/changie). diff --git a/.changes/unreleased/.gitkeep b/.changes/unreleased/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/.changes/unreleased/Added-20250129-010730.yaml b/.changes/unreleased/Added-20250129-010730.yaml deleted file mode 100644 index 231d5baee1..0000000000 --- a/.changes/unreleased/Added-20250129-010730.yaml +++ /dev/null @@ -1,3 +0,0 @@ -kind: Added -body: new section to README about Changie -time: 2025-01-29T01:07:30.285298-08:00 diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000000..e5b6d8d6a6 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000000..42efc1c834 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.5/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/README.md b/README.md index ca284cdfb0..562ef4893a 100644 --- a/README.md +++ b/README.md @@ -163,24 +163,24 @@ To contribute to the project, start with our [Contributing Guide](CONTRIBUTING.m
Creating a Pull Request -1. Before creating a PR, generate a changelog entry using [Changie](https://changie.dev/): +1. Before creating a PR, generate a changeset entry: ```bash - npm run changie new + npm run changeset ``` This will prompt you for: - - Kind of change (Added, Changed, Deprecated, Removed, Fixed, Security) - - `Added` → triggers minor version bump (1.0.0 → 1.1.0) - - `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security` → triggers patch version bump (1.0.0 → 1.0.1) - - Breaking changes → triggers major version bump (1.0.0 → 2.0.0) + - Type of change (major, minor, patch) + - `major` → breaking changes (1.0.0 → 2.0.0) + - `minor` → new features (1.0.0 → 1.1.0) + - `patch` → bug fixes (1.0.0 → 1.0.1) - Description of your changes - - Issue number (if applicable) -2. Commit your changes and the generated `.changes` file +2. Commit your changes and the generated `.changeset` file 3. Push your branch and create a PR on GitHub. Our CI will: - Run tests and checks - - When merged to main, automatically batch changelog entries - - Create a version PR with the updated CHANGELOG.md + - Changesetbot will create a comment showing the version impact + - When merged to main, changesetbot will create a Version Packages PR + - When the Version Packages PR is merged, a new release will be published
diff --git a/package-lock.json b/package-lock.json index d1201009db..9f3906f1d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "zod": "^3.23.8" }, "devDependencies": { + "@changesets/cli": "^2.27.12", "@types/chai": "^5.0.1", "@types/diff": "^5.2.1", "@types/mocha": "^10.0.7", @@ -61,7 +62,6 @@ "@vscode/test-cli": "^0.0.9", "@vscode/test-electron": "^2.4.0", "chai": "^4.3.10", - "changie": "^1.21.0", "esbuild": "^0.21.5", "eslint": "^8.57.0", "husky": "^9.1.7", @@ -2177,6 +2177,19 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, + "node_modules/@babel/runtime": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", @@ -2184,6 +2197,341 @@ "dev": true, "license": "MIT" }, + "node_modules/@changesets/apply-release-plan": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.8.tgz", + "integrity": "sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/config": "^3.0.5", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.2", + "@changesets/should-skip-package": "^0.1.1", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.5.tgz", + "integrity": "sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.2", + "@changesets/should-skip-package": "^0.1.1", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", + "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.27.12", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.12.tgz", + "integrity": "sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.0.8", + "@changesets/assemble-release-plan": "^6.0.5", + "@changesets/changelog-git": "^0.2.0", + "@changesets/config": "^3.0.5", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.2", + "@changesets/get-release-plan": "^4.0.6", + "@changesets/git": "^3.0.2", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.1", + "@changesets/read": "^0.6.2", + "@changesets/should-skip-package": "^0.1.1", + "@changesets/types": "^6.0.0", + "@changesets/write": "^0.3.2", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "ci-info": "^3.7.0", + "enquirer": "^2.4.1", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "p-limit": "^2.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@changesets/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/config": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.5.tgz", + "integrity": "sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.2", + "@changesets/logger": "^0.1.1", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" + } + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "dev": true, + "license": "MIT", + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.2.tgz", + "integrity": "sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.6.tgz", + "integrity": "sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.5", + "@changesets/config": "^3.0.5", + "@changesets/pre": "^2.0.1", + "@changesets/read": "^0.6.2", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.2.tgz", + "integrity": "sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", + "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@changesets/parse/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@changesets/pre": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.1.tgz", + "integrity": "sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.2.tgz", + "integrity": "sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/git": "^3.0.2", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.0", + "@changesets/types": "^6.0.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.1.tgz", + "integrity": "sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", + "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.2.tgz", + "integrity": "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.0.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", @@ -3163,6 +3511,165 @@ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT" }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/get-packages/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@mistralai/mistralai": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.4.0.tgz", @@ -5750,6 +6257,19 @@ "node": ">=10.0.0" } }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -6008,15 +6528,12 @@ "node": ">=8" } }, - "node_modules/changie": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/changie/-/changie-1.21.0.tgz", - "integrity": "sha512-fLK0oRtjImao22BDjaaXLq9w/hMh7mGdzpRrJ5ADzT0SOSIghT0SrVOhSs9tUCoyPa2fjG05ueVZSLcSXGBeVg==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true, - "license": "MIT", - "bin": { - "changie": "npm/changie.js" - } + "license": "MIT" }, "node_modules/check-error": { "version": "1.0.3", @@ -6101,6 +6618,22 @@ "devtools-protocol": "*" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -6533,6 +7066,16 @@ "node": ">= 0.8" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/devtools-protocol": { "version": "0.0.1342118", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", @@ -6716,6 +7259,33 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -7279,6 +7849,41 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -8232,6 +8837,13 @@ "node": ">= 14" } }, + "node_modules/human-id": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", + "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", + "dev": true, + "license": "MIT" + }, "node_modules/human-signals": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", @@ -8697,6 +9309,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -8755,6 +9380,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -9038,6 +9673,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9492,6 +10134,16 @@ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10073,6 +10725,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10105,6 +10787,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/p-timeout": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", @@ -10117,6 +10809,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/p-wait-for": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.2.tgz", @@ -10171,6 +10873,13 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/package-manager-detector": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.8.tgz", + "integrity": "sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==", + "dev": true, + "license": "MIT" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -10353,6 +11062,13 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -10654,6 +11370,56 @@ "node": ">=4" } }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/read-yaml-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -10682,6 +11448,13 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -11215,6 +11988,17 @@ "node": ">=0.10.0" } }, + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -11572,6 +12356,19 @@ "streamx": "^2.15.0" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -11655,6 +12452,19 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index efa62b0216..0751eea778 100644 --- a/package.json +++ b/package.json @@ -187,9 +187,10 @@ "publish:marketplace": "vsce publish && ovsx publish", "publish:marketplace:prerelease": "vsce publish --pre-release && ovsx publish --pre-release", "prepare": "husky", - "changie": "changie" + "changeset": "changeset" }, "devDependencies": { + "@changesets/cli": "^2.27.12", "@types/chai": "^5.0.1", "@types/diff": "^5.2.1", "@types/mocha": "^10.0.7", @@ -201,7 +202,6 @@ "@vscode/test-cli": "^0.0.9", "@vscode/test-electron": "^2.4.0", "chai": "^4.3.10", - "changie": "^1.21.0", "esbuild": "^0.21.5", "eslint": "^8.57.0", "husky": "^9.1.7", From a731ce4ace0892de2a9350eae4d61c1fc9d1e824 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:33:12 -0800 Subject: [PATCH 46/74] Fix publish workflow --- .github/workflows/publish.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8098129eb9..6c4b460c10 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -88,21 +88,21 @@ jobs: echo "Successfully published release version ${{ steps.get_version.outputs.version }} to VS Code Marketplace and Open VSX Registry" fi - - name: Get Changelog Entry - id: changelog - uses: mindsers/changelog-reader-action@v2 - with: - # This expects a standard Keep a Changelog format - # "latest" means it will read whichever is the most recent version - # set in "## [1.2.3] - 2025-01-28" style - version: latest + # - name: Get Changelog Entry + # id: changelog + # uses: mindsers/changelog-reader-action@v2 + # with: + # # This expects a standard Keep a Changelog format + # # "latest" means it will read whichever is the most recent version + # # set in "## [1.2.3] - 2025-01-28" style + # version: latest - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: files: "*.vsix" - body: ${{ steps.changelog.outputs.content }} - generate_release_notes: false + # body: ${{ steps.changelog.outputs.content }} + generate_release_notes: true prerelease: ${{ github.event.inputs.release-type == 'pre-release' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From cefddec1cfe05a40e83a7f41f6838e304a13a1e7 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:35:08 -0800 Subject: [PATCH 47/74] Make test reusable --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 191977c516..518bc8d244 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,6 +5,7 @@ on: pull_request: branches: - main + workflow_call: # Set default permissions for all jobs permissions: From b5b69b38297f1511ae448c66f32c5856b8a29726 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:37:29 -0800 Subject: [PATCH 48/74] Fix publish perms --- .github/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6c4b460c10..0adfee1634 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,6 +15,8 @@ on: permissions: contents: write packages: write + checks: write + pull-requests: write jobs: test: From 5037541ab4739ec2c68fcb7847f0933e6214082c Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:42:04 -0800 Subject: [PATCH 49/74] Fix get version --- .github/workflows/publish.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0adfee1634..0402d5e8b4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -65,7 +65,9 @@ jobs: - name: Get Version id: get_version - run: echo "version=$(node -p \"require('./package.json').version\")" >> $GITHUB_OUTPUT + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Create Git Tag run: | From c5a17428d3ea36ab6cc72cd8c3763b04560bdf29 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:24:21 -0800 Subject: [PATCH 50/74] Fixes --- .changes/unreleased/Fixed-20250129-095107.yaml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .changes/unreleased/Fixed-20250129-095107.yaml diff --git a/.changes/unreleased/Fixed-20250129-095107.yaml b/.changes/unreleased/Fixed-20250129-095107.yaml deleted file mode 100644 index 9404c5fe22..0000000000 --- a/.changes/unreleased/Fixed-20250129-095107.yaml +++ /dev/null @@ -1,3 +0,0 @@ -kind: Fixed -body: Fix for the "Diff Edit Failed" / "replace_in_file" defects - #1010 #1511 #953 -time: 2025-01-29T09:51:07.5008655-05:00 From e5d712db5947de3805061688b7062552295e4f2a Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:53:15 -0800 Subject: [PATCH 51/74] Add context window info to task header --- webview-ui/src/components/chat/ChatView.tsx | 16 ++++ webview-ui/src/components/chat/TaskHeader.tsx | 78 +++++++++++++++++++ 2 files changed, 94 insertions(+) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index aec4e544a9..7a7e6b93ae 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -5,6 +5,7 @@ import { useDeepCompareEffect, useEvent, useMount } from "react-use" import { Virtuoso, type VirtuosoHandle } from "react-virtuoso" import styled from "styled-components" import { + ClineApiReqInfo, ClineAsk, ClineMessage, ClineSayBrowserAction, @@ -44,6 +45,20 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie // has to be after api_req_finished are all reduced into api_req_started messages const apiMetrics = useMemo(() => getApiMetrics(modifiedMessages), [modifiedMessages]) + const lastApiReqTotalTokens = useMemo(() => { + const getTotalTokensFromApiReqMessage = (msg: ClineMessage) => { + if (!msg.text) return 0 + const { tokensIn, tokensOut, cacheWrites, cacheReads }: ClineApiReqInfo = JSON.parse(msg.text) + return (tokensIn || 0) + (tokensOut || 0) + (cacheWrites || 0) + (cacheReads || 0) + } + const lastApiReqMessage = findLast(modifiedMessages, (msg) => { + if (msg.say !== "api_req_started") return false + return getTotalTokensFromApiReqMessage(msg) > 0 + }) + if (!lastApiReqMessage) return undefined + return getTotalTokensFromApiReqMessage(lastApiReqMessage) + }, [modifiedMessages]) + const [inputValue, setInputValue] = useState("") const textAreaRef = useRef(null) const [textAreaDisabled, setTextAreaDisabled] = useState(false) @@ -729,6 +744,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie cacheWrites={apiMetrics.totalCacheWrites} cacheReads={apiMetrics.totalCacheReads} totalCost={apiMetrics.totalCost} + lastApiReqTotalTokens={lastApiReqTotalTokens} onClose={handleTaskCloseButtonClick} /> ) : ( diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index d04f0aecf4..aeede40047 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -8,6 +8,7 @@ import { formatLargeNumber } from "../../utils/format" import { formatSize } from "../../utils/size" import { vscode } from "../../utils/vscode" import Thumbnails from "../common/Thumbnails" +import { normalizeApiConfiguration } from "../settings/ApiOptions" interface TaskHeaderProps { task: ClineMessage @@ -17,9 +18,39 @@ interface TaskHeaderProps { cacheWrites?: number cacheReads?: number totalCost: number + lastApiReqTotalTokens?: number onClose: () => void } +const LinearProgress: React.FC<{ percentage: number }> = ({ percentage }) => ( +
+
+
+
+ {Math.round(percentage)}% +
+) + const TaskHeader: React.FC = ({ task, tokensIn, @@ -28,6 +59,7 @@ const TaskHeader: React.FC = ({ cacheWrites, cacheReads, totalCost, + lastApiReqTotalTokens, onClose, }) => { const { apiConfiguration, currentTaskItem, checkpointTrackerErrorMessage } = useExtensionState() @@ -37,6 +69,9 @@ const TaskHeader: React.FC = ({ const textContainerRef = useRef(null) const textRef = useRef(null) + const { selectedModelInfo } = useMemo(() => normalizeApiConfiguration(apiConfiguration), [apiConfiguration]) + const contextWindow = selectedModelInfo?.contextWindow + /* When dealing with event listeners in React components that depend on state variables, we face a challenge. We want our listener to always use the most up-to-date version of a callback function that relies on current state, but we don't want to constantly add and remove event listeners as that function updates. This scenario often arises with resize listeners or other window events. Simply adding the listener in a useEffect with an empty dependency array risks using stale state, while including the callback in the dependencies can lead to unnecessary re-registrations of the listener. There are react hook libraries that provide a elegant solution to this problem by utilizing the useRef hook to maintain a reference to the latest callback function without triggering re-renders or effect re-runs. This approach ensures that our event listener always has access to the most current state while minimizing performance overhead and potential memory leaks from multiple listener registrations. Sources @@ -105,6 +140,48 @@ const TaskHeader: React.FC = ({ const shouldShowPromptCacheInfo = doesModelSupportPromptCache && apiConfiguration?.apiProvider !== "openrouter" + const ContextWindowComponent = ( + <> + {isTaskExpanded && contextWindow && lastApiReqTotalTokens && ( +
+
+ Context Window: + + {formatLargeNumber(lastApiReqTotalTokens)} ( + {Math.round((lastApiReqTotalTokens / contextWindow) * 100)}%) + +
+
+
+
+
+ {formatLargeNumber(contextWindow)} +
+
+ )} + + ) + return (
= ({
)} + {ContextWindowComponent} {isCostAvailable && (
Date: Wed, 29 Jan 2025 15:09:58 -0800 Subject: [PATCH 52/74] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a1473d1e9..083140bcfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and is generated by [Changie](https://github.com/miniscruff/changie). ## [3.2.6] - Save last used API/model when switching between Plan and Act, for users that like to use different models for each mode +- New Context Window progress bar in the task header to understand increased cost/generation degradation as the context increases - Localize READMEs and add language selector for English, Spanish, German, Chinese, and Japanese - Add Advanced Settings to remove MCP prompts from requests to save tokens, enable/disable checkpoints for users that don't use git (more coming soon!) - Add Gemini 2.0 Flash Thinking experimental model From 36473d53c94b49fbf5439413e3e16e06b111193a Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 15:51:02 -0800 Subject: [PATCH 53/74] Fix progress bar wrapping --- webview-ui/src/components/chat/TaskHeader.tsx | 86 +++++++++---------- 1 file changed, 40 insertions(+), 46 deletions(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index aeede40047..d5a3e61954 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -22,35 +22,6 @@ interface TaskHeaderProps { onClose: () => void } -const LinearProgress: React.FC<{ percentage: number }> = ({ percentage }) => ( -
-
-
-
- {Math.round(percentage)}% -
-) - const TaskHeader: React.FC = ({ task, tokensIn, @@ -146,36 +117,59 @@ const TaskHeader: React.FC = ({
-
- Context Window: +
+ + {/* {windowWidth > 280 && windowWidth < 310 ? "Context:" : "Context Window:"} */} + Context Window: + +
+
{formatLargeNumber(lastApiReqTotalTokens)} ( {Math.round((lastApiReqTotalTokens / contextWindow) * 100)}%) -
-
+ overflow: "hidden", + }}> +
+
+ {formatLargeNumber(contextWindow)}
- {formatLargeNumber(contextWindow)}
)} From 1ae1d047cb931a72c6ba0ff1b2ccc72edf1ec03e Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Wed, 29 Jan 2025 16:55:39 -0800 Subject: [PATCH 54/74] Fixes --- CHANGELOG.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 083140bcfb..8610bf9080 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,4 @@ # Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), -and is generated by [Changie](https://github.com/miniscruff/changie). - ## [3.2.6] From 3885f09a0b0f0df0e8ede67a03160c4775537700 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:15:16 -0800 Subject: [PATCH 55/74] Fix context window progress bar spacing (#1554) --- webview-ui/src/components/chat/TaskHeader.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index d5a3e61954..8c84fb0c38 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -117,7 +117,7 @@ const TaskHeader: React.FC = ({
= ({ style={{ display: "flex", alignItems: "center", - gap: "8px", + gap: "3px", flex: 1, whiteSpace: "nowrap", }}> - - {formatLargeNumber(lastApiReqTotalTokens)} ( - {Math.round((lastApiReqTotalTokens / contextWindow) * 100)}%) - + {formatLargeNumber(lastApiReqTotalTokens)}
Date: Thu, 30 Jan 2025 11:16:55 -0800 Subject: [PATCH 56/74] Prepare release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0751eea778..75f30de3db 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "claude-dev", "displayName": "Cline", "description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.", - "version": "3.2.6", + "version": "3.2.7", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 0aef2447eebf4da99e96d6be0475b01cce1e1b85 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:57:21 -0800 Subject: [PATCH 57/74] Fix localized README links (#1557) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 562ef4893a..ccd711b9c8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Cline – \#1 on OpenRouter From 8539421d595a43cc5efbc2507bcda901b764a0c1 Mon Sep 17 00:00:00 2001 From: Evan Fannin <58194240+evan-fannin@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:03:12 +0800 Subject: [PATCH 58/74] find all test files (#1559) --- .vscode-test.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode-test.mjs b/.vscode-test.mjs index c1a69e22df..430ee8cadd 100644 --- a/.vscode-test.mjs +++ b/.vscode-test.mjs @@ -2,7 +2,7 @@ import { defineConfig } from "@vscode/test-cli" import path from "path" export default defineConfig({ - files: "{out/test/**/*.test.js,src/test/suite/**/*.test.js}", + files: "{out/**/*.test.js,src/**/*.test.js}", mocha: { ui: "bdd", timeout: 20000, // Maximum time (in ms) that a test can run before failing From 1cd2ff10c770c75f33fc6ba3c16581f915a3961b Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:37:51 -0800 Subject: [PATCH 59/74] Prepare for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 75f30de3db..d4b7081860 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "claude-dev", "displayName": "Cline", "description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.", - "version": "3.2.7", + "version": "3.2.8", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 4f934377977ceb5480cfa4c2adae2d44d7616651 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:49:39 -0800 Subject: [PATCH 60/74] Fix creating github release --- .github/workflows/publish.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0402d5e8b4..88388fac7e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -70,8 +70,10 @@ jobs: echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Create Git Tag + id: create_tag run: | VERSION=v${{ steps.get_version.outputs.version }} + echo "tag=$VERSION" >> $GITHUB_OUTPUT echo "Tagging with $VERSION" git tag "$VERSION" git push origin "$VERSION" @@ -104,6 +106,7 @@ jobs: - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: + tag_name: ${{ steps.create_tag.outputs.tag }} files: "*.vsix" # body: ${{ steps.changelog.outputs.content }} generate_release_notes: true From 64718667ffa90672953eb7730864a2d559a0e6a9 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:55:03 -0800 Subject: [PATCH 61/74] Show context progress bar always --- webview-ui/src/components/chat/TaskHeader.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 8c84fb0c38..30419e67bc 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -113,7 +113,7 @@ const TaskHeader: React.FC = ({ const ContextWindowComponent = ( <> - {isTaskExpanded && contextWindow && lastApiReqTotalTokens && ( + {isTaskExpanded && contextWindow && (
= ({ flex: 1, whiteSpace: "nowrap", }}> - {formatLargeNumber(lastApiReqTotalTokens)} + {formatLargeNumber(lastApiReqTotalTokens || 0)}
= ({ }}>
Date: Thu, 30 Jan 2025 18:55:49 -0800 Subject: [PATCH 62/74] Fixes --- webview-ui/src/components/chat/TaskHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 30419e67bc..92e44e2e4d 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -158,7 +158,7 @@ const TaskHeader: React.FC = ({ }}>
Date: Thu, 30 Jan 2025 18:57:18 -0800 Subject: [PATCH 63/74] Prepare for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4b7081860..9666372384 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "claude-dev", "displayName": "Cline", "description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.", - "version": "3.2.8", + "version": "3.2.9", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 57bb43bb6f89e54be06745f49d6eed322b96efc4 Mon Sep 17 00:00:00 2001 From: brownrw8 Date: Thu, 30 Jan 2025 19:48:19 -1000 Subject: [PATCH 64/74] Basic unit testing for frontend `/webview-ui` (#1522) * feat: very basic unit testing * move dep -> devDeps * correct other deps * resync after i18n revert on main * update package-lock.json --- webview-ui/matchMedia.js | 16 + webview-ui/package-lock.json | 2198 ++++++++++++++--- webview-ui/package.json | 21 +- webview-ui/setupTests.js | 2 + .../chat/__tests__/Announcement.spec.tsx | 39 + webview-ui/tsconfig.json | 3 +- webview-ui/vite.config.js | 9 + 7 files changed, 1974 insertions(+), 314 deletions(-) create mode 100644 webview-ui/matchMedia.js create mode 100644 webview-ui/setupTests.js create mode 100644 webview-ui/src/components/chat/__tests__/Announcement.spec.tsx create mode 100644 webview-ui/vite.config.js diff --git a/webview-ui/matchMedia.js b/webview-ui/matchMedia.js new file mode 100644 index 0000000000..95ddfdf698 --- /dev/null +++ b/webview-ui/matchMedia.js @@ -0,0 +1,16 @@ +// "Official" jest workaround for mocking window.matchMedia() +// https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom + +Object.defineProperty(window, "matchMedia", { + writable: true, + value: vi.fn().mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: vi.fn(), // Deprecated + removeListener: vi.fn(), // Deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + })), +}) diff --git a/webview-ui/package-lock.json b/webview-ui/package-lock.json index d2b9114d9d..faec4c48fa 100644 --- a/webview-ui/package-lock.json +++ b/webview-ui/package-lock.json @@ -8,13 +8,6 @@ "name": "webview-ui", "version": "0.1.0", "dependencies": { - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.101", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", "@vscode/webview-ui-toolkit": "^1.4.0", "debounce": "^2.1.1", "fast-deep-equal": "^3.1.3", @@ -34,13 +27,23 @@ "web-vitals": "^2.1.4" }, "devDependencies": { - "@types/vscode-webview": "^1.57.5" + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^15.0.6", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^20.x", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/vscode-webview": "^1.57.5", + "jsdom": "^25.0.1", + "vitest": "^2.1.8" } }, "node_modules/@adobe/css-tools": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, "license": "MIT" }, "node_modules/@alloc/quick-lru": { @@ -68,6 +71,27 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", + "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -2105,6 +2129,121 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "license": "MIT" }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@csstools/normalize.css": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", @@ -2412,6 +2551,397 @@ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", "license": "MIT" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", @@ -3329,6 +3859,272 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz", + "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz", + "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz", + "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz", + "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz", + "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz", + "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz", + "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz", + "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz", + "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz", + "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz", + "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz", + "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz", + "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz", + "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz", + "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz", + "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz", + "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz", + "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz", + "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -3602,8 +4398,8 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -3622,6 +4418,7 @@ "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", @@ -3644,6 +4441,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3654,55 +4452,35 @@ } }, "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", + "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", + "@testing-library/dom": "^10.0.0", "@types/react-dom": "^18.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "peerDependencies": { + "@types/react": "^18.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/react/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@testing-library/user-event": { "version": "13.5.0", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -3737,6 +4515,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { @@ -3947,6 +4726,7 @@ "version": "27.5.2", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "dev": true, "license": "MIT", "dependencies": { "jest-matcher-utils": "^27.0.0", @@ -3993,10 +4773,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.18.124", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.124.tgz", - "integrity": "sha512-8ADCm5WzM/IpWxjs1Jhtwo6j+Fb8z4yr/CobP5beUUPdyCI0mg87/bqQYxNcqnhZ24Dc9RME8SQWu5eI/FmSGA==", - "license": "MIT" + "version": "20.17.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz", + "integrity": "sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -4023,6 +4806,7 @@ "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/q": { @@ -4047,6 +4831,7 @@ "version": "18.3.18", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -4057,6 +4842,7 @@ "version": "18.3.5", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" @@ -4138,6 +4924,7 @@ "version": "5.14.9", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "dev": true, "license": "MIT", "dependencies": { "@types/jest": "*" @@ -4421,6 +5208,149 @@ "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", "license": "ISC" }, + "node_modules/@vitest/expect": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.8", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vscode/webview-ui-toolkit": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz", @@ -4705,15 +5635,13 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, "license": "MIT", - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -4890,6 +5818,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" @@ -5086,6 +6015,16 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -5645,6 +6584,16 @@ "node": ">= 0.8" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -5782,6 +6731,23 @@ "node": ">=4" } }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5837,6 +6803,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/check-types": { "version": "11.2.3", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", @@ -6522,6 +7498,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, "license": "MIT" }, "node_modules/cssdb": { @@ -6647,21 +7624,24 @@ "license": "MIT" }, "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "dev": true, "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, "license": "MIT" }, "node_modules/csstype": { @@ -6677,17 +7657,17 @@ "license": "BSD-2-Clause" }, "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/data-view-buffer": { @@ -6782,36 +7762,14 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "license": "MIT" }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, "node_modules/deep-is": { @@ -7042,6 +8000,7 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, "license": "MIT" }, "node_modules/dom-converter": { @@ -7373,26 +8332,6 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", @@ -7479,6 +8418,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -8133,6 +9111,16 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -8645,9 +9633,10 @@ } }, "node_modules/form-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", - "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -9271,15 +10260,16 @@ } }, "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, "license": "MIT", "dependencies": { - "whatwg-encoding": "^1.0.5" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/html-entities": { @@ -9419,17 +10409,17 @@ } }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http-proxy-middleware": { @@ -9469,16 +10459,17 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -9605,6 +10596,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9695,22 +10687,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -10604,6 +11580,292 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-environment-jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/form-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", + "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, "node_modules/jest-environment-node": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", @@ -11328,44 +12590,39 @@ } }, "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^2.11.2" }, "peerDependenciesMeta": { "canvas": { @@ -11673,6 +12930,13 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -11710,6 +12974,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" @@ -12041,6 +13306,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -12330,22 +13596,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -12679,10 +13929,30 @@ } }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT" + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/parseurl": { "version": "1.3.3", @@ -12773,6 +14043,23 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -14830,6 +16117,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, "license": "MIT", "dependencies": { "indent-string": "^4.0.0", @@ -15290,6 +16578,13 @@ "randombytes": "^2.1.0" } }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true, + "license": "MIT" + }, "node_modules/rtl-css-js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", @@ -15451,15 +16746,16 @@ "license": "ISC" }, "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=v12.22.7" } }, "node_modules/scheduler": { @@ -15889,6 +17185,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -16066,6 +17369,13 @@ "node": ">=8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -16201,18 +17511,12 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -16460,6 +17764,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, "license": "MIT", "dependencies": { "min-indent": "^1.0.0" @@ -17157,6 +18462,70 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.75", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.75.tgz", + "integrity": "sha512-+lFzEXhpl7JXgWYaXcB6DqTYXbUArvrWAE/5ioq/X3CdWLbDjpPP4XTrQBmEJ91y3xbe4Fkw7Lxv4P3GWeJaNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.75" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.75", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.75.tgz", + "integrity": "sha512-AOvV5YYIAFFBfransBzSTyztkc3IMfz5Eq3YluaRiEu55nn43Fzaufx70UqEKYr8BoLCach4q8g/bg6e5+/aFw==", + "dev": true, + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -17191,39 +18560,29 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz", + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node": ">=16" } }, "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.1.1" + "punycode": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/trough": { @@ -17480,6 +18839,12 @@ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", "license": "MIT" }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", @@ -17979,6 +19344,233 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz", + "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.32.1", + "@rollup/rollup-android-arm64": "4.32.1", + "@rollup/rollup-darwin-arm64": "4.32.1", + "@rollup/rollup-darwin-x64": "4.32.1", + "@rollup/rollup-freebsd-arm64": "4.32.1", + "@rollup/rollup-freebsd-x64": "4.32.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.32.1", + "@rollup/rollup-linux-arm-musleabihf": "4.32.1", + "@rollup/rollup-linux-arm64-gnu": "4.32.1", + "@rollup/rollup-linux-arm64-musl": "4.32.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.32.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1", + "@rollup/rollup-linux-riscv64-gnu": "4.32.1", + "@rollup/rollup-linux-s390x-gnu": "4.32.1", + "@rollup/rollup-linux-x64-gnu": "4.32.1", + "@rollup/rollup-linux-x64-musl": "4.32.1", + "@rollup/rollup-win32-arm64-msvc": "4.32.1", + "@rollup/rollup-win32-ia32-msvc": "4.32.1", + "@rollup/rollup-win32-x64-msvc": "4.32.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/vitest": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.8", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -17990,15 +19582,16 @@ } }, "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, "license": "MIT", "dependencies": { - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/walker": { @@ -18049,12 +19642,13 @@ "license": "Apache-2.0" }, "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=10.4" + "node": ">=12" } }, "node_modules/webpack": { @@ -18185,27 +19779,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", - "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 - } - } - }, "node_modules/webpack-manifest-plugin": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", @@ -18308,24 +19881,16 @@ } }, "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, "license": "MIT", "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "iconv-lite": "0.6.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, "node_modules/whatwg-fetch": { @@ -18335,23 +19900,27 @@ "license": "MIT" }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "license": "MIT" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/which": { @@ -18453,6 +20022,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -18854,16 +20440,16 @@ } }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -18875,10 +20461,14 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "license": "Apache-2.0" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } }, "node_modules/xmlchars": { "version": "2.2.0", diff --git a/webview-ui/package.json b/webview-ui/package.json index 7a6b6f4639..d955fba53c 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -3,13 +3,6 @@ "version": "0.1.0", "private": true, "dependencies": { - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.101", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", "@vscode/webview-ui-toolkit": "^1.4.0", "debounce": "^2.1.1", "fast-deep-equal": "^3.1.3", @@ -34,7 +27,8 @@ "scripts": { "start": "react-scripts start", "build": "node ./scripts/build-react-no-split.js", - "test": "react-scripts test", + "test": "vitest run", + "test:watch": "vitest dev", "eject": "react-scripts eject" }, "eslintConfig": { @@ -56,6 +50,15 @@ ] }, "devDependencies": { - "@types/vscode-webview": "^1.57.5" + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^15.0.6", + "@testing-library/user-event": "^13.5.0", + "@types/vscode-webview": "^1.57.5", + "@types/jest": "^27.5.2", + "@types/node": "^20.x", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "jsdom": "^25.0.1", + "vitest": "^2.1.8" } } diff --git a/webview-ui/setupTests.js b/webview-ui/setupTests.js new file mode 100644 index 0000000000..e876ebe760 --- /dev/null +++ b/webview-ui/setupTests.js @@ -0,0 +1,2 @@ +import "@testing-library/jest-dom" +import "./matchMedia" diff --git a/webview-ui/src/components/chat/__tests__/Announcement.spec.tsx b/webview-ui/src/components/chat/__tests__/Announcement.spec.tsx new file mode 100644 index 0000000000..563a705590 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/Announcement.spec.tsx @@ -0,0 +1,39 @@ +import { render, screen, fireEvent } from "@testing-library/react" +import { describe, it, expect, vi } from "vitest" +import Announcement from "../Announcement" + +vi.mock("@vscode/webview-ui-toolkit/react", () => ({ + useTheme: () => ({ themeType: "light" }), + VSCodeButton: (props: any) => , + VSCodeLink: ({ children }: { children: React.ReactNode }) => {children}, +})) + +describe("Announcement", () => { + const hideAnnouncement = vi.fn() + + it("renders the announcement with the correct version", () => { + render() + expect(screen.getByText(/New in v2.0/)).toBeInTheDocument() + }) + + it("calls hideAnnouncement when close button is clicked", () => { + render() + fireEvent.click(screen.getByRole("button")) + expect(hideAnnouncement).toHaveBeenCalled() + }) + + it("renders the mcp server improvements announcement", () => { + render() + expect(screen.getByText(/MCP server improvements:/)).toBeInTheDocument() + }) + + it("renders the 'See new changes' button feature", () => { + render() + expect(screen.getByText(/See it in action here./)).toBeInTheDocument() + }) + + it("renders the demo link", () => { + render() + expect(screen.getByText(/See a demo here./)).toBeInTheDocument() + }) +}) diff --git a/webview-ui/tsconfig.json b/webview-ui/tsconfig.json index 8a9f459684..3552b166de 100644 --- a/webview-ui/tsconfig.json +++ b/webview-ui/tsconfig.json @@ -16,5 +16,6 @@ "noEmit": true, "jsx": "react-jsx" }, - "include": ["src", "../src/shared"] + "include": ["src", "../src/shared"], + "exclude": ["src/**/*.spec.ts", "setupTests.js", "matchMedia.js"] } diff --git a/webview-ui/vite.config.js b/webview-ui/vite.config.js new file mode 100644 index 0000000000..04c560aa10 --- /dev/null +++ b/webview-ui/vite.config.js @@ -0,0 +1,9 @@ +import { defineConfig } from "vitest/config" + +export default defineConfig({ + test: { + environment: "jsdom", + globals: true, + setupFiles: ["./setupTests.js"], + }, +}) From 68ac266463a10a8aa1c988b03bf48bf1197a154c Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Fri, 31 Jan 2025 02:35:06 -0800 Subject: [PATCH 65/74] Add better support for r1 + show reasoning tokens --- src/api/providers/deepseek.ts | 22 ++++- src/api/providers/openai.ts | 21 ++++- src/api/providers/openrouter.ts | 59 +++++++++++-- src/api/transform/r1-format.ts | 98 ++++++++++++++++++++++ src/api/transform/stream.ts | 7 +- src/core/Cline.ts | 14 ++++ src/shared/ExtensionMessage.ts | 2 + webview-ui/src/components/chat/ChatRow.tsx | 56 +++++++++++++ 8 files changed, 268 insertions(+), 11 deletions(-) create mode 100644 src/api/transform/r1-format.ts diff --git a/src/api/providers/deepseek.ts b/src/api/providers/deepseek.ts index d68dc49bed..43aefe7117 100644 --- a/src/api/providers/deepseek.ts +++ b/src/api/providers/deepseek.ts @@ -4,6 +4,7 @@ import { ApiHandler } from "../" import { ApiHandlerOptions, DeepSeekModelId, ModelInfo, deepSeekDefaultModelId, deepSeekModels } from "../../shared/api" import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStream } from "../transform/stream" +import { convertToR1Format } from "../transform/r1-format" export class DeepSeekHandler implements ApiHandler { private options: ApiHandlerOptions @@ -19,10 +20,22 @@ export class DeepSeekHandler implements ApiHandler { async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { const model = this.getModel() + + const isDeepseekReasoner = model.id.includes("deepseek-reasoner") + + let openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...convertToOpenAiMessages(messages), + ] + + if (isDeepseekReasoner) { + openAiMessages = convertToR1Format([{ role: "user", content: systemPrompt }, ...messages]) + } + const stream = await this.client.chat.completions.create({ model: model.id, max_completion_tokens: model.info.maxTokens, - messages: [{ role: "system", content: systemPrompt }, ...convertToOpenAiMessages(messages)], + messages: openAiMessages, stream: true, stream_options: { include_usage: true }, // Only set temperature for non-reasoner models @@ -38,6 +51,13 @@ export class DeepSeekHandler implements ApiHandler { } } + if ("reasoning_content" in delta && delta.reasoning_content) { + yield { + type: "reasoning", + reasoning: (delta.reasoning_content as string | undefined) || "", + } + } + if (chunk.usage) { yield { type: "usage", diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 58e4ba0250..e70273041f 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -4,6 +4,7 @@ import { ApiHandlerOptions, azureOpenAiDefaultApiVersion, ModelInfo, openAiModel import { ApiHandler } from "../index" import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStream } from "../transform/stream" +import { convertToR1Format } from "../transform/r1-format" export class OpenAiHandler implements ApiHandler { private options: ApiHandlerOptions @@ -27,12 +28,20 @@ export class OpenAiHandler implements ApiHandler { } async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { - const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + const modelId = this.options.openAiModelId ?? "" + const isDeepseekReasoner = modelId.includes("deepseek-reasoner") + + let openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ { role: "system", content: systemPrompt }, ...convertToOpenAiMessages(messages), ] + + if (isDeepseekReasoner) { + openAiMessages = convertToR1Format([{ role: "user", content: systemPrompt }, ...messages]) + } + const stream = await this.client.chat.completions.create({ - model: this.options.openAiModelId ?? "", + model: modelId, messages: openAiMessages, temperature: 0, stream: true, @@ -46,6 +55,14 @@ export class OpenAiHandler implements ApiHandler { text: delta.content, } } + + if ("reasoning_content" in delta && delta.reasoning_content) { + yield { + type: "reasoning", + reasoning: (delta.reasoning_content as string | undefined) || "", + } + } + if (chunk.usage) { yield { type: "usage", diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index e0bec2cf1c..34129c0d1a 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -1,11 +1,12 @@ import { Anthropic } from "@anthropic-ai/sdk" import axios from "axios" +import delay from "delay" import OpenAI from "openai" import { ApiHandler } from "../" import { ApiHandlerOptions, ModelInfo, openRouterDefaultModelId, openRouterDefaultModelInfo } from "../../shared/api" import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStream } from "../transform/stream" -import delay from "delay" +import { convertToR1Format } from "../transform/r1-format" export class OpenRouterHandler implements ApiHandler { private options: ApiHandlerOptions @@ -27,7 +28,7 @@ export class OpenRouterHandler implements ApiHandler { const model = this.getModel() // Convert Anthropic messages to OpenAI format - const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + let openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ { role: "system", content: systemPrompt }, ...convertToOpenAiMessages(messages), ] @@ -98,6 +99,18 @@ export class OpenRouterHandler implements ApiHandler { break } + let temperature = 0 + let topP: number | undefined = undefined + // Handle models based on deepseek-r1 + if (this.getModel().id.startsWith("deepseek/deepseek-r1") || this.getModel().id === "perplexity/sonar-reasoning") { + // Recommended temperature for DeepSeek reasoning models + temperature = 0.6 + // DeepSeek highly recommends using user instead of system role + openAiMessages = convertToR1Format([{ role: "user", content: systemPrompt }, ...messages]) + // Some provider support topP and 0.95 is value that Deepseek used in their benchmarks + topP = 0.95 + } + // Removes messages in the middle when close to context window limit. Should not be applied to models that support prompt caching since it would continuously break the cache. let shouldApplyMiddleOutTransform = !model.info.supportsPromptCache // except for deepseek (which we set supportsPromptCache to true for), where because the context window is so small our truncation algo might miss and we should use openrouter's middle-out transform as a fallback to ensure we don't exceed the context window (FIXME: once we have a more robust token estimator we should not rely on this) @@ -105,14 +118,18 @@ export class OpenRouterHandler implements ApiHandler { shouldApplyMiddleOutTransform = true } + const isDeepSeekR1 = model.id === "deepseek/deepseek-r1" || model.id.startsWith("deepseek/deepseek-r1:") + // @ts-ignore-next-line const stream = await this.client.chat.completions.create({ model: model.id, max_tokens: maxTokens, - temperature: 0, + temperature: temperature, + top_p: topP, messages: openAiMessages, stream: true, transforms: shouldApplyMiddleOutTransform ? ["middle-out"] : undefined, + include_reasoning: true, }) let genId: string | undefined @@ -136,6 +153,37 @@ export class OpenRouterHandler implements ApiHandler { text: delta.content, } } + + // Reasoning tokens are returned separately from the content + if ("reasoning" in delta && delta.reasoning) { + // console.log("reasoning", delta.reasoning) + yield { + type: "reasoning", + // @ts-ignore-next-line + reasoning: delta.reasoning, + } + + // if (didStreamThinkTagInReasoning) { + // yield { + // type: "text", + // // @ts-ignore-next-line + // text: delta.reasoning, + // } + // } else { + // yield { + // type: "reasoning", + // // @ts-ignore-next-line + // text: delta.reasoning, + // } + + // // @ts-ignore-next-line + // reasoningResponse += delta.reasoning + // if (reasoningResponse.includes("")) { + // didStreamThinkTagInReasoning = true + // console.log("did hit think tag", reasoningResponse) + // } + // } + } // if (chunk.usage) { // yield { // type: "usage", @@ -178,9 +226,6 @@ export class OpenRouterHandler implements ApiHandler { if (modelId && modelInfo) { return { id: modelId, info: modelInfo } } - return { - id: openRouterDefaultModelId, - info: openRouterDefaultModelInfo, - } + return { id: openRouterDefaultModelId, info: openRouterDefaultModelInfo } } } diff --git a/src/api/transform/r1-format.ts b/src/api/transform/r1-format.ts new file mode 100644 index 0000000000..51a4b94dbc --- /dev/null +++ b/src/api/transform/r1-format.ts @@ -0,0 +1,98 @@ +import { Anthropic } from "@anthropic-ai/sdk" +import OpenAI from "openai" + +type ContentPartText = OpenAI.Chat.ChatCompletionContentPartText +type ContentPartImage = OpenAI.Chat.ChatCompletionContentPartImage +type UserMessage = OpenAI.Chat.ChatCompletionUserMessageParam +type AssistantMessage = OpenAI.Chat.ChatCompletionAssistantMessageParam +type Message = OpenAI.Chat.ChatCompletionMessageParam +type AnthropicMessage = Anthropic.Messages.MessageParam + +/** + * Converts Anthropic messages to OpenAI format while merging consecutive messages with the same role. + * This is required for DeepSeek Reasoner which does not support successive messages with the same role. + * + * @param messages Array of Anthropic messages + * @returns Array of OpenAI messages where consecutive messages with the same role are combined + */ +export function convertToR1Format(messages: AnthropicMessage[]): Message[] { + return messages.reduce((merged, message) => { + const lastMessage = merged[merged.length - 1] + let messageContent: string | (ContentPartText | ContentPartImage)[] = "" + let hasImages = false + + // Convert content to appropriate format + if (Array.isArray(message.content)) { + const textParts: string[] = [] + const imageParts: ContentPartImage[] = [] + + message.content.forEach((part) => { + if (part.type === "text") { + textParts.push(part.text) + } + if (part.type === "image") { + hasImages = true + imageParts.push({ + type: "image_url", + image_url: { url: `data:${part.source.media_type};base64,${part.source.data}` }, + }) + } + }) + + if (hasImages) { + const parts: (ContentPartText | ContentPartImage)[] = [] + if (textParts.length > 0) { + parts.push({ type: "text", text: textParts.join("\n") }) + } + parts.push(...imageParts) + messageContent = parts + } else { + messageContent = textParts.join("\n") + } + } else { + messageContent = message.content + } + + // If last message has same role, merge the content + if (lastMessage?.role === message.role) { + if (typeof lastMessage.content === "string" && typeof messageContent === "string") { + lastMessage.content += `\n${messageContent}` + } + // If either has image content, convert both to array format + else { + const lastContent = Array.isArray(lastMessage.content) + ? lastMessage.content + : [{ type: "text" as const, text: lastMessage.content || "" }] + + const newContent = Array.isArray(messageContent) + ? messageContent + : [{ type: "text" as const, text: messageContent }] + + if (message.role === "assistant") { + const mergedContent = [...lastContent, ...newContent] as AssistantMessage["content"] + lastMessage.content = mergedContent + } else { + const mergedContent = [...lastContent, ...newContent] as UserMessage["content"] + lastMessage.content = mergedContent + } + } + } else { + // Add as new message with the correct type based on role + if (message.role === "assistant") { + const newMessage: AssistantMessage = { + role: "assistant", + content: messageContent as AssistantMessage["content"], + } + merged.push(newMessage) + } else { + const newMessage: UserMessage = { + role: "user", + content: messageContent as UserMessage["content"], + } + merged.push(newMessage) + } + } + + return merged + }, []) +} diff --git a/src/api/transform/stream.ts b/src/api/transform/stream.ts index 0290201dad..712f839b49 100644 --- a/src/api/transform/stream.ts +++ b/src/api/transform/stream.ts @@ -1,11 +1,16 @@ export type ApiStream = AsyncGenerator -export type ApiStreamChunk = ApiStreamTextChunk | ApiStreamUsageChunk +export type ApiStreamChunk = ApiStreamTextChunk | ApiStreamReasoningChunk | ApiStreamUsageChunk export interface ApiStreamTextChunk { type: "text" text: string } +export interface ApiStreamReasoningChunk { + type: "reasoning" + reasoning: string +} + export interface ApiStreamUsageChunk { type: "usage" inputTokens: number diff --git a/src/core/Cline.ts b/src/core/Cline.ts index c9c3e3c066..ff462c61d0 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -2986,9 +2986,14 @@ export class Cline { const stream = this.attemptApiRequest(previousApiReqIndex) // yields only if the first chunk is successful, otherwise will allow the user to retry the request (most likely due to rate limit error, which gets thrown on the first chunk) let assistantMessage = "" + let reasoningMessage = "" this.isStreaming = true try { for await (const chunk of stream) { + if (!chunk) { + // Sometimes chunk is undefined, no idea that can cause it, but this workaround seems to fix it + continue + } switch (chunk.type) { case "usage": inputTokens += chunk.inputTokens @@ -2997,7 +3002,16 @@ export class Cline { cacheReadTokens += chunk.cacheReadTokens ?? 0 totalCost = chunk.totalCost break + case "reasoning": + // reasoning will always come before assistant message + reasoningMessage += chunk.reasoning + await this.say("reasoning", reasoningMessage, undefined, true) + break case "text": + if (reasoningMessage && assistantMessage.length === 0) { + // complete reasoning message + await this.say("reasoning", reasoningMessage, undefined, false) + } assistantMessage += chunk.text // parse raw assistant message into content blocks const prevLength = this.assistantMessageContent.length diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index e45c912ba7..5a93caf07b 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -75,6 +75,7 @@ export interface ClineMessage { ask?: ClineAsk say?: ClineSay text?: string + reasoning?: string images?: string[] partial?: boolean lastCheckpointHash?: string @@ -103,6 +104,7 @@ export type ClineSay = | "api_req_started" | "api_req_finished" | "text" + | "reasoning" | "completion_result" | "user_feedback" | "user_feedback_diff" diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index fed1bb0cf4..5c877207f2 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -842,6 +842,62 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
) + case "reasoning": + return ( + <> + {message.text && ( +
+ {isExpanded ? ( +
+ + Reasoning + + + {message.text} +
+ ) : ( +
+ Reasoning: + + {message.text + "\u200E"} + + +
+ )} +
+ )} + + ) case "user_feedback": return (
Date: Fri, 31 Jan 2025 02:37:13 -0800 Subject: [PATCH 66/74] Prepare for release --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8610bf9080..6c95ff6eec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [3.2.10] + +- Improve support for DeepSeek-R1 (deepseek-reasoner) model for OpenRouter, OpenAI-compatible, and DeepSeek direct +- Show Reasoning tokens for models that support it + ## [3.2.6] - Save last used API/model when switching between Plan and Act, for users that like to use different models for each mode diff --git a/package.json b/package.json index 9666372384..eec6f71f30 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "claude-dev", "displayName": "Cline", "description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.", - "version": "3.2.9", + "version": "3.2.10", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 6500b7c210ee75ab0df505ebbf2b2f480a5e0a7f Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Fri, 31 Jan 2025 02:38:27 -0800 Subject: [PATCH 67/74] Fixes --- src/api/providers/openrouter.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index 34129c0d1a..6b8f40c5e7 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -118,8 +118,6 @@ export class OpenRouterHandler implements ApiHandler { shouldApplyMiddleOutTransform = true } - const isDeepSeekR1 = model.id === "deepseek/deepseek-r1" || model.id.startsWith("deepseek/deepseek-r1:") - // @ts-ignore-next-line const stream = await this.client.chat.completions.create({ model: model.id, From 03f07b762663c7e685a767a31f6182cf4a56087c Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Fri, 31 Jan 2025 03:08:24 -0800 Subject: [PATCH 68/74] Fix model switching between plan/act; enable toggle and model switcher during generation --- src/core/webview/ClineProvider.ts | 6 ++++++ webview-ui/src/components/chat/ChatTextArea.tsx | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 1e2e309359..840a5ab7b1 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -564,10 +564,16 @@ export class ClineProvider implements vscode.WebviewViewProvider { await this.updateGlobalState("lmStudioModelId", newModelId) break } + + if (this.cline) { + const { apiConfiguration: updatedApiConfiguration } = await this.getState() + this.cline.api = buildApiHandler(updatedApiConfiguration) + } } await this.updateGlobalState("chatSettings", message.chatSettings) await this.postStateToWebview() + // console.log("chatSettings", message.chatSettings) if (this.cline) { this.cline.updateChatSettings(message.chatSettings) if (this.cline.isAwaitingPlanResponse && didSwitchToActMode) { diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index c7183bd464..c66837a251 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -597,7 +597,7 @@ const ChatTextArea = forwardRef( }, [apiConfiguration, openRouterModels]) const onModeToggle = useCallback(() => { - if (textAreaDisabled) return + // if (textAreaDisabled) return let changeModeDelay = 0 if (showModelSelector) { // user has model selector open, so we should save it before switching modes @@ -617,7 +617,7 @@ const ChatTextArea = forwardRef( textAreaRef.current?.focus() }, 100) }, changeModeDelay) - }, [chatSettings.mode, textAreaDisabled, showModelSelector, submitApiConfig]) + }, [chatSettings.mode, showModelSelector, submitApiConfig]) const handleContextButtonClick = useCallback(() => { if (textAreaDisabled) return @@ -1038,7 +1038,7 @@ const ChatTextArea = forwardRef( { // if (e.key === "Enter" || e.key === " ") { @@ -1068,7 +1068,7 @@ const ChatTextArea = forwardRef( - + Plan Act From 3df5e533b7c80fe5e6a2494ad62b58feb118ce9b Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Fri, 31 Jan 2025 03:14:43 -0800 Subject: [PATCH 69/74] Prepare for release --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c95ff6eec..7041248a3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Improve support for DeepSeek-R1 (deepseek-reasoner) model for OpenRouter, OpenAI-compatible, and DeepSeek direct - Show Reasoning tokens for models that support it +- Fix issues with switching models between Plan/Act modes ## [3.2.6] From 2a078fee771db3f718bf798a363451b610d1be7b Mon Sep 17 00:00:00 2001 From: Evan Fannin <58194240+evan-fannin@users.noreply.github.com> Date: Sat, 1 Feb 2025 04:09:12 +0800 Subject: [PATCH 70/74] Class Implemented (#1577) * wip * LLMFileAccessController and tests * added class and tests * cleaning up * formatting * removing some defaults * package json and remove defaults list --- package-lock.json | 65 ++++- package.json | 1 + .../LLMFileAccessController.test.ts | 260 ++++++++++++++++++ .../LLMFileAccessController.ts | 100 +++++++ 4 files changed, 420 insertions(+), 6 deletions(-) create mode 100644 src/services/llm-access-control/LLMFileAccessController.test.ts create mode 100644 src/services/llm-access-control/LLMFileAccessController.ts diff --git a/package-lock.json b/package-lock.json index 9f3906f1d4..26881a7159 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "claude-dev", - "version": "3.2.6", + "version": "3.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "claude-dev", - "version": "3.2.6", + "version": "3.2.9", "license": "Apache-2.0", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", @@ -32,6 +32,7 @@ "firebase": "^11.2.0", "get-folder-size": "^5.0.0", "globby": "^14.0.2", + "ignore": "^7.0.3", "isbinaryfile": "^5.0.2", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", @@ -2610,6 +2611,15 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3660,6 +3670,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@manypkg/get-packages/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/@manypkg/get-packages/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5634,6 +5653,15 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/parser": { "version": "7.15.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.15.0.tgz", @@ -5772,6 +5800,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7628,6 +7665,15 @@ "node": ">=10.13.0" } }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8604,6 +8650,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, "node_modules/google-auth-library": { "version": "9.14.0", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.14.0.tgz", @@ -8915,10 +8969,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "license": "MIT", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "engines": { "node": ">= 4" } diff --git a/package.json b/package.json index eec6f71f30..2f1167ee04 100644 --- a/package.json +++ b/package.json @@ -234,6 +234,7 @@ "firebase": "^11.2.0", "get-folder-size": "^5.0.0", "globby": "^14.0.2", + "ignore": "^7.0.3", "isbinaryfile": "^5.0.2", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", diff --git a/src/services/llm-access-control/LLMFileAccessController.test.ts b/src/services/llm-access-control/LLMFileAccessController.test.ts new file mode 100644 index 0000000000..b8cee93e9a --- /dev/null +++ b/src/services/llm-access-control/LLMFileAccessController.test.ts @@ -0,0 +1,260 @@ +import { LLMFileAccessController } from "./LLMFileAccessController" +import fs from "fs/promises" +import path from "path" +import os from "os" +import { after, beforeEach, describe, it } from "mocha" +import "should" + +describe("LLMFileAccessController", () => { + let tempDir: string + let controller: LLMFileAccessController + + beforeEach(async () => { + // Create a temp directory for testing + tempDir = path.join(os.tmpdir(), `llm-test-${Date.now()}-${Math.random().toString(36).slice(2)}`) + await fs.mkdir(tempDir) + + // Create default .clineignore file + await fs.writeFile( + path.join(tempDir, ".clineignore"), + [".env", "*.secret", "private/", "# This is a comment", "", "temp.*", "file-with-space-at-end.* ", "**/.git/**"].join( + "\n", + ), + ) + + controller = new LLMFileAccessController(tempDir) + await controller.initialize() + }) + + after(async () => { + // Clean up temp directory + await fs.rm(tempDir, { recursive: true, force: true }) + }) + + describe("Default Patterns", () => { + // it("should block access to common ignored files", async () => { + // const results = await Promise.all([ + // controller.validateAccess(".env"), + // controller.validateAccess(".git/config"), + // controller.validateAccess("node_modules/package.json"), + // ]) + // results.forEach((result) => result.should.be.false()) + // }) + + it("should allow access to regular files", async () => { + const results = await Promise.all([ + controller.validateAccess("src/index.ts"), + controller.validateAccess("README.md"), + controller.validateAccess("package.json"), + ]) + results.forEach((result) => result.should.be.true()) + }) + }) + + describe("Custom Patterns", () => { + it("should block access to custom ignored patterns", async () => { + const results = await Promise.all([ + controller.validateAccess("config.secret"), + controller.validateAccess("private/data.txt"), + controller.validateAccess("temp.json"), + controller.validateAccess("nested/deep/file.secret"), + controller.validateAccess("private/nested/deep/file.txt"), + ]) + results.forEach((result) => result.should.be.false()) + }) + + it("should allow access to non-ignored files", async () => { + const results = await Promise.all([ + controller.validateAccess("public/data.txt"), + controller.validateAccess("config.json"), + controller.validateAccess("src/temp/file.ts"), + controller.validateAccess("nested/deep/file.txt"), + controller.validateAccess("not-private/data.txt"), + ]) + results.forEach((result) => result.should.be.true()) + }) + + it("should handle pattern edge cases", async () => { + await fs.writeFile( + path.join(tempDir, ".clineignore"), + ["*.secret", "private/", "*.tmp", "data-*.json", "temp/*"].join("\n"), + ) + + controller = new LLMFileAccessController(tempDir) + await controller.initialize() + + const results = await Promise.all([ + controller.validateAccess("data-123.json"), // Should be false (wildcard) + controller.validateAccess("data.json"), // Should be true (doesn't match pattern) + controller.validateAccess("script.tmp"), // Should be false (extension match) + ]) + + results[0].should.be.false() // data-123.json + results[1].should.be.true() // data.json + results[2].should.be.false() // script.tmp + }) + + // ToDo: handle negation patterns successfully + + // it("should handle negation patterns", async () => { + // await fs.writeFile( + // path.join(tempDir, ".clineignore"), + // [ + // "temp/*", // Ignore everything in temp + // "!temp/allowed/*", // But allow files in temp/allowed + // "docs/**/*.md", // Ignore all markdown files in docs + // "!docs/README.md", // Except README.md + // "!docs/CONTRIBUTING.md", // And CONTRIBUTING.md + // "assets/", // Ignore all assets + // "!assets/public/", // Except public assets + // "!assets/public/*.png", // Specifically allow PNGs in public assets + // ].join("\n"), + // ) + + // controller = new LLMFileAccessController(tempDir) + // await controller.initialize() + + // const results = await Promise.all([ + // // Basic negation + // controller.validateAccess("temp/file.txt"), // Should be false (in temp/) + // controller.validateAccess("temp/allowed/file.txt"), // Should be true (negated) + // controller.validateAccess("temp/allowed/nested/file.txt"), // Should be true (negated with nested) + + // // Multiple negations in same path + // controller.validateAccess("docs/guide.md"), // Should be false (matches docs/**/*.md) + // controller.validateAccess("docs/README.md"), // Should be true (negated) + // controller.validateAccess("docs/CONTRIBUTING.md"), // Should be true (negated) + // controller.validateAccess("docs/api/guide.md"), // Should be false (nested markdown) + + // // Nested negations + // controller.validateAccess("assets/logo.png"), // Should be false (in assets/) + // controller.validateAccess("assets/public/logo.png"), // Should be true (negated and matches *.png) + // controller.validateAccess("assets/public/data.json"), // Should be true (in negated public/) + // ]) + + // results[0].should.be.false() // temp/file.txt + // results[1].should.be.true() // temp/allowed/file.txt + // results[2].should.be.true() // temp/allowed/nested/file.txt + // results[3].should.be.false() // docs/guide.md + // results[4].should.be.true() // docs/README.md + // results[5].should.be.true() // docs/CONTRIBUTING.md + // results[6].should.be.false() // docs/api/guide.md + // results[7].should.be.false() // assets/logo.png + // results[8].should.be.true() // assets/public/logo.png + // results[9].should.be.true() // assets/public/data.json + // }) + + it("should handle comments in .clineignore", async () => { + // Create a new .clineignore with comments + await fs.writeFile( + path.join(tempDir, ".clineignore"), + ["# Comment line", "*.secret", "private/", "temp.*"].join("\n"), + ) + + controller = new LLMFileAccessController(tempDir) + await controller.initialize() + + const result = await controller.validateAccess("test.secret") + result.should.be.false() + }) + }) + + describe("Path Handling", () => { + it("should handle absolute paths and match ignore patterns", async () => { + // Test absolute path that should be allowed + const allowedPath = path.join(tempDir, "src/file.ts") + const allowedResult = await controller.validateAccess(allowedPath) + allowedResult.should.be.true() + + // Test absolute path that matches an ignore pattern (*.secret) + const ignoredPath = path.join(tempDir, "config.secret") + const ignoredResult = await controller.validateAccess(ignoredPath) + ignoredResult.should.be.false() + + // Test absolute path in ignored directory (private/) + const ignoredDirPath = path.join(tempDir, "private/data.txt") + const ignoredDirResult = await controller.validateAccess(ignoredDirPath) + ignoredDirResult.should.be.false() + }) + + it("should handle relative paths and match ignore patterns", async () => { + // Test relative path that should be allowed + const allowedResult = await controller.validateAccess("./src/file.ts") + allowedResult.should.be.true() + + // Test relative path that matches an ignore pattern (*.secret) + const ignoredResult = await controller.validateAccess("./config.secret") + ignoredResult.should.be.false() + + // Test relative path in ignored directory (private/) + const ignoredDirResult = await controller.validateAccess("./private/data.txt") + ignoredDirResult.should.be.false() + }) + + it("should normalize paths with backslashes", async () => { + const result = await controller.validateAccess("src\\file.ts") + result.should.be.true() + }) + + it("should handle paths outside cwd", async () => { + // Create a path that points to parent directory of cwd + const outsidePath = path.join(path.dirname(tempDir), "outside.txt") + const result = await controller.validateAccess(outsidePath) + + // Should return false for security since path is outside cwd + result.should.be.false() + + // Test with a deeply nested path outside cwd + const deepOutsidePath = path.join(path.dirname(tempDir), "deep", "nested", "outside.secret") + const deepResult = await controller.validateAccess(deepOutsidePath) + deepResult.should.be.false() + + // Test with a path that tries to escape using ../ + const escapeAttemptPath = path.join(tempDir, "..", "escape-attempt.txt") + const escapeResult = await controller.validateAccess(escapeAttemptPath) + escapeResult.should.be.false() + }) + }) + + describe("Batch Filtering", () => { + it("should filter an array of paths", async () => { + const paths = ["src/index.ts", ".env", "lib/utils.ts", ".git/config", "dist/bundle.js"] + + const filtered = controller.filterPaths(paths) + filtered.should.deepEqual(["src/index.ts", "lib/utils.ts", "dist/bundle.js"]) + }) + }) + + describe("Error Handling", () => { + it("should handle invalid paths", async () => { + // Test with an invalid path containing null byte + const result = await controller.validateAccess("\0invalid") + result.should.be.true() + }) + + it("should handle missing .clineignore gracefully", async () => { + // Create a new controller in a directory without .clineignore + const emptyDir = path.join(os.tmpdir(), `llm-test-empty-${Date.now()}`) + await fs.mkdir(emptyDir) + + try { + const controller = new LLMFileAccessController(emptyDir) + await controller.initialize() + const result = await controller.validateAccess("file.txt") + result.should.be.true() + } finally { + await fs.rm(emptyDir, { recursive: true, force: true }) + } + }) + + it("should handle empty .clineignore", async () => { + await fs.writeFile(path.join(tempDir, ".clineignore"), "") + + controller = new LLMFileAccessController(tempDir) + await controller.initialize() + + const result = await controller.validateAccess("regular-file.txt") + result.should.be.true() + }) + }) +}) diff --git a/src/services/llm-access-control/LLMFileAccessController.ts b/src/services/llm-access-control/LLMFileAccessController.ts new file mode 100644 index 0000000000..b5139c43a8 --- /dev/null +++ b/src/services/llm-access-control/LLMFileAccessController.ts @@ -0,0 +1,100 @@ +import path from "path" +import { fileExistsAtPath } from "../../utils/fs" +import fs from "fs/promises" +import ignore, { Ignore } from "ignore" + +/** + * Controls LLM access to files by enforcing ignore patterns. + * Designed to be instantiated once in Cline.ts and passed to file manipulation services. + * Uses the 'ignore' library to support standard .gitignore syntax in .clineignore files. + */ +export class LLMFileAccessController { + private cwd: string + private ignoreInstance: Ignore + + /** + * Default patterns that are always ignored for security + */ + private static readonly DEFAULT_PATTERNS = [] // empty for now + + constructor(cwd: string) { + this.cwd = cwd + this.ignoreInstance = ignore() + + // Add default patterns immediately + this.ignoreInstance.add(LLMFileAccessController.DEFAULT_PATTERNS) + } + + /** + * Initialize the controller by loading custom patterns + * This must be called and awaited before using the controller + */ + async initialize(): Promise { + await this.loadCustomPatterns() + } + + /** + * Load custom patterns from .clineignore if it exists + */ + private async loadCustomPatterns(): Promise { + try { + const ignorePath = path.join(this.cwd, ".clineignore") + if (await fileExistsAtPath(ignorePath)) { + const content = await fs.readFile(ignorePath, "utf8") + const customPatterns = content + .split("\n") + .map((line) => line.trim()) + .filter((line) => line && !line.startsWith("#")) + + this.ignoreInstance.add(customPatterns) + } + } catch (error) { + console.error("Failed to load .clineignore:", error) + // Continue with default patterns + } + } + + /** + * Check if a file should be accessible to the LLM + * @param filePath - Path to check (relative to cwd) + * @returns true if file is accessible, false if ignored + */ + validateAccess(filePath: string): boolean { + try { + // Normalize path to be relative to cwd and use forward slashes + const absolutePath = path.resolve(this.cwd, filePath) + const relativePath = path.relative(this.cwd, absolutePath).replace(/\\/g, "/") + + // Block access to paths outside cwd (those starting with '..') + if (relativePath.startsWith("..")) { + return false + } + + // Use ignore library to check if path should be ignored + return !this.ignoreInstance.ignores(relativePath) + } catch (error) { + console.error(`Error validating access for ${filePath}:`, error) + return false // Fail closed for security + } + } + + /** + * Filter an array of paths, removing those that should be ignored + * @param paths - Array of paths to filter (relative to cwd) + * @returns Array of allowed paths + */ + filterPaths(paths: string[]): string[] { + try { + return paths + .map((p) => ({ + path: p, + allowed: this.validateAccess(p), + })) + .filter((x) => x.allowed) + .map((x) => x.path) + } catch (error) { + console.error("Error filtering paths:", error) + return [] // Fail closed for security + } + } +} From 5eb8086b421d0882045931c7fd6224bee1dfbfcc Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Fri, 31 Jan 2025 15:21:42 -0800 Subject: [PATCH 71/74] Add o3-mini support to OpenAI --- CHANGELOG.md | 4 +++ package-lock.json | 55 ++++++++++++++---------------- package.json | 4 +-- src/api/providers/openai-native.ts | 25 ++++++++++++++ src/shared/api.ts | 8 +++++ 5 files changed, 64 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7041248a3f..2c9d59f27f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [3.2.11] + +- Add OpenAI o3-mini model + ## [3.2.10] - Improve support for DeepSeek-R1 (deepseek-reasoner) model for OpenRouter, OpenAI-compatible, and DeepSeek direct diff --git a/package-lock.json b/package-lock.json index 26881a7159..f859809461 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "claude-dev", - "version": "3.2.9", + "version": "3.2.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "claude-dev", - "version": "3.2.9", + "version": "3.2.10", "license": "Apache-2.0", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", @@ -36,7 +36,7 @@ "isbinaryfile": "^5.0.2", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", - "openai": "^4.61.0", + "openai": "^4.82.0", "os-name": "^6.0.0", "p-wait-for": "^5.0.2", "pdf-parse": "^1.1.1", @@ -5583,12 +5583,6 @@ "integrity": "sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg==", "license": "MIT" }, - "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", - "license": "MIT" - }, "node_modules/@types/should": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/@types/should/-/should-11.2.0.tgz", @@ -6479,6 +6473,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -7029,6 +7024,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -7410,6 +7406,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -7422,6 +7419,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8306,6 +8304,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8453,6 +8452,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -8678,6 +8678,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -8735,6 +8736,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -8747,6 +8749,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8759,6 +8762,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8793,6 +8797,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -10548,6 +10553,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -10611,28 +10617,30 @@ } }, "node_modules/openai": { - "version": "4.61.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.61.0.tgz", - "integrity": "sha512-xkygRBRLIUumxzKGb1ug05pWmJROQsHkGuj/N6Jiw2dj0dI19JvbFpErSZKmJ/DA+0IvpcugZqCAyk8iLpyM6Q==", + "version": "4.82.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.82.0.tgz", + "integrity": "sha512-1bTxOVGZuVGsKKUWbh3BEwX1QxIXUftJv+9COhhGGVDTFwiaOd4gWsMynF2ewj1mg6by3/O+U8+EEHpWRdPaJg==", "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", - "@types/qs": "^6.9.15", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "qs": "^6.10.3" + "node-fetch": "^2.6.7" }, "bin": { "openai": "bin/cli" }, "peerDependencies": { + "ws": "^8.18.0", "zod": "^3.23.8" }, "peerDependenciesMeta": { + "ws": { + "optional": true + }, "zod": { "optional": true } @@ -11329,21 +11337,6 @@ "node": ">=18" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11793,6 +11786,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -11940,6 +11934,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", diff --git a/package.json b/package.json index 2f1167ee04..5618a24c6e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "claude-dev", "displayName": "Cline", "description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.", - "version": "3.2.10", + "version": "3.2.11", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", @@ -238,7 +238,7 @@ "isbinaryfile": "^5.0.2", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", - "openai": "^4.61.0", + "openai": "^4.82.0", "os-name": "^6.0.0", "p-wait-for": "^5.0.2", "pdf-parse": "^1.1.1", diff --git a/src/api/providers/openai-native.ts b/src/api/providers/openai-native.ts index f91a90dbc5..8a47ec4345 100644 --- a/src/api/providers/openai-native.ts +++ b/src/api/providers/openai-native.ts @@ -43,6 +43,31 @@ export class OpenAiNativeHandler implements ApiHandler { } break } + case "o3-mini": { + const stream = await this.client.chat.completions.create({ + model: this.getModel().id, + messages: [{ role: "developer", content: systemPrompt }, ...convertToOpenAiMessages(messages)], + stream: true, + stream_options: { include_usage: true }, + }) + for await (const chunk of stream) { + const delta = chunk.choices[0]?.delta + if (delta?.content) { + yield { + type: "text", + text: delta.content, + } + } + if (chunk.usage) { + yield { + type: "usage", + inputTokens: chunk.usage.prompt_tokens || 0, + outputTokens: chunk.usage.completion_tokens || 0, + } + } + } + break + } default: { const stream = await this.client.chat.completions.create({ model: this.getModel().id, diff --git a/src/shared/api.ts b/src/shared/api.ts index 81eb1d5897..de36d1fb46 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -322,6 +322,14 @@ export const geminiModels = { export type OpenAiNativeModelId = keyof typeof openAiNativeModels export const openAiNativeDefaultModelId: OpenAiNativeModelId = "gpt-4o" export const openAiNativeModels = { + "o3-mini": { + maxTokens: 100_000, + contextWindow: 200_000, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 1.1, + outputPrice: 4.4, + }, // don't support tool use yet o1: { maxTokens: 100_000, From a087f5e583c5d8fd9d3e864a75df19492694f049 Mon Sep 17 00:00:00 2001 From: Daniel Trugman Date: Sun, 2 Feb 2025 00:15:57 +0000 Subject: [PATCH 72/74] Fix reasoning_content check for openai & deepseek streams (#1594) --- src/api/providers/deepseek.ts | 2 +- src/api/providers/openai.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/providers/deepseek.ts b/src/api/providers/deepseek.ts index 43aefe7117..763e1ae68f 100644 --- a/src/api/providers/deepseek.ts +++ b/src/api/providers/deepseek.ts @@ -51,7 +51,7 @@ export class DeepSeekHandler implements ApiHandler { } } - if ("reasoning_content" in delta && delta.reasoning_content) { + if (delta && "reasoning_content" in delta && delta.reasoning_content) { yield { type: "reasoning", reasoning: (delta.reasoning_content as string | undefined) || "", diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index e70273041f..fd73abb567 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -56,7 +56,7 @@ export class OpenAiHandler implements ApiHandler { } } - if ("reasoning_content" in delta && delta.reasoning_content) { + if (delta && "reasoning_content" in delta && delta.reasoning_content) { yield { type: "reasoning", reasoning: (delta.reasoning_content as string | undefined) || "", From 5fd60b7000940ad4c240e8fc0e967218b9a9057b Mon Sep 17 00:00:00 2001 From: canvrno <46584286+canvrno@users.noreply.github.com> Date: Sat, 1 Feb 2025 16:32:06 -0800 Subject: [PATCH 73/74] Refactor Shell Detection to Use VS Code Terminal Profiles and Fallback Hierarchy (#1543) * Provide explicit command chaining instructions * Added shell detection for powershell The default-shell library being used only returns cmd for windows users. This change will utilize VS Code API calls to determine the user's shell/terminal settings. MacOS & Linux will, for now, continue to use the existing method. Still working on tests. * Replaced default-shell, added tests Replaced default-shell with local code that replicates the old behavior on macOS & Linux Windows shell detection uses VS Code settings to get the user's default terminal profile Adjusted prompt change * One small change * Removed & attributed old package + typo * Added VSC load for other OSes, refactor, better tests * Fixed system.ts explicit git lines * Added back changes for terminal-command-chaining * One minor, but important change --- src/core/prompts/system.ts | 6 +- src/test/shell.test.ts | 235 +++++++++++++++++++++++++++++++++++++ src/utils/shell.ts | 227 +++++++++++++++++++++++++++++++++++ 3 files changed, 465 insertions(+), 3 deletions(-) create mode 100644 src/test/shell.test.ts create mode 100644 src/utils/shell.ts diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index 3c26f70d75..a043189438 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -1,4 +1,4 @@ -import defaultShell from "default-shell" +import { getShell } from "../../utils/shell" import os from "os" import osName from "os-name" import { McpHub } from "../../services/mcp/McpHub" @@ -38,7 +38,7 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## execute_command -Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${cwd.toPosix()} +Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${cwd.toPosix()} Parameters: - command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions. - requires_approval: (required) A boolean indicating whether this command requires explicit user approval before execution in case the user has auto-approve mode enabled. Set to 'true' for potentially impactful operations like installing/uninstalling packages, deleting/overwriting files, system configuration changes, network operations, or any commands that could have unintended side effects. Set to 'false' for safe operations like reading files/directories, running development servers, building projects, and other non-destructive operations. @@ -941,7 +941,7 @@ ${ SYSTEM INFORMATION Operating System: ${osName()} -Default Shell: ${defaultShell} +Default Shell: ${getShell()} Home Directory: ${os.homedir().toPosix()} Current Working Directory: ${cwd.toPosix()} diff --git a/src/test/shell.test.ts b/src/test/shell.test.ts new file mode 100644 index 0000000000..51d0e85dc9 --- /dev/null +++ b/src/test/shell.test.ts @@ -0,0 +1,235 @@ +import { describe, it, beforeEach, afterEach } from "mocha" +import { expect } from "chai" +import { getShell } from "../utils/shell" +import * as vscode from "vscode" +import { userInfo } from "os" + +describe("Shell Detection Tests", () => { + let originalPlatform: string + let originalEnv: NodeJS.ProcessEnv + let originalGetConfig: any + let originalUserInfo: any + + // Helper to mock VS Code configuration + function mockVsCodeConfig(platformKey: string, defaultProfileName: string | null, profiles: Record) { + vscode.workspace.getConfiguration = () => + ({ + get: (key: string) => { + if (key === `defaultProfile.${platformKey}`) { + return defaultProfileName + } + if (key === `profiles.${platformKey}`) { + return profiles + } + return undefined + }, + }) as any + } + + beforeEach(() => { + // Store original references + originalPlatform = process.platform + originalEnv = { ...process.env } + originalGetConfig = vscode.workspace.getConfiguration + originalUserInfo = userInfo + + // Clear environment variables for a clean test + delete process.env.SHELL + delete process.env.COMSPEC + + // Default userInfo() mock + ;(userInfo as any) = () => ({ shell: null }) + }) + + afterEach(() => { + // Restore everything + Object.defineProperty(process, "platform", { value: originalPlatform }) + process.env = originalEnv + vscode.workspace.getConfiguration = originalGetConfig + ;(userInfo as any) = originalUserInfo + }) + + // -------------------------------------------------------------------------- + // Windows Shell Detection + // -------------------------------------------------------------------------- + describe("Windows Shell Detection", () => { + beforeEach(() => { + Object.defineProperty(process, "platform", { value: "win32" }) + }) + + it("uses explicit PowerShell 7 path from VS Code config (profile path)", () => { + mockVsCodeConfig("windows", "PowerShell", { + PowerShell: { path: "C:\\Program Files\\PowerShell\\7\\pwsh.exe" }, + }) + expect(getShell()).to.equal("C:\\Program Files\\PowerShell\\7\\pwsh.exe") + }) + + it("uses PowerShell 7 path if source is 'PowerShell' but no explicit path", () => { + mockVsCodeConfig("windows", "PowerShell", { + PowerShell: { source: "PowerShell" }, + }) + expect(getShell()).to.equal("C:\\Program Files\\PowerShell\\7\\pwsh.exe") + }) + + it("falls back to legacy PowerShell if profile includes 'powershell' but no path/source", () => { + mockVsCodeConfig("windows", "PowerShell", { + PowerShell: {}, + }) + expect(getShell()).to.equal("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe") + }) + + it("uses WSL bash when profile indicates WSL source", () => { + mockVsCodeConfig("windows", "WSL", { + WSL: { source: "WSL" }, + }) + expect(getShell()).to.equal("/bin/bash") + }) + + it("uses WSL bash when profile name includes 'wsl'", () => { + mockVsCodeConfig("windows", "Ubuntu WSL", { + "Ubuntu WSL": {}, + }) + expect(getShell()).to.equal("/bin/bash") + }) + + it("defaults to cmd.exe if no special profile is matched", () => { + mockVsCodeConfig("windows", "CommandPrompt", { + CommandPrompt: {}, + }) + expect(getShell()).to.equal("C:\\Windows\\System32\\cmd.exe") + }) + + it("respects userInfo() if no VS Code config is available", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + ;(userInfo as any) = () => ({ shell: "C:\\Custom\\PowerShell.exe" }) + + expect(getShell()).to.equal("C:\\Custom\\PowerShell.exe") + }) + + it("respects an odd COMSPEC if no userInfo shell is available", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + process.env.COMSPEC = "D:\\CustomCmd\\cmd.exe" + + expect(getShell()).to.equal("D:\\CustomCmd\\cmd.exe") + }) + }) + + // -------------------------------------------------------------------------- + // macOS Shell Detection + // -------------------------------------------------------------------------- + describe("macOS Shell Detection", () => { + beforeEach(() => { + Object.defineProperty(process, "platform", { value: "darwin" }) + }) + + it("uses VS Code profile path if available", () => { + mockVsCodeConfig("osx", "MyCustomShell", { + MyCustomShell: { path: "/usr/local/bin/fish" }, + }) + expect(getShell()).to.equal("/usr/local/bin/fish") + }) + + it("falls back to userInfo().shell if no VS Code config is available", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + ;(userInfo as any) = () => ({ shell: "/opt/homebrew/bin/zsh" }) + + expect(getShell()).to.equal("/opt/homebrew/bin/zsh") + }) + + it("falls back to SHELL env var if no userInfo shell is found", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + process.env.SHELL = "/usr/local/bin/zsh" + + expect(getShell()).to.equal("/usr/local/bin/zsh") + }) + + it("falls back to /bin/zsh if no config, userInfo, or env variable is set", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + // userInfo => null, SHELL => undefined + expect(getShell()).to.equal("/bin/zsh") + }) + }) + + // -------------------------------------------------------------------------- + // Linux Shell Detection + // -------------------------------------------------------------------------- + describe("Linux Shell Detection", () => { + beforeEach(() => { + Object.defineProperty(process, "platform", { value: "linux" }) + }) + + it("uses VS Code profile path if available", () => { + mockVsCodeConfig("linux", "CustomProfile", { + CustomProfile: { path: "/usr/bin/fish" }, + }) + expect(getShell()).to.equal("/usr/bin/fish") + }) + + it("falls back to userInfo().shell if no VS Code config is available", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + ;(userInfo as any) = () => ({ shell: "/usr/bin/zsh" }) + + expect(getShell()).to.equal("/usr/bin/zsh") + }) + + it("falls back to SHELL env var if no userInfo shell is found", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + process.env.SHELL = "/usr/bin/fish" + + expect(getShell()).to.equal("/usr/bin/fish") + }) + + it("falls back to /bin/bash if nothing is set", () => { + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + // userInfo => null, SHELL => undefined + expect(getShell()).to.equal("/bin/bash") + }) + }) + + // -------------------------------------------------------------------------- + // Unknown Platform & Error Handling + // -------------------------------------------------------------------------- + describe("Unknown Platform / Error Handling", () => { + it("falls back to /bin/sh for unknown platforms", () => { + Object.defineProperty(process, "platform", { value: "sunos" }) + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + + expect(getShell()).to.equal("/bin/sh") + }) + + it("handles VS Code config errors gracefully, falling back to userInfo shell if present", () => { + Object.defineProperty(process, "platform", { value: "linux" }) + vscode.workspace.getConfiguration = () => { + throw new Error("Configuration error") + } + ;(userInfo as any) = () => ({ shell: "/bin/bash" }) + + expect(getShell()).to.equal("/bin/bash") + }) + + it("handles userInfo errors gracefully, falling back to environment variable if present", () => { + Object.defineProperty(process, "platform", { value: "darwin" }) + vscode.workspace.getConfiguration = () => ({ get: () => undefined }) as any + ;(userInfo as any) = () => { + throw new Error("userInfo error") + } + process.env.SHELL = "/bin/zsh" + + expect(getShell()).to.equal("/bin/zsh") + }) + + it("falls back fully to default shell paths if everything fails", () => { + Object.defineProperty(process, "platform", { value: "linux" }) + vscode.workspace.getConfiguration = () => { + throw new Error("Configuration error") + } + ;(userInfo as any) = () => { + throw new Error("userInfo error") + } + // No SHELL in env + delete process.env.SHELL + + expect(getShell()).to.equal("/bin/bash") + }) + }) +}) diff --git a/src/utils/shell.ts b/src/utils/shell.ts new file mode 100644 index 0000000000..8871550a0e --- /dev/null +++ b/src/utils/shell.ts @@ -0,0 +1,227 @@ +import * as vscode from "vscode" +import { userInfo } from "os" + +const SHELL_PATHS = { + // Windows paths + POWERSHELL_7: "C:\\Program Files\\PowerShell\\7\\pwsh.exe", + POWERSHELL_LEGACY: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", + CMD: "C:\\Windows\\System32\\cmd.exe", + WSL_BASH: "/bin/bash", + // Unix paths + MAC_DEFAULT: "/bin/zsh", + LINUX_DEFAULT: "/bin/bash", + CSH: "/bin/csh", + BASH: "/bin/bash", + KSH: "/bin/ksh", + SH: "/bin/sh", + ZSH: "/bin/zsh", + DASH: "/bin/dash", + TCSH: "/bin/tcsh", + FALLBACK: "/bin/sh", +} as const + +interface MacTerminalProfile { + path?: string +} + +type MacTerminalProfiles = Record + +interface WindowsTerminalProfile { + path?: string + source?: "PowerShell" | "WSL" +} + +type WindowsTerminalProfiles = Record + +interface LinuxTerminalProfile { + path?: string +} + +type LinuxTerminalProfiles = Record + +// ----------------------------------------------------- +// 1) VS Code Terminal Configuration Helpers +// ----------------------------------------------------- + +function getWindowsTerminalConfig() { + try { + const config = vscode.workspace.getConfiguration("terminal.integrated") + const defaultProfileName = config.get("defaultProfile.windows") + const profiles = config.get("profiles.windows") || {} + return { defaultProfileName, profiles } + } catch { + return { defaultProfileName: null, profiles: {} as WindowsTerminalProfiles } + } +} + +function getMacTerminalConfig() { + try { + const config = vscode.workspace.getConfiguration("terminal.integrated") + const defaultProfileName = config.get("defaultProfile.osx") + const profiles = config.get("profiles.osx") || {} + return { defaultProfileName, profiles } + } catch { + return { defaultProfileName: null, profiles: {} as MacTerminalProfiles } + } +} + +function getLinuxTerminalConfig() { + try { + const config = vscode.workspace.getConfiguration("terminal.integrated") + const defaultProfileName = config.get("defaultProfile.linux") + const profiles = config.get("profiles.linux") || {} + return { defaultProfileName, profiles } + } catch { + return { defaultProfileName: null, profiles: {} as LinuxTerminalProfiles } + } +} + +// ----------------------------------------------------- +// 2) Platform-Specific VS Code Shell Retrieval +// ----------------------------------------------------- + +/** Attempts to retrieve a shell path from VS Code config on Windows. */ +function getWindowsShellFromVSCode(): string | null { + const { defaultProfileName, profiles } = getWindowsTerminalConfig() + if (!defaultProfileName) { + return null + } + + const profile = profiles[defaultProfileName] + + // If the profile name indicates PowerShell, do version-based detection. + // In testing it was found these typically do not have a path, and this + // implementation manages to deductively get the corect version of PowerShell + if (defaultProfileName.toLowerCase().includes("powershell")) { + if (profile?.path) { + // If there's an explicit PowerShell path, return that + return profile.path + } else if (profile?.source === "PowerShell") { + // If the profile is sourced from PowerShell, assume the newest + return SHELL_PATHS.POWERSHELL_7 + } + // Otherwise, assume legacy Windows PowerShell + return SHELL_PATHS.POWERSHELL_LEGACY + } + + // If there's a specific path, return that immediately + if (profile.path) { + return profile.path + } + + // If the profile indicates WSL + if (profile?.source === "WSL" || defaultProfileName.toLowerCase().includes("wsl")) { + return SHELL_PATHS.WSL_BASH + } + + // If nothing special detected, we assume cmd + return SHELL_PATHS.CMD +} + +/** Attempts to retrieve a shell path from VS Code config on macOS. */ +function getMacShellFromVSCode(): string | null { + const { defaultProfileName, profiles } = getMacTerminalConfig() + if (!defaultProfileName) { + return null + } + + const profile = profiles[defaultProfileName] + return profile?.path || null +} + +/** Attempts to retrieve a shell path from VS Code config on Linux. */ +function getLinuxShellFromVSCode(): string | null { + const { defaultProfileName, profiles } = getLinuxTerminalConfig() + if (!defaultProfileName) { + return null + } + + const profile = profiles[defaultProfileName] + return profile?.path || null +} + +// ----------------------------------------------------- +// 3) General Fallback Helpers +// ----------------------------------------------------- + +/** + * Tries to get a user’s shell from os.userInfo() (works on Unix if the + * underlying system call is supported). Returns null on error or if not found. + */ +function getShellFromUserInfo(): string | null { + try { + const { shell } = userInfo() + return shell || null + } catch { + return null + } +} + +/** Returns the environment-based shell variable, or null if not set. */ +function getShellFromEnv(): string | null { + const { env } = process + + if (process.platform === "win32") { + // On Windows, COMSPEC typically holds cmd.exe + return env.COMSPEC || "C:\\Windows\\System32\\cmd.exe" + } + + if (process.platform === "darwin") { + // On macOS/Linux, SHELL is commonly the environment variable + return env.SHELL || "/bin/zsh" + } + + if (process.platform === "linux") { + // On Linux, SHELL is commonly the environment variable + return env.SHELL || "/bin/bash" + } + return null +} + +// ----------------------------------------------------- +// 4) Publicly Exposed Shell Getter +// ----------------------------------------------------- + +export function getShell(): string { + // 1. Check VS Code config first. + if (process.platform === "win32") { + // Special logic for Windows + const windowsShell = getWindowsShellFromVSCode() + if (windowsShell) { + return windowsShell + } + } else if (process.platform === "darwin") { + // macOS from VS Code + const macShell = getMacShellFromVSCode() + if (macShell) { + return macShell + } + } else if (process.platform === "linux") { + // Linux from VS Code + const linuxShell = getLinuxShellFromVSCode() + if (linuxShell) { + return linuxShell + } + } + + // 2. If no shell from VS Code, try userInfo() + const userInfoShell = getShellFromUserInfo() + if (userInfoShell) { + return userInfoShell + } + + // 3. If still nothing, try environment variable + const envShell = getShellFromEnv() + if (envShell) { + return envShell + } + + // 4. Finally, fall back to a default + if (process.platform === "win32") { + // On Windows, if we got here, we have no config, no COMSPEC, and one very messed up operating system. + // Use CMD as a last resort + return SHELL_PATHS.CMD + } + // On macOS/Linux, fallback to a POSIX shell - This is the behavior of our old shell detection method. + return SHELL_PATHS.FALLBACK +} From 162cd3b9c552f29ccb3d8aa8ec2ff7fc722c52ba Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Sat, 1 Feb 2025 18:32:48 -0800 Subject: [PATCH 74/74] Prepare for release --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c9d59f27f..2f6d5e5d65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [3.2.12] + +- Fix command chaining for Windows users +- Fix reasoning_content error for OpenAI providers + ## [3.2.11] - Add OpenAI o3-mini model diff --git a/package.json b/package.json index 5618a24c6e..03702f04fa 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "claude-dev", "displayName": "Cline", "description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.", - "version": "3.2.11", + "version": "3.2.12", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91",