From 6fdec22930395d54ef44966551e662a20de59316 Mon Sep 17 00:00:00 2001 From: arshad Date: Wed, 26 Feb 2025 11:49:17 +0530 Subject: [PATCH 1/4] feat!: remove all providers and add codestal model --- CONTRIBUTING.md | 5 +- README.md | 1 - docs/.vitepress/config.mts | 13 +- docs/advanced/cross-language.md | 2 +- docs/advanced/custom-model.md | 68 +- docs/advanced/custom-prompt.md | 101 + docs/configuration/copilot-options.md | 22 +- docs/configuration/register-options.md | 16 +- docs/configuration/request-options.md | 88 +- docs/examples/nextjs.md | 50 +- docs/examples/remix.md | 49 +- docs/guides/user-selectable-models.md | 104 - docs/index.md | 10 +- packages/core/package.json | 7 +- packages/core/src/copilot.ts | 41 +- packages/core/src/index.ts | 1 + packages/core/src/llm/base.ts | 32 +- packages/core/src/llm/handler.ts | 10 +- packages/core/src/llm/operations.ts | 26 +- packages/core/src/llm/providers/anthropic.ts | 49 - packages/core/src/llm/providers/deepseek.ts | 44 - packages/core/src/llm/providers/google.ts | 50 - packages/core/src/llm/providers/groq.ts | 44 - packages/core/src/llm/providers/mistral.ts | 48 + packages/core/src/llm/providers/openai.ts | 45 - packages/core/src/types/copilot.ts | 29 +- packages/core/src/types/llm.ts | 99 +- packages/core/src/types/metadata.ts | 59 + .../core/tests/base-provider-handler.test.ts | 109 - packages/core/tests/copilot-class.test.ts | 178 -- packages/core/tests/provider-classes.test.ts | 102 - packages/core/tests/provider-handlers.test.ts | 106 - packages/core/tests/validator.test.ts | 17 +- packages/monacopilot/README.md | 1 - .../monacopilot/src/completion-copilot.ts | 4 +- packages/monacopilot/src/index.ts | 6 +- packages/monacopilot/src/processor.ts | 4 +- packages/monacopilot/src/prompt.ts | 72 +- .../monacopilot/src/request-completion.ts | 39 +- packages/monacopilot/src/types/index.ts | 80 +- packages/monacopilot/tests/completion.test.ts | 231 --- packages/monacopilot/tests/mock.ts | 7 +- playground/app/api/code-completion/route.ts | 6 +- playground/components/editor.tsx | 30 +- pnpm-lock.yaml | 1848 +++++++---------- 45 files changed, 1263 insertions(+), 2690 deletions(-) create mode 100644 docs/advanced/custom-prompt.md delete mode 100644 docs/guides/user-selectable-models.md delete mode 100644 packages/core/src/llm/providers/anthropic.ts delete mode 100644 packages/core/src/llm/providers/deepseek.ts delete mode 100644 packages/core/src/llm/providers/google.ts delete mode 100644 packages/core/src/llm/providers/groq.ts create mode 100644 packages/core/src/llm/providers/mistral.ts delete mode 100644 packages/core/src/llm/providers/openai.ts create mode 100644 packages/core/src/types/metadata.ts delete mode 100644 packages/core/tests/base-provider-handler.test.ts delete mode 100644 packages/core/tests/copilot-class.test.ts delete mode 100644 packages/core/tests/provider-classes.test.ts delete mode 100644 packages/core/tests/provider-handlers.test.ts delete mode 100644 packages/monacopilot/tests/completion.test.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 43c87e5d..312209f3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -83,10 +83,11 @@ playground/ # NextJS app for testing changes in real-time We provide a playground environment to test your changes in real-time: - The `playground/` directory contains a NextJS app that automatically reflects changes made to the packages -- Before starting the playground, create a `.env.local` file in the `playground/` directory and add your OpenAI API key: +- Before starting the playground, create a `.env.local` file in the `playground/` directory and add your Mistral API key: ``` - OPENAI_API_KEY=your_api_key_here + MISTRAL_API_KEY=your_api_key_here ``` + Obtain your Mistral API Key from the [Mistral AI Console](https://console.mistral.ai/api-keys). - Run `pnpm dev:playground` to start the playground application - When you run `pnpm dev:monacopilot` or `pnpm dev:core`, your changes will be immediately visible in the playground - Use this playground to verify your changes and test functionality before submitting a PR diff --git a/README.md b/README.md index d302ce51..aaf7c64c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ ### Features -- 🎯 Multiple AI Provider Support (Anthropic, OpenAI, Groq, Google, DeepSeek) - 🔄 Real-time Code Completions - ⚡️ Efficient Caching System - 🎨 Context-Aware Suggestions diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 28be5091..4ad3124f 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -59,6 +59,10 @@ export default defineConfig({ text: 'Advanced', items: [ {text: 'Custom Model', link: '/advanced/custom-model'}, + { + text: 'Custom Prompt', + link: '/advanced/custom-prompt', + }, { text: 'Custom Request Handler', link: '/advanced/custom-request-handler', @@ -69,15 +73,6 @@ export default defineConfig({ }, ], }, - { - text: 'Guides', - items: [ - { - text: 'User-Selectable Models', - link: '/guides/user-selectable-models', - }, - ], - }, { text: 'Examples', items: [ diff --git a/docs/advanced/cross-language.md b/docs/advanced/cross-language.md index 81fe1b45..e2652fa8 100644 --- a/docs/advanced/cross-language.md +++ b/docs/advanced/cross-language.md @@ -38,7 +38,7 @@ Check out the [prompt.ts](https://github.com/arshad-yaseen/monacopilot/blob/main ## Metadata Overview -The request body's `completionMetadata` object contains essential information for crafting a prompt for the LLM to generate accurate completions. See the [Completion Metadata](/configuration/request-options.html#completion-metadata) section for more details. +The request body's `completionMetadata` object contains essential information for crafting a prompt for the LLM to generate accurate completions. See the [Completion Metadata](/advanced/custom-prompt#completion-metadata) section for more details. ## Example Implementation (Python with FastAPI) diff --git a/docs/advanced/custom-model.md b/docs/advanced/custom-model.md index a5de334b..d3f642a8 100644 --- a/docs/advanced/custom-model.md +++ b/docs/advanced/custom-model.md @@ -11,7 +11,6 @@ You can use a custom LLM that isn't built into Monacopilot by setting up a `mode ```javascript const copilot = new CompletionCopilot(process.env.HUGGINGFACE_API_KEY, { // You don't need to set the provider if you are using a custom model. - // provider: 'huggingface', model: { config: (apiKey, prompt) => ({ endpoint: @@ -21,7 +20,7 @@ const copilot = new CompletionCopilot(process.env.HUGGINGFACE_API_KEY, { 'Content-Type': 'application/json', }, body: { - inputs: prompt.user, + inputs: `${prompt.context}\n\n${prompt.instruction}\n\n${prompt.fileContent}`, parameters: { max_length: 100, num_return_sequences: 1, @@ -38,10 +37,36 @@ const copilot = new CompletionCopilot(process.env.HUGGINGFACE_API_KEY, { The `model` option accepts an object with two functions: -| Function | Description | Type | -| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -| `config` | A function that receives the API key and prompt data, and returns the configuration for the custom model API request. | `(apiKey: string, prompt: { system: string; user: string }) => { endpoint: string; body?: object; headers?: object }` | -| `transformResponse` | A function that takes the raw/parsed response from the custom model API and returns an object with the `text` property. | `(response: unknown) => { text: string \| null; }` | +| Function | Description | Type | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| `config` | A function that receives the API key and prompt data, and returns the configuration for the custom model API request. | `(apiKey: string, prompt: PromptData) => { endpoint: string; body?: object; headers?: object }` | +| `transformResponse` | A function that takes the raw/parsed response from the custom model API and returns an object with the `text` property. | `(response: unknown) => { text: string \| null; }` | + +### Prompt Data Structure + +The `prompt` parameter passed to the `config` function has the following structure: + +```typescript +interface PromptData { + /** + * Contextual information about the code environment + * @example filename, technologies, etc. + */ + context: string; + + /** + * Instructions for the AI model on how to generate the completion + */ + instruction: string; + + /** + * The content of the file being edited + */ + fileContent: string; +} +``` + +### Config Return Value The `config` function must return an object with the following properties: @@ -51,7 +76,34 @@ The `config` function must return an object with the following properties: | `body` | `object` or `undefined` | The body of the custom model API request. | | `headers` | `object` or `undefined` | The headers of the custom model API request. | +### Response Transformation + The `transformResponse` function must return an object with the `text` property. This `text` property should contain the text generated by the custom model. If no valid text can be extracted, the function should return `null` for the `text` property. -> [!NOTE] -> Please ensure you are using a high-quality model, especially for coding tasks, to get the best and most accurate completions. Also, use a model with very low response latency (preferably under 1.5 seconds) to enjoy a great experience and utilize the full power of Monacopilot. +## Working with Different Models + +When working with different models, you'll need to format the prompt data appropriately for your specific model. For example: + +- For models that expect a single string input, you might concatenate the prompt fields: + + ```javascript + body: { + inputs: `Context: ${prompt.context}\nInstructions: ${prompt.instruction}\nFile: ${prompt.fileContent}`, + // other parameters... + } + ``` + +- For models that accept structured input: + ```javascript + body: { + messages: [ + { role: "system", content: prompt.context }, + { role: "user", content: `${prompt.instruction}\n\n${prompt.fileContent}` } + ], + // other parameters... + } + ``` + +::: note +Please ensure you are using a high-quality model, especially for coding tasks, to get the best and most accurate completions. The example above shows how to integrate with Hugging Face's GPT-2, but it's important to note that GPT-2 is not recommended for code completion and is shown only as an implementation example. For production use, choose specialized code-optimized models. Also, use a model with very low response latency (preferably under 1 seconds) to enjoy a great experience and utilize the full power of Monacopilot. +::: diff --git a/docs/advanced/custom-prompt.md b/docs/advanced/custom-prompt.md new file mode 100644 index 00000000..0cbeb183 --- /dev/null +++ b/docs/advanced/custom-prompt.md @@ -0,0 +1,101 @@ +--- +title: Custom Prompt +--- + +# Custom Prompt + +You can customize the prompt used for code completions by providing a `customPrompt` function in the options parameter of the `copilot.complete` method. This allows you to tailor how the AI completes your code based on your specific needs. + +## Usage + +```javascript +copilot.complete({ + options: { + customPrompt: metadata => ({ + context: 'Your custom codebase context information here', + instruction: 'Your custom instructions for code completion here', + fileContent: 'Your representation of file with cursor position', + }), + }, +}); +``` + +The `context`, `instruction`, and `fileContent` properties in the `customPrompt` function are all optional. If you omit any of these properties, the default values for those fields will be used. + +## Parameters + +The `customPrompt` function receives a `completionMetadata` object, which contains information about the current editor state and can be used to tailor the prompt. + +### Completion Metadata + +| Property | Type | Description | +| ------------------ | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `language` | `string` or `undefined` | The programming language of the code being completed. | +| `cursorPosition` | `{ lineNumber: number; column: number }` | The current cursor position where the completion should begin. | +| `filename` | `string` or `undefined` | The name of the file being edited. Only available if you have provided the `filename` option in the `registerCompletion` function. | +| `technologies` | `string[]` or `undefined` | An array of technologies used in the project. Only available if you have provided the `technologies` option in the `registerCompletion` function. | +| `relatedFiles` | `object[]` or `undefined` | An array of objects containing the `path` and `content` of related files. Only available if you have provided the `relatedFiles` option in the `registerCompletion` function. | +| `textAfterCursor` | `string` | The text that appears after the cursor position. | +| `textBeforeCursor` | `string` | The text that appears before the cursor position. | + +## Return Value Structure + +The `customPrompt` function should return a `PromptData` object (or a partial one) with the following properties: + +| Property | Type | Description | +| ------------- | ----------------------- | --------------------------------------------------------------------------------------------- | +| `context` | `string` or `undefined` | Information about the codebase context, including technologies, filename, language, etc. | +| `instruction` | `string` or `undefined` | Instructions for how the AI should complete the code after the cursor position. | +| `fileContent` | `string` or `undefined` | The representation of the file content showing where the cursor is positioned for completion. | + +## Example + +Here's an example of a custom prompt for completing React component code: + +```javascript +const customPrompt = ({ + textBeforeCursor, + textAfterCursor, + language, + filename, + technologies, +}) => ({ + context: `You're working with a ${language} file named ${filename || 'unnamed'} in a project using ${technologies?.join(', ') || 'React'}.`, + instruction: + 'Complete the code after the cursor position with appropriate React syntax. Ensure the code follows modern React best practices and matches the style of the existing code.', + fileContent: `${textBeforeCursor}[CURSOR]${textAfterCursor}`, +}); + +copilot.complete({ + options: {customPrompt}, +}); +``` + +## Partial Customization + +You can customize just one aspect of the prompt while letting the system handle the rest: + +```javascript +// Only customize the instruction for code completion +copilot.complete({ + options: { + customPrompt: metadata => ({ + instruction: + 'Complete this code with an efficient algorithm that handles edge cases.', + }), + }, +}); + +// Only customize the context based on project information +copilot.complete({ + options: { + customPrompt: ({language, technologies, filename}) => ({ + context: `This is a ${language} file named ${filename} in a project using ${technologies?.join(', ')}. The code follows a functional programming paradigm with strict typing.`, + }), + }, +}); +``` + +By using a custom prompt, you can guide the AI to complete your code in ways that better match your coding style, project requirements, or specific technologies you're working with. + +For additional `completionMetadata` needs, please [open an issue](https://github.com/arshad-yaseen/monacopilot/issues/new). diff --git a/docs/configuration/copilot-options.md b/docs/configuration/copilot-options.md index 21bca16e..7d510333 100644 --- a/docs/configuration/copilot-options.md +++ b/docs/configuration/copilot-options.md @@ -11,18 +11,18 @@ Configure your `CompletionCopilot` instance with different providers, models and You can specify a different provider and model by setting the `provider` and `model` parameters in the `CompletionCopilot` instance. ```javascript -const copilot = new CompletionCopilot(process.env.ANTHROPIC_API_KEY, { - provider: 'anthropic', - model: 'claude-3-5-haiku', +const copilot = new CompletionCopilot(process.env.MISTRAL_API_KEY, { + provider: 'mistral', + model: 'codestral', }); ``` -There are other providers and models available. Here is a list: +Currently, Monacopilot supports the following provider and model: -| Provider | Models | Notes | -| --------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| groq | `llama-3-70b` | Offers moderate accuracy with extremely fast response times. Ideal for real-time completions while typing. | -| openai | `gpt-4o`, `gpt-4o-mini`, `o1-mini (beta model)` | | -| anthropic | `claude-3-5-sonnet`, `claude-3-haiku`, `claude-3-5-haiku` | Claude-3-5-haiku provides an optimal balance between accuracy and response time. | -| google | `gemini-1.5-pro`, `gemini-1.5-flash`, `gemini-1.5-flash-8b` | | -| deepseek | `v3` | Provides highly accurate completions using Fill-in-the-Middle (FIM) technology. While response times are slower, it excels in completion accuracy. Best choice when precision is the top priority. | +| Provider | Models | Notes | API Key | +| -------- | ----------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | +| mistral | `codestral` | Provides accurate code completions using Fill-in-the-Middle (FIM) technology with fast response time | [Get Mistral API Key](https://console.mistral.ai/api-keys) | + +:::info +More providers and models will be added in future releases. +::: diff --git a/docs/configuration/register-options.md b/docs/configuration/register-options.md index b1cfe474..9af3641b 100644 --- a/docs/configuration/register-options.md +++ b/docs/configuration/register-options.md @@ -24,16 +24,8 @@ registerCompletion(monaco, editor, { [OnTyping Demo](https://github.com/user-attachments/assets/22c2ce44-334c-4963-b853-01b890b8e39f) -::: info -For the best experience with `onTyping` mode: - -- Use super fast, cost-effective models like Groq's `llama-3-70b` for real-time completions -- For higher accuracy needs, consider using `onIdle` mode with models like `claude-3-5-sonnet`, `claude-3-5-haiku`, etc. -- The `onTyping` mode makes more API calls in the background to provide instant suggestions, so choose your model accordingly - ::: - ::: tip -Use `onTyping` mode with Groq's `llama-3-70b` for super fast, realtime completions while you type. +If you are using `mistral` models with the `onTyping` trigger, it is recommended to use Mistral's pay-as-you-go plan. This ensures you will never hit rate limit errors and allows you to experience super fast and accurate completions. ::: ## Manually Trigger Completions @@ -93,13 +85,13 @@ monaco.editor.addEditorAction({ ## Multi-File Context -Improve the quality and relevance of Copilot's suggestions by providing additional code context from other files in your project. This feature allows Copilot to understand the broader scope of your codebase, resulting in more accurate and contextually appropriate completions. +Improve Copilot's suggestions by providing code context from other files in your project. This helps Copilot understand your broader codebase and offer more relevant completions. ```javascript registerCompletion(monaco, editor, { relatedFiles: [ { - path: './utils.js', + path: './utils.js', // The exact path you'd use when importing content: 'export const reverse = (str) => str.split("").reverse().join("")', }, @@ -107,7 +99,7 @@ registerCompletion(monaco, editor, { }); ``` -For instance, if you begin typing `const isPalindrome = ` in your current file, Copilot will recognize the `reverse` function from the `utils.js` file you provided earlier. It will then suggest a completion that utilizes this function. +The `path` value should match how you actually import the file in your code. After registering, when you type `const isPalindrome = `, Copilot will suggest code that properly imports and uses the `reverse` function from your utils.js file. ## Filename diff --git a/docs/configuration/request-options.md b/docs/configuration/request-options.md index 742d0e48..30c5d9c8 100644 --- a/docs/configuration/request-options.md +++ b/docs/configuration/request-options.md @@ -8,7 +8,7 @@ Configure how completion requests are made to the LLM provider by customizing he ## Custom Headers for LLM Requests -You can add custom headers to the provider's completion requests. For example, if you select `OpenAI` as your provider, you can add a custom header to the OpenAI completion requests made by Monacopilot. +You can add custom headers to the provider's completion requests. For example, if you select `mistral` as your provider, you can add a custom header to the mistral completion requests made by Monacopilot. ```javascript copilot.complete({ @@ -19,89 +19,3 @@ copilot.complete({ }, }); ``` - -## Custom Prompt - -You can customize the prompt used for generating completions by providing a `customPrompt` function in the options parameter of the `copilot.complete` method. This allows you to tailor the AI's behavior to your specific needs. - -#### Usage - -```javascript -copilot.complete({ - options: { - customPrompt: metadata => ({ - system: 'Your custom system prompt here', - user: 'Your custom user prompt here', - }), - }, -}); -``` - -The `system` and `user` prompts in the `customPrompt` function are optional. If you omit either the `system` or `user` prompt, the default prompt for that field will be used. Example of customizing only the system prompt: - -```javascript -copilot.complete({ - options: { - customPrompt: metadata => ({ - system: 'You are an AI assistant specialized in writing React components, focusing on creating clean...', - }), - }, -}); -``` - -### Parameters - -The `customPrompt` function receives a `completionMetadata` object, which contains information about the current editor state and can be used to tailor the prompt. - -#### Completion Metadata - -| Property | Type | Description | -| ------------------ | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `language` | `string` | The programming language of the code. | -| `cursorPosition` | `{ lineNumber: number; column: number }` | The current cursor position in the editor. | -| `filename` | `string` or `undefined` | The name of the file being edited. Only available if you have provided the `filename` option in the `registerCompletion` function. | -| `technologies` | `string[]` or `undefined` | An array of technologies used in the project. Only available if you have provided the `technologies` option in the `registerCompletion` function. | -| `relatedFiles` | `object[]` or `undefined` | An array of objects containing the `path` and `content` of related files. Only available if you have provided the `relatedFiles` option in the `registerCompletion` function. | -| `textAfterCursor` | `string` | The text that appears after the cursor. | -| `textBeforeCursor` | `string` | The text that appears before the cursor. | -| `editorState` | `object` | An object containing the `completionMode` property. | - -The `editorState.completionMode` can be one of the following: - -| Mode | Description | -| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `insert` | Indicates that there is a character immediately after the cursor. In this mode, the AI will generate content to be inserted at the cursor position. | -| `complete` | Indicates that there is a character after the cursor but not immediately. In this mode, the AI will generate content to complete the text from the cursor position. | -| `continue` | Indicates that there is no character after the cursor. In this mode, the AI will generate content to continue the text from the cursor position. | - -For additional `completionMetadata` needs, please [open an issue](https://github.com/arshad-yaseen/monacopilot/issues/new). - -The `customPrompt` function should return an object with two properties: - -| Property | Type | Description | -| -------- | ----------------------- | ------------------------------------------------------ | -| `system` | `string` or `undefined` | A string representing the system prompt for the model. | -| `user` | `string` or `undefined` | A string representing the user prompt for the model. | - -### Example - -Here's an example of a custom prompt that focuses on generating React component code: - -```javascript -const customPrompt = ({textBeforeCursor, textAfterCursor}) => ({ - system: 'You are an AI assistant specialized in writing React components. Focus on creating clean, reusable, and well-structured components.', - user: `Please complete the following React component: - - ${textBeforeCursor} - // Cursor position - ${textAfterCursor} - - Use modern React practices and hooks where appropriate. If you're adding new props, make sure to include proper TypeScript types. Please provide only the completed part of the code without additional comments or explanations.`, -}); - -copilot.complete({ - options: {customPrompt}, -}); -``` - -By using a custom prompt, you can guide the model to generate completions that better fit your coding style, project requirements, or specific technologies you're working with. diff --git a/docs/examples/nextjs.md b/docs/examples/nextjs.md index abe5c2f9..d9c12b06 100644 --- a/docs/examples/nextjs.md +++ b/docs/examples/nextjs.md @@ -40,9 +40,9 @@ import {NextRequest, NextResponse} from 'next/server'; import {CompletionCopilot, type CompletionRequestBody} from 'monacopilot'; -const copilot = new CompletionCopilot(process.env.OPENAI_API_KEY, { - provider: 'openai', - model: 'gpt-4o', +const copilot = new CompletionCopilot(process.env.MISTRAL_API_KEY, { + provider: 'mistral', + model: 'codestral', }); export async function POST(req: NextRequest) { @@ -65,9 +65,9 @@ import {NextApiRequest, NextApiResponse} from 'next'; import {CompletionCopilot} from 'monacopilot'; -const copilot = new CompletionCopilot(process.env.OPENAI_API_KEY, { - provider: 'openai', - model: 'gpt-4o', +const copilot = new CompletionCopilot(process.env.MISTRAL_API_KEY, { + provider: 'mistral', + model: 'codestral', }); export default async function handler( @@ -92,44 +92,36 @@ export default async function handler( Create a Editor component: -```tsx +```jsx // components/Editor.tsx 'use client'; -import {useEffect, useState} from 'react'; +import {useEffect, useRef} from 'react'; import MonacoEditor from '@monaco-editor/react'; import { registerCompletion, - type Monaco, - type StandaloneCodeEditor, + type CompletionRegistration, } from 'monacopilot'; export default function Editor() { - const [editor, setEditor] = useState(null); - const [monaco, setMonaco] = useState(null); + const completionRef = useRef(null); useEffect(() => { - if (!monaco || !editor) return; - - const completion = registerCompletion(monaco, editor, { - endpoint: '/api/code-completion', - language: 'javascript', - }); - return () => { - completion.deregister(); + completionRef.current?.deregister(); }; - }, [monaco, editor]); + }, []); return ( { - setEditor(editor); - setMonaco(monaco); + completionRef.current = registerCompletion(monaco, editor, { + endpoint: '/api/code-completion', + language: 'javascript', + trigger: 'onTyping', + }); }} /> ); @@ -179,9 +171,13 @@ export default function Home() { Create a `.env.local` file in your project root: ```bash -OPENAI_API_KEY=your_openai_api_key_here +MISTRAL_API_KEY=your_mistral_api_key_here ``` +Obtain your Mistral API Key from the [Mistral AI Console](https://console.mistral.ai/api-keys). + +Monacopilot supports multiple AI providers and models. For details on available options and configuration, see the [Changing the Provider and Model](/configuration/copilot-options#changing-the-provider-and-model) documentation. + ## Project Structure Here's the complete project structure for both routing approaches: @@ -263,7 +259,7 @@ bun dev 3. Open `http://localhost:3000` in your browser. -You should now see a full-screen Monaco Editor with AI-powered completions working! +You should now see a Monaco Editor with AI-powered completions working! ::: tip Make sure you have set up your environment variables correctly before running the example. diff --git a/docs/examples/remix.md b/docs/examples/remix.md index 76902652..34b60848 100644 --- a/docs/examples/remix.md +++ b/docs/examples/remix.md @@ -36,9 +36,9 @@ Create a route handler for completions in `app/routes/code-completion.tsx`: import {json, type ActionFunctionArgs} from '@remix-run/node'; import {CompletionCopilot, type CompletionRequestBody} from 'monacopilot'; -const copilot = new CompletionCopilot(process.env.OPENAI_API_KEY, { - provider: 'openai', - model: 'gpt-4o', +const copilot = new CompletionCopilot(process.env.MISTRAL_API_KEY, { + provider: 'mistral', + model: 'codestral', }); export const action = async ({request}: ActionFunctionArgs) => { @@ -58,40 +58,29 @@ export const action = async ({request}: ActionFunctionArgs) => { Create a Editor component in `app/components/Editor.tsx`: ```tsx -import {useEffect, useState} from 'react'; +import {useEffect, useRef} from 'react'; -import {Editor as MonacoEditor} from '@monaco-editor/react'; -import { - Monaco, - registerCompletion, - type StandaloneCodeEditor, -} from 'monacopilot'; +import MonacoEditor from '@monaco-editor/react'; +import {registerCompletion, type CompletionRegistration} from 'monacopilot'; export default function Editor() { - const [editor, setEditor] = useState(null); - const [monaco, setMonaco] = useState(null); + const completionRef = useRef(null); useEffect(() => { - if (!monaco || !editor) return; - - const completion = registerCompletion(monaco, editor, { - endpoint: '/code-completion', - language: 'javascript', - }); - return () => { - completion.deregister(); + completionRef.current?.deregister(); }; - }, [monaco, editor]); + }, []); return ( { - setEditor(editor); - setMonaco(monaco); + completionRef.current = registerCompletion(monaco, editor, { + endpoint: '/code-completion', + language: 'javascript', + trigger: 'onTyping', + }); }} /> ); @@ -121,9 +110,15 @@ export default function Index() { Create a `.env` file in your project root: ```bash -OPENAI_API_KEY=your_openai_api_key_here +MISTRAL_API_KEY=your_mistral_api_key_here ``` +Obtain your Mistral API Key from the [Mistral AI Console](https://console.mistral.ai/api-keys). + +Monacopilot supports multiple AI providers and models. For details on available options and configuration, see the [Changing the Provider and Model](/configuration/copilot-options#changing-the-provider-and-model) documentation. + +Obtain your Mistral API Key from the [Mistral AI Console](https://console.mistral.ai/api-keys). + ## Project Structure Here's the complete project structure: @@ -189,7 +184,7 @@ bun dev 3. Open `http://localhost:3000` in your browser. -You should now see a full-screen Monaco Editor with AI-powered completions working! +You should now see a Monaco Editor with AI-powered completions working! ::: tip diff --git a/docs/guides/user-selectable-models.md b/docs/guides/user-selectable-models.md deleted file mode 100644 index 733c0ac7..00000000 --- a/docs/guides/user-selectable-models.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: User-Selectable Models ---- - -# User-Selectable Models - -This guide shows you how to allow users to switch between different AI models for code completion. We'll accomplish this by: - -1. Using the [requestHandler](/advanced/custom-request-handler) option to send the user's selected model to the server -2. Setting up multiple model instances on the server-side -3. Dynamically choosing the right model for each completion request - -Here's how it works: - -```javascript -// Example of model selected -// by user via UI (e.g. dropdown, settings panel) -const selectedModel = 'gpt-4o'; - -registerCompletion(monaco, editor, { - endpoint: 'https://api.example.com/code-completion', - requestHandler: async ({endpoint, body}) => { - const response = await fetch(endpoint, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - ...body, - // Attach selected model to request body - model: selectedModel, - }), - }); - - const data = await response.json(); - return { - completion: data.completion, - }; - }, -}); -``` - -Server-side implementation (Example using Express.js): This is the server-side API handler that the `endpoint` parameter points to in the `registerCompletion` function. - -```javascript -import express from 'express'; -import {CompletionCopilot} from 'monacopilot'; - -const app = express(); - -// Initialize different copilot instances for different models -const copilotInstances = { - 'gpt-4o': new CompletionCopilot(process.env.OPENAI_API_KEY, { - provider: 'openai', - model: 'gpt-4o', - }), - 'sonnet-3-5-sonnet': new CompletionCopilot(process.env.ANTHROPIC_API_KEY, { - provider: 'anthropic', - model: 'claude-3-5-sonnet', - }), - 'llama-3-70b': new CompletionCopilot(process.env.GROQ_API_KEY, { - provider: 'groq', - model: 'llama-3-70b', - }), -}; - -app.post('/code-completion', async (req, res) => { - try { - // Get the selected model from the request body - const {model, ...completionBody} = req.body; - - // Use the appropriate copilot instance based on selected model - const copilot = copilotInstances[model]; - if (!copilot) { - return res.status(400).json({ - completion: null, - error: 'Invalid model selected', - }); - } - - const {completion, error} = await copilot.complete({ - body: completionBody, - }); - - if (error) { - return res.status(500).json({ - completion: null, - error, - }); - } - - res.json({completion}); - } catch (err) { - res.status(500).json({ - completion: null, - error: err.message, - }); - } -}); - -app.listen(3000); -``` - -The server maintains a map of CompletionCopilot instances configured with different providers and models, allowing for flexible model selection while keeping API keys secure on the server side. diff --git a/docs/index.md b/docs/index.md index 39293dc0..d1299bbf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -52,9 +52,9 @@ In our example, we are using Express.js: ```typescript import {CompletionCopilot} from 'monacopilot'; -const copilot = new CompletionCopilot(OPENAI_API_KEY, { - provider: 'openai', - model: 'gpt-4o', +const copilot = new CompletionCopilot(MISTRAL_API_KEY, { + provider: 'mistral', + model: 'codestral', }); app.post('/code-completion', async (req, res) => { @@ -73,6 +73,10 @@ app.post('/code-completion', async (req, res) => { }); ``` +Obtain your Mistral API Key from the [Mistral AI Console](https://console.mistral.ai/api-keys). + +Monacopilot supports multiple AI providers and models. For details on available options and configuration, see the [Changing the Provider and Model](/configuration/copilot-options#changing-the-provider-and-model) documentation. + **That's it! Your Monaco Editor now has AI-powered completions! 🎉** ::: info diff --git a/packages/core/package.json b/packages/core/package.json index e0fcd2ff..321eb89c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -13,12 +13,9 @@ "dev": "tsup src/index.ts --watch" }, "devDependencies": { + "@mistralai/mistralai": "^1.5.0", "tsup": "^8.0.2", - "typescript": "^5.4.3", - "@anthropic-ai/sdk": "^0.27.3", - "@google/generative-ai": "^0.21.0", - "groq-sdk": "^0.3.2", - "openai": "^4.60.1" + "typescript": "^5.4.3" }, "keywords": [ "monacopilot", diff --git a/packages/core/src/copilot.ts b/packages/core/src/copilot.ts index a70e3ecc..591c195b 100644 --- a/packages/core/src/copilot.ts +++ b/packages/core/src/copilot.ts @@ -2,7 +2,7 @@ import { createProviderEndpoint, createProviderHeaders, createRequestBody, - parseProviderChatCompletion, + parseProviderCompletion, } from './llm/operations'; import {logger} from './logger'; import type { @@ -13,14 +13,15 @@ import type { } from './types/copilot'; import type {CopilotResponse} from './types/internal'; import type { - ChatCompletion, - ChatCompletionCreateParams, + Completion, + CompletionCreateParams, Model, Provider, } from './types/llm'; +import {BaseCopilotMetadata} from './types/metadata'; import validate from './validator'; -export abstract class Copilot { +export abstract class Copilot { protected readonly apiKey: string; protected provider: Provider | undefined; protected model: Model | CustomCopilotModel; @@ -33,11 +34,11 @@ export abstract class Copilot { validate.inputs(this.model, this.provider); } - protected abstract getDefaultPrompt(metadata: Meta): PromptData; + protected abstract getDefaultPrompt(metadata: Metadata): PromptData; protected generatePrompt( - metadata: Meta, - customPrompt?: CustomPrompt, + metadata: Metadata, + customPrompt?: CustomPrompt, ): PromptData { const defaultPrompt = this.getDefaultPrompt(metadata); return customPrompt @@ -46,33 +47,40 @@ export abstract class Copilot { } protected async makeAIRequest( - metadata: Meta, + metadata: Metadata, options: { - customPrompt?: CustomPrompt; + customPrompt?: CustomPrompt; customHeaders?: Record; } = {}, ): Promise { try { const {customHeaders = {}} = options; const prompt = this.generatePrompt(metadata, options.customPrompt); - const requestDetails = await this.prepareRequest(prompt); + const requestDetails = await this.prepareRequest( + prompt, + metadata as BaseCopilotMetadata, + ); const response = await this.sendRequest( requestDetails.endpoint, requestDetails.requestBody, {...requestDetails.headers, ...customHeaders}, ); + return this.processResponse(response); } catch (error) { return this.handleError(error); } } - private async prepareRequest(prompt: PromptData) { + private async prepareRequest( + prompt: PromptData, + metadata: BaseCopilotMetadata, + ) { if (this.isCustomModel()) { const customConfig = this.model.config(this.apiKey, prompt); return { endpoint: customConfig.endpoint, - requestBody: customConfig.body as ChatCompletionCreateParams, + requestBody: customConfig.body as CompletionCreateParams, headers: customConfig.headers ?? {}, }; } @@ -92,6 +100,7 @@ export abstract class Copilot { this.model as Model, this.provider, prompt, + metadata, ), }; } @@ -110,8 +119,8 @@ export abstract class Copilot { } return { - text: parseProviderChatCompletion( - response as ChatCompletion, + text: parseProviderCompletion( + response as Completion, this.provider, ), raw: response, @@ -127,7 +136,7 @@ export abstract class Copilot { protected async sendRequest( endpoint: string, - requestBody: ChatCompletionCreateParams, + requestBody: CompletionCreateParams, headers: Record, ) { const response = await fetch(endpoint, { @@ -140,7 +149,7 @@ export abstract class Copilot { }); if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); + throw new Error(await response.text()); } return response.json(); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 08042c04..62255bc3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -6,3 +6,4 @@ export * from './llm/base'; export type * from './types/llm'; export type * from './types/copilot'; +export type * from './types/metadata'; diff --git a/packages/core/src/llm/base.ts b/packages/core/src/llm/base.ts index 12cbac50..35b6437d 100644 --- a/packages/core/src/llm/base.ts +++ b/packages/core/src/llm/base.ts @@ -1,39 +1,15 @@ import type {Model, Provider} from '../types/llm'; -export const PROVIDERS = [ - 'groq', - 'openai', - 'anthropic', - 'google', - 'deepseek', -] as const; +export const PROVIDERS = ['mistral'] as const; export const MODEL_IDS: Record = { - 'llama-3-70b': 'llama3-70b-8192', - 'gpt-4o': 'gpt-4o-2024-08-06', - 'gpt-4o-mini': 'gpt-4o-mini', - 'claude-3-5-sonnet': 'claude-3-5-sonnet-20241022', - 'claude-3-haiku': 'claude-3-haiku-20240307', - 'claude-3-5-haiku': 'claude-3-5-haiku-20241022', - 'o1-mini': 'o1-mini', - 'gemini-1.5-flash-8b': 'gemini-1.5-flash-8b', - 'gemini-1.5-flash': 'gemini-1.5-flash', - 'gemini-1.5-pro': 'gemini-1.5-pro', - v3: 'deepseek-chat', + codestral: 'codestral-latest', } as const; export const PROVIDER_MODEL_MAP: Record = { - groq: ['llama-3-70b'], - openai: ['gpt-4o', 'gpt-4o-mini', 'o1-mini'], - anthropic: ['claude-3-5-sonnet', 'claude-3-haiku', 'claude-3-5-haiku'], - google: ['gemini-1.5-flash-8b', 'gemini-1.5-pro', 'gemini-1.5-flash'], - deepseek: ['v3'], + mistral: ['codestral'], } as const; export const PROVIDER_ENDPOINT_MAP: Record = { - groq: 'https://api.groq.com/openai/v1/chat/completions', - openai: 'https://api.openai.com/v1/chat/completions', - anthropic: 'https://api.anthropic.com/v1/messages', - google: 'https://generativelanguage.googleapis.com/v1beta/models', - deepseek: 'https://api.deepseek.com/beta/completions', + mistral: 'https://api.mistral.ai/v1/fim/completions', } as const; diff --git a/packages/core/src/llm/handler.ts b/packages/core/src/llm/handler.ts index 2b0b3b29..919b9bdd 100644 --- a/packages/core/src/llm/handler.ts +++ b/packages/core/src/llm/handler.ts @@ -1,11 +1,12 @@ import type {PromptData} from '../types/copilot'; import type { Model, - PickChatCompletion, - PickChatCompletionCreateParams, + PickCompletion, + PickCompletionCreateParams, PickModel, Provider, } from '../types/llm'; +import {BaseCopilotMetadata} from '../types/metadata'; export abstract class BaseProviderHandler

{ abstract createEndpoint(model: Model, apiKey?: string): string; @@ -13,9 +14,10 @@ export abstract class BaseProviderHandler

{ abstract createRequestBody( model: PickModel

, prompt: PromptData, - ): PickChatCompletionCreateParams

; + metadata: BaseCopilotMetadata, + ): PickCompletionCreateParams

; abstract createHeaders(apiKey: string): Record; - abstract parseCompletion(completion: PickChatCompletion

): string | null; + abstract parseCompletion(completion: PickCompletion

): string | null; } diff --git a/packages/core/src/llm/operations.ts b/packages/core/src/llm/operations.ts index a3fe5bad..0a2cba60 100644 --- a/packages/core/src/llm/operations.ts +++ b/packages/core/src/llm/operations.ts @@ -1,23 +1,16 @@ import type {PromptData} from '../types/copilot'; import type { - ChatCompletion, - ChatCompletionCreateParams, + Completion, + CompletionCreateParams, PickModel, Provider, } from '../types/llm'; +import type {BaseCopilotMetadata} from '../types/metadata'; import {BaseProviderHandler} from './handler'; -import {AnthropicHandler} from './providers/anthropic'; -import {DeepseekHandler} from './providers/deepseek'; -import {GoogleHandler} from './providers/google'; -import {GroqHandler} from './providers/groq'; -import {OpenAIHandler} from './providers/openai'; +import {MistralHandler} from './providers/mistral'; const providerHandlers: {[P in Provider]: BaseProviderHandler

} = { - openai: new OpenAIHandler(), - groq: new GroqHandler(), - anthropic: new AnthropicHandler(), - google: new GoogleHandler(), - deepseek: new DeepseekHandler(), + mistral: new MistralHandler(), }; export const createProviderEndpoint =

( @@ -30,15 +23,16 @@ export const createRequestBody =

( model: PickModel

, provider: P, prompt: PromptData, -): ChatCompletionCreateParams => - providerHandlers[provider].createRequestBody(model, prompt); + metadata: BaseCopilotMetadata, +): CompletionCreateParams => + providerHandlers[provider].createRequestBody(model, prompt, metadata); export const createProviderHeaders =

( apiKey: string, provider: P, ): Record => providerHandlers[provider].createHeaders(apiKey); -export const parseProviderChatCompletion =

( - completion: ChatCompletion, +export const parseProviderCompletion =

( + completion: Completion, provider: P, ): string | null => providerHandlers[provider].parseCompletion(completion); diff --git a/packages/core/src/llm/providers/anthropic.ts b/packages/core/src/llm/providers/anthropic.ts deleted file mode 100644 index 16473a27..00000000 --- a/packages/core/src/llm/providers/anthropic.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - DEFAULT_COPILOT_MAX_TOKENS, - DEFAULT_COPILOT_TEMPERATURE, -} from '../../constants'; -import type {PromptData} from '../../types/copilot'; -import type { - PickChatCompletion, - PickChatCompletionCreateParams, - PickModel, -} from '../../types/llm'; -import {MODEL_IDS, PROVIDER_ENDPOINT_MAP} from '../base'; -import {BaseProviderHandler} from '../handler'; - -export class AnthropicHandler extends BaseProviderHandler<'anthropic'> { - createEndpoint(): string { - return PROVIDER_ENDPOINT_MAP.anthropic; - } - - createRequestBody( - model: PickModel<'anthropic'>, - prompt: PromptData, - ): PickChatCompletionCreateParams<'anthropic'> { - return { - model: MODEL_IDS[model], - temperature: DEFAULT_COPILOT_TEMPERATURE, - system: prompt.system, - messages: [{role: 'user', content: prompt.user}], - max_tokens: DEFAULT_COPILOT_MAX_TOKENS, - }; - } - - createHeaders(apiKey: string): Record { - return { - 'Content-Type': 'application/json', - 'x-api-key': apiKey, - 'anthropic-version': '2023-06-01', - }; - } - - parseCompletion( - completion: PickChatCompletion<'anthropic'>, - ): string | null { - const c = completion.content?.[0]; - if (c && 'text' in c) { - return c.text; - } - return null; - } -} diff --git a/packages/core/src/llm/providers/deepseek.ts b/packages/core/src/llm/providers/deepseek.ts deleted file mode 100644 index eb2da386..00000000 --- a/packages/core/src/llm/providers/deepseek.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - DEFAULT_COPILOT_MAX_TOKENS, - DEFAULT_COPILOT_TEMPERATURE, -} from '../../constants'; -import type {PromptData} from '../../types/copilot'; -import type { - PickChatCompletion, - PickChatCompletionCreateParams, - PickModel, -} from '../../types/llm'; -import {MODEL_IDS, PROVIDER_ENDPOINT_MAP} from '../base'; -import {BaseProviderHandler} from '../handler'; - -export class DeepseekHandler extends BaseProviderHandler<'deepseek'> { - createEndpoint(): string { - return PROVIDER_ENDPOINT_MAP.deepseek; - } - - createRequestBody( - model: PickModel<'deepseek'>, - prompt: PromptData, - ): PickChatCompletionCreateParams<'deepseek'> { - return { - model: MODEL_IDS[model], - prompt: `${prompt.system}\n\n${prompt.user}`, - suffix: '', - temperature: DEFAULT_COPILOT_TEMPERATURE, - max_tokens: DEFAULT_COPILOT_MAX_TOKENS, - }; - } - - createHeaders(apiKey: string): Record { - return { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, - }; - } - - parseCompletion(completion: PickChatCompletion<'deepseek'>): string | null { - return typeof completion.choices?.[0]?.text === 'string' - ? completion.choices[0].text - : null; - } -} diff --git a/packages/core/src/llm/providers/google.ts b/packages/core/src/llm/providers/google.ts deleted file mode 100644 index b8da3219..00000000 --- a/packages/core/src/llm/providers/google.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - DEFAULT_COPILOT_MAX_TOKENS, - DEFAULT_COPILOT_TEMPERATURE, -} from '../../constants'; -import type {PromptData} from '../../types/copilot'; -import type { - PickChatCompletion, - PickChatCompletionCreateParams, - PickModel, -} from '../../types/llm'; -import {MODEL_IDS, PROVIDER_ENDPOINT_MAP} from '../base'; -import {BaseProviderHandler} from '../handler'; - -export class GoogleHandler extends BaseProviderHandler<'google'> { - createEndpoint(model: PickModel<'google'>, apiKey: string): string { - return `${PROVIDER_ENDPOINT_MAP.google}/${MODEL_IDS[model]}:generateContent?key=${apiKey}`; - } - - createRequestBody( - _: PickModel<'google'>, - prompt: PromptData, - ): PickChatCompletionCreateParams<'google'> { - return { - systemInstruction: { - role: 'system', - parts: [{text: prompt.system}], - }, - generationConfig: { - temperature: DEFAULT_COPILOT_TEMPERATURE, - maxOutputTokens: DEFAULT_COPILOT_MAX_TOKENS, - }, - contents: [ - { - role: 'user', - parts: [{text: prompt.user}], - }, - ], - }; - } - - createHeaders(): Record { - return { - 'Content-Type': 'application/json', - }; - } - - parseCompletion(completion: PickChatCompletion<'google'>): string | null { - return completion.candidates?.[0]?.content?.parts?.[0]?.text ?? null; - } -} diff --git a/packages/core/src/llm/providers/groq.ts b/packages/core/src/llm/providers/groq.ts deleted file mode 100644 index e2cdc45e..00000000 --- a/packages/core/src/llm/providers/groq.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - DEFAULT_COPILOT_MAX_TOKENS, - DEFAULT_COPILOT_TEMPERATURE, -} from '../../constants'; -import type {PromptData} from '../../types/copilot'; -import type { - PickChatCompletion, - PickChatCompletionCreateParams, - PickModel, -} from '../../types/llm'; -import {MODEL_IDS, PROVIDER_ENDPOINT_MAP} from '../base'; -import {BaseProviderHandler} from '../handler'; - -export class GroqHandler extends BaseProviderHandler<'groq'> { - createEndpoint(): string { - return PROVIDER_ENDPOINT_MAP.groq; - } - - createRequestBody( - model: PickModel<'groq'>, - prompt: PromptData, - ): PickChatCompletionCreateParams<'groq'> { - return { - model: MODEL_IDS[model], - temperature: DEFAULT_COPILOT_TEMPERATURE, - max_tokens: DEFAULT_COPILOT_MAX_TOKENS, - messages: [ - {role: 'system', content: prompt.system}, - {role: 'user', content: prompt.user}, - ], - }; - } - - createHeaders(apiKey: string): Record { - return { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, - }; - } - - parseCompletion(completion: PickChatCompletion<'groq'>): string | null { - return completion.choices?.[0]?.message.content ?? null; - } -} diff --git a/packages/core/src/llm/providers/mistral.ts b/packages/core/src/llm/providers/mistral.ts new file mode 100644 index 00000000..0cb3aaca --- /dev/null +++ b/packages/core/src/llm/providers/mistral.ts @@ -0,0 +1,48 @@ +import {DEFAULT_COPILOT_TEMPERATURE} from '../../constants'; +import type {PromptData} from '../../types/copilot'; +import type { + PickCompletion, + PickCompletionCreateParams, + PickModel, +} from '../../types/llm'; +import {BaseCopilotMetadata} from '../../types/metadata'; +import {MODEL_IDS, PROVIDER_ENDPOINT_MAP} from '../base'; +import {BaseProviderHandler} from '../handler'; + +export class MistralHandler extends BaseProviderHandler<'mistral'> { + createEndpoint(): string { + return PROVIDER_ENDPOINT_MAP.mistral; + } + + createRequestBody( + model: PickModel<'mistral'>, + prompt: PromptData, + metadata: BaseCopilotMetadata, + ): PickCompletionCreateParams<'mistral'> { + return { + model: MODEL_IDS[model], + temperature: DEFAULT_COPILOT_TEMPERATURE, + prompt: `${prompt.context}\n${prompt.instruction}\n\n${metadata.textBeforeCursor}`, + suffix: metadata.textAfterCursor, + stream: false, + }; + } + + createHeaders(apiKey: string): Record { + return { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }; + } + + parseCompletion(completion: PickCompletion<'mistral'>): string | null { + const content = completion.choices?.[0]?.message.content; + if (!content) return null; + return Array.isArray(content) + ? content + .filter(chunk => 'text' in chunk) + .map(chunk => chunk.text) + .join('') + : content; + } +} diff --git a/packages/core/src/llm/providers/openai.ts b/packages/core/src/llm/providers/openai.ts deleted file mode 100644 index afb51fb0..00000000 --- a/packages/core/src/llm/providers/openai.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - DEFAULT_COPILOT_MAX_TOKENS, - DEFAULT_COPILOT_TEMPERATURE, -} from '../../constants'; -import type {PromptData} from '../../types/copilot'; -import type { - PickChatCompletion, - PickChatCompletionCreateParams, - PickModel, -} from '../../types/llm'; -import {MODEL_IDS, PROVIDER_ENDPOINT_MAP} from '../base'; -import {BaseProviderHandler} from '../handler'; - -export class OpenAIHandler extends BaseProviderHandler<'openai'> { - createEndpoint(): string { - return PROVIDER_ENDPOINT_MAP.openai; - } - - createRequestBody( - model: PickModel<'openai'>, - prompt: PromptData, - ): PickChatCompletionCreateParams<'openai'> { - const isO1Model = model === 'o1-mini'; - return { - model: MODEL_IDS[model], - ...(!isO1Model && {temperature: DEFAULT_COPILOT_TEMPERATURE}), - max_completion_tokens: DEFAULT_COPILOT_MAX_TOKENS, - messages: [ - {role: 'system' as const, content: prompt.system}, - {role: 'user' as const, content: prompt.user}, - ], - }; - } - - createHeaders(apiKey: string): Record { - return { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, - }; - } - - parseCompletion(completion: PickChatCompletion<'openai'>): string | null { - return completion.choices?.[0]?.message.content ?? null; - } -} diff --git a/packages/core/src/types/copilot.ts b/packages/core/src/types/copilot.ts index bb4a4354..7d6a9aca 100644 --- a/packages/core/src/types/copilot.ts +++ b/packages/core/src/types/copilot.ts @@ -1,23 +1,22 @@ import type {Provider, ProviderImplementationMap} from './llm'; /** - * Data structure representing the prompt data. + * Represents the structure of a prompt used for code completion. */ export interface PromptData { - system: string; - user: string; + /** + * Contextual information about the code environment + * @example filename, technologies, etc. + */ + context: string; + /** Instructions for the AI model on how to generate the completion */ + instruction: string; + /** The content of the file being edited */ + fileContent: string; } -/** - * Custom prompt function type - * @param metadata - The metadata object containing information to generate the prompt - * @returns Partial - A partial prompt data object - */ export type CustomPrompt = (metadata: T) => Partial; -/** - * Custom model configuration types - */ export type CustomCopilotModelConfig = ( apiKey: string, prompt: PromptData, @@ -47,13 +46,7 @@ type CustomOptions = { model: CustomCopilotModel; }; -export type CopilotOptions = - | ProviderOptions<'openai'> - | ProviderOptions<'groq'> - | ProviderOptions<'anthropic'> - | ProviderOptions<'google'> - | ProviderOptions<'deepseek'> - | CustomOptions; +export type CopilotOptions = ProviderOptions<'mistral'> | CustomOptions; export type ProviderOptions = { provider: T; diff --git a/packages/core/src/types/llm.ts b/packages/core/src/types/llm.ts index 93016e4d..e9289a76 100644 --- a/packages/core/src/types/llm.ts +++ b/packages/core/src/types/llm.ts @@ -1,81 +1,30 @@ -import type { - MessageCreateParams as AnthropicChatCompletionCreateParamsBase, - Message as AnthropicChatCompletionType, -} from '@anthropic-ai/sdk/resources'; -import type { - GenerateContentRequest as GoogleChatCompletionCreateParamsBase, - GenerateContentResponse as GoogleChatCompletionType, -} from '@google/generative-ai'; -import type { - ChatCompletionCreateParamsBase as GroqChatCompletionCreateParamsBase, - ChatCompletion as GroqChatCompletionType, -} from 'groq-sdk/resources/chat/completions'; -import type { - ChatCompletionCreateParamsBase as OpenAIChatCompletionCreateParamsBase, - ChatCompletion as OpenAIChatCompletionType, -} from 'openai/resources/chat/completions'; +import { + FIMCompletionResponse as MistralFIMCompletion, + FIMCompletionRequest as MistralFIMCompletionCreateParams, +} from '@mistralai/mistralai/models/components'; -import {MODEL_IDS} from '../llm/base'; import type {PromptData} from './copilot'; /** * Providers supported by Copilot. */ -export type Provider = 'openai' | 'groq' | 'anthropic' | 'google' | 'deepseek'; - -export type DeepSeekChatCompletionType = { - choices: { - text: string; - }[]; -}; - -export type DeepSeekChatCompletionCreateParamsBase = { - model: (typeof MODEL_IDS)['v3']; - prompt: string; - suffix: string; - temperature: number; - max_tokens: number; -}; +export type Provider = 'mistral'; /** * Core type mapping for provider-specific implementations */ export interface ProviderImplementationMap { - openai: { - Model: 'gpt-4o' | 'gpt-4o-mini' | 'o1-mini'; - Params: OpenAIChatCompletionCreateParamsBase; - Completion: OpenAIChatCompletionType; - }; - groq: { - Model: 'llama-3-70b'; - Params: GroqChatCompletionCreateParamsBase; - Completion: GroqChatCompletionType; - }; - anthropic: { - Model: 'claude-3-5-sonnet' | 'claude-3-5-haiku' | 'claude-3-haiku'; - Params: AnthropicChatCompletionCreateParamsBase; - Completion: AnthropicChatCompletionType; - }; - google: { - Model: 'gemini-1.5-flash' | 'gemini-1.5-flash-8b' | 'gemini-1.5-pro'; - Params: GoogleChatCompletionCreateParamsBase; - Completion: GoogleChatCompletionType; - }; - deepseek: { - Model: 'v3'; - Params: DeepSeekChatCompletionCreateParamsBase; - Completion: DeepSeekChatCompletionType; + mistral: { + Model: 'codestral'; + Params: MistralFIMCompletionCreateParams; + Completion: MistralFIMCompletion; }; } /** * Models available for each provider (maintained as individual exports) */ -export type OpenAIModel = ProviderImplementationMap['openai']['Model']; -export type GroqModel = ProviderImplementationMap['groq']['Model']; -export type AnthropicModel = ProviderImplementationMap['anthropic']['Model']; -export type GoogleModel = ProviderImplementationMap['google']['Model']; -export type DeepSeekModel = ProviderImplementationMap['deepseek']['Model']; +export type MistralModel = ProviderImplementationMap['mistral']['Model']; /** * Union of all predefined Copilot models @@ -89,45 +38,33 @@ export type Model = { */ export type PickModel

= ProviderImplementationMap[P]['Model']; -export type PickChatCompletionCreateParams

= +export type PickCompletionCreateParams

= ProviderImplementationMap[P]['Params']; -export type PickChatCompletion

= +export type PickCompletion

= ProviderImplementationMap[P]['Completion']; /** * Consolidated chat completion types (maintained as individual exports) */ -export type ChatCompletionCreateParams = { +export type CompletionCreateParams = { [K in Provider]: ProviderImplementationMap[K]['Params']; }[Provider]; -export type ChatCompletion = { +export type Completion = { [K in Provider]: ProviderImplementationMap[K]['Completion']; }[Provider]; /** * Individual provider type aliases (preserved from original) */ -export type OpenAIChatCompletionCreateParams = - OpenAIChatCompletionCreateParamsBase; -export type DeepSeekChatCompletionCreateParams = - DeepSeekChatCompletionCreateParamsBase; -export type GroqChatCompletionCreateParams = GroqChatCompletionCreateParamsBase; -export type AnthropicChatCompletionCreateParams = - AnthropicChatCompletionCreateParamsBase; -export type GoogleChatCompletionCreateParams = - GoogleChatCompletionCreateParamsBase; -export type OpenAIChatCompletion = OpenAIChatCompletionType; -export type DeepSeekChatCompletion = DeepSeekChatCompletionType; -export type GroqChatCompletion = GroqChatCompletionType; -export type AnthropicChatCompletion = AnthropicChatCompletionType; -export type GoogleChatCompletion = GoogleChatCompletionType; +export type MistralCompletionCreateParams = MistralFIMCompletionCreateParams; +export type MistralCompletion = MistralFIMCompletion; export interface ProviderHandler

{ createEndpoint(model: PickModel

, apiKey: string): string; createRequestBody( model: PickModel

, prompt: PromptData, - ): PickChatCompletionCreateParams

; + ): PickCompletionCreateParams

; createHeaders(apiKey: string): Record; - parseCompletion(completion: PickChatCompletion

): string | null; + parseCompletion(completion: PickCompletion

): string | null; } diff --git a/packages/core/src/types/metadata.ts b/packages/core/src/types/metadata.ts new file mode 100644 index 00000000..e24b558b --- /dev/null +++ b/packages/core/src/types/metadata.ts @@ -0,0 +1,59 @@ +export type Endpoint = string; +export type Filename = string; +export type Technologies = string[]; +export type RelatedFile = { + /** + * The relative path from the current editing code in the editor to an external file. + * + * Examples: + * - To include a file `utils.js` in the same directory, set as `./utils.js`. + * - To include a file `utils.js` in the parent directory, set as `../utils.js`. + * - To include a file `utils.js` in the child directory, set as `./child/utils.js`. + */ + path: string; + + /** + * The content of the external file as a string. + */ + content: string; +}; + +export interface BaseCopilotMetadata { + /** + * The programming language of the code. + */ + language: string | undefined; + /** + * The name of the file being edited. + */ + filename: Filename | undefined; + /** + * The technologies used in the completion. + */ + technologies: Technologies | undefined; + /** + * Additional context from related files. + */ + relatedFiles: RelatedFile[] | undefined; + /** + * The text that appears after the cursor. + */ + textAfterCursor: string; + /** + * The text that appears before the cursor. + */ + textBeforeCursor: string; + /** + * The current cursor position. + */ + cursorPosition: { + /** + * line number (starts at 1) + */ + readonly lineNumber: number; + /** + * column (the first character in a line is between column 1 and column 2) + */ + readonly column: number; + }; +} diff --git a/packages/core/tests/base-provider-handler.test.ts b/packages/core/tests/base-provider-handler.test.ts deleted file mode 100644 index 96c95222..00000000 --- a/packages/core/tests/base-provider-handler.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import {describe, expect, it} from 'vitest'; - -import {ChatCompletion} from '../src'; -import {BaseProviderHandler} from '../src/llm/handler'; -import { - createProviderEndpoint, - createProviderHeaders, - createRequestBody, - parseProviderChatCompletion, -} from '../src/llm/operations'; - -describe('BaseProviderHandler & operations', () => { - class TestProviderHandler extends BaseProviderHandler<'openai'> { - createEndpoint() { - return 'test-endpoint'; - } - createRequestBody() { - return {} as any; - } - createHeaders() { - return {'x-test': 'header'}; - } - parseCompletion() { - return 'parsed'; - } - } - - it('Should instantiate a TestProviderHandler (subclass of BaseProviderHandler)', () => { - const testHandler = new TestProviderHandler(); - expect(testHandler).toBeInstanceOf(TestProviderHandler); - }); - - it('Should create correct endpoint via createProviderEndpoint (OpenAI)', () => { - const endpoint = createProviderEndpoint('gpt-4o', 'fakeKey', 'openai'); - expect(endpoint).toBe('https://api.openai.com/v1/chat/completions'); - }); - - it('Should create correct endpoint via createProviderEndpoint (Anthropic)', () => { - const endpoint = createProviderEndpoint( - 'claude-3-haiku', - 'fakeKey', - 'anthropic', - ); - expect(endpoint).toBe('https://api.anthropic.com/v1/messages'); - }); - - it('Should create request body for OpenAI with user & system prompts', () => { - const body = createRequestBody('gpt-4o', 'openai', { - system: 'sys prompt', - user: 'user prompt', - }); - expect(body).toMatchObject({ - model: 'gpt-4o-2024-08-06', - messages: [ - {role: 'system', content: 'sys prompt'}, - {role: 'user', content: 'user prompt'}, - ], - }); - }); - - it('Should create request body for Anthropic with user & system prompts', () => { - const body = createRequestBody('claude-3-haiku', 'anthropic', { - system: 'anthropic sys', - user: 'anthropic user', - }); - expect(body).toMatchObject({ - model: 'claude-3-haiku-20240307', - system: 'anthropic sys', - messages: [{role: 'user', content: 'anthropic user'}], - }); - }); - - it('Should create correct headers for OpenAI', () => { - const headers = createProviderHeaders('OPENAI_KEY', 'openai'); - expect(headers).toMatchObject({ - Authorization: 'Bearer OPENAI_KEY', - 'Content-Type': 'application/json', - }); - }); - - it('Should create correct headers for Google', () => { - const headers = createProviderHeaders('googleKey', 'google'); - expect(headers).toMatchObject({ - 'Content-Type': 'application/json', - }); - }); - - it('parseProviderChatCompletion with OpenAI returns first choice', () => { - const completion = { - choices: [{message: {content: 'OpenAI content'}}], - } as ChatCompletion; - const result = parseProviderChatCompletion(completion, 'openai'); - expect(result).toBe('OpenAI content'); - }); - - it('parseProviderChatCompletion with Deepseek returns choice text if present', () => { - const completion = { - choices: [{text: 'Deepseek content'}], - } as any; - const result = parseProviderChatCompletion(completion, 'deepseek'); - expect(result).toBe('Deepseek content'); - }); - - it('parseProviderChatCompletion returns null if no relevant fields are found', () => { - const completion = {} as any; - const result = parseProviderChatCompletion(completion, 'deepseek'); - expect(result).toBeNull(); - }); -}); diff --git a/packages/core/tests/copilot-class.test.ts b/packages/core/tests/copilot-class.test.ts deleted file mode 100644 index 7f684ef4..00000000 --- a/packages/core/tests/copilot-class.test.ts +++ /dev/null @@ -1,178 +0,0 @@ -import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'; - -import {Copilot} from '../src/copilot'; -import type {CustomCopilotModel, PromptData} from '../src/types/copilot'; - -describe('Copilot class', () => { - class TestCopilot extends Copilot<{name: string}> { - protected getDefaultPrompt(metadata: {name: string}): PromptData { - return { - system: `Default system for ${metadata.name}`, - user: `Default user for ${metadata.name}`, - }; - } - } - - const customModel: CustomCopilotModel = { - config: (apiKey: string, prompt: PromptData) => ({ - endpoint: 'https://custom-model.example.com/endpoint', - headers: { - 'x-custom-api-key': apiKey, - }, - body: { - specialPrompt: `${prompt.system} | ${prompt.user}`, - }, - }), - transformResponse: (response: any) => ({ - text: response.result || null, - }), - }; - - beforeEach(() => { - global.fetch = vi.fn(); - }); - afterEach(() => { - vi.restoreAllMocks(); - }); - - it('Constructor sets apiKey, provider, model for normal usage', () => { - const copilot = new TestCopilot('fakeKey', { - provider: 'openai', - model: 'gpt-4o', - }); - expect((copilot as any).apiKey).toBe('fakeKey'); - expect((copilot as any).provider).toBe('openai'); - expect((copilot as any).model).toBe('gpt-4o'); - }); - - it('Constructor allows custom model without provider', () => { - const customCopilot = new TestCopilot('anotherKey', { - model: customModel, - }); - expect((customCopilot as any).apiKey).toBe('anotherKey'); - expect((customCopilot as any).provider).toBeUndefined(); - expect((customCopilot as any).model).toBe(customModel); - }); - - it('getDefaultPrompt is used if no customPrompt is provided', async () => { - const copilot = new TestCopilot('key', { - provider: 'openai', - model: 'gpt-4o', - }); - const prompt = (copilot as any).generatePrompt( - {name: 'Alice'}, - undefined, - ); - expect(prompt).toEqual({ - system: 'Default system for Alice', - user: 'Default user for Alice', - }); - }); - - it('generatePrompt merges defaultPrompt with customPrompt overrides', () => { - const copilot = new TestCopilot('key', { - provider: 'openai', - model: 'gpt-4o', - }); - const customPrompt = (meta: {name: string}) => ({ - user: `Custom user for ${meta.name}`, - }); - const prompt = (copilot as any).generatePrompt( - {name: 'Bob'}, - customPrompt, - ); - expect(prompt).toEqual({ - system: 'Default system for Bob', - user: 'Custom user for Bob', - }); - }); - - it('makeAIRequest should return text on success (provider-based)', async () => { - (global.fetch as any).mockResolvedValueOnce({ - ok: true, - json: async () => ({ - choices: [{message: {content: 'Hello from the AI'}}], - }), - }); - const copilot = new TestCopilot('apiKey', { - provider: 'openai', - model: 'gpt-4o', - }); - const result = await (copilot as any).makeAIRequest({ - name: 'test-user', - }); - expect(result.text).toBe('Hello from the AI'); - expect(result.error).toBeUndefined(); - }); - - it('makeAIRequest should capture error and return it if fetch fails', async () => { - (global.fetch as any).mockRejectedValueOnce(new Error('Network down')); - const copilot = new TestCopilot('apiKey', { - provider: 'openai', - model: 'gpt-4o', - }); - const result = await (copilot as any).makeAIRequest({ - name: 'test-user', - }); - expect(result.text).toBeNull(); - expect(result.error).toContain('Network down'); - }); - - it('makeAIRequest uses custom model config and transformResponse if model is custom', async () => { - (global.fetch as any).mockResolvedValueOnce({ - ok: true, - json: async () => ({result: 'Custom model says hi'}), - }); - const copilot = new TestCopilot('customApiKey', { - model: customModel, - }); - const result = await (copilot as any).makeAIRequest({name: 'TestUser'}); - expect(result.text).toBe('Custom model says hi'); - expect(result.raw).toEqual({result: 'Custom model says hi'}); - }); - - it('prepareRequest for custom model uses config body & headers', async () => { - const copilot = new TestCopilot('k3y', { - model: customModel, - }); - const prompt = {system: 'sys', user: 'usr'}; - const requestDetails = await (copilot as any).prepareRequest(prompt); - expect(requestDetails.endpoint).toBe( - 'https://custom-model.example.com/endpoint', - ); - expect(requestDetails.headers).toEqual({'x-custom-api-key': 'k3y'}); - expect(requestDetails.requestBody).toEqual({ - specialPrompt: 'sys | usr', - }); - }); - - it('prepareRequest for provider uses createProviderEndpoint etc.', async () => { - const copilot = new TestCopilot('k3y', { - provider: 'openai', - model: 'gpt-4o', - }); - const prompt = {system: 'sys', user: 'usr'}; - const requestDetails = await (copilot as any).prepareRequest(prompt); - expect(requestDetails.endpoint).toBe( - 'https://api.openai.com/v1/chat/completions', - ); - expect(requestDetails.requestBody.model).toBe('gpt-4o-2024-08-06'); - expect(requestDetails.headers).toHaveProperty( - 'Authorization', - 'Bearer k3y', - ); - }); - - it('processResponse (non-custom) calls parseProviderChatCompletion', () => { - const copilot = new TestCopilot('k3y', { - provider: 'openai', - model: 'gpt-4o', - }); - const response = { - choices: [{message: {content: 'Hello from parse test'}}], - }; - const result = (copilot as any).processResponse(response); - expect(result.text).toBe('Hello from parse test'); - expect(result.raw).toBe(response); - }); -}); diff --git a/packages/core/tests/provider-classes.test.ts b/packages/core/tests/provider-classes.test.ts deleted file mode 100644 index 5030dade..00000000 --- a/packages/core/tests/provider-classes.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import {describe, expect, it} from 'vitest'; - -import {DEFAULT_COPILOT_TEMPERATURE} from '../src/constants'; -import {AnthropicHandler} from '../src/llm/providers/anthropic'; -import {DeepseekHandler} from '../src/llm/providers/deepseek'; -import {GoogleHandler} from '../src/llm/providers/google'; -import {GroqHandler} from '../src/llm/providers/groq'; -import {OpenAIHandler} from '../src/llm/providers/openai'; - -describe('Provider Classes', () => { - it('AnthropicHandler should create correct endpoint', () => { - const handler = new AnthropicHandler(); - expect(handler.createEndpoint()).toBe( - 'https://api.anthropic.com/v1/messages', - ); - }); - - it('AnthropicHandler should parse completion with valid content', () => { - const handler = new AnthropicHandler(); - const completion = { - content: [{type: 'text', text: 'Hello from Anthropic'}], - } as unknown; - const result = handler.parseCompletion(completion as any); - expect(result).toBe('Hello from Anthropic'); - }); - - it('DeepseekHandler createRequestBody should embed system + user in prompt', () => { - const handler = new DeepseekHandler(); - const body = handler.createRequestBody('v3', { - system: 'System message', - user: 'User message', - }); - expect(body.prompt).toContain('System message'); - expect(body.prompt).toContain('User message'); - expect(body.model).toBe('deepseek-chat'); - }); - - it('DeepseekHandler parseCompletion should return null if text is missing', () => { - const handler = new DeepseekHandler(); - const result = handler.parseCompletion({ - choices: [{text: undefined}], - } as any); - expect(result).toBeNull(); - }); - - it('GoogleHandler should create correct endpoint with appended API key', () => { - const handler = new GoogleHandler(); - const url = handler.createEndpoint('gemini-1.5-pro', 'XYZ-ABC-123'); - expect(url).toBe( - 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent?key=XYZ-ABC-123', - ); - }); - - it('GoogleHandler parseCompletion should return content if present', () => { - const handler = new GoogleHandler(); - const completion = { - candidates: [{content: {parts: [{text: 'Hello from Google'}]}}], - } as any; - const result = handler.parseCompletion(completion); - expect(result).toBe('Hello from Google'); - }); - - it('GroqHandler should create correct endpoint', () => { - const handler = new GroqHandler(); - expect(handler.createEndpoint()).toBe( - 'https://api.groq.com/openai/v1/chat/completions', - ); - }); - - it('GroqHandler parseCompletion should return first choice content', () => { - const handler = new GroqHandler(); - const completion = { - choices: [{message: {content: 'Hello from Groq!'}}], - } as any; - const result = handler.parseCompletion(completion); - expect(result).toBe('Hello from Groq!'); - }); - - it('OpenAIHandler createRequestBody should omit temperature if model is o1-mini', () => { - const handler = new OpenAIHandler(); - const bodyMini = handler.createRequestBody('o1-mini', { - system: 'system text', - user: 'user text', - }); - expect(bodyMini).not.toHaveProperty('temperature'); - const bodyRegular = handler.createRequestBody('gpt-4o', { - system: 'system text', - user: 'user text', - }); - expect(bodyRegular).toHaveProperty( - 'temperature', - DEFAULT_COPILOT_TEMPERATURE, - ); - }); - - it('OpenAIHandler parseCompletion returns null if no choices exist', () => { - const handler = new OpenAIHandler(); - const completion = {} as any; - const result = handler.parseCompletion(completion); - expect(result).toBeNull(); - }); -}); diff --git a/packages/core/tests/provider-handlers.test.ts b/packages/core/tests/provider-handlers.test.ts deleted file mode 100644 index 3e7430fb..00000000 --- a/packages/core/tests/provider-handlers.test.ts +++ /dev/null @@ -1,106 +0,0 @@ -import {describe, expect, it} from 'vitest'; - -import { - DEFAULT_COPILOT_MAX_TOKENS, - DEFAULT_COPILOT_TEMPERATURE, -} from '../src/constants'; -import {AnthropicHandler} from '../src/llm/providers/anthropic'; -import {GroqHandler} from '../src/llm/providers/groq'; -import {OpenAIHandler} from '../src/llm/providers/openai'; - -describe('Provider Handlers - Creation Methods', () => { - describe('AnthropicHandler', () => { - const handler = new AnthropicHandler(); - const apiKey = 'test-key'; - - it('should create correct endpoint', () => { - const endpoint = handler.createEndpoint(); - expect(endpoint).toBe('https://api.anthropic.com/v1/messages'); - }); - - it('should create correct headers', () => { - const headers = handler.createHeaders(apiKey); - expect(headers).toEqual({ - 'Content-Type': 'application/json', - 'x-api-key': apiKey, - 'anthropic-version': '2023-06-01', - }); - }); - - it('should create correct request body', () => { - const model = 'claude-3-haiku'; - const prompt = {system: 'system prompt', user: 'user prompt'}; - const body = handler.createRequestBody(model, prompt); - - expect(body).toEqual({ - model: 'claude-3-haiku-20240307', - temperature: DEFAULT_COPILOT_TEMPERATURE, - system: prompt.system, - messages: [{role: 'user', content: prompt.user}], - max_tokens: DEFAULT_COPILOT_MAX_TOKENS, - }); - }); - }); - - describe('OpenAIHandler', () => { - const handler = new OpenAIHandler(); - const apiKey = 'test-key'; - - it('should create correct endpoint', () => { - const endpoint = handler.createEndpoint(); - expect(endpoint).toBe('https://api.openai.com/v1/chat/completions'); - }); - - it('should create correct headers', () => { - const headers = handler.createHeaders(apiKey); - expect(headers).toEqual({ - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, - }); - }); - - it('should handle O1 model differently in request body', () => { - const model = 'o1-mini'; - const prompt = {system: 'system prompt', user: 'user prompt'}; - const body = handler.createRequestBody(model, prompt); - - expect(body.temperature).toBeUndefined(); - }); - }); - - describe('GroqHandler', () => { - const handler = new GroqHandler(); - const apiKey = 'test-key'; - - it('should create correct endpoint', () => { - const endpoint = handler.createEndpoint(); - expect(endpoint).toBe( - 'https://api.groq.com/openai/v1/chat/completions', - ); - }); - - it('should create correct headers', () => { - const headers = handler.createHeaders(apiKey); - expect(headers).toEqual({ - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, - }); - }); - - it('should create correct request body for llama model', () => { - const model = 'llama-3-70b'; - const prompt = {system: 'system prompt', user: 'user prompt'}; - const body = handler.createRequestBody(model, prompt); - - expect(body).toEqual({ - model: 'llama3-70b-8192', - temperature: DEFAULT_COPILOT_TEMPERATURE, - max_tokens: DEFAULT_COPILOT_MAX_TOKENS, - messages: [ - {role: 'system', content: prompt.system}, - {role: 'user', content: prompt.user}, - ], - }); - }); - }); -}); diff --git a/packages/core/tests/validator.test.ts b/packages/core/tests/validator.test.ts index 173da188..d4481f52 100644 --- a/packages/core/tests/validator.test.ts +++ b/packages/core/tests/validator.test.ts @@ -20,8 +20,8 @@ describe('Validator', () => { it('should not throw with valid params', () => { expect(() => validator.params('key', { - provider: 'openai', - model: 'gpt-4o', + provider: 'mistral', + model: 'codestral', }), ).not.toThrow(); }); @@ -37,7 +37,7 @@ describe('Validator', () => { }; it('should throw if provider specified with custom model', () => { - expect(() => validator.inputs(customModel, 'openai')).toThrow( + expect(() => validator.inputs(customModel, 'mistral')).toThrow( 'Provider should not be specified when using a custom model.', ); }); @@ -49,19 +49,22 @@ describe('Validator', () => { }); it('should throw if provider not specified for built-in model', () => { - expect(() => validator.inputs('gpt-4o')).toThrow( + expect(() => validator.inputs('codestral')).toThrow( 'Provider must be specified and supported', ); }); it('should throw if model not supported by provider', () => { - expect(() => validator.inputs('gpt-4o', 'anthropic')).toThrow( - 'Model "gpt-4o" is not supported by the "anthropic" provider', + // @ts-expect-error - model is not supported by the provider + expect(() => validator.inputs('codestrals', 'mistral')).toThrow( + 'Model "codestrals" is not supported by the "mistral" provider', ); }); it('should not throw with valid built-in model and provider', () => { - expect(() => validator.inputs('gpt-4o', 'openai')).not.toThrow(); + expect(() => + validator.inputs('codestral', 'mistral'), + ).not.toThrow(); }); it('should not throw with valid custom model', () => { diff --git a/packages/monacopilot/README.md b/packages/monacopilot/README.md index d302ce51..aaf7c64c 100644 --- a/packages/monacopilot/README.md +++ b/packages/monacopilot/README.md @@ -2,7 +2,6 @@ ### Features -- 🎯 Multiple AI Provider Support (Anthropic, OpenAI, Groq, Google, DeepSeek) - 🔄 Real-time Code Completions - ⚡️ Efficient Caching System - 🎨 Context-Aware Suggestions diff --git a/packages/monacopilot/src/completion-copilot.ts b/packages/monacopilot/src/completion-copilot.ts index da2bb13d..60e13dd8 100644 --- a/packages/monacopilot/src/completion-copilot.ts +++ b/packages/monacopilot/src/completion-copilot.ts @@ -1,6 +1,6 @@ import {Copilot, type PromptData} from '@monacopilot/core'; -import {buildDefaultPrompt} from './prompt'; +import {buildPrompt} from './prompt'; import type { CompletionMetadata, CompletionRequest, @@ -27,6 +27,6 @@ export class CompletionCopilot extends Copilot { } protected getDefaultPrompt(metadata: CompletionMetadata): PromptData { - return buildDefaultPrompt(metadata); + return buildPrompt(metadata); } } diff --git a/packages/monacopilot/src/index.ts b/packages/monacopilot/src/index.ts index 3402ec8e..0aa51e9b 100644 --- a/packages/monacopilot/src/index.ts +++ b/packages/monacopilot/src/index.ts @@ -13,11 +13,7 @@ export type { CustomCopilotModel, Provider, Model, - OpenAIModel, - GroqModel, - AnthropicModel, - GoogleModel, - DeepSeekModel, + MistralModel, } from '@monacopilot/core'; export type { diff --git a/packages/monacopilot/src/processor.ts b/packages/monacopilot/src/processor.ts index b78534cc..bc693950 100644 --- a/packages/monacopilot/src/processor.ts +++ b/packages/monacopilot/src/processor.ts @@ -43,7 +43,7 @@ export const processInlineCompletions = async ({ requestHandler, } = options; - if (enableCaching) { + if (enableCaching && !isCompletionAccepted) { const cachedCompletions = completionCache.get(pos, mdl).map(cache => ({ insertText: cache.completion, range: cache.range, @@ -54,7 +54,7 @@ export const processInlineCompletions = async ({ } } - if (token.isCancellationRequested || isCompletionAccepted) { + if (token.isCancellationRequested) { return createInlineCompletionResult([]); } diff --git a/packages/monacopilot/src/prompt.ts b/packages/monacopilot/src/prompt.ts index eb910f59..d6207bad 100644 --- a/packages/monacopilot/src/prompt.ts +++ b/packages/monacopilot/src/prompt.ts @@ -4,68 +4,50 @@ import type {CompletionMetadata} from './types'; import {joinWithAnd} from './utils/text'; const CURSOR_PLACEHOLDER = '<|developer_cursor_is_here|>'; -const COMPLETION_MODE_TEXTS = { - insert: { - noun: 'insertion', - verb: 'Insert', - }, - complete: { - noun: 'completion', - verb: 'Complete', - }, - continue: { - noun: 'continuation', - verb: 'Continue', - }, -}; -export const buildDefaultPrompt = ( - metadata: CompletionMetadata, -): PromptData => { - const { - technologies = [], - filename, - relatedFiles, - language, - textBeforeCursor = '', - textAfterCursor = '', - editorState: {completionMode}, - } = metadata; +export const buildPrompt = (metadata: CompletionMetadata): PromptData => { + return { + instruction: getInstruction(), + context: buildContext(metadata), + fileContent: getFileContent(metadata), + }; +}; - const {noun, verb} = COMPLETION_MODE_TEXTS[completionMode]; +const getInstruction = (): string => { + return `You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.`; +}; - const isFullCompletion = - completionMode === 'continue' || completionMode === 'complete'; +const buildContext = (metadata: CompletionMetadata): string => { + const {technologies = [], filename, relatedFiles = [], language} = metadata; const techStack = joinWithAnd( - [language, ...technologies].filter( - (item): item is string => typeof item === 'string' && !!item, + [language, ...technologies].filter((item): item is string => + Boolean(item), ), ); const relatedFilesText = - !relatedFiles || relatedFiles.length === 0 + relatedFiles.length === 0 ? '' : relatedFiles .map(({path, content}) => `### ${path}\n${content}`) .join('\n\n'); - const systemInstruction = `You are an expert code ${noun} assistant. ${verb}${isFullCompletion ? ' the full' : ''} code naturally as if you were the developer, following their patterns and style. Use ${techStack || 'appropriate'} best practices. Focus on writing concise, accurate code that matches the context perfectly, including proper indentation and formatting to seamlessly integrate with the existing code. Do not include explanations, comments, or backticks.`; + const contextHeader = [ + techStack ? `Technology stack: ${techStack}` : '', + `File: ${filename || 'unknown'}`, + ] + .filter(Boolean) + .join('\n'); - const userInstruction = `${relatedFilesText} + return `${relatedFilesText ? `${relatedFilesText}\n\n` : ''}${contextHeader}`; +}; -File: ${filename || 'unknown'} -Mode: ${completionMode} +const getFileContent = (metadata: CompletionMetadata): string => { + const {textBeforeCursor, textAfterCursor} = metadata; -Here is the code context with the ${CURSOR_PLACEHOLDER} marker indicating where to ${verb.toLowerCase()} the code: + return `**Current code:** \`\`\` ${textBeforeCursor}${CURSOR_PLACEHOLDER}${textAfterCursor} -\`\`\` - -Provide only the code that should replace the ${CURSOR_PLACEHOLDER} marker. Ensure it is properly indented and formatted to seamlessly integrate with the existing code. Do not include any additional text, explanations, or syntax highlighting. Your response will be directly inserted in place of the marker.`; - - return { - system: systemInstruction, - user: userInstruction, - }; +\`\`\``; }; diff --git a/packages/monacopilot/src/request-completion.ts b/packages/monacopilot/src/request-completion.ts index 90d82905..ca7000bc 100644 --- a/packages/monacopilot/src/request-completion.ts +++ b/packages/monacopilot/src/request-completion.ts @@ -1,16 +1,14 @@ +import type {RelatedFile} from '@monacopilot/core'; + import {DEFAULT_MAX_CONTEXT_LINES} from './defaults'; -import type {CompletionMode, CompletionResponse, RelatedFile} from './types'; +import type {CompletionMetadata, CompletionResponse} from './types'; import type { ConstructCompletionMetadataParams, FetchCompletionItemParams, FetchCompletionItemReturn, } from './types/internal'; import type {CursorPosition, EditorModel} from './types/monaco'; -import { - getCharAfterCursor, - getTextAfterCursor, - getTextBeforeCursor, -} from './utils/editor'; +import {getTextAfterCursor, getTextBeforeCursor} from './utils/editor'; import { truncateTextToMaxLines, TruncateTextToMaxLinesOptions, @@ -30,7 +28,9 @@ export const requestCompletionItem = async ( }); if (!response.ok) { - throw new Error('Error while fetching completion item'); + throw new Error( + `Error while fetching completion item: ${response.statusText}`, + ); } const {completion, error} = (await response.json()) as CompletionResponse; @@ -46,7 +46,7 @@ export const buildCompletionMetadata = ({ pos, mdl, options, -}: ConstructCompletionMetadataParams) => { +}: ConstructCompletionMetadataParams): CompletionMetadata => { const { filename, language, @@ -55,8 +55,6 @@ export const buildCompletionMetadata = ({ maxContextLines = DEFAULT_MAX_CONTEXT_LINES, } = options; - const completionMode = determineCompletionMode(pos, mdl); - const hasRelatedFiles = relatedFiles && relatedFiles.length > 0; const contextLinesDivisor = hasRelatedFiles ? 3 : 2; @@ -117,26 +115,5 @@ export const buildCompletionMetadata = ({ textBeforeCursor, textAfterCursor, cursorPosition: pos, - editorState: { - completionMode, - }, }; }; - -const determineCompletionMode = ( - pos: CursorPosition, - mdl: EditorModel, -): CompletionMode => { - const charAfterCursor = getCharAfterCursor(pos, mdl); - const textAfterCursor = getTextAfterCursor(pos, mdl); - - if (charAfterCursor) { - return 'insert'; - } - - if (textAfterCursor.trim()) { - return 'complete'; - } - - return 'continue'; -}; diff --git a/packages/monacopilot/src/types/index.ts b/packages/monacopilot/src/types/index.ts index ceb257b6..e6ebd68a 100644 --- a/packages/monacopilot/src/types/index.ts +++ b/packages/monacopilot/src/types/index.ts @@ -1,4 +1,11 @@ -import type {CustomPrompt} from '@monacopilot/core'; +import type { + BaseCopilotMetadata, + CustomPrompt, + Endpoint, + Filename, + RelatedFile, + Technologies, +} from '@monacopilot/core'; import {FetchCompletionItemHandler} from './internal'; import type { @@ -9,25 +16,7 @@ import type { Monaco, } from './monaco'; -export type Endpoint = string; -export type Filename = string; -export type Technologies = string[]; -export type RelatedFile = { - /** - * The relative path from the current editing code in the editor to an external file. - * - * Examples: - * - To include a file `utils.js` in the same directory, set as `./utils.js`. - * - To include a file `utils.js` in the parent directory, set as `../utils.js`. - * - To include a file `utils.js` in the child directory, set as `./child/utils.js`. - */ - path: string; - - /** - * The content of the external file as a string. - */ - content: string; -}; +export type CompletionMetadata = BaseCopilotMetadata; export interface RegisterCompletionOptions { /** @@ -44,7 +33,6 @@ export interface RegisterCompletionOptions { * Options: * - `'onIdle'`: Provides completions after a brief pause in typing. * - `'onTyping'`: Provides completions in real-time as you type. - * - *Note:* Best suited for models with low response latency (e.g., Groq). * - *Consideration:* May initiate additional background requests to deliver real-time suggestions. * - `'onDemand'`: Completions are not provided automatically. You need to trigger the completion manually, possibly by using the `trigger` function from `registerCompletion` return. * @@ -186,11 +174,12 @@ export interface CompletionRequestOptions { headers?: Record; /** * Custom prompt generator function for the completion request. - * This function allows you to override the default system and user prompts + * This function allows you to override the default prompt * used in the completion request, providing more control over the AI's context and behavior. * * @param completionMetadata - Metadata about the current completion context - * @returns An object containing custom 'system' and 'user' prompts + * @returns A partial PromptData object that can override context and/or instruction + * @see {@link https://github.com/arshad-yaseen/monacopilot/blob/main/packages/monacopilot/src/prompt.ts | Monacopilot default prompt implementation} */ customPrompt?: CustomPrompt; } @@ -209,48 +198,3 @@ export interface CompletionResponse { */ raw?: unknown; } - -export type CompletionMode = 'insert' | 'complete' | 'continue'; - -export interface CompletionMetadata { - /** - * The programming language of the code. - */ - language: string | undefined; - /** - * The name of the file being edited. - */ - filename: Filename | undefined; - /** - * The technologies used in the completion. - */ - technologies: Technologies | undefined; - /** - * Additional context from related files. - */ - relatedFiles: RelatedFile[] | undefined; - /** - * The text that appears after the cursor. - */ - textAfterCursor: string; - /** - * The text that appears before the cursor. - */ - textBeforeCursor: string; - /** - * The current cursor position. - */ - cursorPosition: CursorPosition; - /** - * The current state of the editor. - */ - editorState: { - /** - * The mode of the completion. - * - `insert`: Indicates that there is a character immediately after the cursor. In this mode, the LLM will generate content to be inserted at the cursor position. - * - `complete`: Indicates that there is a character after the cursor but not immediately. In this mode, the LLM will generate content to complete the text from the cursor position. - * - `continue`: Indicates that there is no character after the cursor. In this mode, the LLM will generate content to continue the text from the cursor position. - */ - completionMode: CompletionMode; - }; -} diff --git a/packages/monacopilot/tests/completion.test.ts b/packages/monacopilot/tests/completion.test.ts deleted file mode 100644 index 78eadf64..00000000 --- a/packages/monacopilot/tests/completion.test.ts +++ /dev/null @@ -1,231 +0,0 @@ -import {MODEL_IDS, PROVIDER_ENDPOINT_MAP} from '@monacopilot/core'; -import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'; - -import {CompletionCopilot} from '../src/completion-copilot'; -import type {CompletionMetadata} from '../src/types'; -import { - MOCK_API_KEY, - MOCK_COMPLETION, - MOCK_COMPLETION_CONTENT, - MOCK_COMPLETION_METADATA, - MOCK_ERROR, - MOCK_NETWORK_ERROR, - TEST_MODEL, - TEST_PROVIDER, -} from './mock'; - -describe('Completion', () => { - let copilot: CompletionCopilot; - - beforeEach(() => { - copilot = new CompletionCopilot(MOCK_API_KEY, { - provider: TEST_PROVIDER, - model: TEST_MODEL, - }); - vi.clearAllMocks(); - }); - - afterEach(() => { - vi.restoreAllMocks(); - }); - - it('should successfully return a completion', async () => { - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve(MOCK_COMPLETION), - }); - - const result = await copilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - }); - - expect(result).toEqual({ - completion: MOCK_COMPLETION_CONTENT, - raw: MOCK_COMPLETION, - }); - expect(fetch).toHaveBeenCalledWith( - PROVIDER_ENDPOINT_MAP[TEST_PROVIDER], - expect.objectContaining({ - method: 'POST', - headers: expect.any(Object), - body: expect.stringContaining(MODEL_IDS[TEST_MODEL]), - }), - ); - }); - - it('should handle API errors and return an error response', async () => { - global.fetch = vi.fn().mockRejectedValue(MOCK_ERROR); - - const result = await copilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - }); - - expect(result).toEqual({ - error: expect.stringContaining('API Error'), - completion: null, - }); - }); - - it('should use custom provider and model when specified', async () => { - const customCompletionCopilot = new CompletionCopilot(MOCK_API_KEY, { - provider: 'openai', - model: 'gpt-4o', - }); - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve(MOCK_COMPLETION), - }); - - await customCompletionCopilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - }); - - expect(fetch).toHaveBeenCalledWith( - PROVIDER_ENDPOINT_MAP['openai'], - expect.objectContaining({ - method: 'POST', - body: expect.stringContaining(MODEL_IDS['gpt-4o']), - }), - ); - }); - - it('should handle network errors', async () => { - MOCK_ERROR.name = 'NetworkError'; - global.fetch = vi.fn().mockRejectedValue(MOCK_NETWORK_ERROR); - - const result = await copilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - }); - - expect(result).toEqual({ - error: expect.stringContaining('Network error'), - completion: null, - }); - }); - - it('should use custom headers in API requests', async () => { - const customHeaders = {'X-Custom-Header': 'test-value'}; - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve(MOCK_COMPLETION), - }); - - await copilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - options: { - headers: customHeaders, - }, - }); - - expect(fetch).toHaveBeenCalledWith( - expect.any(String), - expect.objectContaining({ - method: 'POST', - headers: expect.objectContaining(customHeaders), - }), - ); - }); - - it('should use custom prompt when provided', async () => { - const customPrompt = (metadata: CompletionMetadata) => ({ - system: 'Custom system prompt', - user: `Custom user prompt: ${metadata.textBeforeCursor}`, - }); - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve(MOCK_COMPLETION), - }); - - await copilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - options: { - customPrompt, - }, - }); - - expect(fetch).toHaveBeenCalledWith( - expect.any(String), - expect.objectContaining({ - method: 'POST', - body: expect.stringContaining('Custom system prompt'), - }), - ); - }); - - it('should use default prompt when custom prompt is not provided', async () => { - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve(MOCK_COMPLETION), - }); - - await copilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - }); - - expect(fetch).toHaveBeenCalledWith( - expect.any(String), - expect.objectContaining({ - method: 'POST', - body: expect.stringContaining('user'), - }), - ); - }); - - it('should use custom system prompt while retaining default user prompt', async () => { - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve(MOCK_COMPLETION), - }); - - await copilot.complete({ - body: { - completionMetadata: MOCK_COMPLETION_METADATA, - }, - options: { - customPrompt: () => ({ - system: 'You are an AI assistant specialized in writing React components.', - }), - }, - }); - - expect(fetch).toHaveBeenCalledWith( - expect.any(String), - expect.objectContaining({ - method: 'POST', - body: expect.stringContaining( - 'You are an AI assistant specialized in writing React components.', - ), - }), - ); - }); - - it('should pass complete CompletionMetadata to customPrompt and handle optional properties correctly', () => { - const customPrompt = (metadata: CompletionMetadata) => ({ - system: 'Custom system prompt', - user: `Custom user prompt: ${metadata.textBeforeCursor}`, - }); - - const prompt = customPrompt(MOCK_COMPLETION_METADATA); - - expect(prompt.system).toBe('Custom system prompt'); - expect(prompt.user).toBe('Custom user prompt: function hello() {'); - expect(prompt.system).toBeDefined(); - expect(prompt.user).toBeDefined(); - expect(prompt.system).not.toBeUndefined(); - expect(prompt.user).not.toBeUndefined(); - }); -}); diff --git a/packages/monacopilot/tests/mock.ts b/packages/monacopilot/tests/mock.ts index 1174c865..3413746f 100644 --- a/packages/monacopilot/tests/mock.ts +++ b/packages/monacopilot/tests/mock.ts @@ -20,9 +20,6 @@ export const MOCK_COMPLETION_METADATA: CompletionMetadata = { relatedFiles: [{path: './utils.js', content: 'function test() {}'}], textAfterCursor: 'console.log(', textBeforeCursor: 'function hello() {', - editorState: { - completionMode: 'complete', - }, }; export const MOCK_COMPLETION_POS: CursorPosition = { @@ -39,5 +36,5 @@ export const MOCK_COMPLETION = { export const MOCK_ERROR = new Error('API Error'); export const MOCK_NETWORK_ERROR = new Error('Network error'); -export const TEST_PROVIDER = 'anthropic'; -export const TEST_MODEL = 'claude-3-5-haiku'; +export const TEST_PROVIDER = 'mistral'; +export const TEST_MODEL = 'codestral'; diff --git a/playground/app/api/code-completion/route.ts b/playground/app/api/code-completion/route.ts index 22723910..d5a77709 100644 --- a/playground/app/api/code-completion/route.ts +++ b/playground/app/api/code-completion/route.ts @@ -2,9 +2,9 @@ import {NextRequest, NextResponse} from 'next/server'; import {CompletionCopilot} from 'monacopilot'; -const copilot = new CompletionCopilot(process.env.OPENAI_API_KEY, { - provider: 'openai', - model: 'gpt-4o-mini', +const copilot = new CompletionCopilot(process.env.MISTRAL_API_KEY, { + provider: 'mistral', + model: 'codestral', }); export async function POST(req: NextRequest) { diff --git a/playground/components/editor.tsx b/playground/components/editor.tsx index 094f5a33..1986abe9 100644 --- a/playground/components/editor.tsx +++ b/playground/components/editor.tsx @@ -1,42 +1,32 @@ 'use client'; -import {useEffect, useState} from 'react'; +import {useEffect, useRef} from 'react'; import {DEFAULT_MONACO_EDITOR_OPTIONS} from '@/constants/editor'; import MonacoEditor from '@monaco-editor/react'; -import { - registerCompletion, - type Monaco, - type StandaloneCodeEditor, -} from 'monacopilot'; +import {CompletionRegistration, registerCompletion} from 'monacopilot'; const Editor = () => { - const [monaco, setMonaco] = useState(null); - const [editor, setEditor] = useState(null); + const completionRef = useRef(null); useEffect(() => { - if (!monaco || !editor) return; - - const completion = registerCompletion(monaco, editor, { - endpoint: '/api/code-completion', - language: 'javascript', - }); - return () => { - completion.deregister(); + completionRef.current?.deregister(); }; - }, [monaco, editor]); + }, []); return ( { - setEditor(editor); - setMonaco(monaco); + completionRef.current = registerCompletion(monaco, editor, { + endpoint: '/api/code-completion', + language: 'python', + }); }} /> ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24ffa0a6..895555c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,13 +15,13 @@ importers: version: 19.7.1 '@ianvs/prettier-plugin-sort-imports': specifier: ^4.2.1 - version: 4.4.1(@vue/compiler-sfc@3.5.13)(prettier@3.5.1) + version: 4.4.1(@vue/compiler-sfc@3.5.13)(prettier@3.5.2) '@release-it/conventional-changelog': specifier: ^8.0.2 version: 8.0.2(release-it@17.11.0(typescript@5.7.3)) '@typescript-eslint/eslint-plugin': specifier: ^7.3.1 - version: 7.18.0(@typescript-eslint/parser@8.24.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + version: 7.18.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) bumpp: specifier: ^10.0.2 version: 10.0.3 @@ -33,7 +33,7 @@ importers: version: 9.1.7 prettier: specifier: ^3.2.5 - version: 3.5.1 + version: 3.5.2 typescript: specifier: ^5.4.3 version: 5.7.3 @@ -45,25 +45,16 @@ importers: devDependencies: vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.20.2)(@types/node@20.17.19)(postcss@8.5.2)(search-insights@2.17.3)(typescript@5.7.3) + version: 1.6.3(@algolia/client-search@5.20.3)(@types/node@20.17.19)(postcss@8.5.3)(search-insights@2.17.3)(typescript@5.7.3) packages/core: devDependencies: - '@anthropic-ai/sdk': - specifier: ^0.27.3 - version: 0.27.3 - '@google/generative-ai': - specifier: ^0.21.0 - version: 0.21.0 - groq-sdk: - specifier: ^0.3.2 - version: 0.3.3 - openai: - specifier: ^4.60.1 - version: 4.85.1 + '@mistralai/mistralai': + specifier: ^1.5.0 + version: 1.5.0(zod@3.24.2) tsup: specifier: ^8.0.2 - version: 8.3.6(jiti@2.4.2)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.4.3 version: 5.7.3 @@ -79,7 +70,7 @@ importers: version: 0.52.2 tsup: specifier: ^8.0.2 - version: 8.3.6(jiti@2.4.2)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.4.3 version: 5.7.3 @@ -91,10 +82,10 @@ importers: version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-dialog': specifier: ^1.1.6 - version: 1.1.6(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-slot': specifier: ^1.1.2 - version: 1.1.2(@types/react@19.0.8)(react@19.0.0) + version: 1.1.2(@types/react@19.0.10)(react@19.0.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -118,32 +109,32 @@ importers: version: 19.0.0(react@19.0.0) tailwind-merge: specifier: ^3.0.1 - version: 3.0.1 + version: 3.0.2 tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.17) devDependencies: '@eslint/eslintrc': specifier: ^3 - version: 3.2.0 + version: 3.3.0 '@types/node': specifier: ^20 version: 20.17.19 '@types/react': specifier: ^19 - version: 19.0.8 + version: 19.0.10 '@types/react-dom': specifier: ^19 - version: 19.0.3(@types/react@19.0.8) + version: 19.0.4(@types/react@19.0.10) eslint: specifier: ^9 - version: 9.20.1(jiti@2.4.2) + version: 9.21.0(jiti@2.4.2) eslint-config-next: specifier: 15.1.7 - version: 15.1.7(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + version: 15.1.7(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) postcss: specifier: ^8 - version: 8.5.2 + version: 8.5.3 tailwindcss: specifier: ^3.4.1 version: 3.4.17 @@ -184,94 +175,94 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.20.2': + '@algolia/client-abtesting@5.20.3': resolution: { - integrity: sha512-IS8JSFsDD33haaKIIFaL7qj3bEIG9GldZfb3ILW0QF3at7TcrIJYy58hrDvFee5T3p3E2aH/+wqIr0eha8jB/w==, + integrity: sha512-wPOzHYSsW+H97JkBLmnlOdJSpbb9mIiuNPycUCV5DgzSkJFaI/OFxXfZXAh1gqxK+hf0miKue1C9bltjWljrNA==, } engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.20.2': + '@algolia/client-analytics@5.20.3': resolution: { - integrity: sha512-k0KxCfcX/HZySqPasKy6GkiiDuebaMh2v/nE0HHg1PbsyeyagLapDi6Ktjkxhz8NlUq6eTJR+ddGJegippKQtQ==, + integrity: sha512-XE3iduH9lA7iTQacDGofBQyIyIgaX8qbTRRdj1bOCmfzc9b98CoiMwhNwdTifmmMewmN0EhVF3hP8KjKWwX7Yw==, } engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.20.2': + '@algolia/client-common@5.20.3': resolution: { - integrity: sha512-xoZcL/Uu49KYDb3feu2n06gALD17p5CslO8Zk3mZ7+uTurK3lgjLws7LNetZ172Ap/GpzPCRXI83d2iDoYQD6Q==, + integrity: sha512-IYRd/A/R3BXeaQVT2805lZEdWo54v39Lqa7ABOxIYnUvX2vvOMW1AyzCuT0U7Q+uPdD4UW48zksUKRixShcWxA==, } engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.20.2': + '@algolia/client-insights@5.20.3': resolution: { - integrity: sha512-fy7aCbo9y7WHt/9G03EYc471Dd5kIaM8PNP4z6AEQYr9a9X8c4inwNs6tePxAEfRHwVQi0CZ7kuVdn6/MjWx1A==, + integrity: sha512-QGc/bmDUBgzB71rDL6kihI2e1Mx6G6PxYO5Ks84iL3tDcIel1aFuxtRF14P8saGgdIe1B6I6QkpkeIddZ6vWQw==, } engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.20.2': + '@algolia/client-personalization@5.20.3': resolution: { - integrity: sha512-ocL1ZXulfuXzJAwsKw2kMscKMD0rs/f4CFYu6Gjh4mK4um6rGfa1a6u1MSc4swFqRQer0wNP9Pi+kVfKhuKt5A==, + integrity: sha512-zuM31VNPDJ1LBIwKbYGz/7+CSm+M8EhlljDamTg8AnDilnCpKjBebWZR5Tftv/FdWSro4tnYGOIz1AURQgZ+tQ==, } engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.20.2': + '@algolia/client-query-suggestions@5.20.3': resolution: { - integrity: sha512-Xjs4Tj1zkLCnmq1ys8RRhLQPy002I6GuT/nbHVdSQmQu4yKCI0gOFbwxHdM6yYPEuE3cJx7A4wSQjCH21mUKsg==, + integrity: sha512-Nn872PuOI8qzi1bxMMhJ0t2AzVBqN01jbymBQOkypvZHrrjZPso3iTpuuLLo9gi3yc/08vaaWTAwJfPhxPwJUw==, } engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.20.2': + '@algolia/client-search@5.20.3': resolution: { - integrity: sha512-2cD3RGB5byusLS0DAX1Nvl5MLiv7OoGgQrRs+94dTalqjvK8lGKzxxJhXoVojgx2qcROyIUAIDXFdTqv6NIHaA==, + integrity: sha512-9+Fm1ahV8/2goSIPIqZnVitV5yHW5E5xTdKy33xnqGd45A9yVv5tTkudWzEXsbfBB47j9Xb3uYPZjAvV5RHbKA==, } engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.20.2': + '@algolia/ingestion@1.20.3': resolution: { - integrity: sha512-S593Kmhc98+5zdzGet4GrZEBEBGl4vVtqg/MPfW8dCRf9qDRNYSkhBsIzlhQe9JWiohe9oB9LW5meibwOgRmww==, + integrity: sha512-5GHNTiZ3saLjTNyr6WkP5hzDg2eFFAYWomvPcm9eHWskjzXt8R0IOiW9kkTS6I6hXBwN5H9Zna5mZDSqqJdg+g==, } engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.20.2': + '@algolia/monitoring@1.20.3': resolution: { - integrity: sha512-bW41aWLYgBv/coJUIT85mkN3kk1VBKsM8tlwB5S/s446Mgc7r8t5TX7kA8kCR2UbwDedOK51i/85/x/rM0ZXbg==, + integrity: sha512-KUWQbTPoRjP37ivXSQ1+lWMfaifCCMzTnEcEnXwAmherS5Tp7us6BAqQDMGOD4E7xyaS2I8pto6WlOzxH+CxmA==, } engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.20.2': + '@algolia/recommend@5.20.3': resolution: { - integrity: sha512-wBMf3J1L5ogvU8p8ifHkknDXWn1zdZ2epkqpt2MkUaZynE3G77rrFU9frcO+Pu1FQJQ5xCDTKcYUUcJCDD00rg==, + integrity: sha512-oo/gG77xTTTclkrdFem0Kmx5+iSRFiwuRRdxZETDjwzCI7svutdbwBgV/Vy4D4QpYaX4nhY/P43k84uEowCE4Q==, } engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.20.2': + '@algolia/requester-browser-xhr@5.20.3': resolution: { - integrity: sha512-w+VMzOkIq2XDGg6Ybzr74RlBZvJQnuIdKpVusQSXCXknvxwAwbO457LmoavhZWl06Lcsk9YDx1X2k0zb+iJQmw==, + integrity: sha512-BkkW7otbiI/Er1AiEPZs1h7lxbtSO9p09jFhv3/iT8/0Yz0CY79VJ9iq+Wv1+dq/l0OxnMpBy8mozrieGA3mXQ==, } engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.20.2': + '@algolia/requester-fetch@5.20.3': resolution: { - integrity: sha512-wpjnbvbi3A13b0DvijE45DRYDvwcP5Ttz7RTMkPWTkF1s6AHuo6O2UcwGyaogMAGa1QOOzFYfp5u4YQwMOQx5g==, + integrity: sha512-eAVlXz7UNzTsA1EDr+p0nlIH7WFxo7k3NMxYe8p38DH8YVWLgm2MgOVFUMNg9HCi6ZNOi/A2w/id2ZZ4sKgUOw==, } engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.20.2': + '@algolia/requester-node-http@5.20.3': resolution: { - integrity: sha512-YuSSdtgUt1dFBTNYUb+2TA5j0Hd0eDXE0bVISjUvTCqmoaGsGLwW+rKI7p1eLQ1r7RESwBAvUwcY1qP2Wl3Lyw==, + integrity: sha512-FqR3pQPfHfQyX1wgcdK6iyqu86yP76MZd4Pzj1y/YLMj9rRmRCY0E0AffKr//nrOFEwv6uY8BQY4fd9/6b0ZCg==, } engines: {node: '>= 14.0.0'} @@ -282,12 +273,6 @@ packages: } engines: {node: '>=10'} - '@anthropic-ai/sdk@0.27.3': - resolution: - { - integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==, - } - '@babel/code-frame@7.26.2': resolution: { @@ -527,10 +512,10 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.0': resolution: { - integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==, + integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==, } engines: {node: '>=18'} cpu: [ppc64] @@ -545,10 +530,10 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.0': resolution: { - integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==, + integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==, } engines: {node: '>=18'} cpu: [arm64] @@ -563,10 +548,10 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.0': resolution: { - integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==, + integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==, } engines: {node: '>=18'} cpu: [arm] @@ -581,10 +566,10 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.0': resolution: { - integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==, + integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==, } engines: {node: '>=18'} cpu: [x64] @@ -599,10 +584,10 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.0': resolution: { - integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==, + integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==, } engines: {node: '>=18'} cpu: [arm64] @@ -617,10 +602,10 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.0': resolution: { - integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==, + integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==, } engines: {node: '>=18'} cpu: [x64] @@ -635,10 +620,10 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.0': resolution: { - integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==, + integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==, } engines: {node: '>=18'} cpu: [arm64] @@ -653,10 +638,10 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.0': resolution: { - integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==, + integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==, } engines: {node: '>=18'} cpu: [x64] @@ -671,10 +656,10 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.0': resolution: { - integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==, + integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==, } engines: {node: '>=18'} cpu: [arm64] @@ -689,10 +674,10 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.0': resolution: { - integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==, + integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==, } engines: {node: '>=18'} cpu: [arm] @@ -707,10 +692,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.0': resolution: { - integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==, + integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==, } engines: {node: '>=18'} cpu: [ia32] @@ -725,10 +710,10 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.0': resolution: { - integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==, + integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==, } engines: {node: '>=18'} cpu: [loong64] @@ -743,10 +728,10 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.0': resolution: { - integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==, + integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==, } engines: {node: '>=18'} cpu: [mips64el] @@ -761,10 +746,10 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.0': resolution: { - integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==, + integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==, } engines: {node: '>=18'} cpu: [ppc64] @@ -779,10 +764,10 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.0': resolution: { - integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==, + integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==, } engines: {node: '>=18'} cpu: [riscv64] @@ -797,10 +782,10 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.0': resolution: { - integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==, + integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==, } engines: {node: '>=18'} cpu: [s390x] @@ -815,19 +800,19 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.0': resolution: { - integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==, + integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==, } engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.0': resolution: { - integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==, + integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==, } engines: {node: '>=18'} cpu: [arm64] @@ -842,19 +827,19 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.0': resolution: { - integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==, + integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==, } engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.0': resolution: { - integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==, + integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==, } engines: {node: '>=18'} cpu: [arm64] @@ -869,10 +854,10 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.0': resolution: { - integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==, + integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==, } engines: {node: '>=18'} cpu: [x64] @@ -887,10 +872,10 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.0': resolution: { - integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==, + integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==, } engines: {node: '>=18'} cpu: [x64] @@ -905,10 +890,10 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.0': resolution: { - integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==, + integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==, } engines: {node: '>=18'} cpu: [arm64] @@ -923,10 +908,10 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.0': resolution: { - integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==, + integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==, } engines: {node: '>=18'} cpu: [ia32] @@ -941,10 +926,10 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.0': resolution: { - integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==, + integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==, } engines: {node: '>=18'} cpu: [x64] @@ -973,17 +958,10 @@ packages: } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: - { - integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==, - } - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.11.0': + '@eslint/core@0.12.0': resolution: { - integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==, + integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -994,10 +972,10 @@ packages: } engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': resolution: { - integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==, + integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1008,10 +986,10 @@ packages: } engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.20.0': + '@eslint/js@9.21.0': resolution: { - integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==, + integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1022,20 +1000,13 @@ packages: } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': resolution: { - integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==, + integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@google/generative-ai@0.21.0': - resolution: - { - integrity: sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==, - } - engines: {node: '>=18.0.0'} - '@humanfs/core@0.19.1': resolution: { @@ -1079,10 +1050,10 @@ packages: } engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': + '@humanwhocodes/retry@0.4.2': resolution: { - integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==, + integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==, } engines: {node: '>=18.18'} @@ -1111,10 +1082,10 @@ packages: integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==, } - '@iconify-json/simple-icons@1.2.24': + '@iconify-json/simple-icons@1.2.26': resolution: { - integrity: sha512-06ZWXZx3PHCE+02zn+iIGOKKNgE3kyPd0Yh7IUEIa0bCYI6UmGlsYYghRx8As9TnTNYMCEiy5V0zI4Jb6EY6XA==, + integrity: sha512-NvqRuE+5h/tp4boPlnvfs0alD0CvnRE7oeG9Li5NGmZRx2/rhwlNjW/vEVTyhZcR9zqvRPAVh2GXR+PTEpzV+A==, } '@iconify/types@2.0.0': @@ -1332,6 +1303,14 @@ packages: integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, } + '@mistralai/mistralai@1.5.0': + resolution: + { + integrity: sha512-AIn8pwAwA/fDvEUvmkt+40zH1ZmfaG3Q7oUWl17GUEC1tU7ZPwYz8Cv9P59lyS1SisHdDSu81oknO7f1ywkz8Q==, + } + peerDependencies: + zod: '>= 3' + '@monaco-editor/loader@1.5.0': resolution: { @@ -1474,17 +1453,17 @@ packages: } engines: {node: '>= 18'} - '@octokit/endpoint@9.0.5': + '@octokit/endpoint@9.0.6': resolution: { - integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==, + integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==, } engines: {node: '>= 18'} - '@octokit/graphql@7.1.0': + '@octokit/graphql@7.1.1': resolution: { - integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==, + integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==, } engines: {node: '>= 18'} @@ -1521,17 +1500,17 @@ packages: peerDependencies: '@octokit/core': ^5 - '@octokit/request-error@5.1.0': + '@octokit/request-error@5.1.1': resolution: { - integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==, + integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==, } engines: {node: '>= 18'} - '@octokit/request@8.4.0': + '@octokit/request@8.4.1': resolution: { - integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==, + integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==, } engines: {node: '>= 18'} @@ -1795,154 +1774,154 @@ packages: peerDependencies: release-it: ^17.0.0 - '@rollup/rollup-android-arm-eabi@4.34.7': + '@rollup/rollup-android-arm-eabi@4.34.8': resolution: { - integrity: sha512-l6CtzHYo8D2TQ3J7qJNpp3Q1Iye56ssIAtqbM2H8axxCEEwvN7o8Ze9PuIapbxFL3OHrJU2JBX6FIIVnP/rYyw==, + integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==, } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.7': + '@rollup/rollup-android-arm64@4.34.8': resolution: { - integrity: sha512-KvyJpFUueUnSp53zhAa293QBYqwm94TgYTIfXyOTtidhm5V0LbLCJQRGkQClYiX3FXDQGSvPxOTD/6rPStMMDg==, + integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==, } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.7': + '@rollup/rollup-darwin-arm64@4.34.8': resolution: { - integrity: sha512-jq87CjmgL9YIKvs8ybtIC98s/M3HdbqXhllcy9EdLV0yMg1DpxES2gr65nNy7ObNo/vZ/MrOTxt0bE5LinL6mA==, + integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==, } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.7': + '@rollup/rollup-darwin-x64@4.34.8': resolution: { - integrity: sha512-rSI/m8OxBjsdnMMg0WEetu/w+LhLAcCDEiL66lmMX4R3oaml3eXz3Dxfvrxs1FbzPbJMaItQiksyMfv1hoIxnA==, + integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==, } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.7': + '@rollup/rollup-freebsd-arm64@4.34.8': resolution: { - integrity: sha512-oIoJRy3ZrdsXpFuWDtzsOOa/E/RbRWXVokpVrNnkS7npz8GEG++E1gYbzhYxhxHbO2om1T26BZjVmdIoyN2WtA==, + integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==, } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.7': + '@rollup/rollup-freebsd-x64@4.34.8': resolution: { - integrity: sha512-X++QSLm4NZfZ3VXGVwyHdRf58IBbCu9ammgJxuWZYLX0du6kZvdNqPwrjvDfwmi6wFdvfZ/s6K7ia0E5kI7m8Q==, + integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==, } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.7': + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': resolution: { - integrity: sha512-Z0TzhrsNqukTz3ISzrvyshQpFnFRfLunYiXxlCRvcrb3nvC5rVKI+ZXPFG/Aa4jhQa1gHgH3A0exHaRRN4VmdQ==, + integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==, } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.7': + '@rollup/rollup-linux-arm-musleabihf@4.34.8': resolution: { - integrity: sha512-nkznpyXekFAbvFBKBy4nNppSgneB1wwG1yx/hujN3wRnhnkrYVugMTCBXED4+Ni6thoWfQuHNYbFjgGH0MBXtw==, + integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==, } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.7': + '@rollup/rollup-linux-arm64-gnu@4.34.8': resolution: { - integrity: sha512-KCjlUkcKs6PjOcxolqrXglBDcfCuUCTVlX5BgzgoJHw+1rWH1MCkETLkLe5iLLS9dP5gKC7mp3y6x8c1oGBUtA==, + integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==, } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.7': + '@rollup/rollup-linux-arm64-musl@4.34.8': resolution: { - integrity: sha512-uFLJFz6+utmpbR313TTx+NpPuAXbPz4BhTQzgaP0tozlLnGnQ6rCo6tLwaSa6b7l6gRErjLicXQ1iPiXzYotjw==, + integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==, } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.7': + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': resolution: { - integrity: sha512-ws8pc68UcJJqCpneDFepnwlsMUFoWvPbWXT/XUrJ7rWUL9vLoIN3GAasgG+nCvq8xrE3pIrd+qLX/jotcLy0Qw==, + integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==, } cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.7': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': resolution: { - integrity: sha512-vrDk9JDa/BFkxcS2PbWpr0C/LiiSLxFbNOBgfbW6P8TBe9PPHx9Wqbvx2xgNi1TOAyQHQJ7RZFqBiEohm79r0w==, + integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==, } cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.7': + '@rollup/rollup-linux-riscv64-gnu@4.34.8': resolution: { - integrity: sha512-rB+ejFyjtmSo+g/a4eovDD1lHWHVqizN8P0Hm0RElkINpS0XOdpaXloqM4FBkF9ZWEzg6bezymbpLmeMldfLTw==, + integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==, } cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.7': + '@rollup/rollup-linux-s390x-gnu@4.34.8': resolution: { - integrity: sha512-nNXNjo4As6dNqRn7OrsnHzwTgtypfRA3u3AKr0B3sOOo+HkedIbn8ZtFnB+4XyKJojIfqDKmbIzO1QydQ8c+Pw==, + integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==, } cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.7': + '@rollup/rollup-linux-x64-gnu@4.34.8': resolution: { - integrity: sha512-9kPVf9ahnpOMSGlCxXGv980wXD0zRR3wyk8+33/MXQIpQEOpaNe7dEHm5LMfyRZRNt9lMEQuH0jUKj15MkM7QA==, + integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==, } cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.7': + '@rollup/rollup-linux-x64-musl@4.34.8': resolution: { - integrity: sha512-7wJPXRWTTPtTFDFezA8sle/1sdgxDjuMoRXEKtx97ViRxGGkVQYovem+Q8Pr/2HxiHp74SSRG+o6R0Yq0shPwQ==, + integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==, } cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.7': + '@rollup/rollup-win32-arm64-msvc@4.34.8': resolution: { - integrity: sha512-MN7aaBC7mAjsiMEZcsJvwNsQVNZShgES/9SzWp1HC9Yjqb5OpexYnRjF7RmE4itbeesHMYYQiAtUAQaSKs2Rfw==, + integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==, } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.7': + '@rollup/rollup-win32-ia32-msvc@4.34.8': resolution: { - integrity: sha512-aeawEKYswsFu1LhDM9RIgToobquzdtSc4jSVqHV8uApz4FVvhFl/mKh92wc8WpFc6aYCothV/03UjY6y7yLgbg==, + integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==, } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.7': + '@rollup/rollup-win32-x64-msvc@4.34.8': resolution: { - integrity: sha512-4ZedScpxxIrVO7otcZ8kCX1mZArtH2Wfj3uFCxRJ9NO80gg1XV0U/b2f/MKaGwj2X3QopHfoWiDQ917FRpwY3w==, + integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==, } cpu: [x64] os: [win32] @@ -1959,52 +1938,52 @@ packages: integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==, } - '@shikijs/core@2.3.2': + '@shikijs/core@2.5.0': resolution: { - integrity: sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==, + integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==, } - '@shikijs/engine-javascript@2.3.2': + '@shikijs/engine-javascript@2.5.0': resolution: { - integrity: sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==, + integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==, } - '@shikijs/engine-oniguruma@2.3.2': + '@shikijs/engine-oniguruma@2.5.0': resolution: { - integrity: sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==, + integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==, } - '@shikijs/langs@2.3.2': + '@shikijs/langs@2.5.0': resolution: { - integrity: sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==, + integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==, } - '@shikijs/themes@2.3.2': + '@shikijs/themes@2.5.0': resolution: { - integrity: sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==, + integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==, } - '@shikijs/transformers@2.3.2': + '@shikijs/transformers@2.5.0': resolution: { - integrity: sha512-2HDnJumw8A/9GecRpTgvfqSbPjEbJ4DPWq5J++OVP1gNMLvbV0MqFsP4canqRNM1LqB7VmWY45Stipb0ZIJ+0A==, + integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==, } - '@shikijs/types@2.3.2': + '@shikijs/types@2.5.0': resolution: { - integrity: sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==, + integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==, } - '@shikijs/vscode-textmate@10.0.1': + '@shikijs/vscode-textmate@10.0.2': resolution: { - integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==, + integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==, } '@sindresorhus/merge-streams@2.3.0': @@ -2086,18 +2065,6 @@ packages: integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==, } - '@types/node-fetch@2.6.12': - resolution: - { - integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==, - } - - '@types/node@18.19.76': - resolution: - { - integrity: sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==, - } - '@types/node@20.17.19': resolution: { @@ -2110,18 +2077,18 @@ packages: integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, } - '@types/react-dom@19.0.3': + '@types/react-dom@19.0.4': resolution: { - integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==, + integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==, } peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.8': + '@types/react@19.0.10': resolution: { - integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==, + integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==, } '@types/semver@7.5.8': @@ -2156,10 +2123,10 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.24.0': + '@typescript-eslint/parser@8.25.0': resolution: { - integrity: sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==, + integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -2173,10 +2140,10 @@ packages: } engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.24.0': + '@typescript-eslint/scope-manager@8.25.0': resolution: { - integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==, + integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2200,10 +2167,10 @@ packages: } engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.24.0': + '@typescript-eslint/types@8.25.0': resolution: { - integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==, + integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2219,10 +2186,10 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.24.0': + '@typescript-eslint/typescript-estree@8.25.0': resolution: { - integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==, + integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -2244,10 +2211,10 @@ packages: } engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.24.0': + '@typescript-eslint/visitor-keys@8.25.0': resolution: { - integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==, + integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2391,16 +2358,16 @@ packages: integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==, } - '@vueuse/core@12.6.1': + '@vueuse/core@12.7.0': resolution: { - integrity: sha512-FpgM1tXGAHsAC5n4Tflyg0vSoJUmdevfKaAhKFdxiK9BTIdHOHOiWmo+xivwdzjYFIvI8cEeJWYuqs646jOM2w==, + integrity: sha512-jtK5B7YjZXmkGNHjviyGO4s3ZtEhbzSgrbX+s5o+Lr8i2nYqNyHuPVOeTdM1/hZ5Tkxg/KktAuAVDDiHMraMVA==, } - '@vueuse/integrations@12.6.1': + '@vueuse/integrations@12.7.0': resolution: { - integrity: sha512-TsX9noygHqZGGoAcvvu+DoSGtbeuVl49V6gZZLgNxmKGeAxH2wQrlS3/7TM2wNczIkKV541bbOmhcQH6D+CM4Q==, + integrity: sha512-IEq7K4bCl7mn3uKJaWtNXnd1CAPaHLUMuyj5K1/k/pVcItt0VONZW8xiGxdIovJcQjkzOHjImhX5t6gija+0/g==, } peerDependencies: async-validator: ^4 @@ -2441,16 +2408,16 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@12.6.1': + '@vueuse/metadata@12.7.0': resolution: { - integrity: sha512-2094HNXGdsU3aqRbad0vmlRgGncMC4u2f6nFdW1mUn7b7ym4hORrDZfyeq8G5BfGvX4y0zZynWfCdtB2WwpyVw==, + integrity: sha512-4VvTH9mrjXqFN5LYa5YfqHVRI6j7R00Vy4995Rw7PQxyCL3z0Lli86iN4UemWqixxEvYfRjG+hF9wL8oLOn+3g==, } - '@vueuse/shared@12.6.1': + '@vueuse/shared@12.7.0': resolution: { - integrity: sha512-ukTb2na19KT1/YVjj4CYBDOgiV/xmsSJRL6TcKeiz2db+P5bT3I0OJxy38eRR3WSN8CmSnt7MdVJ16vX6VZFxg==, + integrity: sha512-coLlUw2HHKsm7rPN6WqHJQr18WymN4wkA/3ThFaJ4v4gWGWAQQGK+MJxLuJTBs4mojQiazlVWAKNJNpUWGRkNw==, } JSONStream@1.3.5: @@ -2460,13 +2427,6 @@ packages: } hasBin: true - abort-controller@3.0.0: - resolution: - { - integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, - } - engines: {node: '>=6.5'} - acorn-jsx@5.3.2: resolution: { @@ -2496,13 +2456,6 @@ packages: } engines: {node: '>= 14'} - agentkeepalive@4.6.0: - resolution: - { - integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==, - } - engines: {node: '>= 8.0.0'} - ajv@6.12.6: resolution: { @@ -2515,10 +2468,10 @@ packages: integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, } - algoliasearch@5.20.2: + algoliasearch@5.20.3: resolution: { - integrity: sha512-8evxG++iWyWnhng3g5RP+kwn6j+2vKLfew8pVoekn87FcfsDm92zJXKwSrU6pl+m5eAbGFhFF/gCYEQiRdbPlA==, + integrity: sha512-iNC6BGvipaalFfDfDnXUje8GUlW5asj0cTMsZJwO/0rhsyLx1L7GZFAY8wW+eQ6AM4Yge2p5GSE5hrBlfSD90Q==, } engines: {node: '>= 14.0.0'} @@ -2710,12 +2663,6 @@ packages: integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, } - asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - atomically@2.0.3: resolution: { @@ -2749,12 +2696,6 @@ packages: integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, } - base-64@0.1.0: - resolution: - { - integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==, - } - base64-js@1.5.1: resolution: { @@ -2862,10 +2803,10 @@ packages: } engines: {node: '>=10.16.0'} - c12@2.0.2: + c12@2.0.4: resolution: { - integrity: sha512-NkvlL5CHZt9kPswJYDCUYtTaMt7JOfcpsnNncfj7sWsc13x6Wz+GiTpBtqZOojFlzyTHui8+OAfR6praV6PYaQ==, + integrity: sha512-3DbbhnFt0fKJHxU4tEUPmD1ahWE4PWPMomqfYsTJdrhpmEnRKJi3qSC4rO5U6E6zN1+pjBY7+z8fUmNRMaVKLw==, } peerDependencies: magicast: ^0.3.5 @@ -2922,10 +2863,10 @@ packages: } engines: {node: '>=16'} - caniuse-lite@1.0.30001699: + caniuse-lite@1.0.30001700: resolution: { - integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==, + integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==, } ccount@2.0.1: @@ -2973,12 +2914,6 @@ packages: integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, } - charenc@0.0.2: - resolution: - { - integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, - } - check-error@2.1.1: resolution: { @@ -3114,13 +3049,6 @@ packages: } engines: {node: '>=12.5.0'} - combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: {node: '>= 0.8'} - comma-separated-tokens@2.0.3: resolution: { @@ -3331,12 +3259,6 @@ packages: } engines: {node: '>= 8'} - crypt@0.0.2: - resolution: - { - integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, - } - cssesc@3.0.0: resolution: { @@ -3489,13 +3411,6 @@ packages: } engines: {node: '>= 14'} - delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: {node: '>=0.4.0'} - deprecation@2.3.1: resolution: { @@ -3540,12 +3455,6 @@ packages: integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, } - digest-fetch@1.3.0: - resolution: - { - integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==, - } - dir-glob@3.0.1: resolution: { @@ -3728,10 +3637,10 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.24.2: + esbuild@0.25.0: resolution: { - integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==, + integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==, } engines: {node: '>=18'} hasBin: true @@ -3783,10 +3692,10 @@ packages: integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, } - eslint-import-resolver-typescript@3.8.0: + eslint-import-resolver-typescript@3.8.3: resolution: { - integrity: sha512-fItUrP/+xwpavWgadrn6lsvcMe80s08xIVFXkUXvhR4cZD2ga96kRF/z/iFGDI7ZDnvtlaZ0wGic7Tw+DhgVnA==, + integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==, } engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3900,10 +3809,10 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@9.20.1: + eslint@9.21.0: resolution: { - integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==, + integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==, } engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true @@ -3975,13 +3884,6 @@ packages: } engines: {node: '>=0.10.0'} - event-target-shim@5.0.1: - resolution: - { - integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, - } - engines: {node: '>=6'} - execa@5.1.1: resolution: { @@ -4121,10 +4023,10 @@ packages: } engines: {node: '>=16'} - flatted@3.3.2: + flatted@3.3.3: resolution: { - integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==, + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, } focus-trap@7.6.4: @@ -4140,33 +4042,13 @@ packages: } engines: {node: '>= 0.4'} - foreground-child@3.3.0: + foreground-child@3.3.1: resolution: { - integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, } engines: {node: '>=14'} - form-data-encoder@1.7.2: - resolution: - { - integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==, - } - - form-data@4.0.1: - resolution: - { - integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==, - } - engines: {node: '>= 6'} - - formdata-node@4.4.1: - resolution: - { - integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, - } - engines: {node: '>= 12.20'} - fs-minipass@2.1.0: resolution: { @@ -4221,10 +4103,10 @@ packages: } engines: {node: '>=18'} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: resolution: { - integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==, + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, } engines: {node: '>= 0.4'} @@ -4276,10 +4158,10 @@ packages: } engines: {node: '>= 14'} - giget@1.2.4: + giget@1.2.5: resolution: { - integrity: sha512-Wv+daGyispVoA31TrWAVR+aAdP7roubTPEM/8JzRnqXhLbdJH0T9eQyXVFF8fjk3WKTsctII6QcyxILYgNp2DA==, + integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==, } hasBin: true @@ -4421,12 +4303,6 @@ packages: integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, } - groq-sdk@0.3.3: - resolution: - { - integrity: sha512-wdOeZ2QymPjjP3tmFpUAnfMisoLbt7xF2MfpROeFAngcqWbfTyB9j9pMWSEAMF/E4gZx8f2Y+5zswO0q92CSxA==, - } - handlebars@4.7.8: resolution: { @@ -4483,10 +4359,10 @@ packages: } engines: {node: '>= 0.4'} - hast-util-to-html@9.0.4: + hast-util-to-html@9.0.5: resolution: { - integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==, + integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==, } hast-util-whitespace@3.0.0: @@ -4542,12 +4418,6 @@ packages: } engines: {node: '>=16.17.0'} - humanize-ms@1.2.1: - resolution: - { - integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, - } - husky@9.1.7: resolution: { @@ -4697,12 +4567,6 @@ packages: } engines: {node: '>= 0.4'} - is-buffer@1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } - is-bun-module@1.3.0: resolution: { @@ -5393,12 +5257,6 @@ packages: } engines: {node: '>= 0.4'} - md5@2.3.0: - resolution: - { - integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, - } - mdast-util-to-hast@13.2.0: resolution: { @@ -5544,10 +5402,10 @@ packages: } engines: {node: '>=16 || 14 >=14.17'} - minisearch@7.1.1: + minisearch@7.1.2: resolution: { - integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==, + integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==, } minizlib@2.1.2: @@ -5660,31 +5518,12 @@ packages: sass: optional: true - node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - } - engines: {node: '>=10.5.0'} - node-fetch-native@1.6.6: resolution: { integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==, } - node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - normalize-package-data@6.0.2: resolution: { @@ -5713,10 +5552,10 @@ packages: } engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nypm@0.5.2: + nypm@0.5.4: resolution: { - integrity: sha512-AHzvnyUJYSrrphPhRWWZNcoZfArGNp3Vrc4pm/ZurO74tYNTgAPrEyBQEKy+qioqmWlPXwvMZCG2wOaHlPG0Pw==, + integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==, } engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -5784,10 +5623,10 @@ packages: } engines: {node: '>= 0.4'} - ohash@1.1.4: + ohash@2.0.5: resolution: { - integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==, + integrity: sha512-3k3APZwRRPYyohdIDmPTpe5i0AY5lm7gvu/Oip7tZrTaEGfSlKX+7kXUoWLd9sHX0GDRVwVvlW18yEcD7qS1zw==, } once@1.4.0: @@ -5817,10 +5656,10 @@ packages: } engines: {node: '>=18'} - oniguruma-to-es@3.1.0: + oniguruma-to-es@3.1.1: resolution: { - integrity: sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw==, + integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==, } open@10.1.0: @@ -5830,21 +5669,6 @@ packages: } engines: {node: '>=18'} - openai@4.85.1: - resolution: - { - integrity: sha512-jkX2fntHljUvSH3MkWh4jShl10oNkb+SsCj4auKlbu2oF4KWAnmHLNR5EpnUHK1ZNW05Rp0fjbJzYwQzMsH8ZA==, - } - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - optionator@0.9.4: resolution: { @@ -5915,10 +5739,10 @@ packages: } engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - pac-proxy-agent@7.1.0: + pac-proxy-agent@7.2.0: resolution: { - integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==, + integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==, } engines: {node: '>= 14'} @@ -6198,17 +6022,17 @@ packages: } engines: {node: ^10 || ^12 || >=14} - postcss@8.5.2: + postcss@8.5.3: resolution: { - integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==, + integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, } engines: {node: ^10 || ^12 || >=14} - preact@10.25.4: + preact@10.26.2: resolution: { - integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==, + integrity: sha512-0gNmv4qpS9HaN3+40CLBAnKe0ZfyE4ZWo5xKlC1rVrr0ckkEvJvAQqKaHANdFKsGstoxrY4AItZ7kZSGVoVjgg==, } prelude-ls@1.2.1: @@ -6218,10 +6042,10 @@ packages: } engines: {node: '>= 0.8.0'} - prettier@3.5.1: + prettier@3.5.2: resolution: { - integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==, + integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==, } engines: {node: '>=14'} hasBin: true @@ -6239,10 +6063,10 @@ packages: integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, } - property-information@6.5.0: + property-information@7.0.0: resolution: { - integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==, + integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==, } proto-list@1.2.4: @@ -6397,10 +6221,10 @@ packages: } engines: {node: '>=8.10.0'} - readdirp@4.1.1: + readdirp@4.1.2: resolution: { - integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==, + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, } engines: {node: '>= 14.18.0'} @@ -6535,10 +6359,10 @@ packages: } engines: {node: '>= 4'} - reusify@1.0.4: + reusify@1.1.0: resolution: { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, } engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6556,10 +6380,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.34.7: + rollup@4.34.8: resolution: { - integrity: sha512-8qhyN0oZ4x0H6wmBgfKxJtxM7qS98YJ0k0kNh5ECVtuchIJ7z9IVVvzpmtQyT10PXKMtBxYr1wQ5Apg8RS8kXQ==, + integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==, } engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -6584,10 +6408,10 @@ packages: integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, } - rxjs@7.8.1: + rxjs@7.8.2: resolution: { - integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, } safe-array-concat@1.1.3: @@ -6708,10 +6532,10 @@ packages: engines: {node: '>=4'} hasBin: true - shiki@2.3.2: + shiki@2.5.0: resolution: { - integrity: sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw==, + integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==, } side-channel-list@1.0.0: @@ -7097,10 +6921,10 @@ packages: integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==, } - tailwind-merge@3.0.1: + tailwind-merge@3.0.2: resolution: { - integrity: sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g==, + integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==, } tailwindcss-animate@1.0.7: @@ -7177,10 +7001,10 @@ packages: integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, } - tinyglobby@0.2.10: + tinyglobby@0.2.12: resolution: { - integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==, + integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, } engines: {node: '>=12.0.0'} @@ -7219,12 +7043,6 @@ packages: } engines: {node: '>=8.0'} - tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - tr46@1.0.1: resolution: { @@ -7280,10 +7098,10 @@ packages: integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, } - tsup@8.3.6: + tsup@8.4.0: resolution: { - integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==, + integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==, } engines: {node: '>=18'} hasBin: true @@ -7337,10 +7155,10 @@ packages: } engines: {node: '>=14.16'} - type-fest@4.34.1: + type-fest@4.35.0: resolution: { - integrity: sha512-6kSc32kT0rbwxD6QL1CYe8IqdzN/J/ILMrNK+HMQCKH3insCDRY/3ITb0vcBss0a3t72fzh2YSzj8ko1HgwT3g==, + integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==, } engines: {node: '>=16'} @@ -7407,12 +7225,6 @@ packages: } engines: {node: '>= 0.4'} - undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } - undici-types@6.19.8: resolution: { @@ -7634,38 +7446,12 @@ packages: integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, } - web-streams-polyfill@3.3.3: - resolution: - { - integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==, - } - engines: {node: '>= 8'} - - web-streams-polyfill@4.0.0-beta.3: - resolution: - { - integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, - } - engines: {node: '>= 14'} - - webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - webidl-conversions@4.0.2: resolution: { integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, } - whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } - whatwg-url@7.1.0: resolution: { @@ -7852,6 +7638,20 @@ packages: } engines: {node: '>=18'} + zod-to-json-schema@3.24.3: + resolution: + { + integrity: sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==, + } + peerDependencies: + zod: ^3.24.1 + + zod@3.24.2: + resolution: + { + integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==, + } + zwitch@2.0.4: resolution: { @@ -7859,125 +7659,113 @@ packages: } snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) - '@algolia/client-search': 5.20.2 - algoliasearch: 5.20.2 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3) + '@algolia/client-search': 5.20.3 + algoliasearch: 5.20.3 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3)': dependencies: - '@algolia/client-search': 5.20.2 - algoliasearch: 5.20.2 + '@algolia/client-search': 5.20.3 + algoliasearch: 5.20.3 - '@algolia/client-abtesting@5.20.2': + '@algolia/client-abtesting@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/client-analytics@5.20.2': + '@algolia/client-analytics@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/client-common@5.20.2': {} + '@algolia/client-common@5.20.3': {} - '@algolia/client-insights@5.20.2': + '@algolia/client-insights@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/client-personalization@5.20.2': + '@algolia/client-personalization@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/client-query-suggestions@5.20.2': + '@algolia/client-query-suggestions@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/client-search@5.20.2': + '@algolia/client-search@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/ingestion@1.20.2': + '@algolia/ingestion@1.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/monitoring@1.20.2': + '@algolia/monitoring@1.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/recommend@5.20.2': + '@algolia/recommend@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + '@algolia/client-common': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 - '@algolia/requester-browser-xhr@5.20.2': + '@algolia/requester-browser-xhr@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 + '@algolia/client-common': 5.20.3 - '@algolia/requester-fetch@5.20.2': + '@algolia/requester-fetch@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 + '@algolia/client-common': 5.20.3 - '@algolia/requester-node-http@5.20.2': + '@algolia/requester-node-http@5.20.3': dependencies: - '@algolia/client-common': 5.20.2 + '@algolia/client-common': 5.20.3 '@alloc/quick-lru@5.2.0': {} - '@anthropic-ai/sdk@0.27.3': - dependencies: - '@types/node': 18.19.76 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -8140,10 +7928,10 @@ snapshots: '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3)': + '@docsearch/js@3.8.2(@algolia/client-search@5.20.3)(search-insights@2.17.3)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3) - preact: 10.25.4 + '@docsearch/react': 3.8.2(@algolia/client-search@5.20.3)(search-insights@2.17.3) + preact: 10.26.2 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -8151,12 +7939,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3)': + '@docsearch/react@3.8.2(@algolia/client-search@5.20.3)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.20.3)(algoliasearch@5.20.3) '@docsearch/css': 3.8.2 - algoliasearch: 5.20.2 + algoliasearch: 5.20.3 optionalDependencies: search-insights: 2.17.3 transitivePeerDependencies: @@ -8170,145 +7958,145 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.0': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.0': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.0': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.0': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.0': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.0': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.0': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.0': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.0': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.0': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.0': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.0': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.0': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.0': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.0': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.0': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.0': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.0': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.0': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.0': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.0': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.0': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.0': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.0': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.0': optional: true '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': @@ -8316,9 +8104,9 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@2.4.2))': dependencies: - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -8331,11 +8119,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.11.0': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 @@ -8353,7 +8137,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -8369,17 +8153,15 @@ snapshots: '@eslint/js@8.57.1': {} - '@eslint/js@9.20.0': {} + '@eslint/js@9.21.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.12.0 levn: 0.4.1 - '@google/generative-ai@0.21.0': {} - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -8401,17 +8183,17 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@hutson/parse-repository-url@5.0.0': {} - '@ianvs/prettier-plugin-sort-imports@4.4.1(@vue/compiler-sfc@3.5.13)(prettier@3.5.1)': + '@ianvs/prettier-plugin-sort-imports@4.4.1(@vue/compiler-sfc@3.5.13)(prettier@3.5.2)': dependencies: '@babel/generator': 7.26.9 '@babel/parser': 7.26.9 '@babel/traverse': 7.26.9 '@babel/types': 7.26.9 - prettier: 3.5.1 + prettier: 3.5.2 semver: 7.7.1 optionalDependencies: '@vue/compiler-sfc': 3.5.13 @@ -8420,7 +8202,7 @@ snapshots: '@iarna/toml@2.2.5': {} - '@iconify-json/simple-icons@1.2.24': + '@iconify-json/simple-icons@1.2.26': dependencies: '@iconify/types': 2.0.0 @@ -8529,6 +8311,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@mistralai/mistralai@1.5.0(zod@3.24.2)': + dependencies: + zod: 3.24.2 + zod-to-json-schema: 3.24.3(zod@3.24.2) + '@monaco-editor/loader@1.5.0': dependencies: state-local: 1.0.7 @@ -8589,21 +8376,21 @@ snapshots: '@octokit/core@5.2.0': dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.0 - '@octokit/request': 8.4.0 - '@octokit/request-error': 5.1.0 + '@octokit/graphql': 7.1.1 + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 '@octokit/types': 13.8.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 - '@octokit/endpoint@9.0.5': + '@octokit/endpoint@9.0.6': dependencies: '@octokit/types': 13.8.0 universal-user-agent: 6.0.1 - '@octokit/graphql@7.1.0': + '@octokit/graphql@7.1.1': dependencies: - '@octokit/request': 8.4.0 + '@octokit/request': 8.4.1 '@octokit/types': 13.8.0 universal-user-agent: 6.0.1 @@ -8623,16 +8410,16 @@ snapshots: '@octokit/core': 5.2.0 '@octokit/types': 13.8.0 - '@octokit/request-error@5.1.0': + '@octokit/request-error@5.1.1': dependencies: '@octokit/types': 13.8.0 deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@8.4.0': + '@octokit/request@8.4.1': dependencies: - '@octokit/endpoint': 9.0.5 - '@octokit/request-error': 5.1.0 + '@octokit/endpoint': 9.0.6 + '@octokit/request-error': 5.1.1 '@octokit/types': 13.8.0 universal-user-agent: 6.0.1 @@ -8664,138 +8451,138 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-context@1.1.1(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-context@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-dialog@1.1.6(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dialog@1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) aria-hidden: 1.2.4 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.3(@types/react@19.0.8)(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) optionalDependencies: - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-id@1.1.0(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-id@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-slot@1.1.2(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 '@release-it/conventional-changelog@8.0.2(release-it@17.11.0(typescript@5.7.3))': dependencies: @@ -8809,106 +8596,106 @@ snapshots: - conventional-commits-filter - conventional-commits-parser - '@rollup/rollup-android-arm-eabi@4.34.7': + '@rollup/rollup-android-arm-eabi@4.34.8': optional: true - '@rollup/rollup-android-arm64@4.34.7': + '@rollup/rollup-android-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-arm64@4.34.7': + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-x64@4.34.7': + '@rollup/rollup-darwin-x64@4.34.8': optional: true - '@rollup/rollup-freebsd-arm64@4.34.7': + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - '@rollup/rollup-freebsd-x64@4.34.7': + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.7': + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.7': + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.7': + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.7': + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.7': + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.7': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.7': + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.7': + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.7': + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-musl@4.34.7': + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.7': + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.7': + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.7': + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.5': {} - '@shikijs/core@2.3.2': + '@shikijs/core@2.5.0': dependencies: - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@2.3.2': + '@shikijs/engine-javascript@2.5.0': dependencies: - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 - oniguruma-to-es: 3.1.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 - '@shikijs/engine-oniguruma@2.3.2': + '@shikijs/engine-oniguruma@2.5.0': dependencies: - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@2.3.2': + '@shikijs/langs@2.5.0': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.5.0 - '@shikijs/themes@2.3.2': + '@shikijs/themes@2.5.0': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.5.0 - '@shikijs/transformers@2.3.2': + '@shikijs/transformers@2.5.0': dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/types': 2.3.2 + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 - '@shikijs/types@2.3.2': + '@shikijs/types@2.5.0': dependencies: - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@10.0.1': {} + '@shikijs/vscode-textmate@10.0.2': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -8947,26 +8734,17 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node-fetch@2.6.12': - dependencies: - '@types/node': 20.17.19 - form-data: 4.0.1 - - '@types/node@18.19.76': - dependencies: - undici-types: 5.26.5 - '@types/node@20.17.19': dependencies: undici-types: 6.19.8 '@types/normalize-package-data@2.4.4': {} - '@types/react-dom@19.0.3(@types/react@19.0.8)': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@types/react@19.0.8': + '@types/react@19.0.10': dependencies: csstype: 3.1.3 @@ -8976,10 +8754,10 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.24.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.7.3) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) @@ -8994,15 +8772,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/type-utils': 7.18.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -9012,26 +8790,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.0(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 eslint: 8.57.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -9041,10 +8819,10 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.24.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': dependencies: @@ -9058,12 +8836,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/type-utils@7.18.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 @@ -9072,7 +8850,7 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.24.0': {} + '@typescript-eslint/types@8.25.0': {} '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': dependencies: @@ -9089,10 +8867,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -9114,13 +8892,13 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.18.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@7.18.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) transitivePeerDependencies: - supports-color - typescript @@ -9130,9 +8908,9 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.24.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.3.0': {} @@ -9204,7 +8982,7 @@ snapshots: '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.2 + postcss: 8.5.3 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -9254,28 +9032,28 @@ snapshots: '@vue/shared@3.5.13': {} - '@vueuse/core@12.6.1(typescript@5.7.3)': + '@vueuse/core@12.7.0(typescript@5.7.3)': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 12.6.1 - '@vueuse/shared': 12.6.1(typescript@5.7.3) + '@vueuse/metadata': 12.7.0 + '@vueuse/shared': 12.7.0(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.6.1(focus-trap@7.6.4)(typescript@5.7.3)': + '@vueuse/integrations@12.7.0(focus-trap@7.6.4)(typescript@5.7.3)': dependencies: - '@vueuse/core': 12.6.1(typescript@5.7.3) - '@vueuse/shared': 12.6.1(typescript@5.7.3) + '@vueuse/core': 12.7.0(typescript@5.7.3) + '@vueuse/shared': 12.7.0(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3) optionalDependencies: focus-trap: 7.6.4 transitivePeerDependencies: - typescript - '@vueuse/metadata@12.6.1': {} + '@vueuse/metadata@12.7.0': {} - '@vueuse/shared@12.6.1(typescript@5.7.3)': + '@vueuse/shared@12.7.0(typescript@5.7.3)': dependencies: vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: @@ -9286,10 +9064,6 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -9300,10 +9074,6 @@ snapshots: agent-base@7.1.3: {} - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -9318,21 +9088,21 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.20.2: - dependencies: - '@algolia/client-abtesting': 5.20.2 - '@algolia/client-analytics': 5.20.2 - '@algolia/client-common': 5.20.2 - '@algolia/client-insights': 5.20.2 - '@algolia/client-personalization': 5.20.2 - '@algolia/client-query-suggestions': 5.20.2 - '@algolia/client-search': 5.20.2 - '@algolia/ingestion': 1.20.2 - '@algolia/monitoring': 1.20.2 - '@algolia/recommend': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 + algoliasearch@5.20.3: + dependencies: + '@algolia/client-abtesting': 5.20.3 + '@algolia/client-analytics': 5.20.3 + '@algolia/client-common': 5.20.3 + '@algolia/client-insights': 5.20.3 + '@algolia/client-personalization': 5.20.3 + '@algolia/client-query-suggestions': 5.20.3 + '@algolia/client-search': 5.20.3 + '@algolia/ingestion': 1.20.3 + '@algolia/monitoring': 1.20.3 + '@algolia/recommend': 5.20.3 + '@algolia/requester-browser-xhr': 5.20.3 + '@algolia/requester-fetch': 5.20.3 + '@algolia/requester-node-http': 5.20.3 ansi-align@3.0.1: dependencies: @@ -9384,7 +9154,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 array-union@2.1.0: {} @@ -9436,7 +9206,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 assertion-error@2.0.1: {} @@ -9453,8 +9223,6 @@ snapshots: dependencies: retry: 0.13.1 - asynckit@0.4.0: {} - atomically@2.0.3: dependencies: stubborn-fs: 1.2.5 @@ -9470,8 +9238,6 @@ snapshots: balanced-match@1.0.2: {} - base-64@0.1.0: {} - base64-js@1.5.1: {} basic-ftp@5.0.5: {} @@ -9495,7 +9261,7 @@ snapshots: chalk: 5.4.1 cli-boxes: 3.0.0 string-width: 7.2.0 - type-fest: 4.34.1 + type-fest: 4.35.0 widest-line: 5.0.0 wrap-ansi: 9.0.0 @@ -9522,7 +9288,7 @@ snapshots: bumpp@10.0.3: dependencies: args-tokenizer: 0.3.0 - c12: 2.0.2 + c12: 2.0.4 cac: 6.7.14 escalade: 3.2.0 js-yaml: 4.1.0 @@ -9531,7 +9297,7 @@ snapshots: prompts: 2.4.2 semver: 7.7.1 tinyexec: 0.3.2 - tinyglobby: 0.2.10 + tinyglobby: 0.2.12 transitivePeerDependencies: - magicast @@ -9539,25 +9305,25 @@ snapshots: dependencies: run-applescript: 7.0.0 - bundle-require@5.1.0(esbuild@0.24.2): + bundle-require@5.1.0(esbuild@0.25.0): dependencies: - esbuild: 0.24.2 + esbuild: 0.25.0 load-tsconfig: 0.2.5 busboy@1.6.0: dependencies: streamsearch: 1.1.0 - c12@2.0.2: + c12@2.0.4: dependencies: chokidar: 4.0.3 confbox: 0.1.8 defu: 6.1.4 dotenv: 16.4.7 - giget: 1.2.4 + giget: 1.2.5 jiti: 2.4.2 mlly: 1.7.4 - ohash: 1.1.4 + ohash: 2.0.5 pathe: 2.0.3 perfect-debounce: 1.0.0 pkg-types: 1.3.1 @@ -9574,13 +9340,13 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 callsites@3.1.0: {} @@ -9588,7 +9354,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001699: {} + caniuse-lite@1.0.30001700: {} ccount@2.0.1: {} @@ -9613,8 +9379,6 @@ snapshots: chardet@0.7.0: {} - charenc@0.0.2: {} - check-error@2.1.1: {} chokidar@3.6.0: @@ -9631,7 +9395,7 @@ snapshots: chokidar@4.0.3: dependencies: - readdirp: 4.1.1 + readdirp: 4.1.2 chownr@2.0.0: {} @@ -9689,10 +9453,6 @@ snapshots: color-string: 1.9.1 optional: true - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - comma-separated-tokens@2.0.3: {} commander@4.1.1: {} @@ -9833,8 +9593,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crypt@0.0.2: {} - cssesc@3.0.0: {} csstype@3.1.3: {} @@ -9910,8 +9668,6 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - delayed-stream@1.0.0: {} - deprecation@2.3.1: {} dequal@2.0.3: {} @@ -9929,11 +9685,6 @@ snapshots: didyoumean@1.2.2: {} - digest-fetch@1.3.0: - dependencies: - base-64: 0.1.0 - md5: 2.3.0 - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -9954,7 +9705,7 @@ snapshots: dot-prop@9.0.0: dependencies: - type-fest: 4.34.1 + type-fest: 4.35.0 dotenv@16.4.7: {} @@ -10003,7 +9754,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -10054,7 +9805,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -10073,7 +9824,7 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -10113,33 +9864,33 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.24.2: + esbuild@0.25.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 escalade@3.2.0: {} @@ -10155,19 +9906,19 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@15.1.7(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3): + eslint-config-next@15.1.7(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 15.1.7 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.1(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.21.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.0)(eslint@9.20.1(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.20.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.4(eslint@9.20.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.1.0(eslint@9.20.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.4(eslint@9.21.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.1.0(eslint@9.21.0(jiti@2.4.2)) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -10183,33 +9934,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 enhanced-resolve: 5.18.1 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) get-tsconfig: 4.10.0 is-bun-module: 1.3.0 stable-hash: 0.0.4 - tinyglobby: 0.2.10 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.0)(eslint@9.20.1(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.1(jiti@2.4.2) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.21.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.0)(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -10218,9 +9969,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -10232,13 +9983,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -10248,7 +9999,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -10257,11 +10008,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-react-hooks@5.1.0(eslint@9.21.0(jiti@2.4.2)): dependencies: - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) - eslint-plugin-react@7.37.4(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -10269,7 +10020,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.21.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -10340,18 +10091,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.20.1(jiti@2.4.2): + eslint@9.21.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 - '@eslint/core': 0.11.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -10413,8 +10164,6 @@ snapshots: esutils@2.0.3: {} - event-target-shim@5.0.1: {} - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -10473,7 +10222,7 @@ snapshots: fastq@1.19.0: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -10509,16 +10258,16 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 rimraf: 3.0.2 flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.6.4: dependencies: @@ -10528,24 +10277,11 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data-encoder@1.7.2: {} - - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - formdata-node@4.4.1: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -10572,7 +10308,7 @@ snapshots: get-east-asian-width@1.3.0: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -10600,7 +10336,7 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-tsconfig@4.10.0: dependencies: @@ -10614,14 +10350,13 @@ snapshots: transitivePeerDependencies: - supports-color - giget@1.2.4: + giget@1.2.5: dependencies: citty: 0.1.6 consola: 3.4.0 defu: 6.1.4 node-fetch-native: 1.6.6 - nypm: 0.5.2 - ohash: 1.1.4 + nypm: 0.5.4 pathe: 2.0.3 tar: 6.2.1 @@ -10663,7 +10398,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -10722,20 +10457,6 @@ snapshots: graphemer@1.4.0: {} - groq-sdk@0.3.3: - dependencies: - '@types/node': 18.19.76 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - digest-fetch: 1.3.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - web-streams-polyfill: 3.3.3 - transitivePeerDependencies: - - encoding - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -10767,7 +10488,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-to-html@9.0.4: + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -10776,7 +10497,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -10811,10 +10532,6 @@ snapshots: human-signals@5.0.0: {} - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - husky@9.1.7: {} iconv-lite@0.4.24: @@ -10854,7 +10571,7 @@ snapshots: mute-stream: 1.0.0 ora: 5.4.1 run-async: 3.0.0 - rxjs: 7.8.1 + rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 @@ -10877,7 +10594,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -10905,8 +10622,6 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-buffer@1.1.6: {} - is-bun-module@1.3.0: dependencies: semver: 7.7.1 @@ -10920,7 +10635,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -11036,7 +10751,7 @@ snapshots: is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-what@4.1.16: {} @@ -11060,7 +10775,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -11219,12 +10934,6 @@ snapshots: math-intrinsics@1.1.0: {} - md5@2.3.0: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 @@ -11297,7 +11006,7 @@ snapshots: minipass@7.1.2: {} - minisearch@7.1.1: {} + minisearch@7.1.2: {} minizlib@2.1.2: dependencies: @@ -11345,7 +11054,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001700 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -11364,14 +11073,8 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-domexception@1.0.0: {} - node-fetch-native@1.6.6: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 @@ -11388,7 +11091,7 @@ snapshots: dependencies: path-key: 4.0.0 - nypm@0.5.2: + nypm@0.5.4: dependencies: citty: 0.1.6 consola: 3.4.0 @@ -11440,7 +11143,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - ohash@1.1.4: {} + ohash@2.0.5: {} once@1.4.0: dependencies: @@ -11458,7 +11161,7 @@ snapshots: dependencies: mimic-function: 5.0.1 - oniguruma-to-es@3.1.0: + oniguruma-to-es@3.1.1: dependencies: emoji-regex-xs: 1.0.0 regex: 6.0.1 @@ -11471,18 +11174,6 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 - openai@4.85.1: - dependencies: - '@types/node': 18.19.76 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -11525,7 +11216,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -11545,7 +11236,7 @@ snapshots: dependencies: p-limit: 4.0.0 - pac-proxy-agent@7.1.0: + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.3 @@ -11570,7 +11261,7 @@ snapshots: ky: 1.7.5 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.6.3 + semver: 7.7.1 package-manager-detector@0.2.9: {} @@ -11648,36 +11339,36 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.2): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.2 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.2): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.2 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.2): + postcss-load-config@4.0.2(postcss@8.5.3): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.2 + postcss: 8.5.3 - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.2)(yaml@2.7.0): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.4.2 - postcss: 8.5.2 + postcss: 8.5.3 yaml: 2.7.0 - postcss-nested@6.2.0(postcss@8.5.2): + postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.5.2 + postcss: 8.5.3 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -11693,17 +11384,17 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.2: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.25.4: {} + preact@10.26.2: {} prelude-ls@1.2.1: {} - prettier@3.5.1: {} + prettier@3.5.2: {} prompts@2.4.2: dependencies: @@ -11716,7 +11407,7 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - property-information@6.5.0: {} + property-information@7.0.0: {} proto-list@1.2.4: {} @@ -11729,7 +11420,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.1.0 + pac-proxy-agent: 7.2.0 proxy-from-env: 1.1.0 socks-proxy-agent: 8.0.5 transitivePeerDependencies: @@ -11764,32 +11455,32 @@ snapshots: react-is@16.13.1: {} - react-remove-scroll-bar@2.3.8(@types/react@19.0.8)(react@19.0.0): + react-remove-scroll-bar@2.3.8(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 - react-style-singleton: 2.2.3(@types/react@19.0.8)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - react-remove-scroll@2.6.3(@types/react@19.0.8)(react@19.0.0): + react-remove-scroll@2.6.3(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.0.8)(react@19.0.0) - react-style-singleton: 2.2.3(@types/react@19.0.8)(react@19.0.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.0.8)(react@19.0.0) - use-sidecar: 1.1.3(@types/react@19.0.8)(react@19.0.0) + use-callback-ref: 1.3.3(@types/react@19.0.10)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.10)(react@19.0.0) optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - react-style-singleton@2.2.3(@types/react@19.0.8)(react@19.0.0): + react-style-singleton@2.2.3(@types/react@19.0.10)(react@19.0.0): dependencies: get-nonce: 1.0.1 react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 react@19.0.0: {} @@ -11801,14 +11492,14 @@ snapshots: dependencies: find-up: 6.3.0 read-pkg: 8.1.0 - type-fest: 4.34.1 + type-fest: 4.35.0 read-pkg@8.1.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 7.1.1 - type-fest: 4.34.1 + type-fest: 4.35.0 readable-stream@3.6.2: dependencies: @@ -11820,7 +11511,7 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.1: {} + readdirp@4.1.2: {} rechoir@0.6.2: dependencies: @@ -11833,7 +11524,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -11928,7 +11619,7 @@ snapshots: retry@0.13.1: {} - reusify@1.0.4: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -11936,29 +11627,29 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.34.7: + rollup@4.34.8: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.7 - '@rollup/rollup-android-arm64': 4.34.7 - '@rollup/rollup-darwin-arm64': 4.34.7 - '@rollup/rollup-darwin-x64': 4.34.7 - '@rollup/rollup-freebsd-arm64': 4.34.7 - '@rollup/rollup-freebsd-x64': 4.34.7 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.7 - '@rollup/rollup-linux-arm-musleabihf': 4.34.7 - '@rollup/rollup-linux-arm64-gnu': 4.34.7 - '@rollup/rollup-linux-arm64-musl': 4.34.7 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.7 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.7 - '@rollup/rollup-linux-riscv64-gnu': 4.34.7 - '@rollup/rollup-linux-s390x-gnu': 4.34.7 - '@rollup/rollup-linux-x64-gnu': 4.34.7 - '@rollup/rollup-linux-x64-musl': 4.34.7 - '@rollup/rollup-win32-arm64-msvc': 4.34.7 - '@rollup/rollup-win32-ia32-msvc': 4.34.7 - '@rollup/rollup-win32-x64-msvc': 4.34.7 + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -11969,7 +11660,7 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rxjs@7.8.1: + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -11977,7 +11668,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -12011,7 +11702,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -12067,15 +11758,15 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shiki@2.3.2: + shiki@2.5.0: dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/langs': 2.3.2 - '@shikijs/themes': 2.3.2 - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 side-channel-list@1.0.0: @@ -12087,14 +11778,14 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -12212,7 +11903,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -12304,7 +11995,7 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@3.0.1: {} + tailwind-merge@3.0.2: {} tailwindcss-animate@1.0.7(tailwindcss@3.4.17): dependencies: @@ -12326,11 +12017,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.2 - postcss-import: 15.1.0(postcss@8.5.2) - postcss-js: 4.0.1(postcss@8.5.2) - postcss-load-config: 4.0.2(postcss@8.5.2) - postcss-nested: 6.2.0(postcss@8.5.2) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -12366,7 +12057,7 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -12385,8 +12076,6 @@ snapshots: dependencies: is-number: 7.0.0 - tr46@0.0.3: {} - tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -12414,26 +12103,26 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.6(jiti@2.4.2)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: - bundle-require: 5.1.0(esbuild@0.24.2) + bundle-require: 5.1.0(esbuild@0.25.0) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 debug: 4.4.0 - esbuild: 0.24.2 + esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.2)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.0) resolve-from: 5.0.0 - rollup: 4.34.7 + rollup: 4.34.8 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.10 + tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.2 + postcss: 8.5.3 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -12453,7 +12142,7 @@ snapshots: type-fest@3.13.1: {} - type-fest@4.34.1: {} + type-fest@4.35.0: {} typed-array-buffer@1.0.3: dependencies: @@ -12504,8 +12193,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@5.26.5: {} - undici-types@6.19.8: {} unicorn-magic@0.1.0: {} @@ -12545,7 +12232,7 @@ snapshots: is-npm: 6.0.0 latest-version: 9.0.0 pupa: 3.1.0 - semver: 7.6.3 + semver: 7.7.1 xdg-basedir: 5.1.0 uri-js@4.4.1: @@ -12554,20 +12241,20 @@ snapshots: url-join@5.0.0: {} - use-callback-ref@1.3.3(@types/react@19.0.8)(react@19.0.0): + use-callback-ref@1.3.3(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - use-sidecar@1.1.3(@types/react@19.0.8)(react@19.0.0): + use-sidecar@1.1.3(@types/react@19.0.10)(react@19.0.0): dependencies: detect-node-es: 1.1.0 react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 util-deprecate@1.0.2: {} @@ -12607,34 +12294,34 @@ snapshots: vite@5.4.14(@types/node@20.17.19): dependencies: esbuild: 0.21.5 - postcss: 8.5.2 - rollup: 4.34.7 + postcss: 8.5.3 + rollup: 4.34.8 optionalDependencies: '@types/node': 20.17.19 fsevents: 2.3.3 - vitepress@1.6.3(@algolia/client-search@5.20.2)(@types/node@20.17.19)(postcss@8.5.2)(search-insights@2.17.3)(typescript@5.7.3): + vitepress@1.6.3(@algolia/client-search@5.20.3)(@types/node@20.17.19)(postcss@8.5.3)(search-insights@2.17.3)(typescript@5.7.3): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.24 - '@shikijs/core': 2.3.2 - '@shikijs/transformers': 2.3.2 - '@shikijs/types': 2.3.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.20.3)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.26 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@20.17.19))(vue@3.5.13(typescript@5.7.3)) '@vue/devtools-api': 7.7.2 '@vue/shared': 3.5.13 - '@vueuse/core': 12.6.1(typescript@5.7.3) - '@vueuse/integrations': 12.6.1(focus-trap@7.6.4)(typescript@5.7.3) + '@vueuse/core': 12.7.0(typescript@5.7.3) + '@vueuse/integrations': 12.7.0(focus-trap@7.6.4)(typescript@5.7.3) focus-trap: 7.6.4 mark.js: 8.11.1 - minisearch: 7.1.1 - shiki: 2.3.2 + minisearch: 7.1.2 + shiki: 2.5.0 vite: 5.4.14(@types/node@20.17.19) vue: 3.5.13(typescript@5.7.3) optionalDependencies: - postcss: 8.5.2 + postcss: 8.5.3 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -12711,19 +12398,8 @@ snapshots: dependencies: defaults: 1.0.4 - web-streams-polyfill@3.3.3: {} - - web-streams-polyfill@4.0.0-beta.3: {} - - webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -12847,4 +12523,10 @@ snapshots: yoctocolors-cjs@2.1.2: {} + zod-to-json-schema@3.24.3(zod@3.24.2): + dependencies: + zod: 3.24.2 + + zod@3.24.2: {} + zwitch@2.0.4: {} From c906d5022dd693371318e790f93e4a2829ad5cc4 Mon Sep 17 00:00:00 2001 From: arshad Date: Wed, 26 Feb 2025 16:54:31 +0530 Subject: [PATCH 2/4] chore: stop sequence --- packages/core/src/constants.ts | 2 - packages/core/src/copilot.ts | 3 +- packages/core/src/defaults.ts | 2 + packages/core/src/index.ts | 2 +- packages/core/src/llm/providers/mistral.ts | 11 +- packages/core/src/types/llm.ts | 2 +- packages/core/src/utils/fetch-with-timeout.ts | 28 +++ packages/monacopilot/src/classes/formatter.ts | 45 +---- packages/monacopilot/src/processor.ts | 9 +- packages/monacopilot/tests/formatter.test.ts | 191 +----------------- playground/components/editor.tsx | 1 + 11 files changed, 54 insertions(+), 242 deletions(-) delete mode 100644 packages/core/src/constants.ts create mode 100644 packages/core/src/defaults.ts create mode 100644 packages/core/src/utils/fetch-with-timeout.ts diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts deleted file mode 100644 index adf28e36..00000000 --- a/packages/core/src/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const DEFAULT_COPILOT_TEMPERATURE = 0.1 as const; -export const DEFAULT_COPILOT_MAX_TOKENS = 500 as const; diff --git a/packages/core/src/copilot.ts b/packages/core/src/copilot.ts index 591c195b..c6a6af19 100644 --- a/packages/core/src/copilot.ts +++ b/packages/core/src/copilot.ts @@ -19,6 +19,7 @@ import type { Provider, } from './types/llm'; import {BaseCopilotMetadata} from './types/metadata'; +import {fetchWithTimeout} from './utils/fetch-with-timeout'; import validate from './validator'; export abstract class Copilot { @@ -139,7 +140,7 @@ export abstract class Copilot { requestBody: CompletionCreateParams, headers: Record, ) { - const response = await fetch(endpoint, { + const response = await fetchWithTimeout(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/packages/core/src/defaults.ts b/packages/core/src/defaults.ts new file mode 100644 index 00000000..9ac35b90 --- /dev/null +++ b/packages/core/src/defaults.ts @@ -0,0 +1,2 @@ +export const DEFAULT_COPILOT_MAX_TOKENS = 256 as const; +export const DEFAULT_COPILOT_STOP_SEQUENCE = '\n\n' as const; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 62255bc3..7997b1eb 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,7 +1,7 @@ export {Copilot} from './copilot'; export * from './logger'; -export * from './constants'; +export * from './defaults'; export * from './llm/base'; export type * from './types/llm'; diff --git a/packages/core/src/llm/providers/mistral.ts b/packages/core/src/llm/providers/mistral.ts index 0cb3aaca..898ddbfd 100644 --- a/packages/core/src/llm/providers/mistral.ts +++ b/packages/core/src/llm/providers/mistral.ts @@ -1,4 +1,7 @@ -import {DEFAULT_COPILOT_TEMPERATURE} from '../../constants'; +import { + DEFAULT_COPILOT_MAX_TOKENS, + DEFAULT_COPILOT_STOP_SEQUENCE, +} from '../../defaults'; import type {PromptData} from '../../types/copilot'; import type { PickCompletion, @@ -21,10 +24,12 @@ export class MistralHandler extends BaseProviderHandler<'mistral'> { ): PickCompletionCreateParams<'mistral'> { return { model: MODEL_IDS[model], - temperature: DEFAULT_COPILOT_TEMPERATURE, - prompt: `${prompt.context}\n${prompt.instruction}\n\n${metadata.textBeforeCursor}`, + prompt: `${prompt.context}\n${prompt.instruction}\n${metadata.textBeforeCursor}`, + max_tokens: DEFAULT_COPILOT_MAX_TOKENS, + stop: DEFAULT_COPILOT_STOP_SEQUENCE, suffix: metadata.textAfterCursor, stream: false, + top_p: 0.9, }; } diff --git a/packages/core/src/types/llm.ts b/packages/core/src/types/llm.ts index e9289a76..03bad363 100644 --- a/packages/core/src/types/llm.ts +++ b/packages/core/src/types/llm.ts @@ -1,6 +1,6 @@ import { FIMCompletionResponse as MistralFIMCompletion, - FIMCompletionRequest as MistralFIMCompletionCreateParams, + FIMCompletionRequest$Outbound as MistralFIMCompletionCreateParams, } from '@mistralai/mistralai/models/components'; import type {PromptData} from './copilot'; diff --git a/packages/core/src/utils/fetch-with-timeout.ts b/packages/core/src/utils/fetch-with-timeout.ts new file mode 100644 index 00000000..9b3d08cd --- /dev/null +++ b/packages/core/src/utils/fetch-with-timeout.ts @@ -0,0 +1,28 @@ +export const fetchWithTimeout = async ( + url: string, + options: RequestInit = {}, + timeoutMs: number = 5000, +): Promise => { + const controller = new AbortController(); + const {signal} = controller; + + const timeoutId = setTimeout(() => { + controller.abort(); + }, timeoutMs); + + try { + const response = await fetch(url, { + ...options, + signal, + }); + + return response; + } catch (error) { + if (error instanceof DOMException && error.name === 'AbortError') { + throw new Error(`Request timed out after ${timeoutMs}ms`); + } + throw error; + } finally { + clearTimeout(timeoutId); + } +}; diff --git a/packages/monacopilot/src/classes/formatter.ts b/packages/monacopilot/src/classes/formatter.ts index 52bde207..a0cf2f7a 100644 --- a/packages/monacopilot/src/classes/formatter.ts +++ b/packages/monacopilot/src/classes/formatter.ts @@ -1,16 +1,8 @@ export class CompletionFormatter { private formattedCompletion = ''; - private currentColumn = 0; - private textBeforeCursorInLine = ''; - constructor( - completion: string, - currentColumn: number, - textBeforeCursorInLine: string, - ) { + constructor(completion: string) { this.formattedCompletion = completion; - this.currentColumn = currentColumn; - this.textBeforeCursorInLine = textBeforeCursorInLine; } public setCompletion(completion: string): CompletionFormatter { @@ -30,41 +22,6 @@ export class CompletionFormatter { return this; } - public indentByColumn(): CompletionFormatter { - const lines = this.formattedCompletion.split('\n'); - - if (this.textBeforeCursorInLine.trim() !== '') { - return this; - } - - const firstLine = lines[0].trimStart(); - const firstLineIndent = lines[0].length - firstLine.length; - - if (lines.length === 1) { - this.formattedCompletion = firstLine; - return this; - } - - this.formattedCompletion = - firstLine + - '\n' + - lines - .slice(1) - .map(line => { - const currentLineIndent = - line.length - line.trimStart().length; - const trimAmount = Math.min( - firstLineIndent, - currentLineIndent, - ); - const trimmedStart = line.slice(trimAmount); - return ' '.repeat(this.currentColumn - 1) + trimmedStart; - }) - .join('\n'); - - return this; - } - private removeMarkdownCodeBlocks(text: string): string { const lines = text.split('\n'); const result: string[] = []; diff --git a/packages/monacopilot/src/processor.ts b/packages/monacopilot/src/processor.ts index bc693950..d84cc2c6 100644 --- a/packages/monacopilot/src/processor.ts +++ b/packages/monacopilot/src/processor.ts @@ -21,7 +21,7 @@ import { } from './types'; import type {EditorInlineCompletionsResult} from './types/monaco'; import {asyncDebounce} from './utils/async-debounce'; -import {getTextBeforeCursor, getTextBeforeCursorInLine} from './utils/editor'; +import {getTextBeforeCursor} from './utils/editor'; import {isCancellationError} from './utils/error'; import {createInlineCompletionResult} from './utils/result'; @@ -86,15 +86,10 @@ export const processInlineCompletions = async ({ }); if (completion) { - const formattedCompletion = new CompletionFormatter( - completion, - pos.column, - getTextBeforeCursorInLine(pos, mdl), - ) + const formattedCompletion = new CompletionFormatter(completion) .removeMarkdownCodeSyntax() .removeExcessiveNewlines() .removeInvalidLineBreaks() - .indentByColumn() .build(); const completionRange = new CompletionRange(monaco); diff --git a/packages/monacopilot/tests/formatter.test.ts b/packages/monacopilot/tests/formatter.test.ts index a49a00cf..9a476c51 100644 --- a/packages/monacopilot/tests/formatter.test.ts +++ b/packages/monacopilot/tests/formatter.test.ts @@ -1,15 +1,12 @@ import {describe, expect, it} from 'vitest'; import {CompletionFormatter} from '../src/classes/formatter'; -import {MOCK_COMPLETION_POS} from './mock'; describe('CompletionFormatter', () => { describe('create', () => { it('should create a new instance of CompletionFormatter', () => { const formatter = new CompletionFormatter( 'const greeting = "Hello, World!";', - MOCK_COMPLETION_POS.column, - '', ); expect(formatter).toBeInstanceOf(CompletionFormatter); }); @@ -19,8 +16,6 @@ describe('CompletionFormatter', () => { it('should remove trailing line breaks', () => { const formatter = new CompletionFormatter( 'function sum(a, b) {\n return a + b;\n}\n\n', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeInvalidLineBreaks().build(); expect(result).toBe('function sum(a, b) {\n return a + b;\n}'); @@ -29,8 +24,6 @@ describe('CompletionFormatter', () => { it('should not remove line breaks in the middle of the text', () => { const formatter = new CompletionFormatter( 'const x = 5;\nconst y = 10;\nconst sum = x + y;', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeInvalidLineBreaks().build(); expect(result).toBe( @@ -39,11 +32,7 @@ describe('CompletionFormatter', () => { }); it('should handle empty string', () => { - const formatter = new CompletionFormatter( - '', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter(''); const result = formatter.removeInvalidLineBreaks().build(); expect(result).toBe(''); }); @@ -53,8 +42,6 @@ describe('CompletionFormatter', () => { it('should remove markdown code block syntax', () => { const formatter = new CompletionFormatter( '```\nconst array = [1, 2, 3];\narray.map(x => x * 2);\n```', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe( @@ -65,8 +52,6 @@ describe('CompletionFormatter', () => { it('should remove markdown code block in the middle of the text', () => { const formatter = new CompletionFormatter( 'calculate the factorial of a given number using recursion\n```javascript\nfunction calculateFactorial(n) {\n // Base case: factorial of 0 or 1 is 1\n if (n === 0 || n === 1) {\n return 1;\n ', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe( @@ -77,8 +62,6 @@ describe('CompletionFormatter', () => { it('should remove multiple markdown code blocks', () => { const formatter = new CompletionFormatter( '```\nfunction greet(name) {\n return `Hello, ${name}!`;\n}\n```\nSome text\n```\nconst result = greet("Alice");\nconsole.log(result);\n```', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe( @@ -89,8 +72,6 @@ describe('CompletionFormatter', () => { it('should handle code blocks with language specifiers', () => { const formatter = new CompletionFormatter( '```javascript\nclass Person {\n constructor(name) {\n this.name = name;\n }\n}\n```', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe( @@ -99,21 +80,13 @@ describe('CompletionFormatter', () => { }); it('should not modify text without code blocks', () => { - const formatter = new CompletionFormatter( - 'const PI = 3.14159;', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter('const PI = 3.14159;'); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe('const PI = 3.14159;'); }); it('should handle empty string', () => { - const formatter = new CompletionFormatter( - '', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter(''); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe(''); }); @@ -121,29 +94,19 @@ describe('CompletionFormatter', () => { it('should handle incomplete code blocks', () => { const formatter = new CompletionFormatter( '```\nconst incomplete = true;', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe('const incomplete = true;'); }); it('should keep starting whitespaces', () => { - const formatter = new CompletionFormatter( - ' 3.14159;', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter(' 3.14159;'); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe(' 3.14159;'); }); it('should keep leading newlines', () => { - const formatter = new CompletionFormatter( - '\nconst PI = 3.14159;', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter('\nconst PI = 3.14159;'); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe('\nconst PI = 3.14159;'); }); @@ -151,8 +114,6 @@ describe('CompletionFormatter', () => { it('should preserve leading newline with code block', () => { const formatter = new CompletionFormatter( '\n```\nconst x = 5;\n```', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeMarkdownCodeSyntax().build(); expect(result).toBe('\nconst x = 5;'); @@ -163,8 +124,6 @@ describe('CompletionFormatter', () => { it('should replace three or more consecutive newlines with two newlines', () => { const formatter = new CompletionFormatter( 'import React from "react";\n\n\n\nconst App = () => {\n return

Hello React
;\n};', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeExcessiveNewlines().build(); expect(result).toBe( @@ -175,8 +134,6 @@ describe('CompletionFormatter', () => { it('should not modify text with two or fewer consecutive newlines', () => { const formatter = new CompletionFormatter( 'const x = 10;\n\nconst y = 20;', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeExcessiveNewlines().build(); expect(result).toBe('const x = 10;\n\nconst y = 20;'); @@ -185,8 +142,6 @@ describe('CompletionFormatter', () => { it('should handle multiple occurrences of excessive newlines', () => { const formatter = new CompletionFormatter( 'function add(a, b) {\n return a + b;\n}\n\n\nfunction subtract(a, b) {\n return a - b;\n}\n\n\n\nconst result = add(5, 3);', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeExcessiveNewlines().build(); expect(result).toBe( @@ -195,21 +150,13 @@ describe('CompletionFormatter', () => { }); it('should handle empty string', () => { - const formatter = new CompletionFormatter( - '', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter(''); const result = formatter.removeExcessiveNewlines().build(); expect(result).toBe(''); }); it('should handle string with only newlines', () => { - const formatter = new CompletionFormatter( - '\n\n\n\n', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter('\n\n\n\n'); const result = formatter.removeExcessiveNewlines().build(); expect(result).toBe('\n\n'); }); @@ -217,132 +164,16 @@ describe('CompletionFormatter', () => { it('should maintain single leading newline', () => { const formatter = new CompletionFormatter( '\nconst x = 10;\n\nconst y = 20;', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.removeExcessiveNewlines().build(); expect(result).toBe('\nconst x = 10;\n\nconst y = 20;'); }); }); - describe('indentByColumn', () => { - it('should not modify a single-line completion', () => { - const input = 'Hello world'; - const formatter = new CompletionFormatter(input, 5, ''); - formatter.indentByColumn(); - expect(formatter.build()).toBe('Hello world'); - }); - - it('should not modify multi-line completions if textBeforeCursorInLine is non-empty', () => { - const input = 'First line\nSecond line'; - const formatter = new CompletionFormatter(input, 5, 'non-empty'); - formatter.indentByColumn(); - expect(formatter.build()).toBe(input); - }); - - it('should correctly indent multi-line completion when textBeforeCursorInLine is empty', () => { - const input = - ' function test() {' + - '\n console.log("hello");' + - '\n }'; - const formatter = new CompletionFormatter(input, 5, ''); - formatter.indentByColumn(); - const expected = - 'function test() {' + - '\n' + - ' ' + - ' console.log("hello");' + - '\n' + - ' ' + - '}'; - expect(formatter.build()).toBe(expected); - }); - - it('should handle case where first line indent is larger than subsequent line indent', () => { - const input = ' First line' + '\n' + ' Second line'; - const formatter = new CompletionFormatter(input, 3, ''); - formatter.indentByColumn(); - const expected = 'First line' + '\n' + ' ' + 'Second line'; - expect(formatter.build()).toBe(expected); - }); - - it('should handle case where first line indent is smaller than subsequent line indent', () => { - const input = ' First line' + '\n' + ' Second line'; - const formatter = new CompletionFormatter(input, 4, ''); - formatter.indentByColumn(); - const expected = 'First line' + '\n' + ' ' + ' Second line'; - expect(formatter.build()).toBe(expected); - }); - - it('should work correctly with empty subsequent lines', () => { - const input = ' First line' + '\n ' + '\n Third line'; - const formatter = new CompletionFormatter(input, 6, ''); - formatter.indentByColumn(); - const expected = - 'First line' + - '\n' + - ' ' + - '' + - '\n' + - ' ' + - 'Third line'; - expect(formatter.build()).toBe(expected); - }); - - it('should work correctly when currentColumn is 1 (no extra prefix added)', () => { - const input = ' Test' + '\n' + ' Line'; - const formatter = new CompletionFormatter(input, 1, ''); - formatter.indentByColumn(); - const expected = 'Test' + '\n' + ' Line'; - expect(formatter.build()).toBe(expected); - }); - - it('should preserve newlines while adjusting indentations', () => { - const input = 'First line\nSecond line\nThird line'; - const formatter = new CompletionFormatter(input, 4, ''); - formatter.indentByColumn(); - const expected = - 'First line' + - '\n' + - ' ' + - 'Second line' + - '\n' + - ' ' + - 'Third line'; - expect(formatter.build()).toBe(expected); - }); - - it('should handle when the first line is only whitespace', () => { - const input = ' ' + '\n' + ' Text after blank first line'; - const formatter = new CompletionFormatter(input, 3, ''); - formatter.indentByColumn(); - const expected = - '' + '\n' + ' ' + ' Text after blank first line'; - expect(formatter.build()).toBe(expected); - }); - - it('should not alter an empty string', () => { - const input = ''; - const formatter = new CompletionFormatter(input, 4, ''); - formatter.indentByColumn(); - expect(formatter.build()).toBe(''); - }); - - it('should treat textBeforeCursorInLine as empty when it contains only whitespace', () => { - const input = ' Alpha' + '\n' + ' Beta'; - const formatter = new CompletionFormatter(input, 5, ' '); - formatter.indentByColumn(); - const expected = 'Alpha' + '\n' + ' ' + ' Beta'; - expect(formatter.build()).toBe(expected); - }); - }); - describe('build', () => { it('should return the formatted completion', () => { const formatter = new CompletionFormatter( ' const square = (x) => x * x; ', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter.build(); expect(result).toBe(' const square = (x) => x * x; '); @@ -353,8 +184,6 @@ describe('CompletionFormatter', () => { it('should allow chaining of multiple formatting methods', () => { const formatter = new CompletionFormatter( '```\nconst fruits = ["apple", "banana", "orange"];\nconst upperFruits = fruits.map(fruit => fruit.toUpperCase());\n```\n\n\n\nconsole.log(upperFruits);', - MOCK_COMPLETION_POS.column, - '', ); const result = formatter .removeMarkdownCodeSyntax() @@ -367,11 +196,7 @@ describe('CompletionFormatter', () => { }); it('should handle empty string with all formatting methods', () => { - const formatter = new CompletionFormatter( - '', - MOCK_COMPLETION_POS.column, - '', - ); + const formatter = new CompletionFormatter(''); const result = formatter .removeMarkdownCodeSyntax() .removeExcessiveNewlines() diff --git a/playground/components/editor.tsx b/playground/components/editor.tsx index 1986abe9..7feecfea 100644 --- a/playground/components/editor.tsx +++ b/playground/components/editor.tsx @@ -26,6 +26,7 @@ const Editor = () => { completionRef.current = registerCompletion(monaco, editor, { endpoint: '/api/code-completion', language: 'python', + trigger: 'onTyping', }); }} /> From 06635d6324764ed845bcaf07c1d8e7d462d3dfae Mon Sep 17 00:00:00 2001 From: arshad Date: Wed, 26 Feb 2025 16:55:21 +0530 Subject: [PATCH 3/4] chore: reset playground model --- playground/components/editor.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/playground/components/editor.tsx b/playground/components/editor.tsx index 7feecfea..9c6209e9 100644 --- a/playground/components/editor.tsx +++ b/playground/components/editor.tsx @@ -19,14 +19,13 @@ const Editor = () => { { completionRef.current = registerCompletion(monaco, editor, { endpoint: '/api/code-completion', - language: 'python', - trigger: 'onTyping', + language: 'javascript', }); }} /> From d5aa544f9300881dc2dd114fb427ff66a272b692 Mon Sep 17 00:00:00 2001 From: arshad Date: Wed, 26 Feb 2025 17:41:32 +0530 Subject: [PATCH 4/4] docs: upgrade to v1 guide --- docs/.vitepress/config.mts | 6 ++ docs/guides/upgrade-to-v1.md | 127 +++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 docs/guides/upgrade-to-v1.md diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 4ad3124f..96391013 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -73,6 +73,12 @@ export default defineConfig({ }, ], }, + { + text: 'Guides', + items: [ + {text: 'Upgrade to v1.0.0', link: '/guides/upgrade-to-v1'}, + ], + }, { text: 'Examples', items: [ diff --git a/docs/guides/upgrade-to-v1.md b/docs/guides/upgrade-to-v1.md new file mode 100644 index 00000000..46e5ed2b --- /dev/null +++ b/docs/guides/upgrade-to-v1.md @@ -0,0 +1,127 @@ +--- +title: Upgrading to Monacopilot v1.0.0 +--- + +::: info +This guide is for those who have already installed and are using monacopilot with a version older than v1 and want to upgrade to monacopilot's stable new major v1 release. For newcomers, you can skip this. +::: + +# Upgrading to Monacopilot `v1.0.0` + +With the release of v1.0.0, Monacopilot now delivers faster, more accurate code completions powered by Mistral's Codestral model. This guide will help you quickly update your existing implementation. + +## Breaking Changes + +- **Provider Optimization**: Previous general-purpose chat models have been replaced with Mistral's specialized `codestral` model, which is specifically designed for code completion. This model leverages Fill-in-the-Middle (FIM) technology to deliver significantly faster and super accurate completions. + +- **Enhanced Customization API**: The interfaces for custom prompts and custom models have been completely redesigned to provide more flexibility and better performance. These changes enable more sophisticated integrations while maintaining a clean developer experience. + +## Update Steps + +### 1. Update your dependencies + +```bash +npm install monacopilot@1.0.0 +``` + +### 2. Update your server-side code + +Replace your existing CompletionCopilot configuration: + +```javascript +// Before (v0.19.17) +const copilot = new CompletionCopilot(process.env.OPENAI_API_KEY, { + provider: 'openai', + model: 'gpt-4o', +}); + +// After (v1.0.0) +const copilot = new CompletionCopilot(process.env.MISTRAL_API_KEY, { + provider: 'mistral', + model: 'codestral', +}); +``` + +For more information about available providers and models, see the [Copilot Options](/configuration/copilot-options) documentation. + +### 3. Update your environment variables + +Create or update your API key: + +``` +# Before +OPENAI_API_KEY=your_openai_api_key_here + +# After +MISTRAL_API_KEY=your_mistral_api_key_here +``` + +You can obtain a Mistral API key from the [Mistral AI Console](https://console.mistral.ai/api-keys). + +### 4. Update Custom Prompt Implementation (If Used) + +If you use the custom prompt feature, the interface has changed: + +```javascript +// Before (v0.19.17) +copilot.complete({ + options: { + customPrompt: metadata => ({ + system: 'Your custom system prompt here', + user: 'Your custom user prompt here', + }), + }, +}); + +// After (v1.0.0) +copilot.complete({ + options: { + customPrompt: metadata => ({ + context: 'Information about the codebase context', + instruction: 'Instructions for code completion', + fileContent: 'File content with cursor position', + }), + }, +}); +``` + +For detailed information about the new custom prompt format, see the [Custom Prompt API](/advanced/custom-prompt) documentation. + +### 5. Update Custom Model Integration (If Used) + +If you use a custom model configuration, update to the new interface: + +```javascript +// Before (v0.19.17) +const copilot = new CompletionCopilot(API_KEY, { + model: { + config: (apiKey, prompt) => ({ + endpoint: 'https://your-api-endpoint.com', + body: { + inputs: prompt.user, + // other parameters + }, + // headers + }), + transformResponse: response => ({text: response.generated_text}), + }, +}); + +// After (v1.0.0) +const copilot = new CompletionCopilot(API_KEY, { + model: { + config: (apiKey, prompt) => ({ + endpoint: 'https://your-api-endpoint.com', + body: { + // The prompt now has context, instruction, and fileContent + inputs: `${prompt.context}\n\n${prompt.instruction}\n\n${prompt.fileContent}`, + // other parameters + }, + // headers + }), + transformResponse: response => ({text: response.generated_text}), + }, +}); +``` + +For complete details on implementing custom models, see the [Custom Model Integration](/advanced/custom-model) documentation.