Colin Hill commited on
Commit
7448666
·
2 Parent(s): 8fb0248 dd4dd2c

Merge branch 'main' from coleam00 into add-docker-support

Browse files
.env.example ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Rename this file to .env.local once you have filled in the below environment variables!
2
+
3
+ # Get your GROQ API Key here -
4
+ # https://console.groq.com/keys
5
+ # You only need this environment variable set if you want to use Groq models
6
+ GROQ_API_KEY=
7
+
8
+ # Get your Open AI API Key by following these instructions -
9
+ # https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key
10
+ # You only need this environment variable set if you want to use GPT models
11
+ OPENAI_API_KEY=
12
+
13
+ # Get your Anthropic API Key in your account settings -
14
+ # https://console.anthropic.com/settings/keys
15
+ # You only need this environment variable set if you want to use Claude models
16
+ ANTHROPIC_API_KEY=
17
+
18
+ # Get your OpenRouter API Key in your account settings -
19
+ # https://openrouter.ai/settings/keys
20
+ # You only need this environment variable set if you want to use OpenRouter models
21
+ OPEN_ROUTER_API_KEY=
22
+
23
+ # Get your Google Generative AI API Key by following these instructions -
24
+ # https://console.cloud.google.com/apis/credentials
25
+ # You only need this environment variable set if you want to use Google Generative AI models
26
+ GOOGLE_GENERATIVE_AI_API_KEY=
27
+
28
+ # You only need this environment variable set if you want to use oLLAMA models
29
+ # EXAMPLE http://localhost:11434
30
+ OLLAMA_API_BASE_URL=
31
+
32
+ # Include this environment variable if you want more logging for debugging locally
33
+ VITE_LOG_LEVEL=debug
.gitignore CHANGED
@@ -24,7 +24,8 @@ dist-ssr
24
 
25
  /.cache
26
  /build
27
- .env*
 
28
  *.vars
29
  .wrangler
30
  _worker.bundle
 
24
 
25
  /.cache
26
  /build
27
+ .env.local
28
+ .env
29
  *.vars
30
  .wrangler
31
  _worker.bundle
README.md CHANGED
@@ -1,12 +1,41 @@
1
  [![Bolt.new: AI-Powered Full-Stack Web Development in the Browser](./public/social_preview_index.jpg)](https://bolt.new)
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  # Bolt.new: AI-Powered Full-Stack Web Development in the Browser
4
 
5
  Bolt.new is an AI-powered web development agent that allows you to prompt, run, edit, and deploy full-stack applications directly from your browser—no local setup required. If you're here to build your own AI-powered web dev agent using the Bolt open source codebase, [click here to get started!](./CONTRIBUTING.md)
6
 
7
  ## What Makes Bolt.new Different
8
 
9
- Claude, v0, etc are incredible- but you can't install packages, run backends or edit code. That’s where Bolt.new stands out:
10
 
11
  - **Full-Stack in the Browser**: Bolt.new integrates cutting-edge AI models with an in-browser development environment powered by **StackBlitz’s WebContainers**. This allows you to:
12
  - Install and run npm tools and libraries (like Vite, Next.js, and more)
@@ -15,40 +44,86 @@ Claude, v0, etc are incredible- but you can't install packages, run backends or
15
  - Deploy to production from chat
16
  - Share your work via a URL
17
 
18
- - **AI with Environment Control**: Unlike traditional dev environments where the AI can only assist in code generation, Bolt.new gives AI models **complete control** over the entire environment including the filesystem, node server, package manager, terminal, and browser console. This empowers AI agents to handle the entire app lifecycle—from creation to deployment.
19
 
20
- Whether you’re an experienced developer, a PM or designer, Bolt.new allows you to build production-grade full-stack applications with ease.
21
 
22
  For developers interested in building their own AI-powered development tools with WebContainers, check out the open-source Bolt codebase in this repo!
23
 
24
- ## Tips and Tricks
25
 
26
- Here are some tips to get the most out of Bolt.new:
27
 
28
- - **Be specific about your stack**: If you want to use specific frameworks or libraries (like Astro, Tailwind, ShadCN, or any other popular JavaScript framework), mention them in your initial prompt to ensure Bolt scaffolds the project accordingly.
 
29
 
30
- - **Use the enhance prompt icon**: Before sending your prompt, try clicking the 'enhance' icon to have the AI model help you refine your prompt, then edit the results before submitting.
31
 
32
- - **Scaffold the basics first, then add features**: Make sure the basic structure of your application is in place before diving into more advanced functionality. This helps Bolt understand the foundation of your project and ensure everything is wired up right before building out more advanced functionality.
33
 
34
- - **Batch simple instructions**: Save time by combining simple instructions into one message. For example, you can ask Bolt to change the color scheme, add mobile responsiveness, and restart the dev server, all in one go saving you time and reducing API credit consumption significantly.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
- ## FAQs
37
 
38
- **Where do I sign up for a paid plan?**
39
- Bolt.new is free to get started. If you need more AI tokens or want private projects, you can purchase a paid subscription in your [Bolt.new](https://bolt.new) settings, in the lower-left hand corner of the application.
40
 
41
- **What happens if I hit the free usage limit?**
42
- Once your free daily token limit is reached, AI interactions are paused until the next day or until you upgrade your plan.
43
 
44
- **Is Bolt in beta?**
45
- Yes, Bolt.new is in beta, and we are actively improving it based on feedback.
46
 
47
- **How can I report Bolt.new issues?**
48
- Check out the [Issues section](https://github.com/stackblitz/bolt.new/issues) to report an issue or request a new feature. Please use the search feature to check if someone else has already submitted the same issue/request.
 
 
 
 
 
 
49
 
50
- **What frameworks/libraries currently work on Bolt?**
51
- Bolt.new supports most popular JavaScript frameworks and libraries. If it runs on StackBlitz, it will run on Bolt.new as well.
52
 
53
- **How can I add make sure my framework/project works well in bolt?**
54
- We are excited to work with the JavaScript ecosystem to improve functionality in Bolt. Reach out to us via [[email protected]](mailto:[email protected]) to discuss how we can partner!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  [![Bolt.new: AI-Powered Full-Stack Web Development in the Browser](./public/social_preview_index.jpg)](https://bolt.new)
2
 
3
+ # Bolt.new Fork by Cole Medin
4
+
5
+ This fork of Bolt.new allows you to choose the LLM that you use for each prompt! Currently, you can use OpenAI, Anthropic, Ollama, OpenRouter, Gemini, or Groq models - and it is easily extended to use any other model supported by the Vercel AI SDK! See the instructions below for running this locally and extending it to include more models.
6
+
7
+ # Requested Additions to this Fork - Feel Free to Contribute!!
8
+
9
+ - ✅ OpenRouter Integration (@coleam00)
10
+ - ✅ Gemini Integration (@jonathands)
11
+ - ✅ Autogenerate Ollama models from what is downloaded (@yunatamos)
12
+ - ✅ Filter models by provider (@jasonm23)
13
+ - ✅ Download project as ZIP (@fabwaseem)
14
+ - ⬜ LM Studio Integration
15
+ - ⬜ DeepSeek API Integration
16
+ - ⬜ Together Integration
17
+ - ⬜ Azure Open AI API Integration
18
+ - ⬜ HuggingFace Integration
19
+ - ⬜ Perplexity Integration
20
+ - ⬜ Containerize the application with Docker for easy installation
21
+ - ⬜ Better prompting for smaller LLMs (code window sometimes doesn't start)
22
+ - ⬜ Attach images to prompts
23
+ - ⬜ Run agents in the backend as opposed to a single model call
24
+ - ⬜ Publish projects directly to GitHub
25
+ - ⬜ Deploy directly to Vercel/Netlify/other similar platforms
26
+ - ⬜ Load local projects into the app
27
+ - ⬜ Ability to revert code to earlier version
28
+ - ⬜ Prompt caching
29
+ - ⬜ Ability to enter API keys in the UI
30
+ - ⬜ Prevent Bolt from rewriting files as often
31
+
32
  # Bolt.new: AI-Powered Full-Stack Web Development in the Browser
33
 
34
  Bolt.new is an AI-powered web development agent that allows you to prompt, run, edit, and deploy full-stack applications directly from your browser—no local setup required. If you're here to build your own AI-powered web dev agent using the Bolt open source codebase, [click here to get started!](./CONTRIBUTING.md)
35
 
36
  ## What Makes Bolt.new Different
37
 
38
+ Claude, v0, etc are incredible- but you can't install packages, run backends, or edit code. That’s where Bolt.new stands out:
39
 
40
  - **Full-Stack in the Browser**: Bolt.new integrates cutting-edge AI models with an in-browser development environment powered by **StackBlitz’s WebContainers**. This allows you to:
41
  - Install and run npm tools and libraries (like Vite, Next.js, and more)
 
44
  - Deploy to production from chat
45
  - Share your work via a URL
46
 
47
+ - **AI with Environment Control**: Unlike traditional dev environments where the AI can only assist in code generation, Bolt.new gives AI models **complete control** over the entire environment including the filesystem, node server, package manager, terminal, and browser console. This empowers AI agents to handle the whole app lifecycle—from creation to deployment.
48
 
49
+ Whether you’re an experienced developer, a PM, or a designer, Bolt.new allows you to easily build production-grade full-stack applications.
50
 
51
  For developers interested in building their own AI-powered development tools with WebContainers, check out the open-source Bolt codebase in this repo!
52
 
53
+ ## Prerequisites
54
 
55
+ Before you begin, ensure you have the following installed:
56
 
57
+ - Node.js (v20.15.1)
58
+ - pnpm (v9.4.0)
59
 
60
+ ## Setup
61
 
62
+ 1. Clone the repository (if you haven't already):
63
 
64
+ ```bash
65
+ git clone https://github.com/coleam00/bolt.new-any-llm.git
66
+ ```
67
+
68
+ 2. Install dependencies:
69
+
70
+ ```bash
71
+ pnpm install
72
+ ```
73
+
74
+ 3. Rename `.env.example` to .env.local and add your LLM API keys (you only have to set the ones you want to use and Ollama doesn't need an API key because it runs locally on your computer):
75
+
76
+ ```
77
+ GROQ_API_KEY=XXX
78
+ OPENAI_API_KEY=XXX
79
+ ANTHROPIC_API_KEY=XXX
80
+ ```
81
+
82
+ Optionally, you can set the debug level:
83
+
84
+ ```
85
+ VITE_LOG_LEVEL=debug
86
+ ```
87
+
88
+ **Important**: Never commit your `.env.local` file to version control. It's already included in .gitignore.
89
+
90
+ ## Adding New LLMs:
91
 
92
+ To make new LLMs available to use in this version of Bolt.new, head on over to `app/utils/constants.ts` and find the constant MODEL_LIST. Each element in this array is an object that has the model ID for the name (get this from the provider's API documentation), a label for the frontend model dropdown, and the provider.
93
 
94
+ By default, Anthropic, OpenAI, Groq, and Ollama are implemented as providers, but the YouTube video for this repo covers how to extend this to work with more providers if you wish!
 
95
 
96
+ When you add a new model to the MODEL_LIST array, it will immediately be available to use when you run the app locally or reload it. For Ollama models, make sure you have the model installed already before trying to use it here!
 
97
 
98
+ ## Available Scripts
 
99
 
100
+ - `pnpm run dev`: Starts the development server.
101
+ - `pnpm run build`: Builds the project.
102
+ - `pnpm run start`: Runs the built application locally using Wrangler Pages. This script uses `bindings.sh` to set up necessary bindings so you don't have to duplicate environment variables.
103
+ - `pnpm run preview`: Builds the project and then starts it locally, useful for testing the production build. Note, HTTP streaming currently doesn't work as expected with `wrangler pages dev`.
104
+ - `pnpm test`: Runs the test suite using Vitest.
105
+ - `pnpm run typecheck`: Runs TypeScript type checking.
106
+ - `pnpm run typegen`: Generates TypeScript types using Wrangler.
107
+ - `pnpm run deploy`: Builds the project and deploys it to Cloudflare Pages.
108
 
109
+ ## Development
 
110
 
111
+ To start the development server:
112
+
113
+ ```bash
114
+ pnpm run dev
115
+ ```
116
+
117
+ This will start the Remix Vite development server. You will need Google Chrome Canary to run this locally! It's an easy install and a good browser for web development anyway.
118
+
119
+ ## Tips and Tricks
120
+
121
+ Here are some tips to get the most out of Bolt.new:
122
+
123
+ - **Be specific about your stack**: If you want to use specific frameworks or libraries (like Astro, Tailwind, ShadCN, or any other popular JavaScript framework), mention them in your initial prompt to ensure Bolt scaffolds the project accordingly.
124
+
125
+ - **Use the enhance prompt icon**: Before sending your prompt, try clicking the 'enhance' icon to have the AI model help you refine your prompt, then edit the results before submitting.
126
+
127
+ - **Scaffold the basics first, then add features**: Make sure the basic structure of your application is in place before diving into more advanced functionality. This helps Bolt understand the foundation of your project and ensure everything is wired up right before building out more advanced functionality.
128
+
129
+ - **Batch simple instructions**: Save time by combining simple instructions into one message. For example, you can ask Bolt to change the color scheme, add mobile responsiveness, and restart the dev server, all in one go saving you time and reducing API credit consumption significantly.
app/components/chat/BaseChat.tsx CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import type { Message } from 'ai';
2
  import React, { type RefCallback } from 'react';
3
  import { ClientOnly } from 'remix-utils/client-only';
@@ -5,11 +7,62 @@ import { Menu } from '~/components/sidebar/Menu.client';
5
  import { IconButton } from '~/components/ui/IconButton';
6
  import { Workbench } from '~/components/workbench/Workbench.client';
7
  import { classNames } from '~/utils/classNames';
 
8
  import { Messages } from './Messages.client';
9
  import { SendButton } from './SendButton.client';
 
10
 
11
  import styles from './BaseChat.module.scss';
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  interface BaseChatProps {
14
  textareaRef?: React.RefObject<HTMLTextAreaElement> | undefined;
15
  messageRef?: RefCallback<HTMLDivElement> | undefined;
@@ -21,22 +74,14 @@ interface BaseChatProps {
21
  enhancingPrompt?: boolean;
22
  promptEnhanced?: boolean;
23
  input?: string;
 
 
24
  handleStop?: () => void;
25
  sendMessage?: (event: React.UIEvent, messageInput?: string) => void;
26
  handleInputChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
27
  enhancePrompt?: () => void;
28
  }
29
 
30
- const EXAMPLE_PROMPTS = [
31
- { text: 'Build a todo app in React using Tailwind' },
32
- { text: 'Build a simple blog using Astro' },
33
- { text: 'Create a cookie consent form using Material UI' },
34
- { text: 'Make a space invaders game' },
35
- { text: 'How do I center a div?' },
36
- ];
37
-
38
- const TEXTAREA_MIN_HEIGHT = 76;
39
-
40
  export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
41
  (
42
  {
@@ -50,6 +95,8 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
50
  promptEnhanced = false,
51
  messages,
52
  input = '',
 
 
53
  sendMessage,
54
  handleInputChange,
55
  enhancePrompt,
@@ -103,6 +150,12 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
103
  'sticky bottom-0': chatStarted,
104
  })}
105
  >
 
 
 
 
 
 
106
  <div
107
  className={classNames(
108
  'shadow-sm border border-bolt-elements-borderColor bg-bolt-elements-prompt-background backdrop-filter backdrop-blur-[8px] rounded-lg overflow-hidden',
@@ -210,4 +263,4 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
210
  </div>
211
  );
212
  },
213
- );
 
1
+ // @ts-nocheck
2
+ // Preventing TS checks with files presented in the video for a better presentation.
3
  import type { Message } from 'ai';
4
  import React, { type RefCallback } from 'react';
5
  import { ClientOnly } from 'remix-utils/client-only';
 
7
  import { IconButton } from '~/components/ui/IconButton';
8
  import { Workbench } from '~/components/workbench/Workbench.client';
9
  import { classNames } from '~/utils/classNames';
10
+ import { MODEL_LIST, DEFAULT_PROVIDER } from '~/utils/constants';
11
  import { Messages } from './Messages.client';
12
  import { SendButton } from './SendButton.client';
13
+ import { useState } from 'react';
14
 
15
  import styles from './BaseChat.module.scss';
16
 
17
+ const EXAMPLE_PROMPTS = [
18
+ { text: 'Build a todo app in React using Tailwind' },
19
+ { text: 'Build a simple blog using Astro' },
20
+ { text: 'Create a cookie consent form using Material UI' },
21
+ { text: 'Make a space invaders game' },
22
+ { text: 'How do I center a div?' },
23
+ ];
24
+
25
+ const providerList = [...new Set(MODEL_LIST.map((model) => model.provider))]
26
+
27
+ const ModelSelector = ({ model, setModel, modelList, providerList }) => {
28
+ const [provider, setProvider] = useState(DEFAULT_PROVIDER);
29
+ return (
30
+ <div className="mb-2">
31
+ <select
32
+ value={provider}
33
+ onChange={(e) => {
34
+ setProvider(e.target.value);
35
+ const firstModel = [...modelList].find(m => m.provider == e.target.value);
36
+ setModel(firstModel ? firstModel.name : '');
37
+ }}
38
+ className="w-full p-2 rounded-lg border border-bolt-elements-borderColor bg-bolt-elements-prompt-background text-bolt-elements-textPrimary focus:outline-none"
39
+ >
40
+ {providerList.map((provider) => (
41
+ <option key={provider} value={provider}>
42
+ {provider}
43
+ </option>
44
+ ))}
45
+ <option key="Ollama" value="Ollama">
46
+ Ollama
47
+ </option>
48
+ </select>
49
+ <select
50
+ value={model}
51
+ onChange={(e) => setModel(e.target.value)}
52
+ className="w-full p-2 rounded-lg border border-bolt-elements-borderColor bg-bolt-elements-prompt-background text-bolt-elements-textPrimary focus:outline-none"
53
+ >
54
+ {[...modelList].filter(e => e.provider == provider && e.name).map((modelOption) => (
55
+ <option key={modelOption.name} value={modelOption.name}>
56
+ {modelOption.label}
57
+ </option>
58
+ ))}
59
+ </select>
60
+ </div>
61
+ );
62
+ };
63
+
64
+ const TEXTAREA_MIN_HEIGHT = 76;
65
+
66
  interface BaseChatProps {
67
  textareaRef?: React.RefObject<HTMLTextAreaElement> | undefined;
68
  messageRef?: RefCallback<HTMLDivElement> | undefined;
 
74
  enhancingPrompt?: boolean;
75
  promptEnhanced?: boolean;
76
  input?: string;
77
+ model: string;
78
+ setModel: (model: string) => void;
79
  handleStop?: () => void;
80
  sendMessage?: (event: React.UIEvent, messageInput?: string) => void;
81
  handleInputChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
82
  enhancePrompt?: () => void;
83
  }
84
 
 
 
 
 
 
 
 
 
 
 
85
  export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
86
  (
87
  {
 
95
  promptEnhanced = false,
96
  messages,
97
  input = '',
98
+ model,
99
+ setModel,
100
  sendMessage,
101
  handleInputChange,
102
  enhancePrompt,
 
150
  'sticky bottom-0': chatStarted,
151
  })}
152
  >
153
+ <ModelSelector
154
+ model={model}
155
+ setModel={setModel}
156
+ modelList={MODEL_LIST}
157
+ providerList={providerList}
158
+ />
159
  <div
160
  className={classNames(
161
  'shadow-sm border border-bolt-elements-borderColor bg-bolt-elements-prompt-background backdrop-filter backdrop-blur-[8px] rounded-lg overflow-hidden',
 
263
  </div>
264
  );
265
  },
266
+ );
app/components/chat/Chat.client.tsx CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import { useStore } from '@nanostores/react';
2
  import type { Message } from 'ai';
3
  import { useChat } from 'ai/react';
@@ -9,6 +11,7 @@ import { useChatHistory } from '~/lib/persistence';
9
  import { chatStore } from '~/lib/stores/chat';
10
  import { workbenchStore } from '~/lib/stores/workbench';
11
  import { fileModificationsToHTML } from '~/utils/diff';
 
12
  import { cubicEasingFn } from '~/utils/easings';
13
  import { createScopedLogger, renderLogger } from '~/utils/logger';
14
  import { BaseChat } from './BaseChat';
@@ -70,6 +73,7 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
70
  const textareaRef = useRef<HTMLTextAreaElement>(null);
71
 
72
  const [chatStarted, setChatStarted] = useState(initialMessages.length > 0);
 
73
 
74
  const { showChat } = useStore(chatStore);
75
 
@@ -178,7 +182,7 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
178
  * manually reset the input and we'd have to manually pass in file attachments. However, those
179
  * aren't relevant here.
180
  */
181
- append({ role: 'user', content: `${diff}\n\n${_input}` });
182
 
183
  /**
184
  * After sending a new message we reset all modifications since the model
@@ -186,7 +190,7 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
186
  */
187
  workbenchStore.resetAllFileModifications();
188
  } else {
189
- append({ role: 'user', content: _input });
190
  }
191
 
192
  setInput('');
@@ -209,6 +213,8 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
209
  enhancingPrompt={enhancingPrompt}
210
  promptEnhanced={promptEnhanced}
211
  sendMessage={sendMessage}
 
 
212
  messageRef={messageRef}
213
  scrollRef={scrollRef}
214
  handleInputChange={handleInputChange}
 
1
+ // @ts-nocheck
2
+ // Preventing TS checks with files presented in the video for a better presentation.
3
  import { useStore } from '@nanostores/react';
4
  import type { Message } from 'ai';
5
  import { useChat } from 'ai/react';
 
11
  import { chatStore } from '~/lib/stores/chat';
12
  import { workbenchStore } from '~/lib/stores/workbench';
13
  import { fileModificationsToHTML } from '~/utils/diff';
14
+ import { DEFAULT_MODEL } from '~/utils/constants';
15
  import { cubicEasingFn } from '~/utils/easings';
16
  import { createScopedLogger, renderLogger } from '~/utils/logger';
17
  import { BaseChat } from './BaseChat';
 
73
  const textareaRef = useRef<HTMLTextAreaElement>(null);
74
 
75
  const [chatStarted, setChatStarted] = useState(initialMessages.length > 0);
76
+ const [model, setModel] = useState(DEFAULT_MODEL);
77
 
78
  const { showChat } = useStore(chatStore);
79
 
 
182
  * manually reset the input and we'd have to manually pass in file attachments. However, those
183
  * aren't relevant here.
184
  */
185
+ append({ role: 'user', content: `[Model: ${model}]\n\n${diff}\n\n${_input}` });
186
 
187
  /**
188
  * After sending a new message we reset all modifications since the model
 
190
  */
191
  workbenchStore.resetAllFileModifications();
192
  } else {
193
+ append({ role: 'user', content: `[Model: ${model}]\n\n${_input}` });
194
  }
195
 
196
  setInput('');
 
213
  enhancingPrompt={enhancingPrompt}
214
  promptEnhanced={promptEnhanced}
215
  sendMessage={sendMessage}
216
+ model={model}
217
+ setModel={setModel}
218
  messageRef={messageRef}
219
  scrollRef={scrollRef}
220
  handleInputChange={handleInputChange}
app/components/chat/UserMessage.tsx CHANGED
@@ -1,4 +1,7 @@
 
 
1
  import { modificationsRegex } from '~/utils/diff';
 
2
  import { Markdown } from './Markdown';
3
 
4
  interface UserMessageProps {
@@ -14,5 +17,5 @@ export function UserMessage({ content }: UserMessageProps) {
14
  }
15
 
16
  function sanitizeUserMessage(content: string) {
17
- return content.replace(modificationsRegex, '').trim();
18
  }
 
1
+ // @ts-nocheck
2
+ // Preventing TS checks with files presented in the video for a better presentation.
3
  import { modificationsRegex } from '~/utils/diff';
4
+ import { MODEL_REGEX } from '~/utils/constants';
5
  import { Markdown } from './Markdown';
6
 
7
  interface UserMessageProps {
 
17
  }
18
 
19
  function sanitizeUserMessage(content: string) {
20
+ return content.replace(modificationsRegex, '').replace(MODEL_REGEX, '').trim();
21
  }
app/components/workbench/Workbench.client.tsx CHANGED
@@ -122,15 +122,26 @@ export const Workbench = memo(({ chatStarted, isStreaming }: WorkspaceProps) =>
122
  <Slider selected={selectedView} options={sliderOptions} setSelected={setSelectedView} />
123
  <div className="ml-auto" />
124
  {selectedView === 'code' && (
125
- <PanelHeaderButton
126
- className="mr-1 text-sm"
127
- onClick={() => {
128
- workbenchStore.toggleTerminal(!workbenchStore.showTerminal.get());
129
- }}
130
- >
131
- <div className="i-ph:terminal" />
132
- Toggle Terminal
133
- </PanelHeaderButton>
 
 
 
 
 
 
 
 
 
 
 
134
  )}
135
  <IconButton
136
  icon="i-ph:x-circle"
 
122
  <Slider selected={selectedView} options={sliderOptions} setSelected={setSelectedView} />
123
  <div className="ml-auto" />
124
  {selectedView === 'code' && (
125
+ <>
126
+ <PanelHeaderButton
127
+ className="mr-1 text-sm"
128
+ onClick={() => {
129
+ workbenchStore.downloadZip();
130
+ }}
131
+ >
132
+ <div className="i-ph:code" />
133
+ Download Code
134
+ </PanelHeaderButton>
135
+ <PanelHeaderButton
136
+ className="mr-1 text-sm"
137
+ onClick={() => {
138
+ workbenchStore.toggleTerminal(!workbenchStore.showTerminal.get());
139
+ }}
140
+ >
141
+ <div className="i-ph:terminal" />
142
+ Toggle Terminal
143
+ </PanelHeaderButton>
144
+ </>
145
  )}
146
  <IconButton
147
  icon="i-ph:x-circle"
app/entry.server.tsx CHANGED
@@ -5,6 +5,7 @@ import { renderToReadableStream } from 'react-dom/server';
5
  import { renderHeadToString } from 'remix-island';
6
  import { Head } from './root';
7
  import { themeStore } from '~/lib/stores/theme';
 
8
 
9
  export default async function handleRequest(
10
  request: Request,
@@ -13,6 +14,8 @@ export default async function handleRequest(
13
  remixContext: EntryContext,
14
  _loadContext: AppLoadContext,
15
  ) {
 
 
16
  const readable = await renderToReadableStream(<RemixServer context={remixContext} url={request.url} />, {
17
  signal: request.signal,
18
  onError(error: unknown) {
 
5
  import { renderHeadToString } from 'remix-island';
6
  import { Head } from './root';
7
  import { themeStore } from '~/lib/stores/theme';
8
+ import { initializeModelList } from '~/utils/constants';
9
 
10
  export default async function handleRequest(
11
  request: Request,
 
14
  remixContext: EntryContext,
15
  _loadContext: AppLoadContext,
16
  ) {
17
+ await initializeModelList();
18
+
19
  const readable = await renderToReadableStream(<RemixServer context={remixContext} url={request.url} />, {
20
  signal: request.signal,
21
  onError(error: unknown) {
app/lib/.server/llm/api-key.ts CHANGED
@@ -1,9 +1,25 @@
 
 
1
  import { env } from 'node:process';
2
 
3
- export function getAPIKey(cloudflareEnv: Env) {
4
  /**
5
  * The `cloudflareEnv` is only used when deployed or when previewing locally.
6
  * In development the environment variables are available through `env`.
7
  */
8
- return env.ANTHROPIC_API_KEY || cloudflareEnv.ANTHROPIC_API_KEY;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
 
1
+ // @ts-nocheck
2
+ // Preventing TS checks with files presented in the video for a better presentation.
3
  import { env } from 'node:process';
4
 
5
+ export function getAPIKey(cloudflareEnv: Env, provider: string) {
6
  /**
7
  * The `cloudflareEnv` is only used when deployed or when previewing locally.
8
  * In development the environment variables are available through `env`.
9
  */
10
+
11
+ switch (provider) {
12
+ case 'Anthropic':
13
+ return env.ANTHROPIC_API_KEY || cloudflareEnv.ANTHROPIC_API_KEY;
14
+ case 'OpenAI':
15
+ return env.OPENAI_API_KEY || cloudflareEnv.OPENAI_API_KEY;
16
+ case 'Google':
17
+ return env.GOOGLE_GENERATIVE_AI_API_KEY || cloudflareEnv.GOOGLE_GENERATIVE_AI_API_KEY;
18
+ case 'Groq':
19
+ return env.GROQ_API_KEY || cloudflareEnv.GROQ_API_KEY;
20
+ case 'OpenRouter':
21
+ return env.OPEN_ROUTER_API_KEY || cloudflareEnv.OPEN_ROUTER_API_KEY;
22
+ default:
23
+ return "";
24
+ }
25
  }
app/lib/.server/llm/model.ts CHANGED
@@ -1,9 +1,73 @@
 
 
 
1
  import { createAnthropic } from '@ai-sdk/anthropic';
 
 
 
 
2
 
3
- export function getAnthropicModel(apiKey: string) {
4
  const anthropic = createAnthropic({
5
  apiKey,
6
  });
7
 
8
- return anthropic('claude-3-5-sonnet-20240620');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
 
1
+ // @ts-nocheck
2
+ // Preventing TS checks with files presented in the video for a better presentation.
3
+ import { getAPIKey } from '~/lib/.server/llm/api-key';
4
  import { createAnthropic } from '@ai-sdk/anthropic';
5
+ import { createOpenAI } from '@ai-sdk/openai';
6
+ import { createGoogleGenerativeAI } from '@ai-sdk/google';
7
+ import { ollama } from 'ollama-ai-provider';
8
+ import { createOpenRouter } from "@openrouter/ai-sdk-provider";
9
 
10
+ export function getAnthropicModel(apiKey: string, model: string) {
11
  const anthropic = createAnthropic({
12
  apiKey,
13
  });
14
 
15
+ return anthropic(model);
16
+ }
17
+
18
+ export function getOpenAIModel(apiKey: string, model: string) {
19
+ const openai = createOpenAI({
20
+ apiKey,
21
+ });
22
+
23
+ return openai(model);
24
+ }
25
+
26
+ export function getGoogleModel(apiKey: string, model: string) {
27
+ const google = createGoogleGenerativeAI(
28
+ apiKey,
29
+ );
30
+
31
+ return google(model);
32
+ }
33
+
34
+ export function getGroqModel(apiKey: string, model: string) {
35
+ const openai = createOpenAI({
36
+ baseURL: 'https://api.groq.com/openai/v1',
37
+ apiKey,
38
+ });
39
+
40
+ return openai(model);
41
+ }
42
+
43
+ export function getOllamaModel(model: string) {
44
+ return ollama(model);
45
+ }
46
+
47
+ export function getOpenRouterModel(apiKey: string, model: string) {
48
+ const openRouter = createOpenRouter({
49
+ apiKey
50
+ });
51
+
52
+ return openRouter.chat(model);
53
+ }
54
+
55
+ export function getModel(provider: string, model: string, env: Env) {
56
+ const apiKey = getAPIKey(env, provider);
57
+
58
+
59
+ switch (provider) {
60
+ case 'Anthropic':
61
+ return getAnthropicModel(apiKey, model);
62
+ case 'OpenAI':
63
+ return getOpenAIModel(apiKey, model);
64
+ case 'Groq':
65
+ return getGroqModel(apiKey, model);
66
+ case 'OpenRouter':
67
+ return getOpenRouterModel(apiKey, model);
68
+ case 'Google':
69
+ return getGoogleModel(apiKey, model)
70
+ default:
71
+ return getOllamaModel(model);
72
+ }
73
  }
app/lib/.server/llm/stream-text.ts CHANGED
@@ -1,8 +1,10 @@
 
 
1
  import { streamText as _streamText, convertToCoreMessages } from 'ai';
2
- import { getAPIKey } from '~/lib/.server/llm/api-key';
3
- import { getAnthropicModel } from '~/lib/.server/llm/model';
4
  import { MAX_TOKENS } from './constants';
5
  import { getSystemPrompt } from './prompts';
 
6
 
7
  interface ToolResult<Name extends string, Args, Result> {
8
  toolCallId: string;
@@ -15,21 +17,50 @@ interface Message {
15
  role: 'user' | 'assistant';
16
  content: string;
17
  toolInvocations?: ToolResult<string, unknown, unknown>[];
 
18
  }
19
 
20
  export type Messages = Message[];
21
 
22
  export type StreamingOptions = Omit<Parameters<typeof _streamText>[0], 'model'>;
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  export function streamText(messages: Messages, env: Env, options?: StreamingOptions) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  return _streamText({
26
- model: getAnthropicModel(getAPIKey(env)),
27
  system: getSystemPrompt(),
28
  maxTokens: MAX_TOKENS,
29
- headers: {
30
- 'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15',
31
- },
32
- messages: convertToCoreMessages(messages),
33
  ...options,
34
  });
35
  }
 
1
+ // @ts-nocheck
2
+ // Preventing TS checks with files presented in the video for a better presentation.
3
  import { streamText as _streamText, convertToCoreMessages } from 'ai';
4
+ import { getModel } from '~/lib/.server/llm/model';
 
5
  import { MAX_TOKENS } from './constants';
6
  import { getSystemPrompt } from './prompts';
7
+ import { MODEL_LIST, DEFAULT_MODEL, DEFAULT_PROVIDER } from '~/utils/constants';
8
 
9
  interface ToolResult<Name extends string, Args, Result> {
10
  toolCallId: string;
 
17
  role: 'user' | 'assistant';
18
  content: string;
19
  toolInvocations?: ToolResult<string, unknown, unknown>[];
20
+ model?: string;
21
  }
22
 
23
  export type Messages = Message[];
24
 
25
  export type StreamingOptions = Omit<Parameters<typeof _streamText>[0], 'model'>;
26
 
27
+ function extractModelFromMessage(message: Message): { model: string; content: string } {
28
+ const modelRegex = /^\[Model: (.*?)\]\n\n/;
29
+ const match = message.content.match(modelRegex);
30
+
31
+ if (match) {
32
+ const model = match[1];
33
+ const content = message.content.replace(modelRegex, '');
34
+ return { model, content };
35
+ }
36
+
37
+ // Default model if not specified
38
+ return { model: DEFAULT_MODEL, content: message.content };
39
+ }
40
+
41
  export function streamText(messages: Messages, env: Env, options?: StreamingOptions) {
42
+ let currentModel = DEFAULT_MODEL;
43
+ const processedMessages = messages.map((message) => {
44
+ if (message.role === 'user') {
45
+ const { model, content } = extractModelFromMessage(message);
46
+ if (model && MODEL_LIST.find((m) => m.name === model)) {
47
+ currentModel = model; // Update the current model
48
+ }
49
+ return { ...message, content };
50
+ }
51
+ return message;
52
+ });
53
+
54
+ const provider = MODEL_LIST.find((model) => model.name === currentModel)?.provider || DEFAULT_PROVIDER;
55
+
56
  return _streamText({
57
+ model: getModel(provider, currentModel, env),
58
  system: getSystemPrompt(),
59
  maxTokens: MAX_TOKENS,
60
+ // headers: {
61
+ // 'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15',
62
+ // },
63
+ messages: convertToCoreMessages(processedMessages),
64
  ...options,
65
  });
66
  }
app/lib/stores/workbench.ts CHANGED
@@ -9,6 +9,8 @@ import { EditorStore } from './editor';
9
  import { FilesStore, type FileMap } from './files';
10
  import { PreviewsStore } from './previews';
11
  import { TerminalStore } from './terminal';
 
 
12
 
13
  export interface ArtifactState {
14
  id: string;
@@ -271,6 +273,36 @@ export class WorkbenchStore {
271
  const artifacts = this.artifacts.get();
272
  return artifacts[id];
273
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  }
275
 
276
  export const workbenchStore = new WorkbenchStore();
 
9
  import { FilesStore, type FileMap } from './files';
10
  import { PreviewsStore } from './previews';
11
  import { TerminalStore } from './terminal';
12
+ import JSZip from 'jszip';
13
+ import { saveAs } from 'file-saver';
14
 
15
  export interface ArtifactState {
16
  id: string;
 
273
  const artifacts = this.artifacts.get();
274
  return artifacts[id];
275
  }
276
+
277
+ async downloadZip() {
278
+ const zip = new JSZip();
279
+ const files = this.files.get();
280
+
281
+ for (const [filePath, dirent] of Object.entries(files)) {
282
+ if (dirent?.type === 'file' && !dirent.isBinary) {
283
+ // Remove '/home/project/' from the beginning of the path
284
+ const relativePath = filePath.replace(/^\/home\/project\//, '');
285
+
286
+ // Split the path into segments
287
+ const pathSegments = relativePath.split('/');
288
+
289
+ // If there's more than one segment, we need to create folders
290
+ if (pathSegments.length > 1) {
291
+ let currentFolder = zip;
292
+ for (let i = 0; i < pathSegments.length - 1; i++) {
293
+ currentFolder = currentFolder.folder(pathSegments[i])!;
294
+ }
295
+ currentFolder.file(pathSegments[pathSegments.length - 1], dirent.content);
296
+ } else {
297
+ // If there's only one segment, it's a file in the root
298
+ zip.file(relativePath, dirent.content);
299
+ }
300
+ }
301
+ }
302
+
303
+ const content = await zip.generateAsync({ type: 'blob' });
304
+ saveAs(content, 'project.zip');
305
+ }
306
  }
307
 
308
  export const workbenchStore = new WorkbenchStore();
app/routes/api.chat.ts CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import { type ActionFunctionArgs } from '@remix-run/cloudflare';
2
  import { MAX_RESPONSE_SEGMENTS, MAX_TOKENS } from '~/lib/.server/llm/constants';
3
  import { CONTINUE_PROMPT } from '~/lib/.server/llm/prompts';
 
1
+ // @ts-nocheck
2
+ // Preventing TS checks with files presented in the video for a better presentation.
3
  import { type ActionFunctionArgs } from '@remix-run/cloudflare';
4
  import { MAX_RESPONSE_SEGMENTS, MAX_TOKENS } from '~/lib/.server/llm/constants';
5
  import { CONTINUE_PROMPT } from '~/lib/.server/llm/prompts';
app/routes/api.models.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { json } from '@remix-run/cloudflare';
2
+ import { MODEL_LIST } from '~/utils/constants';
3
+
4
+ export async function loader() {
5
+ return json(MODEL_LIST);
6
+ }
app/utils/constants.ts CHANGED
@@ -1,3 +1,57 @@
 
 
1
  export const WORK_DIR_NAME = 'project';
2
  export const WORK_DIR = `/home/${WORK_DIR_NAME}`;
3
  export const MODIFICATIONS_TAG_NAME = 'bolt_file_modifications';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { ModelInfo } from './types';
2
+
3
  export const WORK_DIR_NAME = 'project';
4
  export const WORK_DIR = `/home/${WORK_DIR_NAME}`;
5
  export const MODIFICATIONS_TAG_NAME = 'bolt_file_modifications';
6
+ export const MODEL_REGEX = /^\[Model: (.*?)\]\n\n/;
7
+ export const DEFAULT_MODEL = 'claude-3-5-sonnet-20240620';
8
+ export const DEFAULT_PROVIDER = 'Anthropic';
9
+
10
+ const staticModels: ModelInfo[] = [
11
+ { name: 'claude-3-5-sonnet-20240620', label: 'Claude 3.5 Sonnet', provider: 'Anthropic' },
12
+ { name: 'gpt-4o', label: 'GPT-4o', provider: 'OpenAI' },
13
+ { name: 'deepseek/deepseek-coder', label: 'Deepseek-Coder V2 236B (OpenRouter)', provider: 'OpenRouter' },
14
+ { name: 'google/gemini-flash-1.5', label: 'Google Gemini Flash 1.5 (OpenRouter)', provider: 'OpenRouter' },
15
+ { name: 'google/gemini-pro-1.5', label: 'Google Gemini Pro 1.5 (OpenRouter)', provider: 'OpenRouter' },
16
+ { name: 'mistralai/mistral-nemo', label: 'OpenRouter Mistral Nemo (OpenRouter)', provider: 'OpenRouter' },
17
+ { name: 'qwen/qwen-110b-chat', label: 'OpenRouter Qwen 110b Chat (OpenRouter)', provider: 'OpenRouter' },
18
+ { name: 'cohere/command', label: 'Cohere Command (OpenRouter)', provider: 'OpenRouter' },
19
+ { name: 'gemini-1.5-flash-latest', label: 'Gemini 1.5 Flash', provider: 'Google' },
20
+ { name: 'gemini-1.5-pro-latest', label: 'Gemini 1.5 Pro', provider: 'Google'},
21
+ { name: 'llama-3.1-70b-versatile', label: 'Llama 3.1 70b (Groq)', provider: 'Groq' },
22
+ { name: 'llama-3.1-8b-instant', label: 'Llama 3.1 8b (Groq)', provider: 'Groq' },
23
+ { name: 'llama-3.2-11b-vision-preview', label: 'Llama 3.2 11b (Groq)', provider: 'Groq' },
24
+ { name: 'llama-3.2-3b-preview', label: 'Llama 3.2 3b (Groq)', provider: 'Groq' },
25
+ { name: 'llama-3.2-1b-preview', label: 'Llama 3.2 1b (Groq)', provider: 'Groq' },
26
+ { name: 'claude-3-opus-20240229', label: 'Claude 3 Opus', provider: 'Anthropic' },
27
+ { name: 'claude-3-sonnet-20240229', label: 'Claude 3 Sonnet', provider: 'Anthropic' },
28
+ { name: 'claude-3-haiku-20240307', label: 'Claude 3 Haiku', provider: 'Anthropic' },
29
+ { name: 'gpt-4o-mini', label: 'GPT-4o Mini', provider: 'OpenAI' },
30
+ { name: 'gpt-4-turbo', label: 'GPT-4 Turbo', provider: 'OpenAI' },
31
+ { name: 'gpt-4', label: 'GPT-4', provider: 'OpenAI' },
32
+ { name: 'gpt-3.5-turbo', label: 'GPT-3.5 Turbo', provider: 'OpenAI' },
33
+ ];
34
+
35
+ export let MODEL_LIST: ModelInfo[] = [...staticModels];
36
+
37
+ async function getOllamaModels(): Promise<ModelInfo[]> {
38
+ try {
39
+ const response = await fetch(`http://localhost:11434/api/tags`);
40
+ const data = await response.json();
41
+
42
+ return data.models.map((model: any) => ({
43
+ name: model.name,
44
+ label: `${model.name} (${model.details.parameter_size})`,
45
+ provider: 'Ollama',
46
+ }));
47
+ } catch (e) {
48
+ return [];
49
+ }
50
+ }
51
+
52
+ async function initializeModelList(): Promise<void> {
53
+ const ollamaModels = await getOllamaModels();
54
+ MODEL_LIST = [...ollamaModels, ...staticModels];
55
+ }
56
+ initializeModelList().then();
57
+ export { getOllamaModels, initializeModelList };
app/utils/types.ts ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ interface OllamaModelDetails {
3
+ parent_model: string;
4
+ format: string;
5
+ family: string;
6
+ families: string[];
7
+ parameter_size: string;
8
+ quantization_level: string;
9
+ }
10
+
11
+ interface OllamaModel {
12
+ name: string;
13
+ model: string;
14
+ modified_at: string;
15
+ size: number;
16
+ digest: string;
17
+ details: OllamaModelDetails;
18
+ }
19
+
20
+ export interface OllamaApiResponse {
21
+ models: OllamaModel[];
22
+ }
23
+
24
+ export interface ModelInfo {
25
+ name: string;
26
+ label: string;
27
+ provider: string;
28
+ }
package.json CHANGED
@@ -24,6 +24,8 @@
24
  },
25
  "dependencies": {
26
  "@ai-sdk/anthropic": "^0.0.39",
 
 
27
  "@codemirror/autocomplete": "^6.17.0",
28
  "@codemirror/commands": "^6.6.0",
29
  "@codemirror/lang-cpp": "^6.0.2",
@@ -43,6 +45,7 @@
43
  "@iconify-json/svg-spinners": "^1.1.2",
44
  "@lezer/highlight": "^1.2.0",
45
  "@nanostores/react": "^0.7.2",
 
46
  "@radix-ui/react-dialog": "^1.1.1",
47
  "@radix-ui/react-dropdown-menu": "^2.1.1",
48
  "@remix-run/cloudflare": "^2.10.2",
@@ -54,14 +57,17 @@
54
  "@xterm/addon-fit": "^0.10.0",
55
  "@xterm/addon-web-links": "^0.11.0",
56
  "@xterm/xterm": "^5.5.0",
57
- "ai": "^3.3.4",
58
  "date-fns": "^3.6.0",
59
  "diff": "^5.2.0",
 
60
  "framer-motion": "^11.2.12",
61
  "isbot": "^4.1.0",
62
  "istextorbinary": "^9.5.0",
63
  "jose": "^5.6.3",
 
64
  "nanostores": "^0.10.3",
 
65
  "react": "^18.2.0",
66
  "react-dom": "^18.2.0",
67
  "react-hotkeys-hook": "^4.5.0",
@@ -81,6 +87,7 @@
81
  "@cloudflare/workers-types": "^4.20240620.0",
82
  "@remix-run/dev": "^2.10.0",
83
  "@types/diff": "^5.2.1",
 
84
  "@types/react": "^18.2.20",
85
  "@types/react-dom": "^18.2.7",
86
  "fast-glob": "^3.3.2",
 
24
  },
25
  "dependencies": {
26
  "@ai-sdk/anthropic": "^0.0.39",
27
+ "@ai-sdk/google": "^0.0.52",
28
+ "@ai-sdk/openai": "^0.0.66",
29
  "@codemirror/autocomplete": "^6.17.0",
30
  "@codemirror/commands": "^6.6.0",
31
  "@codemirror/lang-cpp": "^6.0.2",
 
45
  "@iconify-json/svg-spinners": "^1.1.2",
46
  "@lezer/highlight": "^1.2.0",
47
  "@nanostores/react": "^0.7.2",
48
+ "@openrouter/ai-sdk-provider": "^0.0.5",
49
  "@radix-ui/react-dialog": "^1.1.1",
50
  "@radix-ui/react-dropdown-menu": "^2.1.1",
51
  "@remix-run/cloudflare": "^2.10.2",
 
57
  "@xterm/addon-fit": "^0.10.0",
58
  "@xterm/addon-web-links": "^0.11.0",
59
  "@xterm/xterm": "^5.5.0",
60
+ "ai": "^3.4.9",
61
  "date-fns": "^3.6.0",
62
  "diff": "^5.2.0",
63
+ "file-saver": "^2.0.5",
64
  "framer-motion": "^11.2.12",
65
  "isbot": "^4.1.0",
66
  "istextorbinary": "^9.5.0",
67
  "jose": "^5.6.3",
68
+ "jszip": "^3.10.1",
69
  "nanostores": "^0.10.3",
70
+ "ollama-ai-provider": "^0.15.2",
71
  "react": "^18.2.0",
72
  "react-dom": "^18.2.0",
73
  "react-hotkeys-hook": "^4.5.0",
 
87
  "@cloudflare/workers-types": "^4.20240620.0",
88
  "@remix-run/dev": "^2.10.0",
89
  "@types/diff": "^5.2.1",
90
+ "@types/file-saver": "^2.0.7",
91
  "@types/react": "^18.2.20",
92
  "@types/react-dom": "^18.2.7",
93
  "fast-glob": "^3.3.2",
pnpm-lock.yaml CHANGED
@@ -14,6 +14,12 @@ importers:
14
  '@ai-sdk/anthropic':
15
  specifier: ^0.0.39
16
  version: 0.0.39([email protected])
 
 
 
 
 
 
17
  '@codemirror/autocomplete':
18
  specifier: ^6.17.0
19
  version: 6.17.0(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])
@@ -71,6 +77,9 @@ importers:
71
  '@nanostores/react':
72
  specifier: ^0.7.2
73
 
 
 
74
  '@radix-ui/react-dialog':
75
  specifier: ^1.1.1
76
@@ -105,14 +114,17 @@ importers:
105
  specifier: ^5.5.0
106
  version: 5.5.0
107
  ai:
108
- specifier: ^3.3.4
109
110
  date-fns:
111
  specifier: ^3.6.0
112
  version: 3.6.0
113
  diff:
114
  specifier: ^5.2.0
115
  version: 5.2.0
 
 
 
116
  framer-motion:
117
  specifier: ^11.2.12
118
@@ -125,9 +137,15 @@ importers:
125
  jose:
126
  specifier: ^5.6.3
127
  version: 5.6.3
 
 
 
128
  nanostores:
129
  specifier: ^0.10.3
130
  version: 0.10.3
 
 
 
131
  react:
132
  specifier: ^18.2.0
133
  version: 18.3.1
@@ -180,6 +198,9 @@ importers:
180
  '@types/diff':
181
  specifier: ^5.2.1
182
  version: 5.2.1
 
 
 
183
  '@types/react':
184
  specifier: ^18.2.20
185
  version: 18.3.3
@@ -237,6 +258,36 @@ packages:
237
  peerDependencies:
238
  zod: ^3.0.0
239
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  '@ai-sdk/[email protected]':
241
  resolution: {integrity: sha512-yfdanjUiCJbtGoRGXrcrmXn0pTyDfRIeY6ozDG96D66f2wupZaZvAgKptUa3zDYXtUCQQvcNJ+tipBBfQD/UYA==}
242
  engines: {node: '>=18'}
@@ -246,12 +297,20 @@ packages:
246
  zod:
247
  optional: true
248
 
 
 
 
 
249
  '@ai-sdk/[email protected]':
250
  resolution: {integrity: sha512-f9j+P5yYRkqKFHxvWae5FI0j6nqROPCoPnMkpc2hc2vC7vKjqzrxBJucD8rpSaUjqiBnY/QuRJ0QeV717Uz5tg==}
251
  engines: {node: '>=18'}
252
 
253
- '@ai-sdk/react@0.0.40':
254
- resolution: {integrity: sha512-irljzw5m9q2kz3g4Y59fbeHI7o29DFmPTPIKQNK+XrHcvYH1sDuj4rlOnQUQl6vpahnrU7fLO6FzVIYdwZv+0w==}
 
 
 
 
255
  engines: {node: '>=18'}
256
  peerDependencies:
257
  react: ^18 || ^19
@@ -262,8 +321,8 @@ packages:
262
  zod:
263
  optional: true
264
 
265
- '@ai-sdk/[email protected].31':
266
- resolution: {integrity: sha512-VYsrTCuNqAe8DzgPCyCqJl6MNdItnjjGMioxi2Pimns/3qet1bOw2LA0yUe5tTAoSpYaCAjGZZB4x8WC762asA==}
267
  engines: {node: '>=18'}
268
  peerDependencies:
269
  solid-js: ^1.7.7
@@ -271,8 +330,8 @@ packages:
271
  solid-js:
272
  optional: true
273
 
274
- '@ai-sdk/[email protected].33':
275
- resolution: {integrity: sha512-/QksvqVEv9fcq39nJfu4QqqeXeFX19pqkGUlVXBNhMQ6QQXhYsUasfJodIWy1DBsKDDV6dROJM0fHku5v+hrdw==}
276
  engines: {node: '>=18'}
277
  peerDependencies:
278
  svelte: ^3.0.0 || ^4.0.0
@@ -280,8 +339,8 @@ packages:
280
  svelte:
281
  optional: true
282
 
283
- '@ai-sdk/[email protected].28':
284
- resolution: {integrity: sha512-yc+0EgC/Gz36ltoHsiBmuEv7iPjV85ihuj8W1vSqYe3+CblGYHG9h8MC5RdIl51GtrOtnH9aqnDjkX5Qy6Q9KQ==}
285
  engines: {node: '>=18'}
286
  peerDependencies:
287
  zod: ^3.0.0
@@ -289,8 +348,8 @@ packages:
289
  zod:
290
  optional: true
291
 
292
- '@ai-sdk/[email protected].32':
293
- resolution: {integrity: sha512-wEiH6J6VbuGcliA44UkQJM/JuSP1IwuFiovzPQ/bS0Gb/nJKuDQ8K2ru1JvdU7pEQFqmpTm7z+2R0Sduz0eKpA==}
294
  engines: {node: '>=18'}
295
  peerDependencies:
296
  vue: ^3.3.4
@@ -394,10 +453,18 @@ packages:
394
  resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
395
  engines: {node: '>=6.9.0'}
396
 
 
 
 
 
397
  '@babel/[email protected]':
398
  resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
399
  engines: {node: '>=6.9.0'}
400
 
 
 
 
 
401
  '@babel/[email protected]':
402
  resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
403
  engines: {node: '>=6.9.0'}
@@ -415,6 +482,11 @@ packages:
415
  engines: {node: '>=6.0.0'}
416
  hasBin: true
417
 
 
 
 
 
 
418
  '@babel/[email protected]':
419
  resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==}
420
  engines: {node: '>=6.9.0'}
@@ -467,6 +539,10 @@ packages:
467
  resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
468
  engines: {node: '>=6.9.0'}
469
 
 
 
 
 
470
  '@blitz/[email protected]':
471
  resolution: {integrity: sha512-mGEAFWCI5AQ4nrePhjp2WzvRen+UWR+SF4MvH70icIBClR08Gm3dT9MRa2jszOpfY00NyIYfm7/1CFZ37GvW4g==}
472
  engines: {node: ^18.0.0 || ^20.0.0}
@@ -1071,6 +1147,9 @@ packages:
1071
  '@jridgewell/[email protected]':
1072
  resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
1073
 
 
 
 
1074
  '@jridgewell/[email protected]':
1075
  resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
1076
 
@@ -1151,6 +1230,12 @@ packages:
1151
  resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==}
1152
  engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
1153
 
 
 
 
 
 
 
1154
  '@opentelemetry/[email protected]':
1155
  resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
1156
  engines: {node: '>=8.0.0'}
@@ -1702,6 +1787,12 @@ packages:
1702
  '@types/[email protected]':
1703
  resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
1704
 
 
 
 
 
 
 
1705
  '@types/[email protected]':
1706
  resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
1707
 
@@ -2000,12 +2091,17 @@ packages:
2000
  engines: {node: '>=0.4.0'}
2001
  hasBin: true
2002
 
 
 
 
 
 
2003
2004
  resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
2005
  engines: {node: '>=8'}
2006
 
2007
- ai@3.3.4:
2008
- resolution: {integrity: sha512-yb9ONWAnTq77J+O/fLtd+yvcTgasdN79k+U0IhBDJ6ssEc+HZeFldjqkSgr1jtKSc8rLZOu0GiVitwyAtwofNQ==}
2009
  engines: {node: '>=18'}
2010
  peerDependencies:
2011
  openai: ^4.42.0
@@ -2066,8 +2162,9 @@ packages:
2066
  resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
2067
  engines: {node: '>=10'}
2068
 
2069
2070
- resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
 
2071
 
2072
2073
  resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
@@ -2097,8 +2194,9 @@ packages:
2097
  resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
2098
  engines: {node: '>= 0.4'}
2099
 
2100
- axobject-query@4.0.0:
2101
- resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==}
 
2102
 
2103
2104
  resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
@@ -2137,6 +2235,10 @@ packages:
2137
  resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
2138
  engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
2139
 
 
 
 
 
2140
2141
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
2142
 
@@ -2374,6 +2476,10 @@ packages:
2374
  resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
2375
  engines: {node: '>= 0.6'}
2376
 
 
 
 
 
2377
2378
  resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
2379
 
@@ -2567,6 +2673,10 @@ packages:
2567
  resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
2568
  engines: {node: '>= 0.8'}
2569
 
 
 
 
 
2570
2571
  resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
2572
 
@@ -2774,6 +2884,10 @@ packages:
2774
  resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
2775
  engines: {node: '>= 0.10.0'}
2776
 
 
 
 
 
2777
2778
  resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
2779
 
@@ -2807,6 +2921,9 @@ packages:
2807
  resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
2808
  engines: {node: '>=16.0.0'}
2809
 
 
 
 
2810
2811
  resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
2812
  engines: {node: '>=8'}
@@ -2815,6 +2932,10 @@ packages:
2815
  resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
2816
  engines: {node: '>= 0.8'}
2817
 
 
 
 
 
2818
2819
  resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
2820
  engines: {node: '>=10'}
@@ -3084,8 +3205,11 @@ packages:
3084
  resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
3085
  engines: {node: '>= 4'}
3086
 
3087
- immutable@4.3.6:
3088
- resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==}
 
 
 
3089
 
3090
3091
  resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
@@ -3299,6 +3423,9 @@ packages:
3299
3300
  resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
3301
 
 
 
 
3302
3303
  resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
3304
 
@@ -3313,6 +3440,9 @@ packages:
3313
  resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
3314
  engines: {node: '>= 0.8.0'}
3315
 
 
 
 
3316
3317
  resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
3318
  engines: {node: '>=14'}
@@ -3375,6 +3505,9 @@ packages:
3375
3376
  resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
3377
 
 
 
 
3378
3379
  resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
3380
  engines: {node: '>=0.10.0'}
@@ -3476,6 +3609,9 @@ packages:
3476
3477
  resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
3478
 
 
 
 
3479
3480
  resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
3481
 
@@ -3670,6 +3806,10 @@ packages:
3670
  resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
3671
  engines: {node: '>= 0.6'}
3672
 
 
 
 
 
3673
3674
  resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
3675
  engines: {node: '>= 0.6'}
@@ -3883,6 +4023,15 @@ packages:
3883
3884
  resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==}
3885
 
 
 
 
 
 
 
 
 
 
3886
3887
  resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
3888
  engines: {node: '>= 0.8'}
@@ -3963,6 +4112,9 @@ packages:
3963
  resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
3964
  engines: {node: '>= 0.8'}
3965
 
 
 
 
3966
3967
  resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
3968
 
@@ -3985,6 +4137,9 @@ packages:
3985
  resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
3986
  engines: {node: '>=16 || 14 >=14.18'}
3987
 
 
 
 
3988
3989
  resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
3990
 
@@ -4182,6 +4337,10 @@ packages:
4182
  resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==}
4183
  engines: {node: '>=0.6'}
4184
 
 
 
 
 
4185
4186
  resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
4187
  engines: {node: '>=0.4.x'}
@@ -4467,10 +4626,18 @@ packages:
4467
  resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
4468
  engines: {node: '>= 0.8.0'}
4469
 
 
 
 
 
4470
4471
  resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
4472
  engines: {node: '>= 0.8.0'}
4473
 
 
 
 
 
4474
4475
  resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
4476
 
@@ -4525,6 +4692,10 @@ packages:
4525
  resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
4526
  engines: {node: '>=0.10.0'}
4527
 
 
 
 
 
4528
4529
  resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
4530
 
@@ -4802,6 +4973,9 @@ packages:
4802
4803
  resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==}
4804
 
 
 
 
4805
4806
  resolution: {integrity: sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==}
4807
 
@@ -4816,6 +4990,10 @@ packages:
4816
  resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==}
4817
  engines: {node: '>=18.17'}
4818
 
 
 
 
 
4819
4820
  resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==}
4821
 
@@ -5183,10 +5361,10 @@ packages:
5183
5184
  resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==}
5185
 
5186
- zod-to-json-schema@3.22.5:
5187
- resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==}
5188
  peerDependencies:
5189
- zod: ^3.22.4
5190
 
5191
5192
  resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
@@ -5202,6 +5380,37 @@ snapshots:
5202
  '@ai-sdk/provider-utils': 1.0.9([email protected])
5203
  zod: 3.23.8
5204
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5205
5206
  dependencies:
5207
  '@ai-sdk/provider': 0.0.17
@@ -5211,48 +5420,58 @@ snapshots:
5211
  optionalDependencies:
5212
  zod: 3.23.8
5213
 
 
 
 
 
5214
  '@ai-sdk/[email protected]':
5215
  dependencies:
5216
  json-schema: 0.4.0
5217
 
5218
- '@ai-sdk/react@0.0.40([email protected])([email protected])':
5219
  dependencies:
5220
- '@ai-sdk/provider-utils': 1.0.9(zod@3.23.8)
5221
- '@ai-sdk/ui-utils': 0.0.28([email protected])
 
 
 
 
5222
  swr: 2.2.5([email protected])
5223
  optionalDependencies:
5224
  react: 18.3.1
5225
  zod: 3.23.8
5226
 
5227
5228
  dependencies:
5229
- '@ai-sdk/provider-utils': 1.0.9([email protected])
5230
- '@ai-sdk/ui-utils': 0.0.28([email protected])
5231
  transitivePeerDependencies:
5232
  - zod
5233
 
5234
5235
  dependencies:
5236
- '@ai-sdk/provider-utils': 1.0.9([email protected])
5237
- '@ai-sdk/ui-utils': 0.0.28([email protected])
5238
  sswr: 2.1.0([email protected])
5239
  optionalDependencies:
5240
  svelte: 4.2.18
5241
  transitivePeerDependencies:
5242
  - zod
5243
 
5244
5245
  dependencies:
5246
- '@ai-sdk/provider': 0.0.17
5247
- '@ai-sdk/provider-utils': 1.0.9([email protected])
 
5248
  secure-json-parse: 2.7.0
 
5249
  optionalDependencies:
5250
  zod: 3.23.8
5251
 
5252
5253
  dependencies:
5254
- '@ai-sdk/provider-utils': 1.0.9([email protected])
5255
- '@ai-sdk/ui-utils': 0.0.28([email protected])
5256
5257
  optionalDependencies:
5258
  vue: 3.4.30([email protected])
@@ -5405,8 +5624,12 @@ snapshots:
5405
 
5406
  '@babel/[email protected]': {}
5407
 
 
 
5408
  '@babel/[email protected]': {}
5409
 
 
 
5410
  '@babel/[email protected]': {}
5411
 
5412
  '@babel/[email protected]':
@@ -5425,6 +5648,10 @@ snapshots:
5425
  dependencies:
5426
  '@babel/types': 7.24.7
5427
 
 
 
 
 
5428
  '@babel/[email protected](@babel/[email protected])':
5429
  dependencies:
5430
  '@babel/core': 7.24.7
@@ -5501,6 +5728,12 @@ snapshots:
5501
  '@babel/helper-validator-identifier': 7.24.7
5502
  to-fast-properties: 2.0.0
5503
 
 
 
 
 
 
 
5504
5505
  dependencies:
5506
  '@stylistic/eslint-plugin-ts': 2.3.0([email protected])([email protected])
@@ -5987,6 +6220,8 @@ snapshots:
5987
 
5988
  '@jridgewell/[email protected]': {}
5989
 
 
 
5990
  '@jridgewell/[email protected]':
5991
  dependencies:
5992
  '@jridgewell/resolve-uri': 3.1.2
@@ -6128,6 +6363,12 @@ snapshots:
6128
  dependencies:
6129
  which: 3.0.1
6130
 
 
 
 
 
 
 
6131
  '@opentelemetry/[email protected]': {}
6132
 
6133
  '@pkgjs/[email protected]':
@@ -6482,10 +6723,10 @@ snapshots:
6482
  - ts-node
6483
  - utf-8-validate
6484
 
6485
- '@remix-run/[email protected](express@4.19.2)([email protected])':
6486
  dependencies:
6487
  '@remix-run/node': 2.10.0([email protected])
6488
- express: 4.19.2
6489
  optionalDependencies:
6490
  typescript: 5.5.2
6491
  optional: true
@@ -6510,7 +6751,7 @@ snapshots:
6510
  cookie-signature: 1.2.1
6511
  source-map-support: 0.5.21
6512
  stream-slice: 0.1.2
6513
- undici: 6.19.4
6514
  optionalDependencies:
6515
  typescript: 5.5.2
6516
  optional: true
@@ -6533,11 +6774,11 @@ snapshots:
6533
 
6534
6535
  dependencies:
6536
- '@remix-run/express': 2.10.0(express@4.19.2)([email protected])
6537
  '@remix-run/node': 2.10.0([email protected])
6538
  chokidar: 3.6.0
6539
  compression: 1.7.4
6540
- express: 4.19.2
6541
  get-port: 5.1.1
6542
  morgan: 1.10.0
6543
  source-map-support: 0.5.21
@@ -6709,6 +6950,10 @@ snapshots:
6709
 
6710
  '@types/[email protected]': {}
6711
 
 
 
 
 
6712
  '@types/[email protected]':
6713
  dependencies:
6714
  '@types/unist': 2.0.10
@@ -7084,11 +7329,11 @@ snapshots:
7084
 
7085
  '@vue/[email protected]':
7086
  dependencies:
7087
- '@babel/parser': 7.24.7
7088
  '@vue/shared': 3.4.30
7089
  entities: 4.5.0
7090
  estree-walker: 2.0.2
7091
- source-map-js: 1.2.0
7092
 
7093
  '@vue/[email protected]':
7094
  dependencies:
@@ -7097,15 +7342,15 @@ snapshots:
7097
 
7098
  '@vue/[email protected]':
7099
  dependencies:
7100
- '@babel/parser': 7.24.7
7101
  '@vue/compiler-core': 3.4.30
7102
  '@vue/compiler-dom': 3.4.30
7103
  '@vue/compiler-ssr': 3.4.30
7104
  '@vue/shared': 3.4.30
7105
  estree-walker: 2.0.2
7106
- magic-string: 0.30.10
7107
  postcss: 8.4.38
7108
- source-map-js: 1.2.0
7109
 
7110
  '@vue/[email protected]':
7111
  dependencies:
@@ -7172,27 +7417,29 @@ snapshots:
7172
 
7173
7174
 
 
 
7175
7176
  dependencies:
7177
  clean-stack: 2.2.0
7178
  indent-string: 4.0.0
7179
 
7180
7181
  dependencies:
7182
- '@ai-sdk/provider': 0.0.17
7183
- '@ai-sdk/provider-utils': 1.0.9([email protected])
7184
- '@ai-sdk/react': 0.0.40([email protected])([email protected])
7185
- '@ai-sdk/solid': 0.0.31([email protected])
7186
- '@ai-sdk/svelte': 0.0.33([email protected])([email protected])
7187
- '@ai-sdk/ui-utils': 0.0.28([email protected])
7188
7189
  '@opentelemetry/api': 1.9.0
7190
  eventsource-parser: 1.1.2
7191
  json-schema: 0.4.0
7192
  jsondiffpatch: 0.6.0
7193
  nanoid: 3.3.6
7194
  secure-json-parse: 2.7.0
7195
- zod-to-json-schema: 3.22.5([email protected])
7196
  optionalDependencies:
7197
  react: 18.3.1
7198
  sswr: 2.1.0([email protected])
@@ -7238,9 +7485,7 @@ snapshots:
7238
  dependencies:
7239
  tslib: 2.6.3
7240
 
7241
7242
- dependencies:
7243
- dequal: 2.0.3
7244
 
7245
7246
 
@@ -7272,9 +7517,7 @@ snapshots:
7272
  dependencies:
7273
  possible-typed-array-names: 1.0.0
7274
 
7275
- axobject-query@4.0.0:
7276
- dependencies:
7277
- dequal: 2.0.3
7278
 
7279
7280
 
@@ -7322,6 +7565,24 @@ snapshots:
7322
  transitivePeerDependencies:
7323
  - supports-color
7324
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7325
7326
  dependencies:
7327
  balanced-match: 1.0.2
@@ -7520,9 +7781,9 @@ snapshots:
7520
 
7521
7522
  dependencies:
7523
- '@jridgewell/sourcemap-codec': 1.4.15
7524
- '@types/estree': 1.0.5
7525
- acorn: 8.12.0
7526
  estree-walker: 3.0.3
7527
  periscopic: 3.1.0
7528
 
@@ -7546,7 +7807,7 @@ snapshots:
7546
 
7547
7548
  dependencies:
7549
- mime-db: 1.52.0
7550
  optional: true
7551
 
7552
@@ -7588,6 +7849,9 @@ snapshots:
7588
 
7589
7590
 
 
 
 
7591
7592
 
7593
@@ -7769,6 +8033,9 @@ snapshots:
7769
 
7770
7771
 
 
 
 
7772
7773
  dependencies:
7774
  once: 1.4.0
@@ -8099,6 +8366,43 @@ snapshots:
8099
  transitivePeerDependencies:
8100
  - supports-color
8101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8102
8103
 
8104
@@ -8134,6 +8438,8 @@ snapshots:
8134
  dependencies:
8135
  flat-cache: 4.0.1
8136
 
 
 
8137
8138
  dependencies:
8139
  to-regex-range: 5.0.1
@@ -8150,6 +8456,19 @@ snapshots:
8150
  transitivePeerDependencies:
8151
  - supports-color
8152
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8153
8154
  dependencies:
8155
  locate-path: 6.0.0
@@ -8472,7 +8791,9 @@ snapshots:
8472
 
8473
8474
 
8475
- immutable@4.3.6:
 
 
8476
  optional: true
8477
 
8478
@@ -8640,6 +8961,13 @@ snapshots:
8640
  optionalDependencies:
8641
  graceful-fs: 4.2.11
8642
 
 
 
 
 
 
 
 
8643
8644
  dependencies:
8645
  json-buffer: 3.0.1
@@ -8653,6 +8981,10 @@ snapshots:
8653
  prelude-ls: 1.2.1
8654
  type-check: 0.4.0
8655
 
 
 
 
 
8656
8657
 
8658
@@ -8707,6 +9039,10 @@ snapshots:
8707
  dependencies:
8708
  '@jridgewell/sourcemap-codec': 1.4.15
8709
 
 
 
 
 
8710
8711
 
8712
@@ -8987,6 +9323,9 @@ snapshots:
8987
 
8988
8989
 
 
 
 
8990
8991
 
8992
@@ -9409,6 +9748,9 @@ snapshots:
9409
 
9410
9411
 
 
 
 
9412
9413
  dependencies:
9414
  mime-db: 1.52.0
@@ -9490,7 +9832,7 @@ snapshots:
9490
  acorn: 8.12.0
9491
  pathe: 1.1.2
9492
  pkg-types: 1.1.1
9493
- ufo: 1.5.3
9494
 
9495
9496
 
@@ -9632,6 +9974,14 @@ snapshots:
9632
  node-fetch-native: 1.6.4
9633
  ufo: 1.5.3
9634
 
 
 
 
 
 
 
 
 
9635
9636
  dependencies:
9637
  ee-first: 1.1.1
@@ -9731,6 +10081,8 @@ snapshots:
9731
 
9732
9733
 
 
 
9734
9735
 
9736
@@ -9746,6 +10098,9 @@ snapshots:
9746
  lru-cache: 10.2.2
9747
  minipass: 7.1.2
9748
 
 
 
 
9749
9750
 
9751
@@ -9932,6 +10287,11 @@ snapshots:
9932
  dependencies:
9933
  side-channel: 1.0.6
9934
 
 
 
 
 
 
9935
9936
 
9937
@@ -10241,8 +10601,8 @@ snapshots:
10241
10242
  dependencies:
10243
  chokidar: 3.6.0
10244
- immutable: 4.3.6
10245
- source-map-js: 1.2.0
10246
  optional: true
10247
 
10248
@@ -10278,6 +10638,25 @@ snapshots:
10278
  transitivePeerDependencies:
10279
  - supports-color
10280
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10281
10282
  dependencies:
10283
  encodeurl: 1.0.2
@@ -10287,6 +10666,16 @@ snapshots:
10287
  transitivePeerDependencies:
10288
  - supports-color
10289
 
 
 
 
 
 
 
 
 
 
 
10290
10291
 
10292
@@ -10340,6 +10729,8 @@ snapshots:
10340
 
10341
10342
 
 
 
10343
10344
  dependencies:
10345
  buffer-from: 1.1.2
@@ -10471,18 +10862,18 @@ snapshots:
10471
10472
  dependencies:
10473
  '@ampproject/remapping': 2.3.0
10474
- '@jridgewell/sourcemap-codec': 1.4.15
10475
  '@jridgewell/trace-mapping': 0.3.25
10476
- '@types/estree': 1.0.5
10477
- acorn: 8.12.0
10478
- aria-query: 5.3.0
10479
- axobject-query: 4.0.0
10480
  code-red: 1.0.4
10481
  css-tree: 2.3.1
10482
  estree-walker: 3.0.3
10483
  is-reference: 3.0.2
10484
  locate-character: 3.0.0
10485
- magic-string: 0.30.10
10486
  periscopic: 3.1.0
10487
 
10488
@@ -10613,6 +11004,8 @@ snapshots:
10613
 
10614
10615
 
 
 
10616
10617
  dependencies:
10618
  '@antfu/utils': 0.7.10
@@ -10627,6 +11020,9 @@ snapshots:
10627
 
10628
10629
 
 
 
 
10630
10631
  dependencies:
10632
  consola: 3.2.3
@@ -10634,7 +11030,7 @@ snapshots:
10634
  mime: 3.0.0
10635
  node-fetch-native: 1.6.4
10636
  pathe: 1.1.2
10637
- ufo: 1.5.3
10638
 
10639
10640
  dependencies:
@@ -11070,7 +11466,7 @@ snapshots:
11070
  mustache: 4.2.0
11071
  stacktracey: 2.1.8
11072
 
11073
- zod-to-json-schema@3.22.5([email protected]):
11074
  dependencies:
11075
  zod: 3.23.8
11076
 
 
14
  '@ai-sdk/anthropic':
15
  specifier: ^0.0.39
16
  version: 0.0.39([email protected])
17
+ '@ai-sdk/google':
18
+ specifier: ^0.0.52
19
+ version: 0.0.52([email protected])
20
+ '@ai-sdk/openai':
21
+ specifier: ^0.0.66
22
+ version: 0.0.66([email protected])
23
  '@codemirror/autocomplete':
24
  specifier: ^6.17.0
25
  version: 6.17.0(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])
 
77
  '@nanostores/react':
78
  specifier: ^0.7.2
79
80
+ '@openrouter/ai-sdk-provider':
81
+ specifier: ^0.0.5
82
+ version: 0.0.5([email protected])
83
  '@radix-ui/react-dialog':
84
  specifier: ^1.1.1
85
 
114
  specifier: ^5.5.0
115
  version: 5.5.0
116
  ai:
117
+ specifier: ^3.4.9
118
119
  date-fns:
120
  specifier: ^3.6.0
121
  version: 3.6.0
122
  diff:
123
  specifier: ^5.2.0
124
  version: 5.2.0
125
+ file-saver:
126
+ specifier: ^2.0.5
127
+ version: 2.0.5
128
  framer-motion:
129
  specifier: ^11.2.12
130
 
137
  jose:
138
  specifier: ^5.6.3
139
  version: 5.6.3
140
+ jszip:
141
+ specifier: ^3.10.1
142
+ version: 3.10.1
143
  nanostores:
144
  specifier: ^0.10.3
145
  version: 0.10.3
146
+ ollama-ai-provider:
147
+ specifier: ^0.15.2
148
+ version: 0.15.2([email protected])
149
  react:
150
  specifier: ^18.2.0
151
  version: 18.3.1
 
198
  '@types/diff':
199
  specifier: ^5.2.1
200
  version: 5.2.1
201
+ '@types/file-saver':
202
+ specifier: ^2.0.7
203
+ version: 2.0.7
204
  '@types/react':
205
  specifier: ^18.2.20
206
  version: 18.3.3
 
258
  peerDependencies:
259
  zod: ^3.0.0
260
 
261
+ '@ai-sdk/[email protected]':
262
+ resolution: {integrity: sha512-bfsA/1Ae0SQ6NfLwWKs5SU4MBwlzJjVhK6bTVBicYFjUxg9liK/W76P1Tq/qK9OlrODACz3i1STOIWsFPpIOuQ==}
263
+ engines: {node: '>=18'}
264
+ peerDependencies:
265
+ zod: ^3.0.0
266
+
267
+ '@ai-sdk/[email protected]':
268
+ resolution: {integrity: sha512-V4XeDnlNl5/AY3GB3ozJUjqnBLU5pK3DacKTbCNH3zH8/MggJoH6B8wRGdLUPVFMcsMz60mtvh4DC9JsIVFrKw==}
269
+ engines: {node: '>=18'}
270
+ peerDependencies:
271
+ zod: ^3.0.0
272
+
273
+ '@ai-sdk/[email protected]':
274
+ resolution: {integrity: sha512-57f6O4OFVNEpI8Z8o+K40tIB3YQiTw+VCql/qrAO9Utq7Ti1o6+X9tvm177DlZJL7ft0Rwzvgy48S9YhrEKgmA==}
275
+ engines: {node: '>=18'}
276
+ peerDependencies:
277
+ zod: ^3.0.0
278
+ peerDependenciesMeta:
279
+ zod:
280
+ optional: true
281
+
282
+ '@ai-sdk/[email protected]':
283
+ resolution: {integrity: sha512-ngg/RGpnA00eNOWEtXHenpX1MsM2QshQh4QJFjUfwcqHpM5kTfG7je7Rc3HcEDP+OkRVv2GF+X4fC1Vfcnl8Ow==}
284
+ engines: {node: '>=18'}
285
+ peerDependencies:
286
+ zod: ^3.0.0
287
+ peerDependenciesMeta:
288
+ zod:
289
+ optional: true
290
+
291
  '@ai-sdk/[email protected]':
292
  resolution: {integrity: sha512-yfdanjUiCJbtGoRGXrcrmXn0pTyDfRIeY6ozDG96D66f2wupZaZvAgKptUa3zDYXtUCQQvcNJ+tipBBfQD/UYA==}
293
  engines: {node: '>=18'}
 
297
  zod:
298
  optional: true
299
 
300
+ '@ai-sdk/[email protected]':
301
+ resolution: {integrity: sha512-oOwPQD8i2Ynpn22cur4sk26FW3mSy6t6/X/K1Ay2yGBKYiSpRyLfObhOrZEGsXDx+3euKy4nEZ193R36NM+tpQ==}
302
+ engines: {node: '>=18'}
303
+
304
  '@ai-sdk/[email protected]':
305
  resolution: {integrity: sha512-f9j+P5yYRkqKFHxvWae5FI0j6nqROPCoPnMkpc2hc2vC7vKjqzrxBJucD8rpSaUjqiBnY/QuRJ0QeV717Uz5tg==}
306
  engines: {node: '>=18'}
307
 
308
+ '@ai-sdk/provider@0.0.24':
309
+ resolution: {integrity: sha512-XMsNGJdGO+L0cxhhegtqZ8+T6nn4EoShS819OvCgI2kLbYTIvk0GWFGD0AXJmxkxs3DrpsJxKAFukFR7bvTkgQ==}
310
+ engines: {node: '>=18'}
311
+
312
+ '@ai-sdk/[email protected]':
313
+ resolution: {integrity: sha512-1asDpxgmeHWL0/EZPCLENxfOHT+0jce0z/zasRhascodm2S6f6/KZn5doLG9jdmarcb+GjMjFmmwyOVXz3W1xg==}
314
  engines: {node: '>=18'}
315
  peerDependencies:
316
  react: ^18 || ^19
 
321
  zod:
322
  optional: true
323
 
324
+ '@ai-sdk/[email protected].49':
325
+ resolution: {integrity: sha512-KnfWTt640cS1hM2fFIba8KHSPLpOIWXtEm28pNCHTvqasVKlh2y/zMQANTwE18pF2nuXL9P9F5/dKWaPsaEzQw==}
326
  engines: {node: '>=18'}
327
  peerDependencies:
328
  solid-js: ^1.7.7
 
330
  solid-js:
331
  optional: true
332
 
333
+ '@ai-sdk/[email protected].51':
334
+ resolution: {integrity: sha512-aIZJaIds+KpCt19yUDCRDWebzF/17GCY7gN9KkcA2QM6IKRO5UmMcqEYja0ZmwFQPm1kBZkF2njhr8VXis2mAw==}
335
  engines: {node: '>=18'}
336
  peerDependencies:
337
  svelte: ^3.0.0 || ^4.0.0
 
339
  svelte:
340
  optional: true
341
 
342
+ '@ai-sdk/[email protected].46':
343
+ resolution: {integrity: sha512-ZG/wneyJG+6w5Nm/hy1AKMuRgjPQToAxBsTk61c9sVPUTaxo+NNjM2MhXQMtmsja2N5evs8NmHie+ExEgpL3cA==}
344
  engines: {node: '>=18'}
345
  peerDependencies:
346
  zod: ^3.0.0
 
348
  zod:
349
  optional: true
350
 
351
+ '@ai-sdk/[email protected].54':
352
+ resolution: {integrity: sha512-Ltu6gbuii8Qlp3gg7zdwdnHdS4M8nqKDij2VVO1223VOtIFwORFJzKqpfx44U11FW8z2TPVBYN+FjkyVIcN2hg==}
353
  engines: {node: '>=18'}
354
  peerDependencies:
355
  vue: ^3.3.4
 
453
  resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
454
  engines: {node: '>=6.9.0'}
455
 
456
+ '@babel/[email protected]':
457
+ resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==}
458
+ engines: {node: '>=6.9.0'}
459
+
460
  '@babel/[email protected]':
461
  resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
462
  engines: {node: '>=6.9.0'}
463
 
464
+ '@babel/[email protected]':
465
+ resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==}
466
+ engines: {node: '>=6.9.0'}
467
+
468
  '@babel/[email protected]':
469
  resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
470
  engines: {node: '>=6.9.0'}
 
482
  engines: {node: '>=6.0.0'}
483
  hasBin: true
484
 
485
+ '@babel/[email protected]':
486
+ resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==}
487
+ engines: {node: '>=6.0.0'}
488
+ hasBin: true
489
+
490
  '@babel/[email protected]':
491
  resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==}
492
  engines: {node: '>=6.9.0'}
 
539
  resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
540
  engines: {node: '>=6.9.0'}
541
 
542
+ '@babel/[email protected]':
543
+ resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==}
544
+ engines: {node: '>=6.9.0'}
545
+
546
  '@blitz/[email protected]':
547
  resolution: {integrity: sha512-mGEAFWCI5AQ4nrePhjp2WzvRen+UWR+SF4MvH70icIBClR08Gm3dT9MRa2jszOpfY00NyIYfm7/1CFZ37GvW4g==}
548
  engines: {node: ^18.0.0 || ^20.0.0}
 
1147
  '@jridgewell/[email protected]':
1148
  resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
1149
 
1150
+ '@jridgewell/[email protected]':
1151
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
1152
+
1153
  '@jridgewell/[email protected]':
1154
  resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
1155
 
 
1230
  resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==}
1231
  engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
1232
 
1233
+ '@openrouter/[email protected]':
1234
+ resolution: {integrity: sha512-AfxXQhISpxQSeUjU/4jo9waM5GRNX6eIkfTFS9l7vHkD1TKDP81Y/dXrE0ttJeN/Kap3tPF3Jwh49me0gWwjSw==}
1235
+ engines: {node: '>=18'}
1236
+ peerDependencies:
1237
+ zod: ^3.0.0
1238
+
1239
  '@opentelemetry/[email protected]':
1240
  resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
1241
  engines: {node: '>=8.0.0'}
 
1787
  '@types/[email protected]':
1788
  resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
1789
 
1790
+ '@types/[email protected]':
1791
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
1792
+
1793
+ '@types/[email protected]':
1794
+ resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==}
1795
+
1796
  '@types/[email protected]':
1797
  resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
1798
 
 
2091
  engines: {node: '>=0.4.0'}
2092
  hasBin: true
2093
 
2094
2095
+ resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
2096
+ engines: {node: '>=0.4.0'}
2097
+ hasBin: true
2098
+
2099
2100
  resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
2101
  engines: {node: '>=8'}
2102
 
2103
+ ai@3.4.9:
2104
+ resolution: {integrity: sha512-wmVzpIHNGjCEjIJ/3945a/DIkz+gwObjC767ZRgO8AmtIZMO5KqvqNr7n2KF+gQrCPCMC8fM1ICQFXSvBZnBlA==}
2105
  engines: {node: '>=18'}
2106
  peerDependencies:
2107
  openai: ^4.42.0
 
2162
  resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
2163
  engines: {node: '>=10'}
2164
 
2165
2166
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
2167
+ engines: {node: '>= 0.4'}
2168
 
2169
2170
  resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
 
2194
  resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
2195
  engines: {node: '>= 0.4'}
2196
 
2197
+ axobject-query@4.1.0:
2198
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
2199
+ engines: {node: '>= 0.4'}
2200
 
2201
2202
  resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
 
2235
  resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
2236
  engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
2237
 
2238
2239
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
2240
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
2241
+
2242
2243
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
2244
 
 
2476
  resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
2477
  engines: {node: '>= 0.6'}
2478
 
2479
2480
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
2481
+ engines: {node: '>= 0.6'}
2482
+
2483
2484
  resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
2485
 
 
2673
  resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
2674
  engines: {node: '>= 0.8'}
2675
 
2676
2677
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
2678
+ engines: {node: '>= 0.8'}
2679
+
2680
2681
  resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
2682
 
 
2884
  resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
2885
  engines: {node: '>= 0.10.0'}
2886
 
2887
2888
+ resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
2889
+ engines: {node: '>= 0.10.0'}
2890
+
2891
2892
  resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
2893
 
 
2921
  resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
2922
  engines: {node: '>=16.0.0'}
2923
 
2924
2925
+ resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
2926
+
2927
2928
  resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
2929
  engines: {node: '>=8'}
 
2932
  resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
2933
  engines: {node: '>= 0.8'}
2934
 
2935
2936
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
2937
+ engines: {node: '>= 0.8'}
2938
+
2939
2940
  resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
2941
  engines: {node: '>=10'}
 
3205
  resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
3206
  engines: {node: '>= 4'}
3207
 
3208
+ immediate@3.0.6:
3209
+ resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
3210
+
3211
3212
+ resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==}
3213
 
3214
3215
  resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
 
3423
3424
  resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
3425
 
3426
3427
+ resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
3428
+
3429
3430
  resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
3431
 
 
3440
  resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
3441
  engines: {node: '>= 0.8.0'}
3442
 
3443
3444
+ resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
3445
+
3446
3447
  resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
3448
  engines: {node: '>=14'}
 
3505
3506
  resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
3507
 
3508
3509
+ resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
3510
+
3511
3512
  resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
3513
  engines: {node: '>=0.10.0'}
 
3609
3610
  resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
3611
 
3612
3613
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
3614
+
3615
3616
  resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
3617
 
 
3806
  resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
3807
  engines: {node: '>= 0.6'}
3808
 
3809
3810
+ resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==}
3811
+ engines: {node: '>= 0.6'}
3812
+
3813
3814
  resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
3815
  engines: {node: '>= 0.6'}
 
4023
4024
  resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==}
4025
 
4026
4027
+ resolution: {integrity: sha512-bMDUlYmohulD87Xrv6meuftQdmFTygtrQywy6/gqdf1bTsJFP1VCx3MrisLFBzb4mMOj02NER7yZhiGIlAx30w==}
4028
+ engines: {node: '>=18'}
4029
+ peerDependencies:
4030
+ zod: ^3.0.0
4031
+ peerDependenciesMeta:
4032
+ zod:
4033
+ optional: true
4034
+
4035
4036
  resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
4037
  engines: {node: '>= 0.8'}
 
4112
  resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
4113
  engines: {node: '>= 0.8'}
4114
 
4115
4116
+ resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==}
4117
+
4118
4119
  resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
4120
 
 
4137
  resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
4138
  engines: {node: '>=16 || 14 >=14.18'}
4139
 
4140
4141
+ resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
4142
+
4143
4144
  resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
4145
 
 
4337
  resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==}
4338
  engines: {node: '>=0.6'}
4339
 
4340
4341
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
4342
+ engines: {node: '>=0.6'}
4343
+
4344
4345
  resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
4346
  engines: {node: '>=0.4.x'}
 
4626
  resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
4627
  engines: {node: '>= 0.8.0'}
4628
 
4629
4630
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
4631
+ engines: {node: '>= 0.8.0'}
4632
+
4633
4634
  resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
4635
  engines: {node: '>= 0.8.0'}
4636
 
4637
4638
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
4639
+ engines: {node: '>= 0.8.0'}
4640
+
4641
4642
  resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
4643
 
 
4692
  resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
4693
  engines: {node: '>=0.10.0'}
4694
 
4695
4696
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
4697
+ engines: {node: '>=0.10.0'}
4698
+
4699
4700
  resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
4701
 
 
4973
4974
  resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==}
4975
 
4976
4977
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
4978
+
4979
4980
  resolution: {integrity: sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==}
4981
 
 
4990
  resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==}
4991
  engines: {node: '>=18.17'}
4992
 
4993
4994
+ resolution: {integrity: sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A==}
4995
+ engines: {node: '>=18.17'}
4996
+
4997
4998
  resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==}
4999
 
 
5361
5362
  resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==}
5363
 
5364
+ zod-to-json-schema@3.23.2:
5365
+ resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==}
5366
  peerDependencies:
5367
+ zod: ^3.23.3
5368
 
5369
5370
  resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
 
5380
  '@ai-sdk/provider-utils': 1.0.9([email protected])
5381
  zod: 3.23.8
5382
 
5383
5384
+ dependencies:
5385
+ '@ai-sdk/provider': 0.0.24
5386
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
5387
+ json-schema: 0.4.0
5388
+ zod: 3.23.8
5389
+
5390
5391
+ dependencies:
5392
+ '@ai-sdk/provider': 0.0.24
5393
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
5394
+ zod: 3.23.8
5395
+
5396
5397
+ dependencies:
5398
+ '@ai-sdk/provider': 0.0.12
5399
+ eventsource-parser: 1.1.2
5400
+ nanoid: 3.3.6
5401
+ secure-json-parse: 2.7.0
5402
+ optionalDependencies:
5403
+ zod: 3.23.8
5404
+
5405
5406
+ dependencies:
5407
+ '@ai-sdk/provider': 0.0.24
5408
+ eventsource-parser: 1.1.2
5409
+ nanoid: 3.3.6
5410
+ secure-json-parse: 2.7.0
5411
+ optionalDependencies:
5412
+ zod: 3.23.8
5413
+
5414
5415
  dependencies:
5416
  '@ai-sdk/provider': 0.0.17
 
5420
  optionalDependencies:
5421
  zod: 3.23.8
5422
 
5423
+ '@ai-sdk/[email protected]':
5424
+ dependencies:
5425
+ json-schema: 0.4.0
5426
+
5427
  '@ai-sdk/[email protected]':
5428
  dependencies:
5429
  json-schema: 0.4.0
5430
 
5431
+ '@ai-sdk/provider@0.0.24':
5432
  dependencies:
5433
+ json-schema: 0.4.0
5434
+
5435
5436
+ dependencies:
5437
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
5438
+ '@ai-sdk/ui-utils': 0.0.46([email protected])
5439
  swr: 2.2.5([email protected])
5440
  optionalDependencies:
5441
  react: 18.3.1
5442
  zod: 3.23.8
5443
 
5444
5445
  dependencies:
5446
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
5447
+ '@ai-sdk/ui-utils': 0.0.46([email protected])
5448
  transitivePeerDependencies:
5449
  - zod
5450
 
5451
5452
  dependencies:
5453
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
5454
+ '@ai-sdk/ui-utils': 0.0.46([email protected])
5455
  sswr: 2.1.0([email protected])
5456
  optionalDependencies:
5457
  svelte: 4.2.18
5458
  transitivePeerDependencies:
5459
  - zod
5460
 
5461
5462
  dependencies:
5463
+ '@ai-sdk/provider': 0.0.24
5464
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
5465
+ json-schema: 0.4.0
5466
  secure-json-parse: 2.7.0
5467
+ zod-to-json-schema: 3.23.2([email protected])
5468
  optionalDependencies:
5469
  zod: 3.23.8
5470
 
5471
5472
  dependencies:
5473
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
5474
+ '@ai-sdk/ui-utils': 0.0.46([email protected])
5475
5476
  optionalDependencies:
5477
  vue: 3.4.30([email protected])
 
5624
 
5625
  '@babel/[email protected]': {}
5626
 
5627
+ '@babel/[email protected]': {}
5628
+
5629
  '@babel/[email protected]': {}
5630
 
5631
+ '@babel/[email protected]': {}
5632
+
5633
  '@babel/[email protected]': {}
5634
 
5635
  '@babel/[email protected]':
 
5648
  dependencies:
5649
  '@babel/types': 7.24.7
5650
 
5651
+ '@babel/[email protected]':
5652
+ dependencies:
5653
+ '@babel/types': 7.25.8
5654
+
5655
  '@babel/[email protected](@babel/[email protected])':
5656
  dependencies:
5657
  '@babel/core': 7.24.7
 
5728
  '@babel/helper-validator-identifier': 7.24.7
5729
  to-fast-properties: 2.0.0
5730
 
5731
+ '@babel/[email protected]':
5732
+ dependencies:
5733
+ '@babel/helper-string-parser': 7.25.7
5734
+ '@babel/helper-validator-identifier': 7.25.7
5735
+ to-fast-properties: 2.0.0
5736
+
5737
5738
  dependencies:
5739
  '@stylistic/eslint-plugin-ts': 2.3.0([email protected])([email protected])
 
6220
 
6221
  '@jridgewell/[email protected]': {}
6222
 
6223
+ '@jridgewell/[email protected]': {}
6224
+
6225
  '@jridgewell/[email protected]':
6226
  dependencies:
6227
  '@jridgewell/resolve-uri': 3.1.2
 
6363
  dependencies:
6364
  which: 3.0.1
6365
 
6366
6367
+ dependencies:
6368
+ '@ai-sdk/provider': 0.0.12
6369
+ '@ai-sdk/provider-utils': 1.0.2([email protected])
6370
+ zod: 3.23.8
6371
+
6372
  '@opentelemetry/[email protected]': {}
6373
 
6374
  '@pkgjs/[email protected]':
 
6723
  - ts-node
6724
  - utf-8-validate
6725
 
6726
+ '@remix-run/[email protected](express@4.21.1)([email protected])':
6727
  dependencies:
6728
  '@remix-run/node': 2.10.0([email protected])
6729
+ express: 4.21.1
6730
  optionalDependencies:
6731
  typescript: 5.5.2
6732
  optional: true
 
6751
  cookie-signature: 1.2.1
6752
  source-map-support: 0.5.21
6753
  stream-slice: 0.1.2
6754
+ undici: 6.20.0
6755
  optionalDependencies:
6756
  typescript: 5.5.2
6757
  optional: true
 
6774
 
6775
6776
  dependencies:
6777
+ '@remix-run/express': 2.10.0(express@4.21.1)([email protected])
6778
  '@remix-run/node': 2.10.0([email protected])
6779
  chokidar: 3.6.0
6780
  compression: 1.7.4
6781
+ express: 4.21.1
6782
  get-port: 5.1.1
6783
  morgan: 1.10.0
6784
  source-map-support: 0.5.21
 
6950
 
6951
  '@types/[email protected]': {}
6952
 
6953
+ '@types/[email protected]': {}
6954
+
6955
+ '@types/[email protected]': {}
6956
+
6957
  '@types/[email protected]':
6958
  dependencies:
6959
  '@types/unist': 2.0.10
 
7329
 
7330
  '@vue/[email protected]':
7331
  dependencies:
7332
+ '@babel/parser': 7.25.8
7333
  '@vue/shared': 3.4.30
7334
  entities: 4.5.0
7335
  estree-walker: 2.0.2
7336
+ source-map-js: 1.2.1
7337
 
7338
  '@vue/[email protected]':
7339
  dependencies:
 
7342
 
7343
  '@vue/[email protected]':
7344
  dependencies:
7345
+ '@babel/parser': 7.25.8
7346
  '@vue/compiler-core': 3.4.30
7347
  '@vue/compiler-dom': 3.4.30
7348
  '@vue/compiler-ssr': 3.4.30
7349
  '@vue/shared': 3.4.30
7350
  estree-walker: 2.0.2
7351
+ magic-string: 0.30.12
7352
  postcss: 8.4.38
7353
+ source-map-js: 1.2.1
7354
 
7355
  '@vue/[email protected]':
7356
  dependencies:
 
7417
 
7418
7419
 
7420
7421
+
7422
7423
  dependencies:
7424
  clean-stack: 2.2.0
7425
  indent-string: 4.0.0
7426
 
7427
7428
  dependencies:
7429
+ '@ai-sdk/provider': 0.0.24
7430
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
7431
+ '@ai-sdk/react': 0.0.62([email protected])([email protected])
7432
+ '@ai-sdk/solid': 0.0.49([email protected])
7433
+ '@ai-sdk/svelte': 0.0.51([email protected])([email protected])
7434
+ '@ai-sdk/ui-utils': 0.0.46([email protected])
7435
7436
  '@opentelemetry/api': 1.9.0
7437
  eventsource-parser: 1.1.2
7438
  json-schema: 0.4.0
7439
  jsondiffpatch: 0.6.0
7440
  nanoid: 3.3.6
7441
  secure-json-parse: 2.7.0
7442
+ zod-to-json-schema: 3.23.2([email protected])
7443
  optionalDependencies:
7444
  react: 18.3.1
7445
  sswr: 2.1.0([email protected])
 
7485
  dependencies:
7486
  tslib: 2.6.3
7487
 
7488
 
 
7489
 
7490
7491
 
 
7517
  dependencies:
7518
  possible-typed-array-names: 1.0.0
7519
 
7520
+ axobject-query@4.1.0: {}
 
 
7521
 
7522
7523
 
 
7565
  transitivePeerDependencies:
7566
  - supports-color
7567
 
7568
7569
+ dependencies:
7570
+ bytes: 3.1.2
7571
+ content-type: 1.0.5
7572
+ debug: 2.6.9
7573
+ depd: 2.0.0
7574
+ destroy: 1.2.0
7575
+ http-errors: 2.0.0
7576
+ iconv-lite: 0.4.24
7577
+ on-finished: 2.4.1
7578
+ qs: 6.13.0
7579
+ raw-body: 2.5.2
7580
+ type-is: 1.6.18
7581
+ unpipe: 1.0.0
7582
+ transitivePeerDependencies:
7583
+ - supports-color
7584
+ optional: true
7585
+
7586
7587
  dependencies:
7588
  balanced-match: 1.0.2
 
7781
 
7782
7783
  dependencies:
7784
+ '@jridgewell/sourcemap-codec': 1.5.0
7785
+ '@types/estree': 1.0.6
7786
+ acorn: 8.12.1
7787
  estree-walker: 3.0.3
7788
  periscopic: 3.1.0
7789
 
 
7807
 
7808
7809
  dependencies:
7810
+ mime-db: 1.53.0
7811
  optional: true
7812
 
7813
 
7849
 
7850
7851
 
7852
7853
+ optional: true
7854
+
7855
7856
 
7857
 
8033
 
8034
8035
 
8036
8037
+ optional: true
8038
+
8039
8040
  dependencies:
8041
  once: 1.4.0
 
8366
  transitivePeerDependencies:
8367
  - supports-color
8368
 
8369
8370
+ dependencies:
8371
+ accepts: 1.3.8
8372
+ array-flatten: 1.1.1
8373
+ body-parser: 1.20.3
8374
+ content-disposition: 0.5.4
8375
+ content-type: 1.0.5
8376
+ cookie: 0.7.1
8377
+ cookie-signature: 1.0.6
8378
+ debug: 2.6.9
8379
+ depd: 2.0.0
8380
+ encodeurl: 2.0.0
8381
+ escape-html: 1.0.3
8382
+ etag: 1.8.1
8383
+ finalhandler: 1.3.1
8384
+ fresh: 0.5.2
8385
+ http-errors: 2.0.0
8386
+ merge-descriptors: 1.0.3
8387
+ methods: 1.1.2
8388
+ on-finished: 2.4.1
8389
+ parseurl: 1.3.3
8390
+ path-to-regexp: 0.1.10
8391
+ proxy-addr: 2.0.7
8392
+ qs: 6.13.0
8393
+ range-parser: 1.2.1
8394
+ safe-buffer: 5.2.1
8395
+ send: 0.19.0
8396
+ serve-static: 1.16.2
8397
+ setprototypeof: 1.2.0
8398
+ statuses: 2.0.1
8399
+ type-is: 1.6.18
8400
+ utils-merge: 1.0.1
8401
+ vary: 1.1.2
8402
+ transitivePeerDependencies:
8403
+ - supports-color
8404
+ optional: true
8405
+
8406
8407
 
8408
 
8438
  dependencies:
8439
  flat-cache: 4.0.1
8440
 
8441
8442
+
8443
8444
  dependencies:
8445
  to-regex-range: 5.0.1
 
8456
  transitivePeerDependencies:
8457
  - supports-color
8458
 
8459
8460
+ dependencies:
8461
+ debug: 2.6.9
8462
+ encodeurl: 2.0.0
8463
+ escape-html: 1.0.3
8464
+ on-finished: 2.4.1
8465
+ parseurl: 1.3.3
8466
+ statuses: 2.0.1
8467
+ unpipe: 1.0.0
8468
+ transitivePeerDependencies:
8469
+ - supports-color
8470
+ optional: true
8471
+
8472
8473
  dependencies:
8474
  locate-path: 6.0.0
 
8791
 
8792
8793
 
8794
+ immediate@3.0.6: {}
8795
+
8796
8797
  optional: true
8798
 
8799
 
8961
  optionalDependencies:
8962
  graceful-fs: 4.2.11
8963
 
8964
8965
+ dependencies:
8966
+ lie: 3.3.0
8967
+ pako: 1.0.11
8968
+ readable-stream: 2.3.8
8969
+ setimmediate: 1.0.5
8970
+
8971
8972
  dependencies:
8973
  json-buffer: 3.0.1
 
8981
  prelude-ls: 1.2.1
8982
  type-check: 0.4.0
8983
 
8984
8985
+ dependencies:
8986
+ immediate: 3.0.6
8987
+
8988
8989
 
8990
 
9039
  dependencies:
9040
  '@jridgewell/sourcemap-codec': 1.4.15
9041
 
9042
9043
+ dependencies:
9044
+ '@jridgewell/sourcemap-codec': 1.5.0
9045
+
9046
9047
 
9048
 
9323
 
9324
9325
 
9326
9327
+ optional: true
9328
+
9329
9330
 
9331
 
9748
 
9749
9750
 
9751
9752
+ optional: true
9753
+
9754
9755
  dependencies:
9756
  mime-db: 1.52.0
 
9832
  acorn: 8.12.0
9833
  pathe: 1.1.2
9834
  pkg-types: 1.1.1
9835
+ ufo: 1.5.4
9836
 
9837
9838
 
 
9974
  node-fetch-native: 1.6.4
9975
  ufo: 1.5.3
9976
 
9977
9978
+ dependencies:
9979
+ '@ai-sdk/provider': 0.0.24
9980
+ '@ai-sdk/provider-utils': 1.0.20([email protected])
9981
+ partial-json: 0.1.7
9982
+ optionalDependencies:
9983
+ zod: 3.23.8
9984
+
9985
9986
  dependencies:
9987
  ee-first: 1.1.1
 
10081
 
10082
10083
 
10084
10085
+
10086
10087
 
10088
 
10098
  lru-cache: 10.2.2
10099
  minipass: 7.1.2
10100
 
10101
10102
+ optional: true
10103
+
10104
10105
 
10106
 
10287
  dependencies:
10288
  side-channel: 1.0.6
10289
 
10290
10291
+ dependencies:
10292
+ side-channel: 1.0.6
10293
+ optional: true
10294
+
10295
10296
 
10297
 
10601
10602
  dependencies:
10603
  chokidar: 3.6.0
10604
+ immutable: 4.3.7
10605
+ source-map-js: 1.2.1
10606
  optional: true
10607
 
10608
 
10638
  transitivePeerDependencies:
10639
  - supports-color
10640
 
10641
10642
+ dependencies:
10643
+ debug: 2.6.9
10644
+ depd: 2.0.0
10645
+ destroy: 1.2.0
10646
+ encodeurl: 1.0.2
10647
+ escape-html: 1.0.3
10648
+ etag: 1.8.1
10649
+ fresh: 0.5.2
10650
+ http-errors: 2.0.0
10651
+ mime: 1.6.0
10652
+ ms: 2.1.3
10653
+ on-finished: 2.4.1
10654
+ range-parser: 1.2.1
10655
+ statuses: 2.0.1
10656
+ transitivePeerDependencies:
10657
+ - supports-color
10658
+ optional: true
10659
+
10660
10661
  dependencies:
10662
  encodeurl: 1.0.2
 
10666
  transitivePeerDependencies:
10667
  - supports-color
10668
 
10669
10670
+ dependencies:
10671
+ encodeurl: 2.0.0
10672
+ escape-html: 1.0.3
10673
+ parseurl: 1.3.3
10674
+ send: 0.19.0
10675
+ transitivePeerDependencies:
10676
+ - supports-color
10677
+ optional: true
10678
+
10679
10680
 
10681
 
10729
 
10730
10731
 
10732
10733
+
10734
10735
  dependencies:
10736
  buffer-from: 1.1.2
 
10862
10863
  dependencies:
10864
  '@ampproject/remapping': 2.3.0
10865
+ '@jridgewell/sourcemap-codec': 1.5.0
10866
  '@jridgewell/trace-mapping': 0.3.25
10867
+ '@types/estree': 1.0.6
10868
+ acorn: 8.12.1
10869
+ aria-query: 5.3.2
10870
+ axobject-query: 4.1.0
10871
  code-red: 1.0.4
10872
  css-tree: 2.3.1
10873
  estree-walker: 3.0.3
10874
  is-reference: 3.0.2
10875
  locate-character: 3.0.0
10876
+ magic-string: 0.30.12
10877
  periscopic: 3.1.0
10878
 
10879
 
11004
 
11005
11006
 
11007
11008
+
11009
11010
  dependencies:
11011
  '@antfu/utils': 0.7.10
 
11020
 
11021
11022
 
11023
11024
+ optional: true
11025
+
11026
11027
  dependencies:
11028
  consola: 3.2.3
 
11030
  mime: 3.0.0
11031
  node-fetch-native: 1.6.4
11032
  pathe: 1.1.2
11033
+ ufo: 1.5.4
11034
 
11035
11036
  dependencies:
 
11466
  mustache: 4.2.0
11467
  stacktracey: 2.1.8
11468
 
11469
+ zod-to-json-schema@3.23.2([email protected]):
11470
  dependencies:
11471
  zod: 3.23.8
11472
 
worker-configuration.d.ts CHANGED
@@ -1,3 +1,7 @@
1
  interface Env {
2
  ANTHROPIC_API_KEY: string;
 
 
 
 
3
  }
 
1
  interface Env {
2
  ANTHROPIC_API_KEY: string;
3
+ OPENAI_API_KEY: string;
4
+ GROQ_API_KEY: string;
5
+ OPEN_ROUTER_API_KEY: string;
6
+ OLLAMA_API_BASE_URL: string;
7
  }