Dominic Elm
commited on
Commit
·
621b880
1
Parent(s):
b4420a2
feat: add first version of workbench, increase token limit, improve system prompt
Browse files- eslint.config.mjs +2 -0
- packages/bolt/app/components/chat/Artifact.tsx +164 -22
- packages/bolt/app/components/chat/BaseChat.tsx +10 -9
- packages/bolt/app/components/chat/Chat.client.tsx +3 -3
- packages/bolt/app/components/chat/CodeBlock.tsx +57 -58
- packages/bolt/app/components/chat/Markdown.module.scss +38 -16
- packages/bolt/app/components/chat/Markdown.tsx +10 -4
- packages/bolt/app/components/chat/Messages.client.tsx +4 -2
- packages/bolt/app/components/editor/codemirror/BinaryContent.tsx +7 -0
- packages/bolt/app/components/editor/codemirror/CodeMirrorEditor.tsx +339 -0
- packages/bolt/app/components/editor/codemirror/cm-theme.ts +165 -0
- packages/bolt/app/components/editor/codemirror/indent.ts +68 -0
- packages/bolt/app/components/editor/codemirror/languages.ts +91 -0
- packages/bolt/app/components/editor/codemirror/styles.css +133 -0
- packages/bolt/app/components/editor/codemirror/themes/vscode-dark.ts +76 -0
- packages/bolt/app/components/ui/IconButton.tsx +1 -1
- packages/bolt/app/components/workbench/EditorPanel.tsx +21 -0
- packages/bolt/app/components/workbench/FileTree.tsx +3 -0
- packages/bolt/app/components/workbench/FileTreePanel.tsx +9 -0
- packages/bolt/app/components/workbench/Preview.tsx +63 -0
- packages/bolt/app/components/{workspace/Workspace.client.tsx → workbench/Workbench.client.tsx} +29 -15
- packages/bolt/app/lib/.server/llm/constants.ts +2 -0
- packages/bolt/app/lib/.server/llm/prompts.ts +35 -30
- packages/bolt/app/lib/.server/llm/stream-text.ts +38 -0
- packages/bolt/app/lib/hooks/useMessageParser.ts +16 -11
- packages/bolt/app/lib/hooks/usePromptEnhancer.ts +1 -1
- packages/bolt/app/lib/runtime/action-runner.ts +68 -0
- packages/bolt/app/lib/runtime/message-parser.spec.ts +9 -7
- packages/bolt/app/lib/runtime/message-parser.ts +116 -40
- packages/bolt/app/lib/stores/previews.ts +42 -0
- packages/bolt/app/lib/stores/theme.ts +33 -0
- packages/bolt/app/lib/stores/workbench.ts +153 -0
- packages/bolt/app/lib/stores/workspace.ts +0 -42
- packages/bolt/app/lib/webcontainer/index.ts +2 -1
- packages/bolt/app/root.tsx +23 -2
- packages/bolt/app/routes/_index.tsx +4 -4
- packages/bolt/app/routes/api.chat.ts +3 -28
- packages/bolt/app/routes/api.enhancer.ts +14 -23
- packages/bolt/app/routes/login.tsx +2 -2
- packages/bolt/app/styles/variables.scss +24 -3
- packages/bolt/app/types/actions.ts +18 -0
- packages/bolt/app/types/artifact.ts +4 -0
- packages/bolt/app/types/theme.ts +1 -0
- packages/bolt/app/utils/debounce.ts +17 -0
- packages/bolt/app/utils/unreachable.ts +3 -0
- packages/bolt/package.json +21 -3
- packages/bolt/uno.config.ts +3 -0
- packages/bolt/vite.config.ts +6 -0
- pnpm-lock.yaml +985 -53
eslint.config.mjs
CHANGED
@@ -9,6 +9,8 @@ export default [
|
|
9 |
{
|
10 |
rules: {
|
11 |
'@blitz/catch-error-name': 'off',
|
|
|
|
|
12 |
},
|
13 |
},
|
14 |
{
|
|
|
9 |
{
|
10 |
rules: {
|
11 |
'@blitz/catch-error-name': 'off',
|
12 |
+
'@typescript-eslint/no-this-alias': 'off',
|
13 |
+
'@typescript-eslint/no-empty-object-type': 'off',
|
14 |
},
|
15 |
},
|
16 |
{
|
packages/bolt/app/components/chat/Artifact.tsx
CHANGED
@@ -1,34 +1,176 @@
|
|
1 |
import { useStore } from '@nanostores/react';
|
2 |
-
import {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
interface ArtifactProps {
|
|
|
5 |
messageId: string;
|
6 |
}
|
7 |
|
8 |
-
export function Artifact({ messageId }: ArtifactProps) {
|
9 |
-
const
|
10 |
|
11 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
return (
|
14 |
-
<
|
15 |
-
className="flex
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
<div className="
|
24 |
-
|
25 |
-
|
26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
</div>
|
28 |
-
<
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
);
|
34 |
}
|
|
|
1 |
import { useStore } from '@nanostores/react';
|
2 |
+
import { AnimatePresence, motion } from 'framer-motion';
|
3 |
+
import { computed } from 'nanostores';
|
4 |
+
import { useState } from 'react';
|
5 |
+
import { createHighlighter, type BundledLanguage, type BundledTheme, type HighlighterGeneric } from 'shiki';
|
6 |
+
import { getArtifactKey, workbenchStore, type ActionState } from '../../lib/stores/workbench';
|
7 |
+
import { classNames } from '../../utils/classNames';
|
8 |
+
import { cubicEasingFn } from '../../utils/easings';
|
9 |
+
import { IconButton } from '../ui/IconButton';
|
10 |
+
|
11 |
+
const highlighterOptions = {
|
12 |
+
langs: ['shell'],
|
13 |
+
themes: ['light-plus', 'dark-plus'],
|
14 |
+
};
|
15 |
+
|
16 |
+
const shellHighlighter: HighlighterGeneric<BundledLanguage, BundledTheme> =
|
17 |
+
import.meta.hot?.data.shellHighlighter ?? (await createHighlighter(highlighterOptions));
|
18 |
+
|
19 |
+
if (import.meta.hot) {
|
20 |
+
import.meta.hot.data.shellHighlighter = shellHighlighter;
|
21 |
+
}
|
22 |
|
23 |
interface ArtifactProps {
|
24 |
+
artifactId: string;
|
25 |
messageId: string;
|
26 |
}
|
27 |
|
28 |
+
export function Artifact({ artifactId, messageId }: ArtifactProps) {
|
29 |
+
const [showActions, setShowActions] = useState(false);
|
30 |
|
31 |
+
const artifacts = useStore(workbenchStore.artifacts);
|
32 |
+
const artifact = artifacts[getArtifactKey(artifactId, messageId)];
|
33 |
+
|
34 |
+
const actions = useStore(
|
35 |
+
computed(artifact.actions, (actions) => {
|
36 |
+
return Object.values(actions);
|
37 |
+
}),
|
38 |
+
);
|
39 |
|
40 |
return (
|
41 |
+
<div className="flex flex-col overflow-hidden border rounded-lg w-full">
|
42 |
+
<div className="flex">
|
43 |
+
<button
|
44 |
+
className="flex items-stretch bg-gray-50/25 w-full overflow-hidden"
|
45 |
+
onClick={() => {
|
46 |
+
const showWorkbench = workbenchStore.showWorkbench.get();
|
47 |
+
workbenchStore.showWorkbench.set(!showWorkbench);
|
48 |
+
}}
|
49 |
+
>
|
50 |
+
<div className="flex items-center px-6 bg-gray-100/50">
|
51 |
+
{!artifact?.closed ? (
|
52 |
+
<div className="i-svg-spinners:90-ring-with-bg scale-130"></div>
|
53 |
+
) : (
|
54 |
+
<div className="i-ph:code-bold scale-130 text-gray-600"></div>
|
55 |
+
)}
|
56 |
+
</div>
|
57 |
+
<div className="px-4 p-3 w-full text-left">
|
58 |
+
<div className="w-full">{artifact?.title}</div>
|
59 |
+
<small className="inline-block w-full w-full">Click to open Workbench</small>
|
60 |
+
</div>
|
61 |
+
</button>
|
62 |
+
<AnimatePresence>
|
63 |
+
{actions.length && (
|
64 |
+
<motion.button
|
65 |
+
initial={{ width: 0 }}
|
66 |
+
animate={{ width: 'auto' }}
|
67 |
+
exit={{ width: 0 }}
|
68 |
+
transition={{ duration: 0.15, ease: cubicEasingFn }}
|
69 |
+
className="hover:bg-gray-200"
|
70 |
+
onClick={() => setShowActions(!showActions)}
|
71 |
+
>
|
72 |
+
<div className="p-4">
|
73 |
+
<div className={showActions ? 'i-ph:caret-up-bold' : 'i-ph:caret-down-bold'}></div>
|
74 |
+
</div>
|
75 |
+
</motion.button>
|
76 |
+
)}
|
77 |
+
</AnimatePresence>
|
78 |
</div>
|
79 |
+
<AnimatePresence>
|
80 |
+
{showActions && actions.length > 0 && (
|
81 |
+
<motion.div
|
82 |
+
className="actions"
|
83 |
+
initial={{ height: 0 }}
|
84 |
+
animate={{ height: 'auto' }}
|
85 |
+
exit={{ height: '0px' }}
|
86 |
+
transition={{ duration: 0.15 }}
|
87 |
+
>
|
88 |
+
<div className="p-4 text-left border-t">
|
89 |
+
<motion.div
|
90 |
+
initial={{ opacity: 0 }}
|
91 |
+
animate={{ opacity: 1 }}
|
92 |
+
exit={{ opacity: 0 }}
|
93 |
+
transition={{ duration: 0.15 }}
|
94 |
+
>
|
95 |
+
<h4 className="font-semibold mb-2">Actions</h4>
|
96 |
+
<ul className="list-none space-y-2.5">
|
97 |
+
{actions.map((action, index) => {
|
98 |
+
const { status, type, content, abort } = action;
|
99 |
+
|
100 |
+
return (
|
101 |
+
<li key={index} className={classNames(getTextColor(action.status))}>
|
102 |
+
<div className="flex items-center gap-1.5">
|
103 |
+
<div className="text-lg">
|
104 |
+
{status === 'running' ? (
|
105 |
+
<div className="i-svg-spinners:90-ring-with-bg"></div>
|
106 |
+
) : status === 'pending' ? (
|
107 |
+
<div className="i-ph:circle-duotone"></div>
|
108 |
+
) : status === 'complete' ? (
|
109 |
+
<div className="i-ph:check-circle-duotone"></div>
|
110 |
+
) : status === 'failed' || status === 'aborted' ? (
|
111 |
+
<div className="i-ph:x-circle-duotone"></div>
|
112 |
+
) : null}
|
113 |
+
</div>
|
114 |
+
{type === 'file' ? (
|
115 |
+
<div>
|
116 |
+
Create <code className="bg-gray-100 text-gray-700">{action.filePath}</code>
|
117 |
+
</div>
|
118 |
+
) : type === 'shell' ? (
|
119 |
+
<div className="flex items-center w-full min-h-[28px]">
|
120 |
+
<span className="flex-1">Run command</span>
|
121 |
+
{abort !== undefined && status === 'running' && (
|
122 |
+
<IconButton icon="i-ph:x-circle" size="xl" onClick={() => abort()} />
|
123 |
+
)}
|
124 |
+
</div>
|
125 |
+
) : null}
|
126 |
+
</div>
|
127 |
+
{type === 'shell' && <ShellCodeBlock classsName="mt-1" code={content} />}
|
128 |
+
</li>
|
129 |
+
);
|
130 |
+
})}
|
131 |
+
</ul>
|
132 |
+
</motion.div>
|
133 |
+
</div>
|
134 |
+
</motion.div>
|
135 |
+
)}
|
136 |
+
</AnimatePresence>
|
137 |
+
</div>
|
138 |
+
);
|
139 |
+
}
|
140 |
+
|
141 |
+
function getTextColor(status: ActionState['status']) {
|
142 |
+
switch (status) {
|
143 |
+
case 'pending': {
|
144 |
+
return 'text-gray-500';
|
145 |
+
}
|
146 |
+
case 'running': {
|
147 |
+
return 'text-gray-1000';
|
148 |
+
}
|
149 |
+
case 'complete': {
|
150 |
+
return 'text-positive-600';
|
151 |
+
}
|
152 |
+
case 'aborted': {
|
153 |
+
return 'text-gray-600';
|
154 |
+
}
|
155 |
+
case 'failed': {
|
156 |
+
return 'text-negative-600';
|
157 |
+
}
|
158 |
+
default: {
|
159 |
+
return undefined;
|
160 |
+
}
|
161 |
+
}
|
162 |
+
}
|
163 |
+
|
164 |
+
interface ShellCodeBlockProps {
|
165 |
+
classsName?: string;
|
166 |
+
code: string;
|
167 |
+
}
|
168 |
+
|
169 |
+
function ShellCodeBlock({ classsName, code }: ShellCodeBlockProps) {
|
170 |
+
return (
|
171 |
+
<div
|
172 |
+
className={classNames('text-xs', classsName)}
|
173 |
+
dangerouslySetInnerHTML={{ __html: shellHighlighter.codeToHtml(code, { lang: 'shell', theme: 'dark-plus' }) }}
|
174 |
+
></div>
|
175 |
);
|
176 |
}
|
packages/bolt/app/components/chat/BaseChat.tsx
CHANGED
@@ -2,16 +2,14 @@ import type { Message } from 'ai';
|
|
2 |
import type { LegacyRef } from 'react';
|
3 |
import React from 'react';
|
4 |
import { ClientOnly } from 'remix-utils/client-only';
|
5 |
-
import {
|
6 |
-
import {
|
7 |
-
import {
|
8 |
import { Messages } from './Messages.client';
|
9 |
import { SendButton } from './SendButton.client';
|
10 |
|
11 |
interface BaseChatProps {
|
12 |
textareaRef?: LegacyRef<HTMLTextAreaElement> | undefined;
|
13 |
-
messagesSlot?: React.ReactNode;
|
14 |
-
workspaceSlot?: React.ReactNode;
|
15 |
chatStarted?: boolean;
|
16 |
isStreaming?: boolean;
|
17 |
messages?: Message[];
|
@@ -80,14 +78,17 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
|
|
80 |
</ClientOnly>
|
81 |
<div
|
82 |
className={classNames('relative w-full max-w-3xl md:mx-auto z-2', {
|
83 |
-
'sticky bottom-0
|
84 |
})}
|
85 |
>
|
86 |
<div
|
87 |
-
className={classNames(
|
|
|
|
|
88 |
>
|
89 |
<textarea
|
90 |
ref={textareaRef}
|
|
|
91 |
onKeyDown={(event) => {
|
92 |
if (event.key === 'Enter') {
|
93 |
if (event.shiftKey) {
|
@@ -103,7 +104,6 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
|
|
103 |
onChange={(event) => {
|
104 |
handleInputChange?.(event);
|
105 |
}}
|
106 |
-
className={`w-full pl-4 pt-4 pr-16 focus:outline-none resize-none`}
|
107 |
style={{
|
108 |
minHeight: TEXTAREA_MIN_HEIGHT,
|
109 |
maxHeight: TEXTAREA_MAX_HEIGHT,
|
@@ -146,10 +146,11 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
|
|
146 |
) : null}
|
147 |
</div>
|
148 |
</div>
|
|
|
149 |
</div>
|
150 |
</div>
|
151 |
</div>
|
152 |
-
<ClientOnly>{() => <
|
153 |
</div>
|
154 |
</div>
|
155 |
);
|
|
|
2 |
import type { LegacyRef } from 'react';
|
3 |
import React from 'react';
|
4 |
import { ClientOnly } from 'remix-utils/client-only';
|
5 |
+
import { classNames } from '../../utils/classNames';
|
6 |
+
import { IconButton } from '../ui/IconButton';
|
7 |
+
import { Workbench } from '../workbench/Workbench.client';
|
8 |
import { Messages } from './Messages.client';
|
9 |
import { SendButton } from './SendButton.client';
|
10 |
|
11 |
interface BaseChatProps {
|
12 |
textareaRef?: LegacyRef<HTMLTextAreaElement> | undefined;
|
|
|
|
|
13 |
chatStarted?: boolean;
|
14 |
isStreaming?: boolean;
|
15 |
messages?: Message[];
|
|
|
78 |
</ClientOnly>
|
79 |
<div
|
80 |
className={classNames('relative w-full max-w-3xl md:mx-auto z-2', {
|
81 |
+
'sticky bottom-0': chatStarted,
|
82 |
})}
|
83 |
>
|
84 |
<div
|
85 |
+
className={classNames(
|
86 |
+
'shadow-sm border border-gray-200 bg-white/85 backdrop-filter backdrop-blur-[8px] rounded-lg overflow-hidden',
|
87 |
+
)}
|
88 |
>
|
89 |
<textarea
|
90 |
ref={textareaRef}
|
91 |
+
className={`w-full pl-4 pt-4 pr-16 focus:outline-none resize-none bg-transparent`}
|
92 |
onKeyDown={(event) => {
|
93 |
if (event.key === 'Enter') {
|
94 |
if (event.shiftKey) {
|
|
|
104 |
onChange={(event) => {
|
105 |
handleInputChange?.(event);
|
106 |
}}
|
|
|
107 |
style={{
|
108 |
minHeight: TEXTAREA_MIN_HEIGHT,
|
109 |
maxHeight: TEXTAREA_MAX_HEIGHT,
|
|
|
146 |
) : null}
|
147 |
</div>
|
148 |
</div>
|
149 |
+
<div className="bg-white pb-6">{/* Ghost Element */}</div>
|
150 |
</div>
|
151 |
</div>
|
152 |
</div>
|
153 |
+
<ClientOnly>{() => <Workbench chatStarted={chatStarted} />}</ClientOnly>
|
154 |
</div>
|
155 |
</div>
|
156 |
);
|
packages/bolt/app/components/chat/Chat.client.tsx
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
import { useChat } from 'ai/react';
|
2 |
import { useAnimate } from 'framer-motion';
|
3 |
import { useEffect, useRef, useState } from 'react';
|
4 |
-
import { useMessageParser, usePromptEnhancer } from '
|
5 |
-
import { cubicEasingFn } from '
|
6 |
-
import { createScopedLogger } from '
|
7 |
import { BaseChat } from './BaseChat';
|
8 |
|
9 |
const logger = createScopedLogger('Chat');
|
|
|
1 |
import { useChat } from 'ai/react';
|
2 |
import { useAnimate } from 'framer-motion';
|
3 |
import { useEffect, useRef, useState } from 'react';
|
4 |
+
import { useMessageParser, usePromptEnhancer } from '../../lib/hooks';
|
5 |
+
import { cubicEasingFn } from '../../utils/easings';
|
6 |
+
import { createScopedLogger } from '../../utils/logger';
|
7 |
import { BaseChat } from './BaseChat';
|
8 |
|
9 |
const logger = createScopedLogger('Chat');
|
packages/bolt/app/components/chat/CodeBlock.tsx
CHANGED
@@ -1,82 +1,81 @@
|
|
1 |
import { memo, useEffect, useState } from 'react';
|
2 |
-
import {
|
3 |
-
|
4 |
-
|
5 |
-
isSpecialLang,
|
6 |
-
type BundledLanguage,
|
7 |
-
type BundledTheme,
|
8 |
-
type SpecialLanguage,
|
9 |
-
} from 'shiki';
|
10 |
-
import { classNames } from '~/utils/classNames';
|
11 |
-
import { createScopedLogger } from '~/utils/logger';
|
12 |
import styles from './CodeBlock.module.scss';
|
13 |
|
14 |
const logger = createScopedLogger('CodeBlock');
|
15 |
|
16 |
interface CodeBlockProps {
|
|
|
17 |
code: string;
|
18 |
-
language?: BundledLanguage;
|
19 |
-
theme?:
|
|
|
20 |
}
|
21 |
|
22 |
-
export const CodeBlock = memo(
|
23 |
-
|
24 |
-
|
|
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
|
31 |
-
|
32 |
|
33 |
-
|
34 |
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
|
45 |
-
|
46 |
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
|
51 |
-
|
52 |
-
|
53 |
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
className={classNames(
|
58 |
-
styles.CopyButtonContainer,
|
59 |
-
'bg-white absolute top-[10px] right-[10px] rounded-md z-10 text-lg flex items-center justify-center opacity-0 group-hover:opacity-100',
|
60 |
-
{
|
61 |
-
'rounded-l-0 opacity-100': copied,
|
62 |
-
},
|
63 |
-
)}
|
64 |
-
>
|
65 |
-
<button
|
66 |
className={classNames(
|
67 |
-
|
|
|
68 |
{
|
69 |
-
'
|
70 |
-
'before:opacity-100': copied,
|
71 |
},
|
72 |
)}
|
73 |
-
title="Copy Code"
|
74 |
-
onClick={() => copyToClipboard()}
|
75 |
>
|
76 |
-
|
77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
</div>
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
});
|
|
|
1 |
import { memo, useEffect, useState } from 'react';
|
2 |
+
import { bundledLanguages, codeToHtml, isSpecialLang, type BundledLanguage, type SpecialLanguage } from 'shiki';
|
3 |
+
import { classNames } from '../../utils/classNames';
|
4 |
+
import { createScopedLogger } from '../../utils/logger';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
import styles from './CodeBlock.module.scss';
|
6 |
|
7 |
const logger = createScopedLogger('CodeBlock');
|
8 |
|
9 |
interface CodeBlockProps {
|
10 |
+
className?: string;
|
11 |
code: string;
|
12 |
+
language?: BundledLanguage | SpecialLanguage;
|
13 |
+
theme?: 'light-plus' | 'dark-plus';
|
14 |
+
disableCopy?: boolean;
|
15 |
}
|
16 |
|
17 |
+
export const CodeBlock = memo(
|
18 |
+
({ className, code, language = 'plaintext', theme = 'dark-plus', disableCopy = false }: CodeBlockProps) => {
|
19 |
+
const [html, setHTML] = useState<string | undefined>(undefined);
|
20 |
+
const [copied, setCopied] = useState(false);
|
21 |
|
22 |
+
const copyToClipboard = () => {
|
23 |
+
if (copied) {
|
24 |
+
return;
|
25 |
+
}
|
26 |
|
27 |
+
navigator.clipboard.writeText(code);
|
28 |
|
29 |
+
setCopied(true);
|
30 |
|
31 |
+
setTimeout(() => {
|
32 |
+
setCopied(false);
|
33 |
+
}, 2000);
|
34 |
+
};
|
35 |
|
36 |
+
useEffect(() => {
|
37 |
+
if (language && !isSpecialLang(language) && !(language in bundledLanguages)) {
|
38 |
+
logger.warn(`Unsupported language '${language}'`);
|
39 |
+
}
|
40 |
|
41 |
+
logger.trace(`Language = ${language}`);
|
42 |
|
43 |
+
const processCode = async () => {
|
44 |
+
setHTML(await codeToHtml(code, { lang: language, theme }));
|
45 |
+
};
|
46 |
|
47 |
+
processCode();
|
48 |
+
}, [code]);
|
49 |
|
50 |
+
return (
|
51 |
+
<div className={classNames('relative group text-left', className)}>
|
52 |
+
<div
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
className={classNames(
|
54 |
+
styles.CopyButtonContainer,
|
55 |
+
'bg-white absolute top-[10px] right-[10px] rounded-md z-10 text-lg flex items-center justify-center opacity-0 group-hover:opacity-100',
|
56 |
{
|
57 |
+
'rounded-l-0 opacity-100': copied,
|
|
|
58 |
},
|
59 |
)}
|
|
|
|
|
60 |
>
|
61 |
+
{!disableCopy && (
|
62 |
+
<button
|
63 |
+
className={classNames(
|
64 |
+
'flex items-center bg-transparent p-[6px] justify-center before:bg-white before:rounded-l-md before:text-gray-500 before:border-r before:border-gray-300',
|
65 |
+
{
|
66 |
+
'before:opacity-0': !copied,
|
67 |
+
'before:opacity-100': copied,
|
68 |
+
},
|
69 |
+
)}
|
70 |
+
title="Copy Code"
|
71 |
+
onClick={() => copyToClipboard()}
|
72 |
+
>
|
73 |
+
<div className="i-ph:clipboard-text-duotone"></div>
|
74 |
+
</button>
|
75 |
+
)}
|
76 |
+
</div>
|
77 |
+
<div dangerouslySetInnerHTML={{ __html: html ?? '' }}></div>
|
78 |
</div>
|
79 |
+
);
|
80 |
+
},
|
81 |
+
);
|
|
packages/bolt/app/components/chat/Markdown.module.scss
CHANGED
@@ -6,6 +6,12 @@ $color-link: #3498db;
|
|
6 |
$color-code-bg: #f8f8f8;
|
7 |
$color-blockquote-border: #dfe2e5;
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
.MarkdownContent {
|
10 |
line-height: 1.6;
|
11 |
color: $color-text;
|
@@ -15,11 +21,13 @@ $color-blockquote-border: #dfe2e5;
|
|
15 |
}
|
16 |
|
17 |
:is(h1, h2, h3, h4, h5, h6) {
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
|
|
|
|
23 |
}
|
24 |
|
25 |
h1 {
|
@@ -68,9 +76,12 @@ $color-blockquote-border: #dfe2e5;
|
|
68 |
:not(pre) > code {
|
69 |
font-family: $font-mono;
|
70 |
font-size: 14px;
|
71 |
-
background-color: $color-code-bg;
|
72 |
border-radius: 6px;
|
73 |
padding: 0.2em 0.4em;
|
|
|
|
|
|
|
|
|
74 |
}
|
75 |
|
76 |
pre {
|
@@ -83,6 +94,7 @@ $color-blockquote-border: #dfe2e5;
|
|
83 |
font-size: 14px;
|
84 |
background: transparent;
|
85 |
overflow-x: auto;
|
|
|
86 |
}
|
87 |
|
88 |
blockquote {
|
@@ -93,25 +105,35 @@ $color-blockquote-border: #dfe2e5;
|
|
93 |
}
|
94 |
|
95 |
:is(ul, ol) {
|
96 |
-
|
97 |
-
|
98 |
-
|
|
|
|
|
99 |
}
|
100 |
|
101 |
ul {
|
102 |
-
|
|
|
|
|
103 |
}
|
104 |
|
105 |
ol {
|
106 |
-
|
|
|
|
|
107 |
}
|
108 |
|
109 |
-
li
|
110 |
-
|
111 |
-
|
|
|
|
|
112 |
|
113 |
-
|
114 |
-
|
|
|
|
|
115 |
}
|
116 |
|
117 |
img {
|
|
|
6 |
$color-code-bg: #f8f8f8;
|
7 |
$color-blockquote-border: #dfe2e5;
|
8 |
|
9 |
+
@mixin not-inside-actions {
|
10 |
+
&:not(:has(:global(.actions)), :global(.actions *)) {
|
11 |
+
@content;
|
12 |
+
}
|
13 |
+
}
|
14 |
+
|
15 |
.MarkdownContent {
|
16 |
line-height: 1.6;
|
17 |
color: $color-text;
|
|
|
21 |
}
|
22 |
|
23 |
:is(h1, h2, h3, h4, h5, h6) {
|
24 |
+
@include not-inside-actions {
|
25 |
+
margin-top: 24px;
|
26 |
+
margin-bottom: 16px;
|
27 |
+
font-weight: 600;
|
28 |
+
line-height: 1.25;
|
29 |
+
color: $color-heading;
|
30 |
+
}
|
31 |
}
|
32 |
|
33 |
h1 {
|
|
|
76 |
:not(pre) > code {
|
77 |
font-family: $font-mono;
|
78 |
font-size: 14px;
|
|
|
79 |
border-radius: 6px;
|
80 |
padding: 0.2em 0.4em;
|
81 |
+
|
82 |
+
@include not-inside-actions {
|
83 |
+
background-color: $color-code-bg;
|
84 |
+
}
|
85 |
}
|
86 |
|
87 |
pre {
|
|
|
94 |
font-size: 14px;
|
95 |
background: transparent;
|
96 |
overflow-x: auto;
|
97 |
+
min-width: 0;
|
98 |
}
|
99 |
|
100 |
blockquote {
|
|
|
105 |
}
|
106 |
|
107 |
:is(ul, ol) {
|
108 |
+
@include not-inside-actions {
|
109 |
+
padding-left: 2em;
|
110 |
+
margin-top: 0;
|
111 |
+
margin-bottom: 24px;
|
112 |
+
}
|
113 |
}
|
114 |
|
115 |
ul {
|
116 |
+
@include not-inside-actions {
|
117 |
+
list-style-type: disc;
|
118 |
+
}
|
119 |
}
|
120 |
|
121 |
ol {
|
122 |
+
@include not-inside-actions {
|
123 |
+
list-style-type: decimal;
|
124 |
+
}
|
125 |
}
|
126 |
|
127 |
+
li {
|
128 |
+
@include not-inside-actions {
|
129 |
+
& + li {
|
130 |
+
margin-top: 8px;
|
131 |
+
}
|
132 |
|
133 |
+
> *:not(:last-child) {
|
134 |
+
margin-bottom: 16px;
|
135 |
+
}
|
136 |
+
}
|
137 |
}
|
138 |
|
139 |
img {
|
packages/bolt/app/components/chat/Markdown.tsx
CHANGED
@@ -1,10 +1,11 @@
|
|
1 |
import { memo, useMemo } from 'react';
|
2 |
import ReactMarkdown, { type Components } from 'react-markdown';
|
3 |
import type { BundledLanguage } from 'shiki';
|
4 |
-
import { createScopedLogger } from '
|
5 |
-
import { rehypePlugins, remarkPlugins } from '
|
6 |
import { Artifact } from './Artifact';
|
7 |
import { CodeBlock } from './CodeBlock';
|
|
|
8 |
import styles from './Markdown.module.scss';
|
9 |
|
10 |
const logger = createScopedLogger('MarkdownComponent');
|
@@ -20,13 +21,18 @@ export const Markdown = memo(({ children }: MarkdownProps) => {
|
|
20 |
return {
|
21 |
div: ({ className, children, node, ...props }) => {
|
22 |
if (className?.includes('__boltArtifact__')) {
|
|
|
23 |
const messageId = node?.properties.dataMessageId as string;
|
24 |
|
|
|
|
|
|
|
|
|
25 |
if (!messageId) {
|
26 |
-
logger.
|
27 |
}
|
28 |
|
29 |
-
return <Artifact messageId={messageId} />;
|
30 |
}
|
31 |
|
32 |
return (
|
|
|
1 |
import { memo, useMemo } from 'react';
|
2 |
import ReactMarkdown, { type Components } from 'react-markdown';
|
3 |
import type { BundledLanguage } from 'shiki';
|
4 |
+
import { createScopedLogger } from '../../utils/logger';
|
5 |
+
import { rehypePlugins, remarkPlugins } from '../../utils/markdown';
|
6 |
import { Artifact } from './Artifact';
|
7 |
import { CodeBlock } from './CodeBlock';
|
8 |
+
|
9 |
import styles from './Markdown.module.scss';
|
10 |
|
11 |
const logger = createScopedLogger('MarkdownComponent');
|
|
|
21 |
return {
|
22 |
div: ({ className, children, node, ...props }) => {
|
23 |
if (className?.includes('__boltArtifact__')) {
|
24 |
+
const artifactId = node?.properties.dataArtifactId as string;
|
25 |
const messageId = node?.properties.dataMessageId as string;
|
26 |
|
27 |
+
if (!artifactId) {
|
28 |
+
logger.debug(`Invalid artifact id ${messageId}`);
|
29 |
+
}
|
30 |
+
|
31 |
if (!messageId) {
|
32 |
+
logger.debug(`Invalid message id ${messageId}`);
|
33 |
}
|
34 |
|
35 |
+
return <Artifact artifactId={artifactId} messageId={messageId} />;
|
36 |
}
|
37 |
|
38 |
return (
|
packages/bolt/app/components/chat/Messages.client.tsx
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
import type { Message } from 'ai';
|
2 |
-
import { classNames } from '
|
3 |
import { AssistantMessage } from './AssistantMessage';
|
4 |
import { UserMessage } from './UserMessage';
|
5 |
|
@@ -50,7 +50,9 @@ export function Messages(props: MessagesProps) {
|
|
50 |
>
|
51 |
<div className={isUserMessage ? 'i-ph:user-fill text-xl' : 'i-blitz:logo'}></div>
|
52 |
</div>
|
53 |
-
|
|
|
|
|
54 |
</div>
|
55 |
</div>
|
56 |
);
|
|
|
1 |
import type { Message } from 'ai';
|
2 |
+
import { classNames } from '../../utils/classNames';
|
3 |
import { AssistantMessage } from './AssistantMessage';
|
4 |
import { UserMessage } from './UserMessage';
|
5 |
|
|
|
50 |
>
|
51 |
<div className={isUserMessage ? 'i-ph:user-fill text-xl' : 'i-blitz:logo'}></div>
|
52 |
</div>
|
53 |
+
<div className="grid grid-col-1 w-full">
|
54 |
+
{isUser ? <UserMessage content={content} /> : <AssistantMessage content={content} />}
|
55 |
+
</div>
|
56 |
</div>
|
57 |
</div>
|
58 |
);
|
packages/bolt/app/components/editor/codemirror/BinaryContent.tsx
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export function BinaryContent() {
|
2 |
+
return (
|
3 |
+
<div className="flex items-center justify-center absolute inset-0 z-10 text-sm bg-tk-elements-app-backgroundColor text-tk-elements-app-textColor">
|
4 |
+
File format cannot be displayed.
|
5 |
+
</div>
|
6 |
+
);
|
7 |
+
}
|
packages/bolt/app/components/editor/codemirror/CodeMirrorEditor.tsx
ADDED
@@ -0,0 +1,339 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { acceptCompletion, autocompletion, closeBrackets } from '@codemirror/autocomplete';
|
2 |
+
import { defaultKeymap, history, historyKeymap } from '@codemirror/commands';
|
3 |
+
import { bracketMatching, foldGutter, indentOnInput, indentUnit } from '@codemirror/language';
|
4 |
+
import { searchKeymap } from '@codemirror/search';
|
5 |
+
import { Compartment, EditorSelection, EditorState, type Extension } from '@codemirror/state';
|
6 |
+
import {
|
7 |
+
EditorView,
|
8 |
+
drawSelection,
|
9 |
+
dropCursor,
|
10 |
+
highlightActiveLine,
|
11 |
+
highlightActiveLineGutter,
|
12 |
+
keymap,
|
13 |
+
lineNumbers,
|
14 |
+
scrollPastEnd,
|
15 |
+
} from '@codemirror/view';
|
16 |
+
import { useEffect, useRef, useState, type MutableRefObject } from 'react';
|
17 |
+
import type { Theme } from '../../../types/theme';
|
18 |
+
import { classNames } from '../../../utils/classNames';
|
19 |
+
import { debounce } from '../../../utils/debounce';
|
20 |
+
import { createScopedLogger } from '../../../utils/logger';
|
21 |
+
import { BinaryContent } from './BinaryContent';
|
22 |
+
import { getTheme, reconfigureTheme } from './cm-theme';
|
23 |
+
import { indentKeyBinding } from './indent';
|
24 |
+
import { getLanguage } from './languages';
|
25 |
+
|
26 |
+
const logger = createScopedLogger('CodeMirrorEditor');
|
27 |
+
|
28 |
+
export interface EditorDocument {
|
29 |
+
value: string | Uint8Array;
|
30 |
+
loading: boolean;
|
31 |
+
filePath: string;
|
32 |
+
scroll?: ScrollPosition;
|
33 |
+
}
|
34 |
+
|
35 |
+
export interface EditorSettings {
|
36 |
+
fontSize?: string;
|
37 |
+
tabSize?: number;
|
38 |
+
}
|
39 |
+
|
40 |
+
type TextEditorDocument = EditorDocument & {
|
41 |
+
value: string;
|
42 |
+
};
|
43 |
+
|
44 |
+
export interface ScrollPosition {
|
45 |
+
top: number;
|
46 |
+
left: number;
|
47 |
+
}
|
48 |
+
|
49 |
+
export interface EditorUpdate {
|
50 |
+
selection: EditorSelection;
|
51 |
+
content: string;
|
52 |
+
}
|
53 |
+
|
54 |
+
export type OnChangeCallback = (update: EditorUpdate) => void;
|
55 |
+
export type OnScrollCallback = (position: ScrollPosition) => void;
|
56 |
+
|
57 |
+
interface Props {
|
58 |
+
theme: Theme;
|
59 |
+
id?: unknown;
|
60 |
+
doc?: EditorDocument;
|
61 |
+
debounceChange?: number;
|
62 |
+
debounceScroll?: number;
|
63 |
+
autoFocusOnDocumentChange?: boolean;
|
64 |
+
onChange?: OnChangeCallback;
|
65 |
+
onScroll?: OnScrollCallback;
|
66 |
+
className?: string;
|
67 |
+
settings?: EditorSettings;
|
68 |
+
}
|
69 |
+
|
70 |
+
type EditorStates = Map<string, EditorState>;
|
71 |
+
|
72 |
+
export function CodeMirrorEditor({
|
73 |
+
id,
|
74 |
+
doc,
|
75 |
+
debounceScroll = 100,
|
76 |
+
debounceChange = 150,
|
77 |
+
autoFocusOnDocumentChange = false,
|
78 |
+
onScroll,
|
79 |
+
onChange,
|
80 |
+
theme,
|
81 |
+
settings,
|
82 |
+
className = '',
|
83 |
+
}: Props) {
|
84 |
+
const [language] = useState(new Compartment());
|
85 |
+
const [readOnly] = useState(new Compartment());
|
86 |
+
|
87 |
+
const containerRef = useRef<HTMLDivElement | null>(null);
|
88 |
+
const viewRef = useRef<EditorView>();
|
89 |
+
const themeRef = useRef<Theme>();
|
90 |
+
const docRef = useRef<EditorDocument>();
|
91 |
+
const editorStatesRef = useRef<EditorStates>();
|
92 |
+
const onScrollRef = useRef(onScroll);
|
93 |
+
const onChangeRef = useRef(onChange);
|
94 |
+
|
95 |
+
const isBinaryFile = doc?.value instanceof Uint8Array;
|
96 |
+
|
97 |
+
onScrollRef.current = onScroll;
|
98 |
+
onChangeRef.current = onChange;
|
99 |
+
|
100 |
+
docRef.current = doc;
|
101 |
+
themeRef.current = theme;
|
102 |
+
|
103 |
+
useEffect(() => {
|
104 |
+
const onUpdate = debounce((update: EditorUpdate) => {
|
105 |
+
onChangeRef.current?.(update);
|
106 |
+
}, debounceChange);
|
107 |
+
|
108 |
+
const view = new EditorView({
|
109 |
+
parent: containerRef.current!,
|
110 |
+
dispatchTransactions(transactions) {
|
111 |
+
const previousSelection = view.state.selection;
|
112 |
+
|
113 |
+
view.update(transactions);
|
114 |
+
|
115 |
+
const newSelection = view.state.selection;
|
116 |
+
|
117 |
+
const selectionChanged =
|
118 |
+
newSelection !== previousSelection &&
|
119 |
+
(newSelection === undefined || previousSelection === undefined || !newSelection.eq(previousSelection));
|
120 |
+
|
121 |
+
if (
|
122 |
+
docRef.current &&
|
123 |
+
!docRef.current.loading &&
|
124 |
+
(transactions.some((transaction) => transaction.docChanged) || selectionChanged)
|
125 |
+
) {
|
126 |
+
onUpdate({
|
127 |
+
selection: view.state.selection,
|
128 |
+
content: view.state.doc.toString(),
|
129 |
+
});
|
130 |
+
|
131 |
+
editorStatesRef.current!.set(docRef.current.filePath, view.state);
|
132 |
+
}
|
133 |
+
},
|
134 |
+
});
|
135 |
+
|
136 |
+
viewRef.current = view;
|
137 |
+
|
138 |
+
return () => {
|
139 |
+
viewRef.current?.destroy();
|
140 |
+
viewRef.current = undefined;
|
141 |
+
};
|
142 |
+
}, []);
|
143 |
+
|
144 |
+
useEffect(() => {
|
145 |
+
if (!viewRef.current) {
|
146 |
+
return;
|
147 |
+
}
|
148 |
+
|
149 |
+
viewRef.current.dispatch({
|
150 |
+
effects: [reconfigureTheme(theme)],
|
151 |
+
});
|
152 |
+
}, [theme]);
|
153 |
+
|
154 |
+
useEffect(() => {
|
155 |
+
editorStatesRef.current = new Map<string, EditorState>();
|
156 |
+
}, [id]);
|
157 |
+
|
158 |
+
useEffect(() => {
|
159 |
+
const editorStates = editorStatesRef.current!;
|
160 |
+
const view = viewRef.current!;
|
161 |
+
const theme = themeRef.current!;
|
162 |
+
|
163 |
+
if (!doc) {
|
164 |
+
const state = newEditorState('', theme, settings, onScrollRef, debounceScroll, [language.of([])]);
|
165 |
+
|
166 |
+
view.setState(state);
|
167 |
+
|
168 |
+
setNoDocument(view);
|
169 |
+
|
170 |
+
return;
|
171 |
+
}
|
172 |
+
|
173 |
+
if (doc.value instanceof Uint8Array) {
|
174 |
+
return;
|
175 |
+
}
|
176 |
+
|
177 |
+
if (doc.filePath === '') {
|
178 |
+
logger.warn('File path should not be empty');
|
179 |
+
}
|
180 |
+
|
181 |
+
let state = editorStates.get(doc.filePath);
|
182 |
+
|
183 |
+
if (!state) {
|
184 |
+
state = newEditorState(doc.value, theme, settings, onScrollRef, debounceScroll, [
|
185 |
+
language.of([]),
|
186 |
+
readOnly.of([EditorState.readOnly.of(doc.loading)]),
|
187 |
+
]);
|
188 |
+
|
189 |
+
editorStates.set(doc.filePath, state);
|
190 |
+
}
|
191 |
+
|
192 |
+
view.setState(state);
|
193 |
+
|
194 |
+
setEditorDocument(view, theme, language, readOnly, autoFocusOnDocumentChange, doc as TextEditorDocument);
|
195 |
+
}, [doc?.value, doc?.filePath, doc?.loading, autoFocusOnDocumentChange]);
|
196 |
+
|
197 |
+
return (
|
198 |
+
<div className={classNames('relative h-full', className)}>
|
199 |
+
{isBinaryFile && <BinaryContent />}
|
200 |
+
<div className="h-full overflow-hidden" ref={containerRef} />
|
201 |
+
</div>
|
202 |
+
);
|
203 |
+
}
|
204 |
+
|
205 |
+
export default CodeMirrorEditor;
|
206 |
+
|
207 |
+
CodeMirrorEditor.displayName = 'CodeMirrorEditor';
|
208 |
+
|
209 |
+
function newEditorState(
|
210 |
+
content: string,
|
211 |
+
theme: Theme,
|
212 |
+
settings: EditorSettings | undefined,
|
213 |
+
onScrollRef: MutableRefObject<OnScrollCallback | undefined>,
|
214 |
+
debounceScroll: number,
|
215 |
+
extensions: Extension[],
|
216 |
+
) {
|
217 |
+
return EditorState.create({
|
218 |
+
doc: content,
|
219 |
+
extensions: [
|
220 |
+
EditorView.domEventHandlers({
|
221 |
+
scroll: debounce((_event, view) => {
|
222 |
+
onScrollRef.current?.({ left: view.scrollDOM.scrollLeft, top: view.scrollDOM.scrollTop });
|
223 |
+
}, debounceScroll),
|
224 |
+
keydown: (event) => {
|
225 |
+
if (event.code === 'KeyS' && (event.ctrlKey || event.metaKey)) {
|
226 |
+
event.preventDefault();
|
227 |
+
}
|
228 |
+
},
|
229 |
+
}),
|
230 |
+
getTheme(theme, settings),
|
231 |
+
history(),
|
232 |
+
keymap.of([
|
233 |
+
...defaultKeymap,
|
234 |
+
...historyKeymap,
|
235 |
+
...searchKeymap,
|
236 |
+
{ key: 'Tab', run: acceptCompletion },
|
237 |
+
indentKeyBinding,
|
238 |
+
]),
|
239 |
+
indentUnit.of('\t'),
|
240 |
+
autocompletion({
|
241 |
+
closeOnBlur: false,
|
242 |
+
}),
|
243 |
+
closeBrackets(),
|
244 |
+
lineNumbers(),
|
245 |
+
scrollPastEnd(),
|
246 |
+
dropCursor(),
|
247 |
+
drawSelection(),
|
248 |
+
bracketMatching(),
|
249 |
+
EditorState.tabSize.of(settings?.tabSize ?? 2),
|
250 |
+
indentOnInput(),
|
251 |
+
highlightActiveLineGutter(),
|
252 |
+
highlightActiveLine(),
|
253 |
+
foldGutter({
|
254 |
+
markerDOM: (open) => {
|
255 |
+
const icon = document.createElement('div');
|
256 |
+
|
257 |
+
icon.className = `fold-icon ${open ? 'i-ph-caret-down-bold' : 'i-ph-caret-right-bold'}`;
|
258 |
+
|
259 |
+
return icon;
|
260 |
+
},
|
261 |
+
}),
|
262 |
+
...extensions,
|
263 |
+
],
|
264 |
+
});
|
265 |
+
}
|
266 |
+
|
267 |
+
function setNoDocument(view: EditorView) {
|
268 |
+
view.dispatch({
|
269 |
+
selection: { anchor: 0 },
|
270 |
+
changes: {
|
271 |
+
from: 0,
|
272 |
+
to: view.state.doc.length,
|
273 |
+
insert: '',
|
274 |
+
},
|
275 |
+
});
|
276 |
+
|
277 |
+
view.scrollDOM.scrollTo(0, 0);
|
278 |
+
}
|
279 |
+
|
280 |
+
function setEditorDocument(
|
281 |
+
view: EditorView,
|
282 |
+
theme: Theme,
|
283 |
+
language: Compartment,
|
284 |
+
readOnly: Compartment,
|
285 |
+
autoFocus: boolean,
|
286 |
+
doc: TextEditorDocument,
|
287 |
+
) {
|
288 |
+
if (doc.value !== view.state.doc.toString()) {
|
289 |
+
view.dispatch({
|
290 |
+
selection: { anchor: 0 },
|
291 |
+
changes: {
|
292 |
+
from: 0,
|
293 |
+
to: view.state.doc.length,
|
294 |
+
insert: doc.value,
|
295 |
+
},
|
296 |
+
});
|
297 |
+
}
|
298 |
+
|
299 |
+
view.dispatch({
|
300 |
+
effects: [readOnly.reconfigure([EditorState.readOnly.of(doc.loading)])],
|
301 |
+
});
|
302 |
+
|
303 |
+
getLanguage(doc.filePath).then((languageSupport) => {
|
304 |
+
if (!languageSupport) {
|
305 |
+
return;
|
306 |
+
}
|
307 |
+
|
308 |
+
view.dispatch({
|
309 |
+
effects: [language.reconfigure([languageSupport]), reconfigureTheme(theme)],
|
310 |
+
});
|
311 |
+
|
312 |
+
requestAnimationFrame(() => {
|
313 |
+
const currentLeft = view.scrollDOM.scrollLeft;
|
314 |
+
const currentTop = view.scrollDOM.scrollTop;
|
315 |
+
const newLeft = doc.scroll?.left ?? 0;
|
316 |
+
const newTop = doc.scroll?.top ?? 0;
|
317 |
+
|
318 |
+
const needsScrolling = currentLeft !== newLeft || currentTop !== newTop;
|
319 |
+
|
320 |
+
if (autoFocus) {
|
321 |
+
if (needsScrolling) {
|
322 |
+
// we have to wait until the scroll position was changed before we can set the focus
|
323 |
+
view.scrollDOM.addEventListener(
|
324 |
+
'scroll',
|
325 |
+
() => {
|
326 |
+
view.focus();
|
327 |
+
},
|
328 |
+
{ once: true },
|
329 |
+
);
|
330 |
+
} else {
|
331 |
+
// if the scroll position is still the same we can focus immediately
|
332 |
+
view.focus();
|
333 |
+
}
|
334 |
+
}
|
335 |
+
|
336 |
+
view.scrollDOM.scrollTo(newLeft, newTop);
|
337 |
+
});
|
338 |
+
});
|
339 |
+
}
|
packages/bolt/app/components/editor/codemirror/cm-theme.ts
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';
|
2 |
+
import { Compartment, type Extension } from '@codemirror/state';
|
3 |
+
import { EditorView } from '@codemirror/view';
|
4 |
+
import type { Theme } from '../../../types/theme.js';
|
5 |
+
import type { EditorSettings } from './CodeMirrorEditor.js';
|
6 |
+
import { vscodeDarkTheme } from './themes/vscode-dark.js';
|
7 |
+
|
8 |
+
import './styles.css';
|
9 |
+
|
10 |
+
export const darkTheme = EditorView.theme({}, { dark: true });
|
11 |
+
export const themeSelection = new Compartment();
|
12 |
+
|
13 |
+
export function getTheme(theme: Theme, settings: EditorSettings = {}): Extension {
|
14 |
+
return [
|
15 |
+
getEditorTheme(settings),
|
16 |
+
theme === 'dark' ? themeSelection.of([getDarkTheme()]) : themeSelection.of([getLightTheme()]),
|
17 |
+
];
|
18 |
+
}
|
19 |
+
|
20 |
+
export function reconfigureTheme(theme: Theme) {
|
21 |
+
return themeSelection.reconfigure(theme === 'dark' ? getDarkTheme() : getLightTheme());
|
22 |
+
}
|
23 |
+
|
24 |
+
function getEditorTheme(settings: EditorSettings) {
|
25 |
+
return EditorView.theme({
|
26 |
+
...(settings.fontSize && {
|
27 |
+
'&': {
|
28 |
+
fontSize: settings.fontSize,
|
29 |
+
},
|
30 |
+
}),
|
31 |
+
'&.cm-editor': {
|
32 |
+
height: '100%',
|
33 |
+
background: 'var(--cm-backgroundColor)',
|
34 |
+
color: 'var(--cm-textColor)',
|
35 |
+
},
|
36 |
+
'.cm-cursor': {
|
37 |
+
borderLeft: 'var(--cm-cursor-width) solid var(--cm-cursor-backgroundColor)',
|
38 |
+
},
|
39 |
+
'.cm-scroller': {
|
40 |
+
lineHeight: '1.5',
|
41 |
+
},
|
42 |
+
'.cm-line': {
|
43 |
+
padding: '0 0 0 4px',
|
44 |
+
},
|
45 |
+
'&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {
|
46 |
+
backgroundColor: 'var(--cm-selection-backgroundColorFocused)',
|
47 |
+
opacity: 'var(--cm-selection-backgroundOpacityFocused, 0.3)',
|
48 |
+
},
|
49 |
+
'&:not(.cm-focused) > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {
|
50 |
+
backgroundColor: 'var(--cm-selection-backgroundColorBlured)',
|
51 |
+
opacity: 'var(--cm-selection-backgroundOpacityBlured, 0.3)',
|
52 |
+
},
|
53 |
+
'&.cm-focused > .cm-scroller .cm-matchingBracket': {
|
54 |
+
backgroundColor: 'var(--cm-matching-bracket)',
|
55 |
+
},
|
56 |
+
'.cm-activeLine': {
|
57 |
+
background: 'var(--cm-activeLineBackgroundColor)',
|
58 |
+
},
|
59 |
+
'.cm-gutters': {
|
60 |
+
background: 'var(--cm-gutter-backgroundColor)',
|
61 |
+
borderRight: 0,
|
62 |
+
color: 'var(--cm-gutter-textColor)',
|
63 |
+
},
|
64 |
+
'.cm-gutter': {
|
65 |
+
'&.cm-lineNumbers': {
|
66 |
+
fontFamily: 'Roboto Mono, monospace',
|
67 |
+
fontSize: '13px',
|
68 |
+
minWidth: '28px',
|
69 |
+
},
|
70 |
+
'& .cm-activeLineGutter': {
|
71 |
+
background: 'transparent',
|
72 |
+
color: 'var(--cm-gutter-activeLineTextColor)',
|
73 |
+
},
|
74 |
+
'&.cm-foldGutter .cm-gutterElement > .fold-icon': {
|
75 |
+
cursor: 'pointer',
|
76 |
+
color: 'var(--cm-foldGutter-textColor)',
|
77 |
+
transform: 'translateY(2px)',
|
78 |
+
'&:hover': {
|
79 |
+
color: 'var(--cm-foldGutter-textColorHover)',
|
80 |
+
},
|
81 |
+
},
|
82 |
+
},
|
83 |
+
'.cm-foldGutter .cm-gutterElement': {
|
84 |
+
padding: '0 4px',
|
85 |
+
},
|
86 |
+
'.cm-tooltip-autocomplete > ul > li': {
|
87 |
+
minHeight: '18px',
|
88 |
+
},
|
89 |
+
'.cm-panel.cm-search label': {
|
90 |
+
marginLeft: '2px',
|
91 |
+
},
|
92 |
+
'.cm-panel.cm-search input[type=checkbox]': {
|
93 |
+
position: 'relative',
|
94 |
+
transform: 'translateY(2px)',
|
95 |
+
marginRight: '4px',
|
96 |
+
},
|
97 |
+
'.cm-panels': {
|
98 |
+
borderColor: 'var(--cm-panels-borderColor)',
|
99 |
+
},
|
100 |
+
'.cm-panel.cm-search': {
|
101 |
+
background: 'var(--cm-search-backgroundColor)',
|
102 |
+
color: 'var(--cm-search-textColor)',
|
103 |
+
padding: '6px 8px',
|
104 |
+
},
|
105 |
+
'.cm-search .cm-button': {
|
106 |
+
background: 'var(--cm-search-button-backgroundColor)',
|
107 |
+
borderColor: 'var(--cm-search-button-borderColor)',
|
108 |
+
color: 'var(--cm-search-button-textColor)',
|
109 |
+
borderRadius: '4px',
|
110 |
+
'&:hover': {
|
111 |
+
color: 'var(--cm-search-button-textColorHover)',
|
112 |
+
},
|
113 |
+
'&:focus-visible': {
|
114 |
+
outline: 'none',
|
115 |
+
borderColor: 'var(--cm-search-button-borderColorFocused)',
|
116 |
+
},
|
117 |
+
'&:hover:not(:focus-visible)': {
|
118 |
+
background: 'var(--cm-search-button-backgroundColorHover)',
|
119 |
+
borderColor: 'var(--cm-search-button-borderColorHover)',
|
120 |
+
},
|
121 |
+
'&:hover:focus-visible': {
|
122 |
+
background: 'var(--cm-search-button-backgroundColorHover)',
|
123 |
+
borderColor: 'var(--cm-search-button-borderColorFocused)',
|
124 |
+
},
|
125 |
+
},
|
126 |
+
'.cm-panel.cm-search [name=close]': {
|
127 |
+
top: '6px',
|
128 |
+
right: '6px',
|
129 |
+
padding: '0 6px',
|
130 |
+
backgroundColor: 'var(--cm-search-closeButton-backgroundColor)',
|
131 |
+
color: 'var(--cm-search-closeButton-textColor)',
|
132 |
+
'&:hover': {
|
133 |
+
'border-radius': '6px',
|
134 |
+
color: 'var(--cm-search-closeButton-textColorHover)',
|
135 |
+
backgroundColor: 'var(--cm-search-closeButton-backgroundColorHover)',
|
136 |
+
},
|
137 |
+
},
|
138 |
+
'.cm-search input': {
|
139 |
+
background: 'var(--cm-search-input-backgroundColor)',
|
140 |
+
borderColor: 'var(--cm-search-input-borderColor)',
|
141 |
+
outline: 'none',
|
142 |
+
borderRadius: '4px',
|
143 |
+
'&:focus-visible': {
|
144 |
+
borderColor: 'var(--cm-search-input-borderColorFocused)',
|
145 |
+
},
|
146 |
+
},
|
147 |
+
'.cm-tooltip': {
|
148 |
+
background: 'var(--cm-tooltip-backgroundColor)',
|
149 |
+
borderColor: 'var(--cm-tooltip-borderColor)',
|
150 |
+
color: 'var(--cm-tooltip-textColor)',
|
151 |
+
},
|
152 |
+
'.cm-tooltip.cm-tooltip-autocomplete ul li[aria-selected]': {
|
153 |
+
background: 'var(--cm-tooltip-backgroundColorSelected)',
|
154 |
+
color: 'var(--cm-tooltip-textColorSelected)',
|
155 |
+
},
|
156 |
+
});
|
157 |
+
}
|
158 |
+
|
159 |
+
function getLightTheme() {
|
160 |
+
return syntaxHighlighting(defaultHighlightStyle);
|
161 |
+
}
|
162 |
+
|
163 |
+
function getDarkTheme() {
|
164 |
+
return syntaxHighlighting(vscodeDarkTheme);
|
165 |
+
}
|
packages/bolt/app/components/editor/codemirror/indent.ts
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { indentLess } from '@codemirror/commands';
|
2 |
+
import { indentUnit } from '@codemirror/language';
|
3 |
+
import { EditorSelection, EditorState, Line, type ChangeSpec } from '@codemirror/state';
|
4 |
+
import { EditorView, type KeyBinding } from '@codemirror/view';
|
5 |
+
|
6 |
+
export const indentKeyBinding: KeyBinding = {
|
7 |
+
key: 'Tab',
|
8 |
+
run: indentMore,
|
9 |
+
shift: indentLess,
|
10 |
+
};
|
11 |
+
|
12 |
+
function indentMore({ state, dispatch }: EditorView) {
|
13 |
+
if (state.readOnly) {
|
14 |
+
return false;
|
15 |
+
}
|
16 |
+
|
17 |
+
dispatch(
|
18 |
+
state.update(
|
19 |
+
changeBySelectedLine(state, (from, to, changes) => {
|
20 |
+
changes.push({ from, to, insert: state.facet(indentUnit) });
|
21 |
+
}),
|
22 |
+
{ userEvent: 'input.indent' },
|
23 |
+
),
|
24 |
+
);
|
25 |
+
|
26 |
+
return true;
|
27 |
+
}
|
28 |
+
|
29 |
+
function changeBySelectedLine(
|
30 |
+
state: EditorState,
|
31 |
+
cb: (from: number, to: number | undefined, changes: ChangeSpec[], line: Line) => void,
|
32 |
+
) {
|
33 |
+
return state.changeByRange((range) => {
|
34 |
+
const changes: ChangeSpec[] = [];
|
35 |
+
|
36 |
+
const line = state.doc.lineAt(range.from);
|
37 |
+
|
38 |
+
// just insert single indent unit at the current cursor position
|
39 |
+
if (range.from === range.to) {
|
40 |
+
cb(range.from, undefined, changes, line);
|
41 |
+
}
|
42 |
+
// handle the case when multiple characters are selected in a single line
|
43 |
+
else if (range.from < range.to && range.to <= line.to) {
|
44 |
+
cb(range.from, range.to, changes, line);
|
45 |
+
} else {
|
46 |
+
let atLine = -1;
|
47 |
+
|
48 |
+
// handle the case when selection spans multiple lines
|
49 |
+
for (let pos = range.from; pos <= range.to; ) {
|
50 |
+
const line = state.doc.lineAt(pos);
|
51 |
+
|
52 |
+
if (line.number > atLine && (range.empty || range.to > line.from)) {
|
53 |
+
cb(line.from, undefined, changes, line);
|
54 |
+
atLine = line.number;
|
55 |
+
}
|
56 |
+
|
57 |
+
pos = line.to + 1;
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
const changeSet = state.changes(changes);
|
62 |
+
|
63 |
+
return {
|
64 |
+
changes,
|
65 |
+
range: EditorSelection.range(changeSet.mapPos(range.anchor, 1), changeSet.mapPos(range.head, 1)),
|
66 |
+
};
|
67 |
+
});
|
68 |
+
}
|
packages/bolt/app/components/editor/codemirror/languages.ts
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { LanguageDescription } from '@codemirror/language';
|
2 |
+
|
3 |
+
export const supportedLanguages = [
|
4 |
+
LanguageDescription.of({
|
5 |
+
name: 'TS',
|
6 |
+
extensions: ['ts'],
|
7 |
+
async load() {
|
8 |
+
return import('@codemirror/lang-javascript').then((module) => module.javascript({ typescript: true }));
|
9 |
+
},
|
10 |
+
}),
|
11 |
+
LanguageDescription.of({
|
12 |
+
name: 'JS',
|
13 |
+
extensions: ['js', 'mjs', 'cjs'],
|
14 |
+
async load() {
|
15 |
+
return import('@codemirror/lang-javascript').then((module) => module.javascript());
|
16 |
+
},
|
17 |
+
}),
|
18 |
+
LanguageDescription.of({
|
19 |
+
name: 'TSX',
|
20 |
+
extensions: ['tsx'],
|
21 |
+
async load() {
|
22 |
+
return import('@codemirror/lang-javascript').then((module) => module.javascript({ jsx: true, typescript: true }));
|
23 |
+
},
|
24 |
+
}),
|
25 |
+
LanguageDescription.of({
|
26 |
+
name: 'JSX',
|
27 |
+
extensions: ['jsx'],
|
28 |
+
async load() {
|
29 |
+
return import('@codemirror/lang-javascript').then((module) => module.javascript({ jsx: true }));
|
30 |
+
},
|
31 |
+
}),
|
32 |
+
LanguageDescription.of({
|
33 |
+
name: 'HTML',
|
34 |
+
extensions: ['html'],
|
35 |
+
async load() {
|
36 |
+
return import('@codemirror/lang-html').then((module) => module.html());
|
37 |
+
},
|
38 |
+
}),
|
39 |
+
LanguageDescription.of({
|
40 |
+
name: 'CSS',
|
41 |
+
extensions: ['css'],
|
42 |
+
async load() {
|
43 |
+
return import('@codemirror/lang-css').then((module) => module.css());
|
44 |
+
},
|
45 |
+
}),
|
46 |
+
LanguageDescription.of({
|
47 |
+
name: 'SASS',
|
48 |
+
extensions: ['sass'],
|
49 |
+
async load() {
|
50 |
+
return import('@codemirror/lang-sass').then((module) => module.sass({ indented: true }));
|
51 |
+
},
|
52 |
+
}),
|
53 |
+
LanguageDescription.of({
|
54 |
+
name: 'SCSS',
|
55 |
+
extensions: ['scss'],
|
56 |
+
async load() {
|
57 |
+
return import('@codemirror/lang-sass').then((module) => module.sass({ indented: false }));
|
58 |
+
},
|
59 |
+
}),
|
60 |
+
LanguageDescription.of({
|
61 |
+
name: 'JSON',
|
62 |
+
extensions: ['json'],
|
63 |
+
async load() {
|
64 |
+
return import('@codemirror/lang-json').then((module) => module.json());
|
65 |
+
},
|
66 |
+
}),
|
67 |
+
LanguageDescription.of({
|
68 |
+
name: 'Markdown',
|
69 |
+
extensions: ['md'],
|
70 |
+
async load() {
|
71 |
+
return import('@codemirror/lang-markdown').then((module) => module.markdown());
|
72 |
+
},
|
73 |
+
}),
|
74 |
+
LanguageDescription.of({
|
75 |
+
name: 'Wasm',
|
76 |
+
extensions: ['wat'],
|
77 |
+
async load() {
|
78 |
+
return import('@codemirror/lang-wast').then((module) => module.wast());
|
79 |
+
},
|
80 |
+
}),
|
81 |
+
];
|
82 |
+
|
83 |
+
export async function getLanguage(fileName: string) {
|
84 |
+
const languageDescription = LanguageDescription.matchFilename(supportedLanguages, fileName);
|
85 |
+
|
86 |
+
if (languageDescription) {
|
87 |
+
return await languageDescription.load();
|
88 |
+
}
|
89 |
+
|
90 |
+
return undefined;
|
91 |
+
}
|
packages/bolt/app/components/editor/codemirror/styles.css
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
:root {
|
2 |
+
--cm-backgroundColor: var(--bolt-elements-editor-backgroundColor, var(--bolt-elements-app-backgroundColor));
|
3 |
+
--cm-textColor: var(--bolt-elements-editor-textColor, var(--bolt-text-primary));
|
4 |
+
|
5 |
+
/* Gutter */
|
6 |
+
|
7 |
+
--cm-gutter-backgroundColor: var(--bolt-elements-editor-gutter-backgroundColor, var(--cm-backgroundColor));
|
8 |
+
--cm-gutter-textColor: var(--bolt-elements-editor-gutter-textColor, var(--bolt-text-secondary));
|
9 |
+
--cm-gutter-activeLineTextColor: var(--bolt-elements-editor-gutter-activeLineTextColor, var(--cm-gutter-textColor));
|
10 |
+
|
11 |
+
/* Fold Gutter */
|
12 |
+
|
13 |
+
--cm-foldGutter-textColor: var(--bolt-elements-editor-foldGutter-textColor, var(--cm-gutter-textColor));
|
14 |
+
--cm-foldGutter-textColorHover: var(--bolt-elements-editor-foldGutter-textColorHover, var(--cm-gutter-textColor));
|
15 |
+
|
16 |
+
/* Active Line */
|
17 |
+
|
18 |
+
--cm-activeLineBackgroundColor: var(--bolt-elements-editor-activeLineBackgroundColor, rgb(224 231 235 / 30%));
|
19 |
+
|
20 |
+
/* Cursor */
|
21 |
+
|
22 |
+
--cm-cursor-width: 2px;
|
23 |
+
--cm-cursor-backgroundColor: var(--bolt-elements-editor-cursorColor, var(--bolt-text-primary));
|
24 |
+
|
25 |
+
/* Matching Brackets */
|
26 |
+
|
27 |
+
--cm-matching-bracket: var(--bolt-elements-editor-matchingBracketBackgroundColor, rgb(50 140 130 / 0.3));
|
28 |
+
|
29 |
+
/* Selection */
|
30 |
+
|
31 |
+
--cm-selection-backgroundColorFocused: var(--bolt-elements-editor-selection-backgroundColor, #42b4ff);
|
32 |
+
--cm-selection-backgroundOpacityFocused: var(--bolt-elements-editor-selection-backgroundOpacity, 0.3);
|
33 |
+
--cm-selection-backgroundColorBlured: var(--bolt-elements-editor-selection-inactiveBackgroundColor, #c9e9ff);
|
34 |
+
--cm-selection-backgroundOpacityBlured: var(--bolt-elements-editor-selection-inactiveBackgroundOpacity, 0.3);
|
35 |
+
|
36 |
+
/* Panels */
|
37 |
+
|
38 |
+
--cm-panels-borderColor: var(--bolt-elements-editor-panels-borderColor, var(--bolt-elements-app-borderColor));
|
39 |
+
|
40 |
+
/* Search */
|
41 |
+
|
42 |
+
--cm-search-backgroundColor: var(--bolt-elements-editor-search-backgroundColor, var(--cm-backgroundColor));
|
43 |
+
--cm-search-textColor: var(--bolt-elements-editor-search-textColor, var(--bolt-elements-app-textColor));
|
44 |
+
--cm-search-closeButton-backgroundColor: var(--bolt-elements-editor-search-closeButton-backgroundColor, transparent);
|
45 |
+
|
46 |
+
--cm-search-closeButton-backgroundColorHover: var(
|
47 |
+
--bolt-elements-editor-search-closeButton-backgroundColorHover,
|
48 |
+
var(--bolt-background-secondary)
|
49 |
+
);
|
50 |
+
|
51 |
+
--cm-search-closeButton-textColor: var(
|
52 |
+
--bolt-elements-editor-search-closeButton-textColor,
|
53 |
+
var(--bolt-text-secondary)
|
54 |
+
);
|
55 |
+
|
56 |
+
--cm-search-closeButton-textColorHover: var(
|
57 |
+
--bolt-elements-editor-search-closeButton-textColorHover,
|
58 |
+
var(--bolt-text-primary)
|
59 |
+
);
|
60 |
+
|
61 |
+
--cm-search-button-backgroundColor: var(
|
62 |
+
--bolt-elements-editor-search-button-backgroundColor,
|
63 |
+
var(--bolt-background-secondary)
|
64 |
+
);
|
65 |
+
|
66 |
+
--cm-search-button-backgroundColorHover: var(
|
67 |
+
--bolt-elements-editor-search-button-backgroundColorHover,
|
68 |
+
var(--bolt-background-active)
|
69 |
+
);
|
70 |
+
|
71 |
+
--cm-search-button-textColor: var(--bolt-elements-editor-search-button-textColor, var(--bolt-text-secondary));
|
72 |
+
--cm-search-button-textColorHover: var(--bolt-elements-editor-search-button-textColorHover, var(--bolt-text-primary));
|
73 |
+
--cm-search-button-borderColor: var(--bolt-elements-editor-search-button-borderColor, transparent);
|
74 |
+
|
75 |
+
--cm-search-button-borderColorHover: var(
|
76 |
+
--bolt-elements-editor-search-button-borderColorHover,
|
77 |
+
var(--cm-search-button-borderColor)
|
78 |
+
);
|
79 |
+
|
80 |
+
--cm-search-button-borderColorFocused: var(
|
81 |
+
--bolt-elements-editor-search-button-borderColorFocused,
|
82 |
+
var(--bolt-border-accent)
|
83 |
+
);
|
84 |
+
|
85 |
+
--cm-search-input-backgroundColor: var(
|
86 |
+
--bolt-elements-editor-search-input-backgroundColor,
|
87 |
+
var(--bolt-background-primary)
|
88 |
+
);
|
89 |
+
|
90 |
+
--cm-search-input-borderColor: var(
|
91 |
+
--bolt-elements-editor-search-input-borderColor,
|
92 |
+
var(--bolt-elements-app-borderColor)
|
93 |
+
);
|
94 |
+
|
95 |
+
--cm-search-input-borderColorFocused: var(
|
96 |
+
--bolt-elements-editor-search-input-borderColorFocused,
|
97 |
+
var(--bolt-border-accent)
|
98 |
+
);
|
99 |
+
|
100 |
+
/* Tooltip */
|
101 |
+
|
102 |
+
--cm-tooltip-backgroundColor: var(
|
103 |
+
--bolt-elements-editor-tooltip-backgroundColor,
|
104 |
+
var(--bolt-elements-app-backgroundColor)
|
105 |
+
);
|
106 |
+
|
107 |
+
--cm-tooltip-textColor: var(--bolt-elements-editor-tooltip-textColor, var(--bolt-text-primary));
|
108 |
+
|
109 |
+
--cm-tooltip-backgroundColorSelected: var(
|
110 |
+
--bolt-elements-editor-tooltip-backgroundColorSelected,
|
111 |
+
var(--bolt-background-accent)
|
112 |
+
);
|
113 |
+
|
114 |
+
--cm-tooltip-textColorSelected: var(
|
115 |
+
--bolt-elements-editor-tooltip-textColorSelected,
|
116 |
+
var(--bolt-text-primary-inverted)
|
117 |
+
);
|
118 |
+
|
119 |
+
--cm-tooltip-borderColor: var(--bolt-elements-editor-tooltip-borderColor, var(--bolt-elements-app-borderColor));
|
120 |
+
}
|
121 |
+
|
122 |
+
html[data-theme='light'] {
|
123 |
+
--bolt-elements-editor-gutter-textColor: #237893;
|
124 |
+
--bolt-elements-editor-gutter-activeLineTextColor: var(--bolt-text-primary);
|
125 |
+
--bolt-elements-editor-foldGutter-textColorHover: var(--bolt-text-primary);
|
126 |
+
}
|
127 |
+
|
128 |
+
html[data-theme='dark'] {
|
129 |
+
--bolt-elements-editor-gutter-activeLineTextColor: var(--bolt-text-primary);
|
130 |
+
--bolt-elements-editor-selection-backgroundOpacityBlured: 0.1;
|
131 |
+
--bolt-elements-editor-activeLineBackgroundColor: rgb(50 53 63 / 50%);
|
132 |
+
--bolt-elements-editor-foldGutter-textColorHover: var(--bolt-text-primary);
|
133 |
+
}
|
packages/bolt/app/components/editor/codemirror/themes/vscode-dark.ts
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { HighlightStyle } from '@codemirror/language';
|
2 |
+
import { tags } from '@lezer/highlight';
|
3 |
+
|
4 |
+
export const vscodeDarkTheme = HighlightStyle.define([
|
5 |
+
{
|
6 |
+
tag: [
|
7 |
+
tags.keyword,
|
8 |
+
tags.operatorKeyword,
|
9 |
+
tags.modifier,
|
10 |
+
tags.color,
|
11 |
+
tags.constant(tags.name),
|
12 |
+
tags.standard(tags.name),
|
13 |
+
tags.standard(tags.tagName),
|
14 |
+
tags.special(tags.brace),
|
15 |
+
tags.atom,
|
16 |
+
tags.bool,
|
17 |
+
tags.special(tags.variableName),
|
18 |
+
],
|
19 |
+
color: '#569cd6',
|
20 |
+
},
|
21 |
+
{
|
22 |
+
tag: [tags.controlKeyword, tags.moduleKeyword],
|
23 |
+
color: '#c586c0',
|
24 |
+
},
|
25 |
+
{
|
26 |
+
tag: [
|
27 |
+
tags.name,
|
28 |
+
tags.deleted,
|
29 |
+
tags.character,
|
30 |
+
tags.macroName,
|
31 |
+
tags.propertyName,
|
32 |
+
tags.variableName,
|
33 |
+
tags.labelName,
|
34 |
+
tags.definition(tags.name),
|
35 |
+
],
|
36 |
+
color: '#9cdcfe',
|
37 |
+
},
|
38 |
+
{ tag: tags.heading, fontWeight: 'bold', color: '#9cdcfe' },
|
39 |
+
{
|
40 |
+
tag: [
|
41 |
+
tags.typeName,
|
42 |
+
tags.className,
|
43 |
+
tags.tagName,
|
44 |
+
tags.number,
|
45 |
+
tags.changed,
|
46 |
+
tags.annotation,
|
47 |
+
tags.self,
|
48 |
+
tags.namespace,
|
49 |
+
],
|
50 |
+
color: '#4ec9b0',
|
51 |
+
},
|
52 |
+
{
|
53 |
+
tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],
|
54 |
+
color: '#dcdcaa',
|
55 |
+
},
|
56 |
+
{ tag: [tags.number], color: '#b5cea8' },
|
57 |
+
{
|
58 |
+
tag: [tags.operator, tags.punctuation, tags.separator, tags.url, tags.escape, tags.regexp],
|
59 |
+
color: '#d4d4d4',
|
60 |
+
},
|
61 |
+
{
|
62 |
+
tag: [tags.regexp],
|
63 |
+
color: '#d16969',
|
64 |
+
},
|
65 |
+
{
|
66 |
+
tag: [tags.special(tags.string), tags.processingInstruction, tags.string, tags.inserted],
|
67 |
+
color: '#ce9178',
|
68 |
+
},
|
69 |
+
{ tag: [tags.angleBracket], color: '#808080' },
|
70 |
+
{ tag: tags.strong, fontWeight: 'bold' },
|
71 |
+
{ tag: tags.emphasis, fontStyle: 'italic' },
|
72 |
+
{ tag: tags.strikethrough, textDecoration: 'line-through' },
|
73 |
+
{ tag: [tags.meta, tags.comment], color: '#6a9955' },
|
74 |
+
{ tag: tags.link, color: '#6a9955', textDecoration: 'underline' },
|
75 |
+
{ tag: tags.invalid, color: '#ff0000' },
|
76 |
+
]);
|
packages/bolt/app/components/ui/IconButton.tsx
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
import { memo } from 'react';
|
2 |
-
import { classNames } from '
|
3 |
|
4 |
type IconSize = 'sm' | 'md' | 'xl' | 'xxl';
|
5 |
|
|
|
1 |
import { memo } from 'react';
|
2 |
+
import { classNames } from '../../utils/classNames';
|
3 |
|
4 |
type IconSize = 'sm' | 'md' | 'xl' | 'xxl';
|
5 |
|
packages/bolt/app/components/workbench/EditorPanel.tsx
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { useStore } from '@nanostores/react';
|
2 |
+
import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels';
|
3 |
+
import { themeStore } from '../../lib/stores/theme';
|
4 |
+
import CodeMirrorEditor from '../editor/codemirror/CodeMirrorEditor';
|
5 |
+
import { FileTreePanel } from './FileTreePanel';
|
6 |
+
|
7 |
+
export function EditorPanel() {
|
8 |
+
const theme = useStore(themeStore);
|
9 |
+
|
10 |
+
return (
|
11 |
+
<PanelGroup direction="horizontal">
|
12 |
+
<Panel defaultSize={30} minSize={20} collapsible={false}>
|
13 |
+
<FileTreePanel />
|
14 |
+
</Panel>
|
15 |
+
<PanelResizeHandle />
|
16 |
+
<Panel defaultSize={70} minSize={20}>
|
17 |
+
<CodeMirrorEditor theme={theme} settings={{ tabSize: 2 }} />
|
18 |
+
</Panel>
|
19 |
+
</PanelGroup>
|
20 |
+
);
|
21 |
+
}
|
packages/bolt/app/components/workbench/FileTree.tsx
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
export function FileTree() {
|
2 |
+
return <div>File Tree</div>;
|
3 |
+
}
|
packages/bolt/app/components/workbench/FileTreePanel.tsx
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { FileTree } from './FileTree';
|
2 |
+
|
3 |
+
export function FileTreePanel() {
|
4 |
+
return (
|
5 |
+
<div className="border-r h-full p-4">
|
6 |
+
<FileTree />
|
7 |
+
</div>
|
8 |
+
);
|
9 |
+
}
|
packages/bolt/app/components/workbench/Preview.tsx
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { useStore } from '@nanostores/react';
|
2 |
+
import { memo, useEffect, useRef, useState } from 'react';
|
3 |
+
import { workbenchStore } from '../../lib/stores/workbench';
|
4 |
+
import { IconButton } from '../ui/IconButton';
|
5 |
+
|
6 |
+
export const Preview = memo(() => {
|
7 |
+
const iframeRef = useRef<HTMLIFrameElement>(null);
|
8 |
+
const [activePreviewIndex] = useState(0);
|
9 |
+
const previews = useStore(workbenchStore.previews);
|
10 |
+
const activePreview = previews[activePreviewIndex];
|
11 |
+
|
12 |
+
const [url, setUrl] = useState('');
|
13 |
+
const [iframeUrl, setIframeUrl] = useState<string | undefined>();
|
14 |
+
|
15 |
+
useEffect(() => {
|
16 |
+
if (activePreview && !iframeUrl) {
|
17 |
+
const { baseUrl } = activePreview;
|
18 |
+
|
19 |
+
setUrl(baseUrl);
|
20 |
+
setIframeUrl(baseUrl);
|
21 |
+
}
|
22 |
+
}, [activePreview, iframeUrl]);
|
23 |
+
|
24 |
+
const reloadPreview = () => {
|
25 |
+
if (iframeRef.current) {
|
26 |
+
iframeRef.current.src = iframeRef.current.src;
|
27 |
+
}
|
28 |
+
};
|
29 |
+
|
30 |
+
return (
|
31 |
+
<div className="w-full h-full flex flex-col">
|
32 |
+
<div className="bg-gray-100 rounded-t-lg p-2 flex items-center space-x-1.5">
|
33 |
+
<div className="i-ph:circle-fill text-[#FF5F57]"></div>
|
34 |
+
<div className="i-ph:circle-fill text-[#FEBC2E]"></div>
|
35 |
+
<div className="i-ph:circle-fill text-[#29CC41]"></div>
|
36 |
+
<div className="flex-grow"></div>
|
37 |
+
</div>
|
38 |
+
<div className="bg-white p-2 flex items-center gap-1">
|
39 |
+
<IconButton icon="i-ph:arrow-clockwise" onClick={reloadPreview} />
|
40 |
+
<div className="flex items-center gap-1 flex-grow bg-gray-100 rounded-full px-3 py-1 text-sm text-gray-600 hover:bg-gray-200 hover:focus-within:bg-white focus-within:bg-white focus-within:ring-2 focus-within:ring-accent">
|
41 |
+
<div className="bg-white rounded-full p-[2px] -ml-1">
|
42 |
+
<div className="i-ph:info-bold text-lg"></div>
|
43 |
+
</div>
|
44 |
+
<input
|
45 |
+
className="w-full bg-transparent outline-none"
|
46 |
+
type="text"
|
47 |
+
value={url}
|
48 |
+
onChange={(event) => {
|
49 |
+
setUrl(event.target.value);
|
50 |
+
}}
|
51 |
+
/>
|
52 |
+
</div>
|
53 |
+
</div>
|
54 |
+
<div className="flex-1 bg-white border-t">
|
55 |
+
{activePreview ? (
|
56 |
+
<iframe ref={iframeRef} className="border-none w-full h-full" src={iframeUrl}></iframe>
|
57 |
+
) : (
|
58 |
+
<div className="flex w-full h-full justify-center items-center">No preview available</div>
|
59 |
+
)}
|
60 |
+
</div>
|
61 |
+
</div>
|
62 |
+
);
|
63 |
+
});
|
packages/bolt/app/components/{workspace/Workspace.client.tsx → workbench/Workbench.client.tsx}
RENAMED
@@ -1,14 +1,17 @@
|
|
1 |
import { useStore } from '@nanostores/react';
|
2 |
import { AnimatePresence, motion, type Variants } from 'framer-motion';
|
3 |
-
import {
|
4 |
-
import {
|
5 |
-
import {
|
|
|
|
|
|
|
6 |
|
7 |
interface WorkspaceProps {
|
8 |
chatStarted?: boolean;
|
9 |
}
|
10 |
|
11 |
-
const
|
12 |
closed: {
|
13 |
width: 0,
|
14 |
transition: {
|
@@ -19,32 +22,43 @@ const workspaceVariants = {
|
|
19 |
open: {
|
20 |
width: '100%',
|
21 |
transition: {
|
22 |
-
duration: 0.
|
23 |
-
|
24 |
},
|
25 |
},
|
26 |
} satisfies Variants;
|
27 |
|
28 |
-
export function
|
29 |
-
const
|
30 |
|
31 |
return (
|
32 |
chatStarted && (
|
33 |
<AnimatePresence>
|
34 |
-
{
|
35 |
-
<motion.div initial="closed" animate="open" exit="closed" variants={
|
36 |
-
<div className="fixed top-[calc(var(--header-height)+1.5rem)] bottom-
|
37 |
-
<div className="bg-white border border-gray-200 shadow-sm rounded-lg overflow-hidden absolute inset-0 right-8">
|
38 |
-
<
|
39 |
<IconButton
|
40 |
icon="i-ph:x-circle"
|
41 |
className="ml-auto"
|
42 |
size="xxl"
|
43 |
onClick={() => {
|
44 |
-
|
45 |
}}
|
46 |
/>
|
47 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
</div>
|
49 |
</div>
|
50 |
</motion.div>
|
|
|
1 |
import { useStore } from '@nanostores/react';
|
2 |
import { AnimatePresence, motion, type Variants } from 'framer-motion';
|
3 |
+
import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels';
|
4 |
+
import { workbenchStore } from '../../lib/stores/workbench';
|
5 |
+
import { cubicEasingFn } from '../../utils/easings';
|
6 |
+
import { IconButton } from '../ui/IconButton';
|
7 |
+
import { EditorPanel } from './EditorPanel';
|
8 |
+
import { Preview } from './Preview';
|
9 |
|
10 |
interface WorkspaceProps {
|
11 |
chatStarted?: boolean;
|
12 |
}
|
13 |
|
14 |
+
const workbenchVariants = {
|
15 |
closed: {
|
16 |
width: 0,
|
17 |
transition: {
|
|
|
22 |
open: {
|
23 |
width: '100%',
|
24 |
transition: {
|
25 |
+
duration: 0.2,
|
26 |
+
ease: cubicEasingFn,
|
27 |
},
|
28 |
},
|
29 |
} satisfies Variants;
|
30 |
|
31 |
+
export function Workbench({ chatStarted }: WorkspaceProps) {
|
32 |
+
const showWorkbench = useStore(workbenchStore.showWorkbench);
|
33 |
|
34 |
return (
|
35 |
chatStarted && (
|
36 |
<AnimatePresence>
|
37 |
+
{showWorkbench && (
|
38 |
+
<motion.div initial="closed" animate="open" exit="closed" variants={workbenchVariants}>
|
39 |
+
<div className="fixed top-[calc(var(--header-height)+1.5rem)] bottom-[calc(1.5rem-1px)] w-[50vw] mr-4 z-0">
|
40 |
+
<div className="flex flex-col bg-white border border-gray-200 shadow-sm rounded-lg overflow-hidden absolute inset-0 right-8">
|
41 |
+
<div className="px-3 py-2 border-b border-gray-200">
|
42 |
<IconButton
|
43 |
icon="i-ph:x-circle"
|
44 |
className="ml-auto"
|
45 |
size="xxl"
|
46 |
onClick={() => {
|
47 |
+
workbenchStore.showWorkbench.set(false);
|
48 |
}}
|
49 |
/>
|
50 |
+
</div>
|
51 |
+
<div className="flex-1 overflow-hidden">
|
52 |
+
<PanelGroup direction="vertical">
|
53 |
+
<Panel defaultSize={50} minSize={20}>
|
54 |
+
<EditorPanel />
|
55 |
+
</Panel>
|
56 |
+
<PanelResizeHandle />
|
57 |
+
<Panel defaultSize={50} minSize={20}>
|
58 |
+
<Preview />
|
59 |
+
</Panel>
|
60 |
+
</PanelGroup>
|
61 |
+
</div>
|
62 |
</div>
|
63 |
</div>
|
64 |
</motion.div>
|
packages/bolt/app/lib/.server/llm/constants.ts
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
// see https://docs.anthropic.com/en/docs/about-claude/models
|
2 |
+
export const MAX_TOKENS = 8192;
|
packages/bolt/app/lib/.server/llm/prompts.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
export const
|
2 |
You are Bolt, an expert AI assistant and exceptional senior software developer with vast knowledge across multiple programming languages, frameworks, and best practices.
|
3 |
|
4 |
<system_constraints>
|
@@ -22,34 +22,45 @@ You are Bolt, an expert AI assistant and exceptional senior software developer w
|
|
22 |
|
23 |
- Shell commands to run including dependencies to install using a package manager (NPM)
|
24 |
- Files to create and their contents
|
|
|
25 |
|
26 |
<artifact_instructions>
|
27 |
-
1. Think BEFORE creating an artifact
|
28 |
|
29 |
-
2.
|
30 |
|
31 |
-
3.
|
32 |
|
33 |
-
|
34 |
|
35 |
-
|
36 |
|
37 |
-
|
38 |
|
39 |
-
|
40 |
|
41 |
-
|
42 |
|
43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
|
45 |
IMPORTANT: Add all required dependencies to the \`package.json\` already and try to avoid \`npm i <pkg>\` if possible!
|
46 |
|
47 |
-
|
48 |
|
49 |
-
|
50 |
</artifact_instructions>
|
51 |
</artifact_info>
|
52 |
|
|
|
|
|
53 |
NEVER use the word "artifact". For example:
|
54 |
- DO NOT SAY: "This artifact sets up a simple Snake game using HTML, CSS, and JavaScript."
|
55 |
- INSTEAD SAY: "We set up a simple Snake game using HTML, CSS, and JavaScript."
|
@@ -69,16 +80,10 @@ Here are some examples of correct usage of artifacts:
|
|
69 |
<assistant_response>
|
70 |
Certainly, I can help you create a JavaScript function to calculate the factorial of a number.
|
71 |
|
72 |
-
<boltArtifact title="JavaScript Factorial Function">
|
73 |
-
<boltAction type="file"
|
74 |
function factorial(n) {
|
75 |
-
|
76 |
-
return 1;
|
77 |
-
} else if (n < 0) {
|
78 |
-
return "Factorial is not defined for negative numbers";
|
79 |
-
} else {
|
80 |
-
return n * factorial(n - 1);
|
81 |
-
}
|
82 |
}
|
83 |
|
84 |
...
|
@@ -97,8 +102,8 @@ Here are some examples of correct usage of artifacts:
|
|
97 |
<assistant_response>
|
98 |
Certainly! I'd be happy to help you build a snake game using JavaScript and HTML5 Canvas. This will be a basic implementation that you can later expand upon. Let's create the game step by step.
|
99 |
|
100 |
-
<boltArtifact title="Snake Game in HTML and JavaScript">
|
101 |
-
<boltAction type="file"
|
102 |
{
|
103 |
"name": "snake",
|
104 |
"scripts": {
|
@@ -112,7 +117,7 @@ Here are some examples of correct usage of artifacts:
|
|
112 |
npm install --save-dev vite
|
113 |
</boltAction>
|
114 |
|
115 |
-
<boltAction type="file"
|
116 |
...
|
117 |
</boltAction>
|
118 |
|
@@ -131,8 +136,8 @@ Here are some examples of correct usage of artifacts:
|
|
131 |
<assistant_response>
|
132 |
Certainly! I'll create a bouncing ball with real gravity using React. We'll use the react-spring library for physics-based animations.
|
133 |
|
134 |
-
<boltArtifact title="Bouncing Ball with Gravity in React">
|
135 |
-
<boltAction type="file"
|
136 |
{
|
137 |
"name": "bouncing-ball",
|
138 |
"private": true,
|
@@ -157,19 +162,19 @@ Here are some examples of correct usage of artifacts:
|
|
157 |
}
|
158 |
</boltAction>
|
159 |
|
160 |
-
<boltAction type="file"
|
161 |
...
|
162 |
</boltAction>
|
163 |
|
164 |
-
<boltAction type="file"
|
165 |
...
|
166 |
</boltAction>
|
167 |
|
168 |
-
<boltAction type="file"
|
169 |
...
|
170 |
</boltAction>
|
171 |
|
172 |
-
<boltAction type="file"
|
173 |
...
|
174 |
</boltAction>
|
175 |
|
|
|
1 |
+
export const getSystemPrompt = (cwd: string = '/home/project') => `
|
2 |
You are Bolt, an expert AI assistant and exceptional senior software developer with vast knowledge across multiple programming languages, frameworks, and best practices.
|
3 |
|
4 |
<system_constraints>
|
|
|
22 |
|
23 |
- Shell commands to run including dependencies to install using a package manager (NPM)
|
24 |
- Files to create and their contents
|
25 |
+
- Folders to create if necessary
|
26 |
|
27 |
<artifact_instructions>
|
28 |
+
1. Think BEFORE creating an artifact
|
29 |
|
30 |
+
2. The current working directory is \`${cwd}\`.
|
31 |
|
32 |
+
3. Wrap the content in opening and closing \`<boltArtifact>\` tags. These tags contain more specific \`<boltAction>\` elements.
|
33 |
|
34 |
+
4. Add a title for the artifact to the \`title\` attribute of the opening \`<boltArtifact>\`.
|
35 |
|
36 |
+
5. Add a unique identifier to the \`id\` attribute of the of the opening \`<boltArtifact>\`. For updates, reuse the prior identifier. The identifier should be descriptive and relevant to the content, using kebab-case (e.g., "example-code-snippet"). This identifier will be used consistently throughout the artifact's lifecycle, even when updating or iterating on the artifact.
|
37 |
|
38 |
+
6. Use \`<boltAction>\` tags to define specific actions to perform.
|
39 |
|
40 |
+
7. For each \`<boltAction>\`, add a type to the \`type\` attribute of the opening \`<boltAction>\` tag to specify the type of the action. Assign one of the following values to the \`type\` attribute:
|
41 |
|
42 |
+
- shell: For running shell commands.
|
43 |
|
44 |
+
- When Using \`npx\`, ALWAYS provide the \`--yes\` flag.
|
45 |
+
- When running multiple shell commands, use \`&&\` to run them sequentially.
|
46 |
+
- Do NOT re-run a dev command if there is one that starts a dev server and new dependencies were installed. If a dev server has started already, assume that installing dependencies will be executed in a different process and will be picked up by the dev server.
|
47 |
+
|
48 |
+
- file: For writing new files or updating existing files. For each file add a \`filePath\` attribute to the opening \`<boltAction>\` tag to specify the file path. The content of the file artifact is the file contents. All file paths MUST BE relative to the current working directory.
|
49 |
+
|
50 |
+
8. The order of the actions is VERY IMPORTANT. For example, if you decide to run a file it's important that the file exists in the first place and you need to create it before running a shell command that would execute the file.
|
51 |
+
|
52 |
+
9. ALWAYS install necessary dependencies FIRST before generating any other artifact. If that requires a \`package.json\` then you should create that first!
|
53 |
|
54 |
IMPORTANT: Add all required dependencies to the \`package.json\` already and try to avoid \`npm i <pkg>\` if possible!
|
55 |
|
56 |
+
10. Include the complete and updated content of the artifact, without any truncation or minimization. Don't use "// rest of the code remains the same...".
|
57 |
|
58 |
+
11. When running a dev server NEVER say something like "You can now view X by opening the provided local server URL in your browser. The preview will be opened automatically or by the user manually!
|
59 |
</artifact_instructions>
|
60 |
</artifact_info>
|
61 |
|
62 |
+
BEST PRACTICES: Follow coding best practices. Whenever creating files, split functionality into smaller modules instead of placing everything in a single large file. If possible, files should be as small as possible, with functionality extracted into separate modules. This is VERY IMPORTANT so that updates to the project can be done to smaller modules without re-generating large files!
|
63 |
+
|
64 |
NEVER use the word "artifact". For example:
|
65 |
- DO NOT SAY: "This artifact sets up a simple Snake game using HTML, CSS, and JavaScript."
|
66 |
- INSTEAD SAY: "We set up a simple Snake game using HTML, CSS, and JavaScript."
|
|
|
80 |
<assistant_response>
|
81 |
Certainly, I can help you create a JavaScript function to calculate the factorial of a number.
|
82 |
|
83 |
+
<boltArtifact id="factorial-function" title="JavaScript Factorial Function">
|
84 |
+
<boltAction type="file" filePath="index.js">
|
85 |
function factorial(n) {
|
86 |
+
...
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
}
|
88 |
|
89 |
...
|
|
|
102 |
<assistant_response>
|
103 |
Certainly! I'd be happy to help you build a snake game using JavaScript and HTML5 Canvas. This will be a basic implementation that you can later expand upon. Let's create the game step by step.
|
104 |
|
105 |
+
<boltArtifact id="snake-game" title="Snake Game in HTML and JavaScript">
|
106 |
+
<boltAction type="file" filePath="package.json">
|
107 |
{
|
108 |
"name": "snake",
|
109 |
"scripts": {
|
|
|
117 |
npm install --save-dev vite
|
118 |
</boltAction>
|
119 |
|
120 |
+
<boltAction type="file" filePath="index.html">
|
121 |
...
|
122 |
</boltAction>
|
123 |
|
|
|
136 |
<assistant_response>
|
137 |
Certainly! I'll create a bouncing ball with real gravity using React. We'll use the react-spring library for physics-based animations.
|
138 |
|
139 |
+
<boltArtifact id="bouncing-ball-react" title="Bouncing Ball with Gravity in React">
|
140 |
+
<boltAction type="file" filePath="package.json">
|
141 |
{
|
142 |
"name": "bouncing-ball",
|
143 |
"private": true,
|
|
|
162 |
}
|
163 |
</boltAction>
|
164 |
|
165 |
+
<boltAction type="file" filePath="index.html">
|
166 |
...
|
167 |
</boltAction>
|
168 |
|
169 |
+
<boltAction type="file" filePath="src/main.jsx">
|
170 |
...
|
171 |
</boltAction>
|
172 |
|
173 |
+
<boltAction type="file" filePath="src/index.css">
|
174 |
...
|
175 |
</boltAction>
|
176 |
|
177 |
+
<boltAction type="file" filePath="src/App.jsx">
|
178 |
...
|
179 |
</boltAction>
|
180 |
|
packages/bolt/app/lib/.server/llm/stream-text.ts
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { streamText as _streamText, convertToCoreMessages } from 'ai';
|
2 |
+
import { getAPIKey } from '../llm/api-key';
|
3 |
+
import { getAnthropicModel } from '../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;
|
9 |
+
toolName: Name;
|
10 |
+
args: Args;
|
11 |
+
result: Result;
|
12 |
+
}
|
13 |
+
|
14 |
+
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 |
+
onFinish: ({ finishReason, usage, warnings }) => {
|
34 |
+
console.log({ finishReason, usage, warnings });
|
35 |
+
},
|
36 |
+
...options,
|
37 |
+
});
|
38 |
+
}
|
packages/bolt/app/lib/hooks/useMessageParser.ts
CHANGED
@@ -1,23 +1,28 @@
|
|
1 |
import type { Message } from 'ai';
|
2 |
import { useCallback, useState } from 'react';
|
3 |
-
import {
|
4 |
-
import {
|
5 |
-
import {
|
6 |
|
7 |
const logger = createScopedLogger('useMessageParser');
|
8 |
|
9 |
const messageParser = new StreamingMessageParser({
|
10 |
callbacks: {
|
11 |
-
onArtifactOpen: (
|
12 |
-
logger.
|
13 |
-
|
|
|
|
|
14 |
},
|
15 |
-
onArtifactClose: (
|
16 |
-
logger.
|
17 |
-
|
|
|
18 |
},
|
19 |
-
onAction: (
|
20 |
-
|
|
|
|
|
21 |
},
|
22 |
},
|
23 |
});
|
|
|
1 |
import type { Message } from 'ai';
|
2 |
import { useCallback, useState } from 'react';
|
3 |
+
import { createScopedLogger } from '../../utils/logger';
|
4 |
+
import { StreamingMessageParser } from '../runtime/message-parser';
|
5 |
+
import { workbenchStore } from '../stores/workbench';
|
6 |
|
7 |
const logger = createScopedLogger('useMessageParser');
|
8 |
|
9 |
const messageParser = new StreamingMessageParser({
|
10 |
callbacks: {
|
11 |
+
onArtifactOpen: (data) => {
|
12 |
+
logger.trace('onArtifactOpen', data);
|
13 |
+
|
14 |
+
workbenchStore.showWorkbench.set(true);
|
15 |
+
workbenchStore.addArtifact(data);
|
16 |
},
|
17 |
+
onArtifactClose: (data) => {
|
18 |
+
logger.trace('onArtifactClose');
|
19 |
+
|
20 |
+
workbenchStore.updateArtifact(data, { closed: true });
|
21 |
},
|
22 |
+
onAction: (data) => {
|
23 |
+
logger.trace('onAction', data);
|
24 |
+
|
25 |
+
workbenchStore.runAction(data);
|
26 |
},
|
27 |
},
|
28 |
});
|
packages/bolt/app/lib/hooks/usePromptEnhancer.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
import { useState } from 'react';
|
2 |
-
import { createScopedLogger } from '
|
3 |
|
4 |
const logger = createScopedLogger('usePromptEnhancement');
|
5 |
|
|
|
1 |
import { useState } from 'react';
|
2 |
+
import { createScopedLogger } from '../../utils/logger';
|
3 |
|
4 |
const logger = createScopedLogger('usePromptEnhancement');
|
5 |
|
packages/bolt/app/lib/runtime/action-runner.ts
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { WebContainer } from '@webcontainer/api';
|
2 |
+
import * as nodePath from 'node:path';
|
3 |
+
import { createScopedLogger } from '../../utils/logger';
|
4 |
+
import type { ActionCallbackData } from './message-parser';
|
5 |
+
|
6 |
+
const logger = createScopedLogger('ActionRunner');
|
7 |
+
|
8 |
+
export class ActionRunner {
|
9 |
+
#webcontainer: Promise<WebContainer>;
|
10 |
+
|
11 |
+
constructor(webcontainerPromise: Promise<WebContainer>) {
|
12 |
+
this.#webcontainer = webcontainerPromise;
|
13 |
+
}
|
14 |
+
|
15 |
+
async runAction({ action }: ActionCallbackData, abortSignal?: AbortSignal) {
|
16 |
+
logger.trace('Running action', action);
|
17 |
+
|
18 |
+
const { content } = action;
|
19 |
+
|
20 |
+
const webcontainer = await this.#webcontainer;
|
21 |
+
|
22 |
+
switch (action.type) {
|
23 |
+
case 'file': {
|
24 |
+
let folder = nodePath.dirname(action.filePath);
|
25 |
+
|
26 |
+
// remove trailing slashes
|
27 |
+
folder = folder.replace(/\/$/g, '');
|
28 |
+
|
29 |
+
if (folder !== '.') {
|
30 |
+
try {
|
31 |
+
await webcontainer.fs.mkdir(folder, { recursive: true });
|
32 |
+
logger.debug('Created folder', folder);
|
33 |
+
} catch (error) {
|
34 |
+
logger.error('Failed to create folder\n', error);
|
35 |
+
}
|
36 |
+
}
|
37 |
+
|
38 |
+
try {
|
39 |
+
await webcontainer.fs.writeFile(action.filePath, content);
|
40 |
+
logger.debug(`File written ${action.filePath}`);
|
41 |
+
} catch (error) {
|
42 |
+
logger.error('Failed to write file\n', error);
|
43 |
+
}
|
44 |
+
|
45 |
+
break;
|
46 |
+
}
|
47 |
+
case 'shell': {
|
48 |
+
const process = await webcontainer.spawn('jsh', ['-c', content]);
|
49 |
+
|
50 |
+
abortSignal?.addEventListener('abort', () => {
|
51 |
+
process.kill();
|
52 |
+
});
|
53 |
+
|
54 |
+
process.output.pipeTo(
|
55 |
+
new WritableStream({
|
56 |
+
write(data) {
|
57 |
+
console.log(data);
|
58 |
+
},
|
59 |
+
}),
|
60 |
+
);
|
61 |
+
|
62 |
+
const exitCode = await process.exit;
|
63 |
+
|
64 |
+
logger.debug(`Process terminated with code ${exitCode}`);
|
65 |
+
}
|
66 |
+
}
|
67 |
+
}
|
68 |
+
}
|
packages/bolt/app/lib/runtime/message-parser.spec.ts
CHANGED
@@ -38,28 +38,30 @@ describe('StreamingMessageParser', () => {
|
|
38 |
['Before <boltArtifactt>foo</boltArtifact> After', 'Before <boltArtifactt>foo</boltArtifact> After'],
|
39 |
['Before <boltArtifact title="Some title">foo</boltArtifact> After', 'Before After'],
|
40 |
[
|
41 |
-
'Before <boltArtifact title="Some title"><boltAction type="shell">npm install</boltAction></boltArtifact> After',
|
42 |
'Before After',
|
43 |
[{ type: 'shell', content: 'npm install' }],
|
44 |
],
|
45 |
[
|
46 |
-
'Before <boltArtifact title="Some title"><boltAction type="shell">npm install</boltAction><boltAction type="file"
|
47 |
'Before After',
|
48 |
[
|
49 |
{ type: 'shell', content: 'npm install' },
|
50 |
-
{ type: 'file',
|
51 |
],
|
52 |
],
|
53 |
])('should correctly parse chunks and strip out bolt artifacts', (input, expected, expectedActions = []) => {
|
54 |
let actionCounter = 0;
|
55 |
|
56 |
-
const
|
|
|
57 |
|
58 |
const parser = new StreamingMessageParser({
|
59 |
artifactElement: '',
|
60 |
callbacks: {
|
61 |
-
onAction: (
|
62 |
-
expect(
|
|
|
63 |
expect(action).toEqual(expectedActions[actionCounter]);
|
64 |
actionCounter++;
|
65 |
},
|
@@ -75,7 +77,7 @@ describe('StreamingMessageParser', () => {
|
|
75 |
for (const chunk of chunks) {
|
76 |
message += chunk;
|
77 |
|
78 |
-
result += parser.parse(
|
79 |
}
|
80 |
|
81 |
expect(actionCounter).toBe(expectedActions.length);
|
|
|
38 |
['Before <boltArtifactt>foo</boltArtifact> After', 'Before <boltArtifactt>foo</boltArtifact> After'],
|
39 |
['Before <boltArtifact title="Some title">foo</boltArtifact> After', 'Before After'],
|
40 |
[
|
41 |
+
'Before <boltArtifact title="Some title" id="artifact_1"><boltAction type="shell">npm install</boltAction></boltArtifact> After',
|
42 |
'Before After',
|
43 |
[{ type: 'shell', content: 'npm install' }],
|
44 |
],
|
45 |
[
|
46 |
+
'Before <boltArtifact title="Some title" id="artifact_1"><boltAction type="shell">npm install</boltAction><boltAction type="file" filePath="index.js">some content</boltAction></boltArtifact> After',
|
47 |
'Before After',
|
48 |
[
|
49 |
{ type: 'shell', content: 'npm install' },
|
50 |
+
{ type: 'file', filePath: 'index.js', content: 'some content\n' },
|
51 |
],
|
52 |
],
|
53 |
])('should correctly parse chunks and strip out bolt artifacts', (input, expected, expectedActions = []) => {
|
54 |
let actionCounter = 0;
|
55 |
|
56 |
+
const expectedArtifactId = 'artifact_1';
|
57 |
+
const expectedMessageId = 'message_1';
|
58 |
|
59 |
const parser = new StreamingMessageParser({
|
60 |
artifactElement: '',
|
61 |
callbacks: {
|
62 |
+
onAction: ({ artifactId, messageId, action }) => {
|
63 |
+
expect(artifactId).toBe(expectedArtifactId);
|
64 |
+
expect(messageId).toBe(expectedMessageId);
|
65 |
expect(action).toEqual(expectedActions[actionCounter]);
|
66 |
actionCounter++;
|
67 |
},
|
|
|
77 |
for (const chunk of chunks) {
|
78 |
message += chunk;
|
79 |
|
80 |
+
result += parser.parse(expectedMessageId, message);
|
81 |
}
|
82 |
|
83 |
expect(actionCounter).toBe(expectedActions.length);
|
packages/bolt/app/lib/runtime/message-parser.ts
CHANGED
@@ -1,24 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
1 |
const ARTIFACT_TAG_OPEN = '<boltArtifact';
|
2 |
const ARTIFACT_TAG_CLOSE = '</boltArtifact>';
|
3 |
const ARTIFACT_ACTION_TAG_OPEN = '<boltAction';
|
4 |
const ARTIFACT_ACTION_TAG_CLOSE = '</boltAction>';
|
5 |
|
6 |
-
|
7 |
-
title: string;
|
8 |
-
}
|
9 |
-
|
10 |
-
type ArtifactOpenCallback = (messageId: string, artifact: BoltArtifact) => void;
|
11 |
-
type ArtifactCloseCallback = (messageId: string) => void;
|
12 |
-
type ActionCallback = (messageId: string, action: BoltActionData) => void;
|
13 |
|
14 |
-
|
|
|
|
|
15 |
|
16 |
-
export interface
|
17 |
-
|
18 |
-
|
19 |
-
|
|
|
20 |
}
|
21 |
|
|
|
|
|
|
|
|
|
22 |
interface Callbacks {
|
23 |
onArtifactOpen?: ArtifactOpenCallback;
|
24 |
onArtifactClose?: ArtifactCloseCallback;
|
@@ -32,39 +38,72 @@ interface StreamingMessageParserOptions {
|
|
32 |
artifactElement?: string | ElementFactory;
|
33 |
}
|
34 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
export class StreamingMessageParser {
|
36 |
-
#
|
37 |
-
#insideArtifact = false;
|
38 |
-
#insideAction = false;
|
39 |
-
#currentAction: BoltActionData = { content: '' };
|
40 |
|
41 |
constructor(private _options: StreamingMessageParserOptions = {}) {}
|
42 |
|
43 |
-
parse(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
let output = '';
|
45 |
-
let i =
|
46 |
let earlyBreak = false;
|
47 |
|
48 |
while (i < input.length) {
|
49 |
-
if (
|
50 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
const closeIndex = input.indexOf(ARTIFACT_ACTION_TAG_CLOSE, i);
|
52 |
|
|
|
|
|
53 |
if (closeIndex !== -1) {
|
54 |
-
|
55 |
|
56 |
-
let content =
|
57 |
|
58 |
-
if (
|
59 |
content += '\n';
|
60 |
}
|
61 |
|
62 |
-
|
63 |
|
64 |
-
this._options.callbacks?.onAction?.(
|
|
|
|
|
|
|
|
|
|
|
65 |
|
66 |
-
|
67 |
-
|
68 |
|
69 |
i = closeIndex + ARTIFACT_ACTION_TAG_CLOSE.length;
|
70 |
} else {
|
@@ -79,17 +118,39 @@ export class StreamingMessageParser {
|
|
79 |
|
80 |
if (actionEndIndex !== -1) {
|
81 |
const actionTag = input.slice(actionOpenIndex, actionEndIndex + 1);
|
82 |
-
|
83 |
-
|
84 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
i = actionEndIndex + 1;
|
86 |
} else {
|
87 |
break;
|
88 |
}
|
89 |
} else if (artifactCloseIndex !== -1) {
|
90 |
-
this
|
91 |
|
92 |
-
|
|
|
93 |
|
94 |
i = artifactCloseIndex + ARTIFACT_TAG_CLOSE.length;
|
95 |
} else {
|
@@ -118,12 +179,30 @@ export class StreamingMessageParser {
|
|
118 |
const artifactTag = input.slice(i, openTagEnd + 1);
|
119 |
|
120 |
const artifactTitle = this.#extractAttribute(artifactTag, 'title') as string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
|
122 |
-
|
123 |
|
124 |
-
this._options.callbacks?.onArtifactOpen?.(
|
125 |
|
126 |
-
output +=
|
|
|
|
|
127 |
|
128 |
i = openTagEnd + 1;
|
129 |
} else {
|
@@ -153,16 +232,13 @@ export class StreamingMessageParser {
|
|
153 |
}
|
154 |
}
|
155 |
|
156 |
-
|
157 |
|
158 |
return output;
|
159 |
}
|
160 |
|
161 |
reset() {
|
162 |
-
this.#
|
163 |
-
this.#insideArtifact = false;
|
164 |
-
this.#insideAction = false;
|
165 |
-
this.#currentAction = { content: '' };
|
166 |
}
|
167 |
|
168 |
#extractAttribute(tag: string, attributeName: string): string | undefined {
|
|
|
1 |
+
import type { ActionType, BoltAction, BoltActionData, FileAction, ShellAction } from '../../types/actions';
|
2 |
+
import type { BoltArtifactData } from '../../types/artifact';
|
3 |
+
import { createScopedLogger } from '../../utils/logger';
|
4 |
+
import { unreachable } from '../../utils/unreachable';
|
5 |
+
|
6 |
const ARTIFACT_TAG_OPEN = '<boltArtifact';
|
7 |
const ARTIFACT_TAG_CLOSE = '</boltArtifact>';
|
8 |
const ARTIFACT_ACTION_TAG_OPEN = '<boltAction';
|
9 |
const ARTIFACT_ACTION_TAG_CLOSE = '</boltAction>';
|
10 |
|
11 |
+
const logger = createScopedLogger('MessageParser');
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
+
export interface ArtifactCallbackData extends BoltArtifactData {
|
14 |
+
messageId: string;
|
15 |
+
}
|
16 |
|
17 |
+
export interface ActionCallbackData {
|
18 |
+
artifactId: string;
|
19 |
+
messageId: string;
|
20 |
+
actionId: string;
|
21 |
+
action: BoltAction;
|
22 |
}
|
23 |
|
24 |
+
type ArtifactOpenCallback = (data: ArtifactCallbackData) => void;
|
25 |
+
type ArtifactCloseCallback = (data: ArtifactCallbackData) => void;
|
26 |
+
type ActionCallback = (data: ActionCallbackData) => void;
|
27 |
+
|
28 |
interface Callbacks {
|
29 |
onArtifactOpen?: ArtifactOpenCallback;
|
30 |
onArtifactClose?: ArtifactCloseCallback;
|
|
|
38 |
artifactElement?: string | ElementFactory;
|
39 |
}
|
40 |
|
41 |
+
interface MessageState {
|
42 |
+
position: number;
|
43 |
+
insideArtifact: boolean;
|
44 |
+
insideAction: boolean;
|
45 |
+
currentArtifact?: BoltArtifactData;
|
46 |
+
currentAction: BoltActionData;
|
47 |
+
actionId: number;
|
48 |
+
}
|
49 |
+
|
50 |
export class StreamingMessageParser {
|
51 |
+
#messages = new Map<string, MessageState>();
|
|
|
|
|
|
|
52 |
|
53 |
constructor(private _options: StreamingMessageParserOptions = {}) {}
|
54 |
|
55 |
+
parse(messageId: string, input: string) {
|
56 |
+
let state = this.#messages.get(messageId);
|
57 |
+
|
58 |
+
if (!state) {
|
59 |
+
state = {
|
60 |
+
position: 0,
|
61 |
+
insideAction: false,
|
62 |
+
insideArtifact: false,
|
63 |
+
currentAction: { content: '' },
|
64 |
+
actionId: 0,
|
65 |
+
};
|
66 |
+
|
67 |
+
this.#messages.set(messageId, state);
|
68 |
+
}
|
69 |
+
|
70 |
let output = '';
|
71 |
+
let i = state.position;
|
72 |
let earlyBreak = false;
|
73 |
|
74 |
while (i < input.length) {
|
75 |
+
if (state.insideArtifact) {
|
76 |
+
const currentArtifact = state.currentArtifact;
|
77 |
+
|
78 |
+
if (currentArtifact === undefined) {
|
79 |
+
unreachable('Artifact not initialized');
|
80 |
+
}
|
81 |
+
|
82 |
+
if (state.insideAction) {
|
83 |
const closeIndex = input.indexOf(ARTIFACT_ACTION_TAG_CLOSE, i);
|
84 |
|
85 |
+
const currentAction = state.currentAction;
|
86 |
+
|
87 |
if (closeIndex !== -1) {
|
88 |
+
currentAction.content += input.slice(i, closeIndex);
|
89 |
|
90 |
+
let content = currentAction.content.trim();
|
91 |
|
92 |
+
if ('type' in currentAction && currentAction.type === 'file') {
|
93 |
content += '\n';
|
94 |
}
|
95 |
|
96 |
+
currentAction.content = content;
|
97 |
|
98 |
+
this._options.callbacks?.onAction?.({
|
99 |
+
artifactId: currentArtifact.id,
|
100 |
+
messageId,
|
101 |
+
actionId: String(state.actionId++),
|
102 |
+
action: currentAction as BoltAction,
|
103 |
+
});
|
104 |
|
105 |
+
state.insideAction = false;
|
106 |
+
state.currentAction = { content: '' };
|
107 |
|
108 |
i = closeIndex + ARTIFACT_ACTION_TAG_CLOSE.length;
|
109 |
} else {
|
|
|
118 |
|
119 |
if (actionEndIndex !== -1) {
|
120 |
const actionTag = input.slice(actionOpenIndex, actionEndIndex + 1);
|
121 |
+
|
122 |
+
const actionType = this.#extractAttribute(actionTag, 'type') as ActionType;
|
123 |
+
|
124 |
+
const actionAttributes = {
|
125 |
+
type: actionType,
|
126 |
+
content: '',
|
127 |
+
};
|
128 |
+
|
129 |
+
if (actionType === 'file') {
|
130 |
+
const filePath = this.#extractAttribute(actionTag, 'filePath') as string;
|
131 |
+
|
132 |
+
if (!filePath) {
|
133 |
+
logger.debug('File path not specified');
|
134 |
+
}
|
135 |
+
|
136 |
+
(actionAttributes as FileAction).filePath = filePath;
|
137 |
+
} else if (actionType !== 'shell') {
|
138 |
+
logger.warn(`Unknown action type '${actionType}'`);
|
139 |
+
}
|
140 |
+
|
141 |
+
state.currentAction = actionAttributes as FileAction | ShellAction;
|
142 |
+
|
143 |
+
state.insideAction = true;
|
144 |
+
|
145 |
i = actionEndIndex + 1;
|
146 |
} else {
|
147 |
break;
|
148 |
}
|
149 |
} else if (artifactCloseIndex !== -1) {
|
150 |
+
this._options.callbacks?.onArtifactClose?.({ messageId, ...currentArtifact });
|
151 |
|
152 |
+
state.insideArtifact = false;
|
153 |
+
state.currentArtifact = undefined;
|
154 |
|
155 |
i = artifactCloseIndex + ARTIFACT_TAG_CLOSE.length;
|
156 |
} else {
|
|
|
179 |
const artifactTag = input.slice(i, openTagEnd + 1);
|
180 |
|
181 |
const artifactTitle = this.#extractAttribute(artifactTag, 'title') as string;
|
182 |
+
const artifactId = this.#extractAttribute(artifactTag, 'id') as string;
|
183 |
+
|
184 |
+
if (!artifactTitle) {
|
185 |
+
logger.warn('Artifact title missing');
|
186 |
+
}
|
187 |
+
|
188 |
+
if (!artifactId) {
|
189 |
+
logger.warn('Artifact id missing');
|
190 |
+
}
|
191 |
+
|
192 |
+
state.insideArtifact = true;
|
193 |
+
|
194 |
+
const currentArtifact = {
|
195 |
+
id: artifactId,
|
196 |
+
title: artifactTitle,
|
197 |
+
} satisfies BoltArtifactData;
|
198 |
|
199 |
+
state.currentArtifact = currentArtifact;
|
200 |
|
201 |
+
this._options.callbacks?.onArtifactOpen?.({ messageId, ...currentArtifact });
|
202 |
|
203 |
+
output +=
|
204 |
+
this._options.artifactElement ??
|
205 |
+
`<div class="__boltArtifact__" data-artifact-id="${artifactId}" data-message-id="${messageId}"></div>`;
|
206 |
|
207 |
i = openTagEnd + 1;
|
208 |
} else {
|
|
|
232 |
}
|
233 |
}
|
234 |
|
235 |
+
state.position = i;
|
236 |
|
237 |
return output;
|
238 |
}
|
239 |
|
240 |
reset() {
|
241 |
+
this.#messages.clear();
|
|
|
|
|
|
|
242 |
}
|
243 |
|
244 |
#extractAttribute(tag: string, attributeName: string): string | undefined {
|
packages/bolt/app/lib/stores/previews.ts
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import type { WebContainer } from '@webcontainer/api';
|
2 |
+
import { atom } from 'nanostores';
|
3 |
+
|
4 |
+
export interface PreviewInfo {
|
5 |
+
port: number;
|
6 |
+
ready: boolean;
|
7 |
+
baseUrl: string;
|
8 |
+
}
|
9 |
+
|
10 |
+
export class PreviewsStore {
|
11 |
+
#availablePreviews = new Map<number, PreviewInfo>();
|
12 |
+
#webcontainer: Promise<WebContainer>;
|
13 |
+
|
14 |
+
previews = atom<PreviewInfo[]>([]);
|
15 |
+
|
16 |
+
constructor(webcontainerPromise: Promise<WebContainer>) {
|
17 |
+
this.#webcontainer = webcontainerPromise;
|
18 |
+
|
19 |
+
this.#init();
|
20 |
+
}
|
21 |
+
|
22 |
+
async #init() {
|
23 |
+
const webcontainer = await this.#webcontainer;
|
24 |
+
|
25 |
+
webcontainer.on('port', (port, type, url) => {
|
26 |
+
let previewInfo = this.#availablePreviews.get(port);
|
27 |
+
|
28 |
+
const previews = this.previews.get();
|
29 |
+
|
30 |
+
if (!previewInfo) {
|
31 |
+
previewInfo = { port, ready: type === 'open', baseUrl: url };
|
32 |
+
this.#availablePreviews.set(port, previewInfo);
|
33 |
+
previews.push(previewInfo);
|
34 |
+
}
|
35 |
+
|
36 |
+
previewInfo.ready = type === 'open';
|
37 |
+
previewInfo.baseUrl = url;
|
38 |
+
|
39 |
+
this.previews.set([...previews]);
|
40 |
+
});
|
41 |
+
}
|
42 |
+
}
|
packages/bolt/app/lib/stores/theme.ts
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { atom } from 'nanostores';
|
2 |
+
|
3 |
+
export type Theme = 'dark' | 'light';
|
4 |
+
|
5 |
+
export const kTheme = 'bolt_theme';
|
6 |
+
|
7 |
+
export function themeIsDark() {
|
8 |
+
return themeStore.get() === 'dark';
|
9 |
+
}
|
10 |
+
|
11 |
+
export const themeStore = atom<Theme>(initStore());
|
12 |
+
|
13 |
+
function initStore() {
|
14 |
+
if (!import.meta.env.SSR) {
|
15 |
+
const persistedTheme = localStorage.getItem(kTheme) as Theme | undefined;
|
16 |
+
const themeAttribute = document.querySelector('html')?.getAttribute('data-theme');
|
17 |
+
|
18 |
+
return persistedTheme ?? (themeAttribute as Theme) ?? 'light';
|
19 |
+
}
|
20 |
+
|
21 |
+
return 'light';
|
22 |
+
}
|
23 |
+
|
24 |
+
export function toggleTheme() {
|
25 |
+
const currentTheme = themeStore.get();
|
26 |
+
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
|
27 |
+
|
28 |
+
themeStore.set(newTheme);
|
29 |
+
|
30 |
+
localStorage.setItem(kTheme, newTheme);
|
31 |
+
|
32 |
+
document.querySelector('html')?.setAttribute('data-theme', newTheme);
|
33 |
+
}
|
packages/bolt/app/lib/stores/workbench.ts
ADDED
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { atom, map, type MapStore, type WritableAtom } from 'nanostores';
|
2 |
+
import type { BoltAction } from '../../types/actions';
|
3 |
+
import { unreachable } from '../../utils/unreachable';
|
4 |
+
import { ActionRunner } from '../runtime/action-runner';
|
5 |
+
import type { ActionCallbackData, ArtifactCallbackData } from '../runtime/message-parser';
|
6 |
+
import { webcontainer } from '../webcontainer';
|
7 |
+
import { PreviewsStore } from './previews';
|
8 |
+
|
9 |
+
export type RunningState = BoltAction & {
|
10 |
+
status: 'running' | 'complete' | 'pending' | 'aborted';
|
11 |
+
abort?: () => void;
|
12 |
+
};
|
13 |
+
|
14 |
+
export type FailedState = BoltAction & {
|
15 |
+
status: 'failed';
|
16 |
+
error: string;
|
17 |
+
abort?: () => void;
|
18 |
+
};
|
19 |
+
|
20 |
+
export type ActionState = RunningState | FailedState;
|
21 |
+
|
22 |
+
export type ActionStateUpdate =
|
23 |
+
| { status: 'running' | 'complete' | 'pending' | 'aborted'; abort?: () => void }
|
24 |
+
| { status: 'failed'; error: string; abort?: () => void }
|
25 |
+
| { abort?: () => void };
|
26 |
+
|
27 |
+
export interface ArtifactState {
|
28 |
+
title: string;
|
29 |
+
closed: boolean;
|
30 |
+
currentActionPromise: Promise<void>;
|
31 |
+
actions: MapStore<Record<string, ActionState>>;
|
32 |
+
}
|
33 |
+
|
34 |
+
type Artifacts = MapStore<Record<string, ArtifactState>>;
|
35 |
+
|
36 |
+
export class WorkbenchStore {
|
37 |
+
#actionRunner = new ActionRunner(webcontainer);
|
38 |
+
#previewsStore = new PreviewsStore(webcontainer);
|
39 |
+
|
40 |
+
artifacts: Artifacts = import.meta.hot?.data.artifacts ?? map({});
|
41 |
+
|
42 |
+
showWorkbench: WritableAtom<boolean> = import.meta.hot?.data.showWorkbench ?? atom(false);
|
43 |
+
|
44 |
+
get previews() {
|
45 |
+
return this.#previewsStore.previews;
|
46 |
+
}
|
47 |
+
|
48 |
+
setShowWorkbench(show: boolean) {
|
49 |
+
this.showWorkbench.set(show);
|
50 |
+
}
|
51 |
+
|
52 |
+
addArtifact({ id, messageId, title }: ArtifactCallbackData) {
|
53 |
+
const artifacts = this.artifacts.get();
|
54 |
+
const artifactKey = getArtifactKey(id, messageId);
|
55 |
+
const artifact = artifacts[artifactKey];
|
56 |
+
|
57 |
+
if (artifact) {
|
58 |
+
return;
|
59 |
+
}
|
60 |
+
|
61 |
+
this.artifacts.setKey(artifactKey, {
|
62 |
+
title,
|
63 |
+
closed: false,
|
64 |
+
actions: map({}),
|
65 |
+
currentActionPromise: Promise.resolve(),
|
66 |
+
});
|
67 |
+
}
|
68 |
+
|
69 |
+
updateArtifact({ id, messageId }: ArtifactCallbackData, state: Partial<ArtifactState>) {
|
70 |
+
const artifacts = this.artifacts.get();
|
71 |
+
const key = getArtifactKey(id, messageId);
|
72 |
+
const artifact = artifacts[key];
|
73 |
+
|
74 |
+
if (!artifact) {
|
75 |
+
return;
|
76 |
+
}
|
77 |
+
|
78 |
+
this.artifacts.setKey(key, { ...artifact, ...state });
|
79 |
+
}
|
80 |
+
|
81 |
+
async runAction(data: ActionCallbackData) {
|
82 |
+
const { artifactId, messageId, actionId } = data;
|
83 |
+
|
84 |
+
const artifacts = this.artifacts.get();
|
85 |
+
const key = getArtifactKey(artifactId, messageId);
|
86 |
+
const artifact = artifacts[key];
|
87 |
+
|
88 |
+
if (!artifact) {
|
89 |
+
unreachable('Artifact not found');
|
90 |
+
}
|
91 |
+
|
92 |
+
const actions = artifact.actions.get();
|
93 |
+
const action = actions[actionId];
|
94 |
+
|
95 |
+
if (action) {
|
96 |
+
return;
|
97 |
+
}
|
98 |
+
|
99 |
+
artifact.actions.setKey(actionId, { ...data.action, status: 'pending' });
|
100 |
+
|
101 |
+
artifact.currentActionPromise = artifact.currentActionPromise.then(async () => {
|
102 |
+
try {
|
103 |
+
let abortController: AbortController | undefined;
|
104 |
+
|
105 |
+
if (data.action.type === 'shell') {
|
106 |
+
abortController = new AbortController();
|
107 |
+
}
|
108 |
+
|
109 |
+
let aborted = false;
|
110 |
+
|
111 |
+
this.#updateAction(key, actionId, {
|
112 |
+
status: 'running',
|
113 |
+
abort: () => {
|
114 |
+
aborted = true;
|
115 |
+
abortController?.abort();
|
116 |
+
},
|
117 |
+
});
|
118 |
+
|
119 |
+
await this.#actionRunner.runAction(data, abortController?.signal);
|
120 |
+
|
121 |
+
this.#updateAction(key, actionId, { status: aborted ? 'aborted' : 'complete' });
|
122 |
+
} catch (error) {
|
123 |
+
this.#updateAction(key, actionId, { status: 'failed', error: 'Action failed' });
|
124 |
+
|
125 |
+
throw error;
|
126 |
+
}
|
127 |
+
});
|
128 |
+
}
|
129 |
+
|
130 |
+
#updateAction(artifactId: string, actionId: string, newState: ActionStateUpdate) {
|
131 |
+
const artifacts = this.artifacts.get();
|
132 |
+
const artifact = artifacts[artifactId];
|
133 |
+
|
134 |
+
if (!artifact) {
|
135 |
+
return;
|
136 |
+
}
|
137 |
+
|
138 |
+
const actions = artifact.actions.get();
|
139 |
+
|
140 |
+
artifact.actions.setKey(actionId, { ...actions[actionId], ...newState });
|
141 |
+
}
|
142 |
+
}
|
143 |
+
|
144 |
+
export function getArtifactKey(artifactId: string, messageId: string) {
|
145 |
+
return `${artifactId}_${messageId}`;
|
146 |
+
}
|
147 |
+
|
148 |
+
export const workbenchStore = new WorkbenchStore();
|
149 |
+
|
150 |
+
if (import.meta.hot) {
|
151 |
+
import.meta.hot.data.artifacts = workbenchStore.artifacts;
|
152 |
+
import.meta.hot.data.showWorkbench = workbenchStore.showWorkbench;
|
153 |
+
}
|
packages/bolt/app/lib/stores/workspace.ts
DELETED
@@ -1,42 +0,0 @@
|
|
1 |
-
import type { WebContainer } from '@webcontainer/api';
|
2 |
-
import { atom, map, type MapStore, type WritableAtom } from 'nanostores';
|
3 |
-
import { webcontainer } from '~/lib/webcontainer';
|
4 |
-
|
5 |
-
interface WorkspaceStoreOptions {
|
6 |
-
webcontainer: Promise<WebContainer>;
|
7 |
-
}
|
8 |
-
|
9 |
-
interface ArtifactState {
|
10 |
-
title: string;
|
11 |
-
closed: boolean;
|
12 |
-
actions: any /* TODO */;
|
13 |
-
}
|
14 |
-
|
15 |
-
export class WorkspaceStore {
|
16 |
-
#webcontainer: Promise<WebContainer>;
|
17 |
-
|
18 |
-
artifacts: MapStore<Record<string, ArtifactState>> = import.meta.hot?.data.artifacts ?? map({});
|
19 |
-
showWorkspace: WritableAtom<boolean> = import.meta.hot?.data.showWorkspace ?? atom(false);
|
20 |
-
|
21 |
-
constructor({ webcontainer }: WorkspaceStoreOptions) {
|
22 |
-
this.#webcontainer = webcontainer;
|
23 |
-
}
|
24 |
-
|
25 |
-
updateArtifact(id: string, state: Partial<ArtifactState>) {
|
26 |
-
const artifacts = this.artifacts.get();
|
27 |
-
const artifact = artifacts[id];
|
28 |
-
|
29 |
-
this.artifacts.setKey(id, { ...artifact, ...state });
|
30 |
-
}
|
31 |
-
|
32 |
-
runAction() {
|
33 |
-
// TODO
|
34 |
-
}
|
35 |
-
}
|
36 |
-
|
37 |
-
export const workspaceStore = new WorkspaceStore({ webcontainer });
|
38 |
-
|
39 |
-
if (import.meta.hot) {
|
40 |
-
import.meta.hot.data.artifacts = workspaceStore.artifacts;
|
41 |
-
import.meta.hot.data.showWorkspace = workspaceStore.showWorkspace;
|
42 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
packages/bolt/app/lib/webcontainer/index.ts
CHANGED
@@ -21,8 +21,9 @@ if (!import.meta.env.SSR) {
|
|
21 |
import.meta.hot?.data.webcontainer ??
|
22 |
Promise.resolve()
|
23 |
.then(() => WebContainer.boot({ workdirName: 'project' }))
|
24 |
-
.then(() => {
|
25 |
webcontainerContext.loaded = true;
|
|
|
26 |
});
|
27 |
|
28 |
if (import.meta.hot) {
|
|
|
21 |
import.meta.hot?.data.webcontainer ??
|
22 |
Promise.resolve()
|
23 |
.then(() => WebContainer.boot({ workdirName: 'project' }))
|
24 |
+
.then((webcontainer) => {
|
25 |
webcontainerContext.loaded = true;
|
26 |
+
return webcontainer;
|
27 |
});
|
28 |
|
29 |
if (import.meta.hot) {
|
packages/bolt/app/root.tsx
CHANGED
@@ -1,7 +1,11 @@
|
|
|
|
1 |
import type { LinksFunction } from '@remix-run/cloudflare';
|
2 |
import { Links, Meta, Outlet, Scripts, ScrollRestoration } from '@remix-run/react';
|
3 |
import tailwindReset from '@unocss/reset/tailwind-compat.css?url';
|
4 |
-
import
|
|
|
|
|
|
|
5 |
|
6 |
import 'virtual:uno.css';
|
7 |
|
@@ -28,14 +32,31 @@ export const links: LinksFunction = () => [
|
|
28 |
},
|
29 |
];
|
30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
export function Layout({ children }: { children: React.ReactNode }) {
|
|
|
|
|
32 |
return (
|
33 |
-
<html lang="en">
|
34 |
<head>
|
35 |
<meta charSet="utf-8" />
|
36 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
37 |
<Meta />
|
38 |
<Links />
|
|
|
39 |
</head>
|
40 |
<body>
|
41 |
{children}
|
|
|
1 |
+
import { useStore } from '@nanostores/react';
|
2 |
import type { LinksFunction } from '@remix-run/cloudflare';
|
3 |
import { Links, Meta, Outlet, Scripts, ScrollRestoration } from '@remix-run/react';
|
4 |
import tailwindReset from '@unocss/reset/tailwind-compat.css?url';
|
5 |
+
import { themeStore } from './lib/stores/theme';
|
6 |
+
import { stripIndents } from './utils/stripIndent';
|
7 |
+
|
8 |
+
import globalStyles from './styles/index.scss?url';
|
9 |
|
10 |
import 'virtual:uno.css';
|
11 |
|
|
|
32 |
},
|
33 |
];
|
34 |
|
35 |
+
const inlineThemeCode = stripIndents`
|
36 |
+
setTutorialKitTheme();
|
37 |
+
|
38 |
+
function setTutorialKitTheme() {
|
39 |
+
let theme = localStorage.getItem('bolt_theme');
|
40 |
+
|
41 |
+
if (!theme) {
|
42 |
+
theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
43 |
+
}
|
44 |
+
|
45 |
+
document.querySelector('html')?.setAttribute('data-theme', theme);
|
46 |
+
}
|
47 |
+
`;
|
48 |
+
|
49 |
export function Layout({ children }: { children: React.ReactNode }) {
|
50 |
+
const theme = useStore(themeStore);
|
51 |
+
|
52 |
return (
|
53 |
+
<html lang="en" data-theme={theme}>
|
54 |
<head>
|
55 |
<meta charSet="utf-8" />
|
56 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
57 |
<Meta />
|
58 |
<Links />
|
59 |
+
<script dangerouslySetInnerHTML={{ __html: inlineThemeCode }} />
|
60 |
</head>
|
61 |
<body>
|
62 |
{children}
|
packages/bolt/app/routes/_index.tsx
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
import { json, redirect, type LoaderFunctionArgs, type MetaFunction } from '@remix-run/cloudflare';
|
2 |
import { ClientOnly } from 'remix-utils/client-only';
|
3 |
-
import { BaseChat } from '
|
4 |
-
import { Chat } from '
|
5 |
-
import { Header } from '
|
6 |
-
import { isAuthenticated } from '
|
7 |
|
8 |
export const meta: MetaFunction = () => {
|
9 |
return [{ title: 'Bolt' }, { name: 'description', content: 'Talk with Bolt, an AI assistant from StackBlitz' }];
|
|
|
1 |
import { json, redirect, type LoaderFunctionArgs, type MetaFunction } from '@remix-run/cloudflare';
|
2 |
import { ClientOnly } from 'remix-utils/client-only';
|
3 |
+
import { BaseChat } from '../components/chat/BaseChat';
|
4 |
+
import { Chat } from '../components/chat/Chat.client';
|
5 |
+
import { Header } from '../components/Header';
|
6 |
+
import { isAuthenticated } from '../lib/.server/sessions';
|
7 |
|
8 |
export const meta: MetaFunction = () => {
|
9 |
return [{ title: 'Bolt' }, { name: 'description', content: 'Talk with Bolt, an AI assistant from StackBlitz' }];
|
packages/bolt/app/routes/api.chat.ts
CHANGED
@@ -1,36 +1,11 @@
|
|
1 |
import { type ActionFunctionArgs } from '@remix-run/cloudflare';
|
2 |
-
import {
|
3 |
-
import { getAPIKey } from '~/lib/.server/llm/api-key';
|
4 |
-
import { getAnthropicModel } from '~/lib/.server/llm/model';
|
5 |
-
import { systemPrompt } from '~/lib/.server/llm/prompts';
|
6 |
-
|
7 |
-
interface ToolResult<Name extends string, Args, Result> {
|
8 |
-
toolCallId: string;
|
9 |
-
toolName: Name;
|
10 |
-
args: Args;
|
11 |
-
result: Result;
|
12 |
-
}
|
13 |
-
|
14 |
-
interface Message {
|
15 |
-
role: 'user' | 'assistant';
|
16 |
-
content: string;
|
17 |
-
toolInvocations?: ToolResult<string, unknown, unknown>[];
|
18 |
-
}
|
19 |
|
20 |
export async function action({ context, request }: ActionFunctionArgs) {
|
21 |
-
const { messages } = await request.json<{ messages:
|
22 |
|
23 |
try {
|
24 |
-
const result = await streamText({
|
25 |
-
model: getAnthropicModel(getAPIKey(context.cloudflare.env)),
|
26 |
-
messages: convertToCoreMessages(messages),
|
27 |
-
toolChoice: 'none',
|
28 |
-
onFinish: ({ finishReason, usage, warnings }) => {
|
29 |
-
console.log({ finishReason, usage, warnings });
|
30 |
-
},
|
31 |
-
system: systemPrompt,
|
32 |
-
});
|
33 |
-
|
34 |
return result.toAIStreamResponse();
|
35 |
} catch (error) {
|
36 |
console.log(error);
|
|
|
1 |
import { type ActionFunctionArgs } from '@remix-run/cloudflare';
|
2 |
+
import { streamText, type Messages } from '../lib/.server/llm/stream-text';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
export async function action({ context, request }: ActionFunctionArgs) {
|
5 |
+
const { messages } = await request.json<{ messages: Messages }>();
|
6 |
|
7 |
try {
|
8 |
+
const result = await streamText(messages, context.cloudflare.env, { toolChoice: 'none' });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
return result.toAIStreamResponse();
|
10 |
} catch (error) {
|
11 |
console.log(error);
|
packages/bolt/app/routes/api.enhancer.ts
CHANGED
@@ -1,9 +1,7 @@
|
|
1 |
import { type ActionFunctionArgs } from '@remix-run/cloudflare';
|
2 |
-
import { StreamingTextResponse,
|
3 |
-
import {
|
4 |
-
import {
|
5 |
-
import { systemPrompt } from '~/lib/.server/llm/prompts';
|
6 |
-
import { stripIndents } from '~/utils/stripIndent';
|
7 |
|
8 |
const encoder = new TextEncoder();
|
9 |
const decoder = new TextDecoder();
|
@@ -12,30 +10,23 @@ export async function action({ context, request }: ActionFunctionArgs) {
|
|
12 |
const { message } = await request.json<{ message: string }>();
|
13 |
|
14 |
try {
|
15 |
-
const result = await streamText(
|
16 |
-
|
17 |
-
system: systemPrompt,
|
18 |
-
messages: convertToCoreMessages([
|
19 |
{
|
20 |
role: 'user',
|
21 |
content: stripIndents`
|
22 |
-
|
23 |
|
24 |
-
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
},
|
31 |
-
]
|
32 |
-
|
33 |
-
|
34 |
-
if (import.meta.env.DEV) {
|
35 |
-
result.usage.then((usage) => {
|
36 |
-
console.log('Usage', usage);
|
37 |
-
});
|
38 |
-
}
|
39 |
|
40 |
const transformStream = new TransformStream({
|
41 |
transform(chunk, controller) {
|
|
|
1 |
import { type ActionFunctionArgs } from '@remix-run/cloudflare';
|
2 |
+
import { StreamingTextResponse, parseStreamPart } from 'ai';
|
3 |
+
import { streamText } from '../lib/.server/llm/stream-text';
|
4 |
+
import { stripIndents } from '../utils/stripIndent';
|
|
|
|
|
5 |
|
6 |
const encoder = new TextEncoder();
|
7 |
const decoder = new TextDecoder();
|
|
|
10 |
const { message } = await request.json<{ message: string }>();
|
11 |
|
12 |
try {
|
13 |
+
const result = await streamText(
|
14 |
+
[
|
|
|
|
|
15 |
{
|
16 |
role: 'user',
|
17 |
content: stripIndents`
|
18 |
+
I want you to improve the user prompt that is wrapped in \`<original_prompt>\` tags.
|
19 |
|
20 |
+
IMPORTANT: Only respond with the improved prompt and nothing else!
|
21 |
|
22 |
+
<original_prompt>
|
23 |
+
${message}
|
24 |
+
</original_prompt>
|
25 |
+
`,
|
26 |
},
|
27 |
+
],
|
28 |
+
context.cloudflare.env,
|
29 |
+
);
|
|
|
|
|
|
|
|
|
|
|
30 |
|
31 |
const transformStream = new TransformStream({
|
32 |
transform(chunk, controller) {
|
packages/bolt/app/routes/login.tsx
CHANGED
@@ -6,8 +6,8 @@ import {
|
|
6 |
type TypedResponse,
|
7 |
} from '@remix-run/cloudflare';
|
8 |
import { Form, useActionData } from '@remix-run/react';
|
9 |
-
import { verifyPassword } from '
|
10 |
-
import { createUserSession, isAuthenticated } from '
|
11 |
|
12 |
interface Errors {
|
13 |
password?: string;
|
|
|
6 |
type TypedResponse,
|
7 |
} from '@remix-run/cloudflare';
|
8 |
import { Form, useActionData } from '@remix-run/react';
|
9 |
+
import { verifyPassword } from '../lib/.server/login';
|
10 |
+
import { createUserSession, isAuthenticated } from '../lib/.server/sessions';
|
11 |
|
12 |
interface Errors {
|
13 |
password?: string;
|
packages/bolt/app/styles/variables.scss
CHANGED
@@ -1,12 +1,30 @@
|
|
|
|
1 |
:root,
|
2 |
:root[data-theme='light'] {
|
3 |
-
|
4 |
-
--bolt-background-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
}
|
6 |
|
|
|
7 |
:root,
|
8 |
:root[data-theme='dark'] {
|
9 |
-
/* Color Tokens */
|
10 |
--bolt-background-primary: theme('colors.gray.50');
|
11 |
}
|
12 |
|
@@ -20,4 +38,7 @@
|
|
20 |
|
21 |
/* App */
|
22 |
--bolt-elements-app-backgroundColor: var(--bolt-background-primary);
|
|
|
|
|
|
|
23 |
}
|
|
|
1 |
+
/* Color Tokens Light Theme */
|
2 |
:root,
|
3 |
:root[data-theme='light'] {
|
4 |
+
--bolt-background-primary: theme('colors.gray.0');
|
5 |
+
--bolt-background-secondary: theme('colors.gray.50');
|
6 |
+
--bolt-background-active: theme('colors.gray.200');
|
7 |
+
--bolt-background-accent: theme('colors.accent.600');
|
8 |
+
--bolt-background-accent-secondary: theme('colors.accent.600');
|
9 |
+
--bolt-background-accent-active: theme('colors.accent.500');
|
10 |
+
|
11 |
+
--bolt-text-primary: theme('colors.gray.800');
|
12 |
+
--bolt-text-primary-inverted: theme('colors.gray.0');
|
13 |
+
--bolt-text-secondary: theme('colors.gray.600');
|
14 |
+
--bolt-text-secondary-inverted: theme('colors.gray.200');
|
15 |
+
--bolt-text-disabled: theme('colors.gray.400');
|
16 |
+
--bolt-text-accent: theme('colors.accent.600');
|
17 |
+
--bolt-text-positive: theme('colors.positive.700');
|
18 |
+
--bolt-text-warning: theme('colors.warning.600');
|
19 |
+
--bolt-text-negative: theme('colors.negative.600');
|
20 |
+
|
21 |
+
--bolt-border-primary: theme('colors.gray.200');
|
22 |
+
--bolt-border-accent: theme('colors.accent.600');
|
23 |
}
|
24 |
|
25 |
+
/* Color Tokens Dark Theme */
|
26 |
:root,
|
27 |
:root[data-theme='dark'] {
|
|
|
28 |
--bolt-background-primary: theme('colors.gray.50');
|
29 |
}
|
30 |
|
|
|
38 |
|
39 |
/* App */
|
40 |
--bolt-elements-app-backgroundColor: var(--bolt-background-primary);
|
41 |
+
--bolt-elements-app-borderColor: var(--bolt-border-primary);
|
42 |
+
--bolt-elements-app-textColor: var(--bolt-text-primary);
|
43 |
+
--bolt-elements-app-linkColor: var(--bolt-text-accent);
|
44 |
}
|
packages/bolt/app/types/actions.ts
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export type ActionType = 'file' | 'shell';
|
2 |
+
|
3 |
+
export interface BaseAction {
|
4 |
+
content: string;
|
5 |
+
}
|
6 |
+
|
7 |
+
export interface FileAction extends BaseAction {
|
8 |
+
type: 'file';
|
9 |
+
filePath: string;
|
10 |
+
}
|
11 |
+
|
12 |
+
export interface ShellAction extends BaseAction {
|
13 |
+
type: 'shell';
|
14 |
+
}
|
15 |
+
|
16 |
+
export type BoltAction = FileAction | ShellAction;
|
17 |
+
|
18 |
+
export type BoltActionData = BoltAction | BaseAction;
|
packages/bolt/app/types/artifact.ts
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export interface BoltArtifactData {
|
2 |
+
id: string;
|
3 |
+
title: string;
|
4 |
+
}
|
packages/bolt/app/types/theme.ts
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
export type Theme = 'dark' | 'light';
|
packages/bolt/app/utils/debounce.ts
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export function debounce<Args extends any[]>(fn: (...args: Args) => void, delay = 100) {
|
2 |
+
if (delay === 0) {
|
3 |
+
return fn;
|
4 |
+
}
|
5 |
+
|
6 |
+
let timer: number | undefined;
|
7 |
+
|
8 |
+
return function <U>(this: U, ...args: Args) {
|
9 |
+
const context = this;
|
10 |
+
|
11 |
+
clearTimeout(timer);
|
12 |
+
|
13 |
+
timer = window.setTimeout(() => {
|
14 |
+
fn.apply(context, args);
|
15 |
+
}, delay);
|
16 |
+
};
|
17 |
+
}
|
packages/bolt/app/utils/unreachable.ts
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
export function unreachable(message: string): never {
|
2 |
+
throw new Error(`Unreachable: ${message}`);
|
3 |
+
}
|
packages/bolt/package.json
CHANGED
@@ -9,31 +9,47 @@
|
|
9 |
"build": "remix vite:build",
|
10 |
"dev": "remix vite:dev",
|
11 |
"test": "vitest --run",
|
|
|
12 |
"start": "bindings=$(./bindings.sh) && wrangler pages dev ./build/client $bindings",
|
13 |
"typecheck": "tsc",
|
14 |
"typegen": "wrangler types",
|
15 |
"preview": "pnpm run build && pnpm run start"
|
16 |
},
|
17 |
"dependencies": {
|
18 |
-
"@ai-sdk/anthropic": "^0.0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
"@iconify-json/ph": "^1.1.13",
|
20 |
"@iconify-json/svg-spinners": "^1.1.2",
|
|
|
21 |
"@nanostores/react": "^0.7.2",
|
22 |
"@remix-run/cloudflare": "^2.10.2",
|
23 |
"@remix-run/cloudflare-pages": "^2.10.2",
|
24 |
"@remix-run/react": "^2.10.2",
|
25 |
"@unocss/reset": "^0.61.0",
|
26 |
-
"@webcontainer/api": "^1.
|
27 |
"@xterm/addon-fit": "^0.10.0",
|
28 |
"@xterm/addon-web-links": "^0.11.0",
|
29 |
"@xterm/xterm": "^5.5.0",
|
30 |
-
"ai": "^3.2.
|
31 |
"framer-motion": "^11.2.12",
|
32 |
"isbot": "^4.1.0",
|
33 |
"nanostores": "^0.10.3",
|
34 |
"react": "^18.2.0",
|
35 |
"react-dom": "^18.2.0",
|
36 |
"react-markdown": "^9.0.1",
|
|
|
37 |
"rehype-raw": "^7.0.0",
|
38 |
"remark-gfm": "^4.0.0",
|
39 |
"remix-utils": "^7.6.0",
|
@@ -49,6 +65,8 @@
|
|
49 |
"unified": "^11.0.5",
|
50 |
"unocss": "^0.61.3",
|
51 |
"vite": "^5.3.1",
|
|
|
|
|
52 |
"vite-tsconfig-paths": "^4.3.2",
|
53 |
"wrangler": "^3.63.2",
|
54 |
"zod": "^3.23.8"
|
|
|
9 |
"build": "remix vite:build",
|
10 |
"dev": "remix vite:dev",
|
11 |
"test": "vitest --run",
|
12 |
+
"test:watch": "vitest",
|
13 |
"start": "bindings=$(./bindings.sh) && wrangler pages dev ./build/client $bindings",
|
14 |
"typecheck": "tsc",
|
15 |
"typegen": "wrangler types",
|
16 |
"preview": "pnpm run build && pnpm run start"
|
17 |
},
|
18 |
"dependencies": {
|
19 |
+
"@ai-sdk/anthropic": "^0.0.30",
|
20 |
+
"@codemirror/autocomplete": "^6.17.0",
|
21 |
+
"@codemirror/commands": "^6.6.0",
|
22 |
+
"@codemirror/lang-css": "^6.2.1",
|
23 |
+
"@codemirror/lang-html": "^6.4.9",
|
24 |
+
"@codemirror/lang-javascript": "^6.2.2",
|
25 |
+
"@codemirror/lang-json": "^6.0.1",
|
26 |
+
"@codemirror/lang-markdown": "^6.2.5",
|
27 |
+
"@codemirror/lang-sass": "^6.0.2",
|
28 |
+
"@codemirror/lang-wast": "^6.0.2",
|
29 |
+
"@codemirror/language": "^6.10.2",
|
30 |
+
"@codemirror/search": "^6.5.6",
|
31 |
+
"@codemirror/state": "^6.4.1",
|
32 |
+
"@codemirror/view": "^6.28.4",
|
33 |
"@iconify-json/ph": "^1.1.13",
|
34 |
"@iconify-json/svg-spinners": "^1.1.2",
|
35 |
+
"@lezer/highlight": "^1.2.0",
|
36 |
"@nanostores/react": "^0.7.2",
|
37 |
"@remix-run/cloudflare": "^2.10.2",
|
38 |
"@remix-run/cloudflare-pages": "^2.10.2",
|
39 |
"@remix-run/react": "^2.10.2",
|
40 |
"@unocss/reset": "^0.61.0",
|
41 |
+
"@webcontainer/api": "^1.3.0-internal.1",
|
42 |
"@xterm/addon-fit": "^0.10.0",
|
43 |
"@xterm/addon-web-links": "^0.11.0",
|
44 |
"@xterm/xterm": "^5.5.0",
|
45 |
+
"ai": "^3.2.27",
|
46 |
"framer-motion": "^11.2.12",
|
47 |
"isbot": "^4.1.0",
|
48 |
"nanostores": "^0.10.3",
|
49 |
"react": "^18.2.0",
|
50 |
"react-dom": "^18.2.0",
|
51 |
"react-markdown": "^9.0.1",
|
52 |
+
"react-resizable-panels": "^2.0.20",
|
53 |
"rehype-raw": "^7.0.0",
|
54 |
"remark-gfm": "^4.0.0",
|
55 |
"remix-utils": "^7.6.0",
|
|
|
65 |
"unified": "^11.0.5",
|
66 |
"unocss": "^0.61.3",
|
67 |
"vite": "^5.3.1",
|
68 |
+
"vite-plugin-node-polyfills": "^0.22.0",
|
69 |
+
"vite-plugin-optimize-css-modules": "^1.1.0",
|
70 |
"vite-tsconfig-paths": "^4.3.2",
|
71 |
"wrangler": "^3.63.2",
|
72 |
"zod": "^3.23.8"
|
packages/bolt/uno.config.ts
CHANGED
@@ -111,6 +111,9 @@ export default defineConfig({
|
|
111 |
elements: {
|
112 |
app: {
|
113 |
backgroundColor: 'var(--bolt-elements-app-backgroundColor)',
|
|
|
|
|
|
|
114 |
},
|
115 |
},
|
116 |
},
|
|
|
111 |
elements: {
|
112 |
app: {
|
113 |
backgroundColor: 'var(--bolt-elements-app-backgroundColor)',
|
114 |
+
borderColor: 'var(--bolt-elements-app-borderColor)',
|
115 |
+
textColor: 'var(--bolt-elements-app-textColor)',
|
116 |
+
linkColor: 'var(--bolt-elements-app-linkColor)',
|
117 |
},
|
118 |
},
|
119 |
},
|
packages/bolt/vite.config.ts
CHANGED
@@ -1,11 +1,16 @@
|
|
1 |
import { cloudflareDevProxyVitePlugin as remixCloudflareDevProxy, vitePlugin as remixVitePlugin } from '@remix-run/dev';
|
2 |
import UnoCSS from 'unocss/vite';
|
3 |
import { defineConfig } from 'vite';
|
|
|
|
|
4 |
import tsconfigPaths from 'vite-tsconfig-paths';
|
5 |
|
6 |
export default defineConfig((config) => {
|
7 |
return {
|
8 |
plugins: [
|
|
|
|
|
|
|
9 |
config.mode !== 'test' && remixCloudflareDevProxy(),
|
10 |
remixVitePlugin({
|
11 |
future: {
|
@@ -16,6 +21,7 @@ export default defineConfig((config) => {
|
|
16 |
}),
|
17 |
UnoCSS(),
|
18 |
tsconfigPaths(),
|
|
|
19 |
],
|
20 |
};
|
21 |
});
|
|
|
1 |
import { cloudflareDevProxyVitePlugin as remixCloudflareDevProxy, vitePlugin as remixVitePlugin } from '@remix-run/dev';
|
2 |
import UnoCSS from 'unocss/vite';
|
3 |
import { defineConfig } from 'vite';
|
4 |
+
import { nodePolyfills } from 'vite-plugin-node-polyfills';
|
5 |
+
import { optimizeCssModules } from 'vite-plugin-optimize-css-modules';
|
6 |
import tsconfigPaths from 'vite-tsconfig-paths';
|
7 |
|
8 |
export default defineConfig((config) => {
|
9 |
return {
|
10 |
plugins: [
|
11 |
+
nodePolyfills({
|
12 |
+
include: ['path'],
|
13 |
+
}),
|
14 |
config.mode !== 'test' && remixCloudflareDevProxy(),
|
15 |
remixVitePlugin({
|
16 |
future: {
|
|
|
21 |
}),
|
22 |
UnoCSS(),
|
23 |
tsconfigPaths(),
|
24 |
+
config.mode === 'production' && optimizeCssModules({ apply: 'build' }),
|
25 |
],
|
26 |
};
|
27 |
});
|
pnpm-lock.yaml
CHANGED
@@ -36,14 +36,56 @@ importers:
|
|
36 |
packages/bolt:
|
37 |
dependencies:
|
38 |
'@ai-sdk/anthropic':
|
39 |
-
specifier: ^0.0.
|
40 |
-
version: 0.0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
'@iconify-json/ph':
|
42 |
specifier: ^1.1.13
|
43 |
version: 1.1.13
|
44 |
'@iconify-json/svg-spinners':
|
45 |
specifier: ^1.1.2
|
46 |
version: 1.1.2
|
|
|
|
|
|
|
47 |
'@nanostores/react':
|
48 |
specifier: ^0.7.2
|
49 |
version: 0.7.2([email protected])([email protected])
|
@@ -60,8 +102,8 @@ importers:
|
|
60 |
specifier: ^0.61.0
|
61 |
version: 0.61.0
|
62 |
'@webcontainer/api':
|
63 |
-
specifier: ^1.
|
64 |
-
version: 1.
|
65 |
'@xterm/addon-fit':
|
66 |
specifier: ^0.10.0
|
67 |
version: 0.10.0(@xterm/[email protected])
|
@@ -72,8 +114,8 @@ importers:
|
|
72 |
specifier: ^5.5.0
|
73 |
version: 5.5.0
|
74 |
ai:
|
75 |
-
specifier: ^3.2.
|
76 |
-
version: 3.2.
|
77 |
framer-motion:
|
78 |
specifier: ^11.2.12
|
79 |
version: 11.2.12([email protected]([email protected]))([email protected])
|
@@ -92,6 +134,9 @@ importers:
|
|
92 |
react-markdown:
|
93 |
specifier: ^9.0.1
|
94 |
version: 9.0.1(@types/[email protected])([email protected])
|
|
|
|
|
|
|
95 |
rehype-raw:
|
96 |
specifier: ^7.0.0
|
97 |
version: 7.0.0
|
@@ -132,6 +177,12 @@ importers:
|
|
132 |
vite:
|
133 |
specifier: ^5.3.1
|
134 |
version: 5.3.1(@types/[email protected])([email protected])
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
vite-tsconfig-paths:
|
136 |
specifier: ^4.3.2
|
137 |
version: 4.3.2([email protected])([email protected](@types/[email protected])([email protected]))
|
@@ -144,14 +195,23 @@ importers:
|
|
144 |
|
145 |
packages:
|
146 |
|
147 |
-
'@ai-sdk/[email protected].
|
148 |
-
resolution: {integrity: sha512-
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
engines: {node: '>=18'}
|
150 |
peerDependencies:
|
151 |
zod: ^3.0.0
|
|
|
|
|
|
|
152 |
|
153 |
-
'@ai-sdk/[email protected].
|
154 |
-
resolution: {integrity: sha512-
|
155 |
engines: {node: '>=18'}
|
156 |
peerDependencies:
|
157 |
zod: ^3.0.0
|
@@ -159,12 +219,16 @@ packages:
|
|
159 |
zod:
|
160 |
optional: true
|
161 |
|
162 |
-
'@ai-sdk/[email protected].
|
163 |
-
resolution: {integrity: sha512-
|
164 |
engines: {node: '>=18'}
|
165 |
|
166 |
-
'@ai-sdk/
|
167 |
-
resolution: {integrity: sha512-
|
|
|
|
|
|
|
|
|
168 |
engines: {node: '>=18'}
|
169 |
peerDependencies:
|
170 |
react: ^18 || ^19
|
@@ -175,8 +239,8 @@ packages:
|
|
175 |
zod:
|
176 |
optional: true
|
177 |
|
178 |
-
'@ai-sdk/[email protected].
|
179 |
-
resolution: {integrity: sha512-
|
180 |
engines: {node: '>=18'}
|
181 |
peerDependencies:
|
182 |
solid-js: ^1.7.7
|
@@ -184,8 +248,8 @@ packages:
|
|
184 |
solid-js:
|
185 |
optional: true
|
186 |
|
187 |
-
'@ai-sdk/[email protected].
|
188 |
-
resolution: {integrity: sha512-
|
189 |
engines: {node: '>=18'}
|
190 |
peerDependencies:
|
191 |
svelte: ^3.0.0 || ^4.0.0
|
@@ -193,8 +257,8 @@ packages:
|
|
193 |
svelte:
|
194 |
optional: true
|
195 |
|
196 |
-
'@ai-sdk/[email protected].
|
197 |
-
resolution: {integrity: sha512-
|
198 |
engines: {node: '>=18'}
|
199 |
peerDependencies:
|
200 |
zod: ^3.0.0
|
@@ -202,8 +266,8 @@ packages:
|
|
202 |
zod:
|
203 |
optional: true
|
204 |
|
205 |
-
'@ai-sdk/[email protected].
|
206 |
-
resolution: {integrity: sha512-
|
207 |
engines: {node: '>=18'}
|
208 |
peerDependencies:
|
209 |
vue: ^3.3.4
|
@@ -424,6 +488,53 @@ packages:
|
|
424 |
'@cloudflare/[email protected]':
|
425 |
resolution: {integrity: sha512-CQD8YS6evRob7LChvIX3gE3zYo0KVgaLDOu1SwNP1BVIS2Sa0b+FC8S1e1hhrNN8/E4chYlVN+FDAgA4KRDUEQ==}
|
426 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
427 |
'@commitlint/[email protected]':
|
428 |
resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==}
|
429 |
engines: {node: '>=v18'}
|
@@ -994,6 +1105,33 @@ packages:
|
|
994 |
'@jspm/[email protected]':
|
995 |
resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==}
|
996 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
997 |
'@mdx-js/[email protected]':
|
998 |
resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==}
|
999 |
|
@@ -1032,6 +1170,10 @@ packages:
|
|
1032 |
resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==}
|
1033 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
1034 |
|
|
|
|
|
|
|
|
|
1035 |
'@pkgjs/[email protected]':
|
1036 |
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
1037 |
engines: {node: '>=14'}
|
@@ -1169,6 +1311,15 @@ packages:
|
|
1169 |
'@remix-run/[email protected]':
|
1170 |
resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==}
|
1171 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1172 |
'@rollup/[email protected]':
|
1173 |
resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
|
1174 |
engines: {node: '>=14.0.0'}
|
@@ -1550,8 +1701,8 @@ packages:
|
|
1550 |
'@web3-storage/[email protected]':
|
1551 |
resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==}
|
1552 |
|
1553 |
-
'@webcontainer/api@1.
|
1554 |
-
resolution: {integrity: sha512-
|
1555 |
|
1556 |
'@xterm/[email protected]':
|
1557 |
resolution: {integrity: sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==}
|
@@ -1599,8 +1750,8 @@ packages:
|
|
1599 |
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
|
1600 |
engines: {node: '>=8'}
|
1601 |
|
1602 |
-
[email protected].
|
1603 |
-
resolution: {integrity: sha512-
|
1604 |
engines: {node: '>=18'}
|
1605 |
peerDependencies:
|
1606 |
openai: ^4.42.0
|
@@ -1673,6 +1824,12 @@ packages:
|
|
1673 | |
1674 |
resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==}
|
1675 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1676 | |
1677 |
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
|
1678 |
engines: {node: '>=12'}
|
@@ -1711,6 +1868,12 @@ packages:
|
|
1711 | |
1712 |
resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
|
1713 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1714 | |
1715 |
resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
|
1716 |
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
@@ -1725,9 +1888,34 @@ packages:
|
|
1725 |
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
1726 |
engines: {node: '>=8'}
|
1727 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1728 | |
1729 |
resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==}
|
1730 |
|
|
|
|
|
|
|
1731 | |
1732 |
resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==}
|
1733 |
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
@@ -1736,9 +1924,15 @@ packages:
|
|
1736 | |
1737 |
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
|
1738 |
|
|
|
|
|
|
|
1739 | |
1740 |
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
1741 |
|
|
|
|
|
|
|
1742 | |
1743 |
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
|
1744 |
engines: {node: '>= 0.8'}
|
@@ -1819,6 +2013,9 @@ packages:
|
|
1819 |
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
|
1820 |
engines: {node: '>=8'}
|
1821 |
|
|
|
|
|
|
|
1822 | |
1823 |
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
|
1824 |
engines: {node: '>=6'}
|
@@ -1891,6 +2088,12 @@ packages:
|
|
1891 |
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
|
1892 |
engines: {node: ^14.18.0 || >=16.10.0}
|
1893 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1894 | |
1895 |
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
|
1896 |
engines: {node: '>= 0.6'}
|
@@ -1950,10 +2153,28 @@ packages:
|
|
1950 |
typescript:
|
1951 |
optional: true
|
1952 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1953 | |
1954 |
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
1955 |
engines: {node: '>= 8'}
|
1956 |
|
|
|
|
|
|
|
1957 | |
1958 |
resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
|
1959 |
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
|
@@ -2033,6 +2254,10 @@ packages:
|
|
2033 |
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
|
2034 |
engines: {node: '>= 0.4'}
|
2035 |
|
|
|
|
|
|
|
|
|
2036 | |
2037 |
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
2038 |
|
@@ -2044,6 +2269,9 @@ packages:
|
|
2044 |
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
2045 |
engines: {node: '>=6'}
|
2046 |
|
|
|
|
|
|
|
2047 | |
2048 |
resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
|
2049 |
|
@@ -2065,10 +2293,17 @@ packages:
|
|
2065 |
resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
|
2066 |
engines: {node: '>=0.3.1'}
|
2067 |
|
|
|
|
|
|
|
2068 | |
2069 |
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
|
2070 |
engines: {node: '>=8'}
|
2071 |
|
|
|
|
|
|
|
|
|
2072 | |
2073 |
resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
|
2074 |
engines: {node: '>=8'}
|
@@ -2092,6 +2327,9 @@ packages:
|
|
2092 | |
2093 |
resolution: {integrity: sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==}
|
2094 |
|
|
|
|
|
|
|
2095 | |
2096 |
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
|
2097 |
|
@@ -2289,10 +2527,17 @@ packages:
|
|
2289 |
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
|
2290 |
engines: {node: '>=6'}
|
2291 |
|
|
|
|
|
|
|
|
|
2292 | |
2293 |
resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==}
|
2294 |
engines: {node: '>=14.18'}
|
2295 |
|
|
|
|
|
|
|
2296 | |
2297 |
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
|
2298 |
engines: {node: '>=10'}
|
@@ -2534,6 +2779,17 @@ packages:
|
|
2534 |
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
|
2535 |
engines: {node: '>= 0.4'}
|
2536 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2537 | |
2538 |
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
2539 |
engines: {node: '>= 0.4'}
|
@@ -2565,6 +2821,9 @@ packages:
|
|
2565 | |
2566 |
resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
|
2567 |
|
|
|
|
|
|
|
2568 | |
2569 |
resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==}
|
2570 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
@@ -2579,6 +2838,9 @@ packages:
|
|
2579 |
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
2580 |
engines: {node: '>= 0.8'}
|
2581 |
|
|
|
|
|
|
|
2582 | |
2583 |
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
2584 |
engines: {node: '>=10.17.0'}
|
@@ -2710,6 +2972,10 @@ packages:
|
|
2710 |
resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
|
2711 |
engines: {node: '>=8'}
|
2712 |
|
|
|
|
|
|
|
|
|
2713 | |
2714 |
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
2715 |
engines: {node: '>=0.12.0'}
|
@@ -2763,6 +3029,10 @@ packages:
|
|
2763 | |
2764 |
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
2765 |
|
|
|
|
|
|
|
|
|
2766 | |
2767 |
resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==}
|
2768 |
engines: {node: '>=14'}
|
@@ -2945,6 +3215,9 @@ packages:
|
|
2945 | |
2946 |
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
|
2947 |
|
|
|
|
|
|
|
2948 | |
2949 |
resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
|
2950 |
|
@@ -3226,6 +3499,10 @@ packages:
|
|
3226 |
resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
|
3227 |
engines: {node: '>=8.6'}
|
3228 |
|
|
|
|
|
|
|
|
|
3229 | |
3230 |
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
|
3231 |
engines: {node: '>= 0.6'}
|
@@ -3262,6 +3539,12 @@ packages:
|
|
3262 |
engines: {node: '>=16.13'}
|
3263 |
hasBin: true
|
3264 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3265 | |
3266 |
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
3267 |
|
@@ -3374,6 +3657,10 @@ packages:
|
|
3374 | |
3375 |
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
|
3376 |
|
|
|
|
|
|
|
|
|
3377 | |
3378 |
resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==}
|
3379 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
@@ -3410,6 +3697,18 @@ packages:
|
|
3410 |
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
|
3411 |
engines: {node: '>= 0.4'}
|
3412 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3413 | |
3414 |
resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==}
|
3415 |
|
@@ -3444,6 +3743,9 @@ packages:
|
|
3444 |
resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
|
3445 |
engines: {node: '>=10'}
|
3446 |
|
|
|
|
|
|
|
3447 | |
3448 |
resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==}
|
3449 |
|
@@ -3473,10 +3775,17 @@ packages:
|
|
3473 | |
3474 |
resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
|
3475 |
|
|
|
|
|
|
|
3476 | |
3477 |
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
|
3478 |
engines: {node: '>=6'}
|
3479 |
|
|
|
|
|
|
|
|
|
3480 | |
3481 |
resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
|
3482 |
|
@@ -3495,6 +3804,9 @@ packages:
|
|
3495 |
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
|
3496 |
engines: {node: '>= 0.8'}
|
3497 |
|
|
|
|
|
|
|
3498 | |
3499 |
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
|
3500 |
engines: {node: '>=8'}
|
@@ -3535,6 +3847,10 @@ packages:
|
|
3535 |
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
|
3536 |
engines: {node: '>= 14.16'}
|
3537 |
|
|
|
|
|
|
|
|
|
3538 | |
3539 |
resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==}
|
3540 |
|
@@ -3556,6 +3872,10 @@ packages:
|
|
3556 |
engines: {node: '>=0.10'}
|
3557 |
hasBin: true
|
3558 |
|
|
|
|
|
|
|
|
|
3559 | |
3560 |
resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==}
|
3561 |
|
@@ -3657,6 +3977,10 @@ packages:
|
|
3657 | |
3658 |
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
|
3659 |
|
|
|
|
|
|
|
|
|
3660 | |
3661 |
resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
|
3662 |
peerDependencies:
|
@@ -3676,6 +4000,9 @@ packages:
|
|
3676 |
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
3677 |
engines: {node: '>= 0.10'}
|
3678 |
|
|
|
|
|
|
|
3679 | |
3680 |
resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==}
|
3681 |
|
@@ -3685,6 +4012,9 @@ packages:
|
|
3685 | |
3686 |
resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==}
|
3687 |
|
|
|
|
|
|
|
3688 | |
3689 |
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
3690 |
engines: {node: '>=6'}
|
@@ -3693,9 +4023,23 @@ packages:
|
|
3693 |
resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
|
3694 |
engines: {node: '>=0.6'}
|
3695 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3696 | |
3697 |
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
3698 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3699 | |
3700 |
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
3701 |
engines: {node: '>= 0.6'}
|
@@ -3722,6 +4066,12 @@ packages:
|
|
3722 |
resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
|
3723 |
engines: {node: '>=0.10.0'}
|
3724 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3725 | |
3726 |
resolution: {integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==}
|
3727 |
engines: {node: '>=14.0.0'}
|
@@ -3859,6 +4209,9 @@ packages:
|
|
3859 |
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
|
3860 |
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
3861 |
|
|
|
|
|
|
|
3862 | |
3863 |
resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==}
|
3864 |
deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.
|
@@ -3929,9 +4282,16 @@ packages:
|
|
3929 |
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
|
3930 |
engines: {node: '>= 0.4'}
|
3931 |
|
|
|
|
|
|
|
3932 | |
3933 |
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
3934 |
|
|
|
|
|
|
|
|
|
3935 | |
3936 |
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
3937 |
engines: {node: '>=8'}
|
@@ -4029,6 +4389,12 @@ packages:
|
|
4029 |
resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==}
|
4030 |
engines: {node: '>=4', npm: '>=6'}
|
4031 |
|
|
|
|
|
|
|
|
|
|
|
|
|
4032 | |
4033 |
resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
|
4034 |
|
@@ -4079,6 +4445,9 @@ packages:
|
|
4079 |
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
4080 |
engines: {node: '>=8'}
|
4081 |
|
|
|
|
|
|
|
4082 | |
4083 |
resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
|
4084 |
|
@@ -4146,6 +4515,10 @@ packages:
|
|
4146 | |
4147 |
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
|
4148 |
|
|
|
|
|
|
|
|
|
4149 | |
4150 |
resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==}
|
4151 |
|
@@ -4205,6 +4578,9 @@ packages:
|
|
4205 | |
4206 |
resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
|
4207 |
|
|
|
|
|
|
|
4208 | |
4209 |
resolution: {integrity: sha512-FKFg7A0To1VU4CH9YmSMON5QphK0BXjSoiC7D9yMh+mEEbXLUP9qJ4hEt1qcjKtzncs1OpcnjZO8NgrlVbZH+g==}
|
4210 |
|
@@ -4343,6 +4719,9 @@ packages:
|
|
4343 | |
4344 |
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
4345 |
|
|
|
|
|
|
|
4346 | |
4347 |
resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
|
4348 |
peerDependencies:
|
@@ -4399,6 +4778,16 @@ packages:
|
|
4399 |
engines: {node: ^18.0.0 || >=20.0.0}
|
4400 |
hasBin: true
|
4401 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4402 | |
4403 |
resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==}
|
4404 |
peerDependencies:
|
@@ -4460,6 +4849,9 @@ packages:
|
|
4460 |
jsdom:
|
4461 |
optional: true
|
4462 |
|
|
|
|
|
|
|
4463 | |
4464 |
resolution: {integrity: sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==}
|
4465 |
peerDependencies:
|
@@ -4468,6 +4860,9 @@ packages:
|
|
4468 |
typescript:
|
4469 |
optional: true
|
4470 |
|
|
|
|
|
|
|
4471 | |
4472 |
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
|
4473 |
|
@@ -4608,60 +5003,74 @@ packages:
|
|
4608 |
|
4609 |
snapshots:
|
4610 |
|
4611 |
-
'@ai-sdk/[email protected].
|
|
|
|
|
|
|
|
|
|
|
|
|
4612 |
dependencies:
|
4613 |
-
'@ai-sdk/provider': 0.0.
|
4614 |
-
|
|
|
|
|
|
|
4615 |
zod: 3.23.8
|
4616 |
|
4617 |
-
'@ai-sdk/[email protected].
|
4618 |
dependencies:
|
4619 |
-
'@ai-sdk/provider': 0.0.
|
4620 |
eventsource-parser: 1.1.2
|
4621 |
nanoid: 3.3.6
|
4622 |
secure-json-parse: 2.7.0
|
4623 |
optionalDependencies:
|
4624 |
zod: 3.23.8
|
4625 |
|
4626 |
-
'@ai-sdk/[email protected].
|
4627 |
dependencies:
|
4628 |
json-schema: 0.4.0
|
4629 |
|
4630 |
-
'@ai-sdk/
|
4631 |
dependencies:
|
4632 |
-
|
4633 |
-
|
|
|
|
|
|
|
|
|
4634 |
swr: 2.2.0([email protected])
|
4635 |
optionalDependencies:
|
4636 |
react: 18.3.1
|
4637 |
zod: 3.23.8
|
4638 |
|
4639 |
-
'@ai-sdk/[email protected].
|
4640 |
dependencies:
|
4641 |
-
'@ai-sdk/ui-utils': 0.0.
|
4642 |
transitivePeerDependencies:
|
4643 |
- zod
|
4644 |
|
4645 |
-
'@ai-sdk/[email protected].
|
4646 |
dependencies:
|
4647 |
-
'@ai-sdk/provider-utils': 1.0.
|
4648 |
-
'@ai-sdk/ui-utils': 0.0.
|
4649 |
sswr: 2.1.0([email protected])
|
4650 |
optionalDependencies:
|
4651 |
svelte: 4.2.18
|
4652 |
transitivePeerDependencies:
|
4653 |
- zod
|
4654 |
|
4655 |
-
'@ai-sdk/[email protected].
|
4656 |
dependencies:
|
4657 |
-
'@ai-sdk/provider-utils': 1.0.
|
4658 |
secure-json-parse: 2.7.0
|
4659 |
optionalDependencies:
|
4660 |
zod: 3.23.8
|
4661 |
|
4662 |
-
'@ai-sdk/[email protected].
|
4663 |
dependencies:
|
4664 |
-
'@ai-sdk/
|
|
|
4665 |
swrv: 1.0.4([email protected]([email protected]))
|
4666 |
optionalDependencies:
|
4667 |
vue: 3.4.30([email protected])
|
@@ -4954,6 +5363,113 @@ snapshots:
|
|
4954 |
|
4955 |
'@cloudflare/[email protected]': {}
|
4956 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4957 |
'@commitlint/[email protected](@types/[email protected])([email protected])':
|
4958 |
dependencies:
|
4959 |
'@commitlint/format': 19.3.0
|
@@ -5380,6 +5896,51 @@ snapshots:
|
|
5380 |
|
5381 |
'@jspm/[email protected]': {}
|
5382 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5383 |
'@mdx-js/[email protected]':
|
5384 |
dependencies:
|
5385 |
'@types/estree-jsx': 1.0.5
|
@@ -5452,6 +6013,8 @@ snapshots:
|
|
5452 |
dependencies:
|
5453 |
which: 3.0.1
|
5454 |
|
|
|
|
|
5455 |
'@pkgjs/[email protected]':
|
5456 |
optional: true
|
5457 |
|
@@ -5666,6 +6229,14 @@ snapshots:
|
|
5666 |
dependencies:
|
5667 |
web-streams-polyfill: 3.3.3
|
5668 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5669 |
'@rollup/[email protected]([email protected])':
|
5670 |
dependencies:
|
5671 |
'@types/estree': 1.0.5
|
@@ -6188,7 +6759,7 @@ snapshots:
|
|
6188 |
|
6189 |
'@web3-storage/[email protected]': {}
|
6190 |
|
6191 |
-
'@webcontainer/api@1.
|
6192 |
|
6193 |
'@xterm/[email protected](@xterm/[email protected])':
|
6194 |
dependencies:
|
@@ -6232,15 +6803,16 @@ snapshots:
|
|
6232 |
clean-stack: 2.2.0
|
6233 |
indent-string: 4.0.0
|
6234 |
|
6235 | |
6236 |
dependencies:
|
6237 |
-
'@ai-sdk/provider': 0.0.
|
6238 |
-
'@ai-sdk/provider-utils': 1.0.
|
6239 |
-
'@ai-sdk/react': 0.0.
|
6240 |
-
'@ai-sdk/solid': 0.0.
|
6241 |
-
'@ai-sdk/svelte': 0.0.
|
6242 |
-
'@ai-sdk/ui-utils': 0.0.
|
6243 |
-
'@ai-sdk/vue': 0.0.
|
|
|
6244 |
eventsource-parser: 1.1.2
|
6245 |
json-schema: 0.4.0
|
6246 |
jsondiffpatch: 0.6.0
|
@@ -6309,6 +6881,20 @@ snapshots:
|
|
6309 |
dependencies:
|
6310 |
printable-characters: 1.0.42
|
6311 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6312 | |
6313 |
|
6314 | |
@@ -6342,6 +6928,10 @@ snapshots:
|
|
6342 |
|
6343 | |
6344 |
|
|
|
|
|
|
|
|
|
6345 | |
6346 |
dependencies:
|
6347 |
bytes: 3.1.2
|
@@ -6372,10 +6962,60 @@ snapshots:
|
|
6372 |
dependencies:
|
6373 |
fill-range: 7.1.1
|
6374 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6375 | |
6376 |
dependencies:
|
6377 |
pako: 0.2.9
|
6378 |
|
|
|
|
|
|
|
|
|
6379 | |
6380 |
dependencies:
|
6381 |
caniuse-lite: 1.0.30001637
|
@@ -6385,11 +7025,15 @@ snapshots:
|
|
6385 |
|
6386 | |
6387 |
|
|
|
|
|
6388 | |
6389 |
dependencies:
|
6390 |
base64-js: 1.5.1
|
6391 |
ieee754: 1.2.1
|
6392 |
|
|
|
|
|
6393 | |
6394 |
optional: true
|
6395 |
|
@@ -6482,6 +7126,11 @@ snapshots:
|
|
6482 |
|
6483 | |
6484 |
|
|
|
|
|
|
|
|
|
|
|
6485 | |
6486 |
|
6487 | |
@@ -6561,6 +7210,10 @@ snapshots:
|
|
6561 |
|
6562 | |
6563 |
|
|
|
|
|
|
|
|
|
6564 | |
6565 |
dependencies:
|
6566 |
safe-buffer: 5.2.1
|
@@ -6610,12 +7263,52 @@ snapshots:
|
|
6610 |
optionalDependencies:
|
6611 |
typescript: 5.5.2
|
6612 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6613 | |
6614 |
dependencies:
|
6615 |
path-key: 3.1.1
|
6616 |
shebang-command: 2.0.0
|
6617 |
which: 2.0.2
|
6618 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6619 | |
6620 |
dependencies:
|
6621 |
mdn-data: 2.0.30
|
@@ -6667,12 +7360,23 @@ snapshots:
|
|
6667 |
es-errors: 1.3.0
|
6668 |
gopd: 1.0.1
|
6669 |
|
|
|
|
|
|
|
|
|
|
|
|
|
6670 | |
6671 |
|
6672 | |
6673 |
|
6674 | |
6675 |
|
|
|
|
|
|
|
|
|
|
|
6676 | |
6677 |
|
6678 | |
@@ -6687,10 +7391,18 @@ snapshots:
|
|
6687 |
|
6688 | |
6689 |
|
|
|
|
|
|
|
|
|
|
|
|
|
6690 | |
6691 |
dependencies:
|
6692 |
path-type: 4.0.0
|
6693 |
|
|
|
|
|
6694 | |
6695 |
dependencies:
|
6696 |
is-obj: 2.0.0
|
@@ -6712,6 +7424,16 @@ snapshots:
|
|
6712 |
|
6713 | |
6714 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6715 | |
6716 |
|
6717 | |
@@ -6983,8 +7705,15 @@ snapshots:
|
|
6983 |
|
6984 | |
6985 |
|
|
|
|
|
6986 | |
6987 |
|
|
|
|
|
|
|
|
|
|
|
6988 | |
6989 |
dependencies:
|
6990 |
cross-spawn: 7.0.3
|
@@ -7266,6 +7995,22 @@ snapshots:
|
|
7266 |
dependencies:
|
7267 |
has-symbols: 1.0.3
|
7268 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7269 | |
7270 |
dependencies:
|
7271 |
function-bind: 1.1.2
|
@@ -7365,6 +8110,12 @@ snapshots:
|
|
7365 |
property-information: 6.5.0
|
7366 |
space-separated-tokens: 2.0.2
|
7367 |
|
|
|
|
|
|
|
|
|
|
|
|
|
7368 | |
7369 |
dependencies:
|
7370 |
lru-cache: 7.18.3
|
@@ -7381,6 +8132,8 @@ snapshots:
|
|
7381 |
statuses: 2.0.1
|
7382 |
toidentifier: 1.0.1
|
7383 |
|
|
|
|
|
7384 | |
7385 |
|
7386 | |
@@ -7475,6 +8228,11 @@ snapshots:
|
|
7475 |
|
7476 | |
7477 |
|
|
|
|
|
|
|
|
|
|
|
7478 | |
7479 |
|
7480 | |
@@ -7509,6 +8267,8 @@ snapshots:
|
|
7509 |
|
7510 | |
7511 |
|
|
|
|
|
7512 | |
7513 |
dependencies:
|
7514 |
'@isaacs/cliui': 8.0.2
|
@@ -7657,6 +8417,12 @@ snapshots:
|
|
7657 |
|
7658 | |
7659 |
|
|
|
|
|
|
|
|
|
|
|
|
|
7660 | |
7661 |
dependencies:
|
7662 |
'@types/mdast': 3.0.15
|
@@ -8344,6 +9110,11 @@ snapshots:
|
|
8344 |
braces: 3.0.3
|
8345 |
picomatch: 2.3.1
|
8346 |
|
|
|
|
|
|
|
|
|
|
|
8347 | |
8348 |
|
8349 | |
@@ -8379,6 +9150,10 @@ snapshots:
|
|
8379 |
- supports-color
|
8380 |
- utf-8-validate
|
8381 |
|
|
|
|
|
|
|
|
|
8382 | |
8383 |
dependencies:
|
8384 |
brace-expansion: 1.1.11
|
@@ -8468,6 +9243,36 @@ snapshots:
|
|
8468 |
|
8469 | |
8470 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8471 | |
8472 |
dependencies:
|
8473 |
hosted-git-info: 6.1.1
|
@@ -8507,6 +9312,20 @@ snapshots:
|
|
8507 |
|
8508 | |
8509 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8510 | |
8511 |
dependencies:
|
8512 |
destr: 2.0.3
|
@@ -8558,6 +9377,8 @@ snapshots:
|
|
8558 |
strip-ansi: 6.0.1
|
8559 |
wcwidth: 1.0.1
|
8560 |
|
|
|
|
|
8561 | |
8562 |
|
8563 | |
@@ -8584,10 +9405,21 @@ snapshots:
|
|
8584 |
|
8585 | |
8586 |
|
|
|
|
|
8587 | |
8588 |
dependencies:
|
8589 |
callsites: 3.1.0
|
8590 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8591 | |
8592 |
dependencies:
|
8593 |
'@types/unist': 2.0.10
|
@@ -8614,6 +9446,8 @@ snapshots:
|
|
8614 |
|
8615 | |
8616 |
|
|
|
|
|
8617 | |
8618 |
|
8619 | |
@@ -8639,6 +9473,14 @@ snapshots:
|
|
8639 |
|
8640 | |
8641 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8642 | |
8643 |
dependencies:
|
8644 |
buffer-from: 1.1.2
|
@@ -8659,6 +9501,10 @@ snapshots:
|
|
8659 |
|
8660 | |
8661 |
|
|
|
|
|
|
|
|
|
8662 | |
8663 |
dependencies:
|
8664 |
confbox: 0.1.7
|
@@ -8750,6 +9596,8 @@ snapshots:
|
|
8750 |
|
8751 | |
8752 |
|
|
|
|
|
8753 | |
8754 |
|
8755 | |
@@ -8764,6 +9612,15 @@ snapshots:
|
|
8764 |
forwarded: 0.2.0
|
8765 |
ipaddr.js: 1.9.1
|
8766 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8767 | |
8768 |
dependencies:
|
8769 |
end-of-stream: 1.4.4
|
@@ -8780,14 +9637,31 @@ snapshots:
|
|
8780 |
inherits: 2.0.4
|
8781 |
pump: 2.0.1
|
8782 |
|
|
|
|
|
8783 | |
8784 |
|
8785 | |
8786 |
dependencies:
|
8787 |
side-channel: 1.0.6
|
8788 |
|
|
|
|
|
|
|
|
|
|
|
|
|
8789 | |
8790 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8791 | |
8792 |
|
8793 | |
@@ -8824,6 +9698,11 @@ snapshots:
|
|
8824 |
|
8825 | |
8826 |
|
|
|
|
|
|
|
|
|
|
|
8827 | |
8828 |
dependencies:
|
8829 |
'@remix-run/router': 1.17.1
|
@@ -8976,6 +9855,11 @@ snapshots:
|
|
8976 |
|
8977 | |
8978 |
|
|
|
|
|
|
|
|
|
|
|
8979 | |
8980 |
dependencies:
|
8981 |
estree-walker: 0.6.1
|
@@ -9086,8 +9970,15 @@ snapshots:
|
|
9086 |
gopd: 1.0.1
|
9087 |
has-property-descriptors: 1.0.2
|
9088 |
|
|
|
|
|
9089 | |
9090 |
|
|
|
|
|
|
|
|
|
|
|
9091 | |
9092 |
dependencies:
|
9093 |
shebang-regex: 3.0.0
|
@@ -9172,6 +10063,18 @@ snapshots:
|
|
9172 |
|
9173 | |
9174 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9175 | |
9176 |
|
9177 | |
@@ -9219,6 +10122,8 @@ snapshots:
|
|
9219 |
|
9220 | |
9221 |
|
|
|
|
|
9222 | |
9223 |
dependencies:
|
9224 |
inline-style-parser: 0.1.1
|
@@ -9309,6 +10214,10 @@ snapshots:
|
|
9309 |
|
9310 | |
9311 |
|
|
|
|
|
|
|
|
|
9312 | |
9313 |
|
9314 | |
@@ -9347,6 +10256,8 @@ snapshots:
|
|
9347 |
|
9348 | |
9349 |
|
|
|
|
|
9350 | |
9351 |
|
9352 | |
@@ -9533,6 +10444,11 @@ snapshots:
|
|
9533 |
dependencies:
|
9534 |
punycode: 2.3.1
|
9535 |
|
|
|
|
|
|
|
|
|
|
|
9536 | |
9537 |
dependencies:
|
9538 |
react: 18.3.1
|
@@ -9627,6 +10543,18 @@ snapshots:
|
|
9627 |
- supports-color
|
9628 |
- terser
|
9629 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9630 | |
9631 |
dependencies:
|
9632 |
debug: 4.3.5
|
@@ -9679,6 +10607,8 @@ snapshots:
|
|
9679 |
- supports-color
|
9680 |
- terser
|
9681 |
|
|
|
|
|
9682 | |
9683 |
dependencies:
|
9684 |
'@vue/compiler-dom': 3.4.30
|
@@ -9689,6 +10619,8 @@ snapshots:
|
|
9689 |
optionalDependencies:
|
9690 |
typescript: 5.5.2
|
9691 |
|
|
|
|
|
9692 | |
9693 |
dependencies:
|
9694 |
defaults: 1.0.4
|
|
|
36 |
packages/bolt:
|
37 |
dependencies:
|
38 |
'@ai-sdk/anthropic':
|
39 |
+
specifier: ^0.0.30
|
40 |
+
version: 0.0.30([email protected])
|
41 |
+
'@codemirror/autocomplete':
|
42 |
+
specifier: ^6.17.0
|
43 |
+
version: 6.17.0(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])
|
44 |
+
'@codemirror/commands':
|
45 |
+
specifier: ^6.6.0
|
46 |
+
version: 6.6.0
|
47 |
+
'@codemirror/lang-css':
|
48 |
+
specifier: ^6.2.1
|
49 |
+
version: 6.2.1(@codemirror/[email protected])
|
50 |
+
'@codemirror/lang-html':
|
51 |
+
specifier: ^6.4.9
|
52 |
+
version: 6.4.9
|
53 |
+
'@codemirror/lang-javascript':
|
54 |
+
specifier: ^6.2.2
|
55 |
+
version: 6.2.2
|
56 |
+
'@codemirror/lang-json':
|
57 |
+
specifier: ^6.0.1
|
58 |
+
version: 6.0.1
|
59 |
+
'@codemirror/lang-markdown':
|
60 |
+
specifier: ^6.2.5
|
61 |
+
version: 6.2.5
|
62 |
+
'@codemirror/lang-sass':
|
63 |
+
specifier: ^6.0.2
|
64 |
+
version: 6.0.2(@codemirror/[email protected])
|
65 |
+
'@codemirror/lang-wast':
|
66 |
+
specifier: ^6.0.2
|
67 |
+
version: 6.0.2
|
68 |
+
'@codemirror/language':
|
69 |
+
specifier: ^6.10.2
|
70 |
+
version: 6.10.2
|
71 |
+
'@codemirror/search':
|
72 |
+
specifier: ^6.5.6
|
73 |
+
version: 6.5.6
|
74 |
+
'@codemirror/state':
|
75 |
+
specifier: ^6.4.1
|
76 |
+
version: 6.4.1
|
77 |
+
'@codemirror/view':
|
78 |
+
specifier: ^6.28.4
|
79 |
+
version: 6.28.4
|
80 |
'@iconify-json/ph':
|
81 |
specifier: ^1.1.13
|
82 |
version: 1.1.13
|
83 |
'@iconify-json/svg-spinners':
|
84 |
specifier: ^1.1.2
|
85 |
version: 1.1.2
|
86 |
+
'@lezer/highlight':
|
87 |
+
specifier: ^1.2.0
|
88 |
+
version: 1.2.0
|
89 |
'@nanostores/react':
|
90 |
specifier: ^0.7.2
|
91 |
version: 0.7.2([email protected])([email protected])
|
|
|
102 |
specifier: ^0.61.0
|
103 |
version: 0.61.0
|
104 |
'@webcontainer/api':
|
105 |
+
specifier: ^1.3.0-internal.1
|
106 |
+
version: 1.3.0-internal.1
|
107 |
'@xterm/addon-fit':
|
108 |
specifier: ^0.10.0
|
109 |
version: 0.10.0(@xterm/[email protected])
|
|
|
114 |
specifier: ^5.5.0
|
115 |
version: 5.5.0
|
116 |
ai:
|
117 |
+
specifier: ^3.2.27
|
118 |
+
version: 3.2.27([email protected])([email protected])([email protected]([email protected]))([email protected])
|
119 |
framer-motion:
|
120 |
specifier: ^11.2.12
|
121 |
version: 11.2.12([email protected]([email protected]))([email protected])
|
|
|
134 |
react-markdown:
|
135 |
specifier: ^9.0.1
|
136 |
version: 9.0.1(@types/[email protected])([email protected])
|
137 |
+
react-resizable-panels:
|
138 |
+
specifier: ^2.0.20
|
139 |
+
version: 2.0.20([email protected]([email protected]))([email protected])
|
140 |
rehype-raw:
|
141 |
specifier: ^7.0.0
|
142 |
version: 7.0.0
|
|
|
177 |
vite:
|
178 |
specifier: ^5.3.1
|
179 |
version: 5.3.1(@types/[email protected])([email protected])
|
180 |
+
vite-plugin-node-polyfills:
|
181 |
+
specifier: ^0.22.0
|
182 |
+
version: 0.22.0([email protected])([email protected](@types/[email protected])([email protected]))
|
183 |
+
vite-plugin-optimize-css-modules:
|
184 |
+
specifier: ^1.1.0
|
185 |
+
version: 1.1.0([email protected](@types/[email protected])([email protected]))
|
186 |
vite-tsconfig-paths:
|
187 |
specifier: ^4.3.2
|
188 |
version: 4.3.2([email protected])([email protected](@types/[email protected])([email protected]))
|
|
|
195 |
|
196 |
packages:
|
197 |
|
198 |
+
'@ai-sdk/[email protected].30':
|
199 |
+
resolution: {integrity: sha512-iPJjKtIH8yk2cf5BNXLN6sn6TTghOh8puWothX4pPVBM/OKC4RWVjYTEELwUv2VDPIw918KBg2j/T0RfTgu+bw==}
|
200 |
+
engines: {node: '>=18'}
|
201 |
+
peerDependencies:
|
202 |
+
zod: ^3.0.0
|
203 |
+
|
204 |
+
'@ai-sdk/[email protected]':
|
205 |
+
resolution: {integrity: sha512-PCQFN3MlC6DShS/81IFU9NVvt9OekQGiZTEowRc2AwAwWrDsv7er3UkcMswFAL/Z7xZKjgu0dZTNH1z9oUlo7A==}
|
206 |
engines: {node: '>=18'}
|
207 |
peerDependencies:
|
208 |
zod: ^3.0.0
|
209 |
+
peerDependenciesMeta:
|
210 |
+
zod:
|
211 |
+
optional: true
|
212 |
|
213 |
+
'@ai-sdk/[email protected].2':
|
214 |
+
resolution: {integrity: sha512-57f6O4OFVNEpI8Z8o+K40tIB3YQiTw+VCql/qrAO9Utq7Ti1o6+X9tvm177DlZJL7ft0Rwzvgy48S9YhrEKgmA==}
|
215 |
engines: {node: '>=18'}
|
216 |
peerDependencies:
|
217 |
zod: ^3.0.0
|
|
|
219 |
zod:
|
220 |
optional: true
|
221 |
|
222 |
+
'@ai-sdk/[email protected].10':
|
223 |
+
resolution: {integrity: sha512-NzkrtREQpHID1cTqY/C4CI30PVOaXWKYytDR2EcytmFgnP7Z6+CrGIA/YCnNhYAuUm6Nx+nGpRL/Hmyrv7NYzg==}
|
224 |
engines: {node: '>=18'}
|
225 |
|
226 |
+
'@ai-sdk/provider@0.0.12':
|
227 |
+
resolution: {integrity: sha512-oOwPQD8i2Ynpn22cur4sk26FW3mSy6t6/X/K1Ay2yGBKYiSpRyLfObhOrZEGsXDx+3euKy4nEZ193R36NM+tpQ==}
|
228 |
+
engines: {node: '>=18'}
|
229 |
+
|
230 |
+
'@ai-sdk/[email protected]':
|
231 |
+
resolution: {integrity: sha512-r84qhn08GHtVGjvbveMekP1CeXDs5sIrdDvMaoxhCL8o90HjYTWBSDywuRJU1Jk1uPE/BwZWQu9f5bqaIx6AgA==}
|
232 |
engines: {node: '>=18'}
|
233 |
peerDependencies:
|
234 |
react: ^18 || ^19
|
|
|
239 |
zod:
|
240 |
optional: true
|
241 |
|
242 |
+
'@ai-sdk/[email protected].16':
|
243 |
+
resolution: {integrity: sha512-rhBTHLY2fx+weF/vrNmYY8S+D6Gcni77YlDDq9kANpNycL99WQo1hRy9fVJ44ICMJCpVrY/kHIl3Jlumdy3oPw==}
|
244 |
engines: {node: '>=18'}
|
245 |
peerDependencies:
|
246 |
solid-js: ^1.7.7
|
|
|
248 |
solid-js:
|
249 |
optional: true
|
250 |
|
251 |
+
'@ai-sdk/[email protected].17':
|
252 |
+
resolution: {integrity: sha512-dkN8tTMNq7U4Ya02aKd1nH2gZLj0BdleuSY6PAeIQ3huo2Z8Ixgf90ZdnWEf1BSUtdIuXwkkVz6gn+jbh3IbQQ==}
|
253 |
engines: {node: '>=18'}
|
254 |
peerDependencies:
|
255 |
svelte: ^3.0.0 || ^4.0.0
|
|
|
257 |
svelte:
|
258 |
optional: true
|
259 |
|
260 |
+
'@ai-sdk/[email protected].14':
|
261 |
+
resolution: {integrity: sha512-mm9jAkdZW+UTrSLMGwRcT7o8pHGO7Z5FmmLC0B1NH7BRzLfh1/t0ZuF1U6T7GQbmRQXwQUWjdjnlpY83kc62zw==}
|
262 |
engines: {node: '>=18'}
|
263 |
peerDependencies:
|
264 |
zod: ^3.0.0
|
|
|
266 |
zod:
|
267 |
optional: true
|
268 |
|
269 |
+
'@ai-sdk/[email protected].17':
|
270 |
+
resolution: {integrity: sha512-DoWimMtYNQbqaZZZT00NlfR/G/hEMZLwOZLC58Jp0iIxagJnAcamMJlS1rSR4+vd2UWNk4iPdgsMFdkpDvD9aA==}
|
271 |
engines: {node: '>=18'}
|
272 |
peerDependencies:
|
273 |
vue: ^3.3.4
|
|
|
488 |
'@cloudflare/[email protected]':
|
489 |
resolution: {integrity: sha512-CQD8YS6evRob7LChvIX3gE3zYo0KVgaLDOu1SwNP1BVIS2Sa0b+FC8S1e1hhrNN8/E4chYlVN+FDAgA4KRDUEQ==}
|
490 |
|
491 |
+
'@codemirror/[email protected]':
|
492 |
+
resolution: {integrity: sha512-fdfj6e6ZxZf8yrkMHUSJJir7OJkHkZKaOZGzLWIYp2PZ3jd+d+UjG8zVPqJF6d3bKxkhvXTPan/UZ1t7Bqm0gA==}
|
493 |
+
peerDependencies:
|
494 |
+
'@codemirror/language': ^6.0.0
|
495 |
+
'@codemirror/state': ^6.0.0
|
496 |
+
'@codemirror/view': ^6.0.0
|
497 |
+
'@lezer/common': ^1.0.0
|
498 |
+
|
499 |
+
'@codemirror/[email protected]':
|
500 |
+
resolution: {integrity: sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==}
|
501 |
+
|
502 |
+
'@codemirror/[email protected]':
|
503 |
+
resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==}
|
504 |
+
|
505 |
+
'@codemirror/[email protected]':
|
506 |
+
resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==}
|
507 |
+
|
508 |
+
'@codemirror/[email protected]':
|
509 |
+
resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==}
|
510 |
+
|
511 |
+
'@codemirror/[email protected]':
|
512 |
+
resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==}
|
513 |
+
|
514 |
+
'@codemirror/[email protected]':
|
515 |
+
resolution: {integrity: sha512-Hgke565YcO4fd9pe2uLYxnMufHO5rQwRr+AAhFq8ABuhkrjyX8R5p5s+hZUTdV60O0dMRjxKhBLxz8pu/MkUVA==}
|
516 |
+
|
517 |
+
'@codemirror/[email protected]':
|
518 |
+
resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==}
|
519 |
+
|
520 |
+
'@codemirror/[email protected]':
|
521 |
+
resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==}
|
522 |
+
|
523 |
+
'@codemirror/[email protected]':
|
524 |
+
resolution: {integrity: sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==}
|
525 |
+
|
526 |
+
'@codemirror/[email protected]':
|
527 |
+
resolution: {integrity: sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==}
|
528 |
+
|
529 |
+
'@codemirror/[email protected]':
|
530 |
+
resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==}
|
531 |
+
|
532 |
+
'@codemirror/[email protected]':
|
533 |
+
resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==}
|
534 |
+
|
535 |
+
'@codemirror/[email protected]':
|
536 |
+
resolution: {integrity: sha512-QScv95fiviSQ/CaVGflxAvvvDy/9wi0RFyDl4LkHHWiMr/UPebyuTspmYSeN5Nx6eujcPYwsQzA6ZIZucKZVHQ==}
|
537 |
+
|
538 |
'@commitlint/[email protected]':
|
539 |
resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==}
|
540 |
engines: {node: '>=v18'}
|
|
|
1105 |
'@jspm/[email protected]':
|
1106 |
resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==}
|
1107 |
|
1108 |
+
'@lezer/[email protected]':
|
1109 |
+
resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==}
|
1110 |
+
|
1111 |
+
'@lezer/[email protected]':
|
1112 |
+
resolution: {integrity: sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==}
|
1113 |
+
|
1114 |
+
'@lezer/[email protected]':
|
1115 |
+
resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==}
|
1116 |
+
|
1117 |
+
'@lezer/[email protected]':
|
1118 |
+
resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==}
|
1119 |
+
|
1120 |
+
'@lezer/[email protected]':
|
1121 |
+
resolution: {integrity: sha512-bYW4ctpyGK+JMumDApeUzuIezX01H76R1foD6LcRX224FWfyYit/HYxiPGDjXXe/wQWASjCvVGoukTH68+0HIA==}
|
1122 |
+
|
1123 |
+
'@lezer/[email protected]':
|
1124 |
+
resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==}
|
1125 |
+
|
1126 |
+
'@lezer/[email protected]':
|
1127 |
+
resolution: {integrity: sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==}
|
1128 |
+
|
1129 |
+
'@lezer/[email protected]':
|
1130 |
+
resolution: {integrity: sha512-ErbEQ15eowmJUyT095e9NJc3BI9yZ894fjSDtHftD0InkfUBGgnKSU6dvan9jqsZuNHg2+ag/1oyDRxNsENupQ==}
|
1131 |
+
|
1132 |
+
'@lezer/[email protected]':
|
1133 |
+
resolution: {integrity: sha512-w/RCO2dIzZH1To8p+xjs8cE+yfgGus8NZ/dXeWl/QzHyr+TeBs71qiE70KPImEwvTsmEjoWh0A5SxMzKd5BWBQ==}
|
1134 |
+
|
1135 |
'@mdx-js/[email protected]':
|
1136 |
resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==}
|
1137 |
|
|
|
1170 |
resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==}
|
1171 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
1172 |
|
1173 |
+
'@opentelemetry/[email protected]':
|
1174 |
+
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
|
1175 |
+
engines: {node: '>=8.0.0'}
|
1176 |
+
|
1177 |
'@pkgjs/[email protected]':
|
1178 |
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
1179 |
engines: {node: '>=14'}
|
|
|
1311 |
'@remix-run/[email protected]':
|
1312 |
resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==}
|
1313 |
|
1314 |
+
'@rollup/[email protected]':
|
1315 |
+
resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==}
|
1316 |
+
engines: {node: '>=14.0.0'}
|
1317 |
+
peerDependencies:
|
1318 |
+
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
|
1319 |
+
peerDependenciesMeta:
|
1320 |
+
rollup:
|
1321 |
+
optional: true
|
1322 |
+
|
1323 |
'@rollup/[email protected]':
|
1324 |
resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
|
1325 |
engines: {node: '>=14.0.0'}
|
|
|
1701 |
'@web3-storage/[email protected]':
|
1702 |
resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==}
|
1703 |
|
1704 |
+
'@webcontainer/api@1.3.0-internal.1':
|
1705 |
+
resolution: {integrity: sha512-XHveAaZgZItLWieict8xTteBbPLeAwCJLuc80Zq6Mmk0LEWTw8yYZep0dTKbet6bd9MPTQ1+vjPAsEtD0H1fOA==}
|
1706 |
|
1707 |
'@xterm/[email protected]':
|
1708 |
resolution: {integrity: sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==}
|
|
|
1750 |
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
|
1751 |
engines: {node: '>=8'}
|
1752 |
|
1753 |
+
[email protected].27:
|
1754 |
+
resolution: {integrity: sha512-J0SCozj1c8ZTprYVAH3LL1XYR5TRT6oGsXZ5leSqXeEo1SWBx6rFEqDKZLFskLvOf3Ta/AG6EDDrP1EErwapMQ==}
|
1755 |
engines: {node: '>=18'}
|
1756 |
peerDependencies:
|
1757 |
openai: ^4.42.0
|
|
|
1824 | |
1825 |
resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==}
|
1826 |
|
1827 | |
1828 |
+
resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==}
|
1829 |
+
|
1830 | |
1831 |
+
resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
|
1832 |
+
|
1833 | |
1834 |
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
|
1835 |
engines: {node: '>=12'}
|
|
|
1868 | |
1869 |
resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
|
1870 |
|
1871 | |
1872 |
+
resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
|
1873 |
+
|
1874 | |
1875 |
+
resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
|
1876 |
+
|
1877 | |
1878 |
resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
|
1879 |
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
|
|
1888 |
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
1889 |
engines: {node: '>=8'}
|
1890 |
|
1891 | |
1892 |
+
resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
|
1893 |
+
|
1894 | |
1895 |
+
resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==}
|
1896 |
+
|
1897 | |
1898 |
+
resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
|
1899 |
+
|
1900 | |
1901 |
+
resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
|
1902 |
+
|
1903 | |
1904 |
+
resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
|
1905 |
+
|
1906 | |
1907 |
+
resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==}
|
1908 |
+
|
1909 | |
1910 |
+
resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==}
|
1911 |
+
engines: {node: '>= 0.12'}
|
1912 |
+
|
1913 | |
1914 |
resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==}
|
1915 |
|
1916 | |
1917 |
+
resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
|
1918 |
+
|
1919 | |
1920 |
resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==}
|
1921 |
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
|
|
1924 | |
1925 |
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
|
1926 |
|
1927 | |
1928 |
+
resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
|
1929 |
+
|
1930 | |
1931 |
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
1932 |
|
1933 | |
1934 |
+
resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
|
1935 |
+
|
1936 | |
1937 |
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
|
1938 |
engines: {node: '>= 0.8'}
|
|
|
2013 |
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
|
2014 |
engines: {node: '>=8'}
|
2015 |
|
2016 | |
2017 |
+
resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
|
2018 |
+
|
2019 | |
2020 |
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
|
2021 |
engines: {node: '>=6'}
|
|
|
2088 |
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
|
2089 |
engines: {node: ^14.18.0 || >=16.10.0}
|
2090 |
|
2091 | |
2092 |
+
resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
|
2093 |
+
|
2094 | |
2095 |
+
resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
|
2096 |
+
|
2097 | |
2098 |
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
|
2099 |
engines: {node: '>= 0.6'}
|
|
|
2153 |
typescript:
|
2154 |
optional: true
|
2155 |
|
2156 | |
2157 |
+
resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
|
2158 |
+
|
2159 | |
2160 |
+
resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
|
2161 |
+
|
2162 | |
2163 |
+
resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
|
2164 |
+
|
2165 | |
2166 |
+
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
|
2167 |
+
|
2168 | |
2169 |
+
resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
|
2170 |
+
|
2171 | |
2172 |
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
2173 |
engines: {node: '>= 8'}
|
2174 |
|
2175 | |
2176 |
+
resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==}
|
2177 |
+
|
2178 | |
2179 |
resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
|
2180 |
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
|
|
|
2254 |
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
|
2255 |
engines: {node: '>= 0.4'}
|
2256 |
|
2257 | |
2258 |
+
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
|
2259 |
+
engines: {node: '>= 0.4'}
|
2260 |
+
|
2261 | |
2262 |
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
2263 |
|
|
|
2269 |
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
2270 |
engines: {node: '>=6'}
|
2271 |
|
2272 | |
2273 |
+
resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
|
2274 |
+
|
2275 | |
2276 |
resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
|
2277 |
|
|
|
2293 |
resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
|
2294 |
engines: {node: '>=0.3.1'}
|
2295 |
|
2296 | |
2297 |
+
resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
|
2298 |
+
|
2299 | |
2300 |
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
|
2301 |
engines: {node: '>=8'}
|
2302 |
|
2303 | |
2304 |
+
resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==}
|
2305 |
+
engines: {node: '>=10'}
|
2306 |
+
|
2307 | |
2308 |
resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
|
2309 |
engines: {node: '>=8'}
|
|
|
2327 | |
2328 |
resolution: {integrity: sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==}
|
2329 |
|
2330 | |
2331 |
+
resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==}
|
2332 |
+
|
2333 | |
2334 |
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
|
2335 |
|
|
|
2527 |
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
|
2528 |
engines: {node: '>=6'}
|
2529 |
|
2530 | |
2531 |
+
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
|
2532 |
+
engines: {node: '>=0.8.x'}
|
2533 |
+
|
2534 | |
2535 |
resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==}
|
2536 |
engines: {node: '>=14.18'}
|
2537 |
|
2538 | |
2539 |
+
resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
|
2540 |
+
|
2541 | |
2542 |
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
|
2543 |
engines: {node: '>=10'}
|
|
|
2779 |
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
|
2780 |
engines: {node: '>= 0.4'}
|
2781 |
|
2782 | |
2783 |
+
resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==}
|
2784 |
+
engines: {node: '>=4'}
|
2785 |
+
|
2786 | |
2787 |
+
resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
|
2788 |
+
engines: {node: '>=4'}
|
2789 |
+
|
2790 | |
2791 |
+
resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
|
2792 |
+
|
2793 | |
2794 |
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
2795 |
engines: {node: '>= 0.4'}
|
|
|
2821 | |
2822 |
resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
|
2823 |
|
2824 | |
2825 |
+
resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
|
2826 |
+
|
2827 | |
2828 |
resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==}
|
2829 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
|
|
2838 |
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
2839 |
engines: {node: '>= 0.8'}
|
2840 |
|
2841 | |
2842 |
+
resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
|
2843 |
+
|
2844 | |
2845 |
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
2846 |
engines: {node: '>=10.17.0'}
|
|
|
2972 |
resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
|
2973 |
engines: {node: '>=8'}
|
2974 |
|
2975 | |
2976 |
+
resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
|
2977 |
+
engines: {node: '>= 0.4'}
|
2978 |
+
|
2979 | |
2980 |
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
2981 |
engines: {node: '>=0.12.0'}
|
|
|
3029 | |
3030 |
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
3031 |
|
3032 | |
3033 |
+
resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==}
|
3034 |
+
engines: {node: '>=10'}
|
3035 |
+
|
3036 | |
3037 |
resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==}
|
3038 |
engines: {node: '>=14'}
|
|
|
3215 | |
3216 |
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
|
3217 |
|
3218 | |
3219 |
+
resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
|
3220 |
+
|
3221 | |
3222 |
resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
|
3223 |
|
|
|
3499 |
resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
|
3500 |
engines: {node: '>=8.6'}
|
3501 |
|
3502 | |
3503 |
+
resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
|
3504 |
+
hasBin: true
|
3505 |
+
|
3506 | |
3507 |
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
|
3508 |
engines: {node: '>= 0.6'}
|
|
|
3539 |
engines: {node: '>=16.13'}
|
3540 |
hasBin: true
|
3541 |
|
3542 | |
3543 |
+
resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
|
3544 |
+
|
3545 | |
3546 |
+
resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
|
3547 |
+
|
3548 | |
3549 |
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
3550 |
|
|
|
3657 | |
3658 |
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
|
3659 |
|
3660 | |
3661 |
+
resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==}
|
3662 |
+
engines: {node: '>=10'}
|
3663 |
+
|
3664 | |
3665 |
resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==}
|
3666 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
|
|
3697 |
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
|
3698 |
engines: {node: '>= 0.4'}
|
3699 |
|
3700 | |
3701 |
+
resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
|
3702 |
+
engines: {node: '>= 0.4'}
|
3703 |
+
|
3704 | |
3705 |
+
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
|
3706 |
+
engines: {node: '>= 0.4'}
|
3707 |
+
|
3708 | |
3709 |
+
resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
|
3710 |
+
engines: {node: '>= 0.4'}
|
3711 |
+
|
3712 | |
3713 |
resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==}
|
3714 |
|
|
|
3743 |
resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
|
3744 |
engines: {node: '>=10'}
|
3745 |
|
3746 | |
3747 |
+
resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
|
3748 |
+
|
3749 | |
3750 |
resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==}
|
3751 |
|
|
|
3775 | |
3776 |
resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
|
3777 |
|
3778 | |
3779 |
+
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
|
3780 |
+
|
3781 | |
3782 |
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
|
3783 |
engines: {node: '>=6'}
|
3784 |
|
3785 | |
3786 |
+
resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==}
|
3787 |
+
engines: {node: '>= 0.10'}
|
3788 |
+
|
3789 | |
3790 |
resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
|
3791 |
|
|
|
3804 |
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
|
3805 |
engines: {node: '>= 0.8'}
|
3806 |
|
3807 | |
3808 |
+
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
|
3809 |
+
|
3810 | |
3811 |
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
|
3812 |
engines: {node: '>=8'}
|
|
|
3847 |
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
|
3848 |
engines: {node: '>= 14.16'}
|
3849 |
|
3850 | |
3851 |
+
resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
|
3852 |
+
engines: {node: '>=0.12'}
|
3853 |
+
|
3854 | |
3855 |
resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==}
|
3856 |
|
|
|
3872 |
engines: {node: '>=0.10'}
|
3873 |
hasBin: true
|
3874 |
|
3875 | |
3876 |
+
resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==}
|
3877 |
+
engines: {node: '>=10'}
|
3878 |
+
|
3879 | |
3880 |
resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==}
|
3881 |
|
|
|
3977 | |
3978 |
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
|
3979 |
|
3980 | |
3981 |
+
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
|
3982 |
+
engines: {node: '>= 0.6.0'}
|
3983 |
+
|
3984 | |
3985 |
resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
|
3986 |
peerDependencies:
|
|
|
4000 |
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
4001 |
engines: {node: '>= 0.10'}
|
4002 |
|
4003 | |
4004 |
+
resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
|
4005 |
+
|
4006 | |
4007 |
resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==}
|
4008 |
|
|
|
4012 | |
4013 |
resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==}
|
4014 |
|
4015 | |
4016 |
+
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
|
4017 |
+
|
4018 | |
4019 |
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
4020 |
engines: {node: '>=6'}
|
|
|
4023 |
resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
|
4024 |
engines: {node: '>=0.6'}
|
4025 |
|
4026 | |
4027 |
+
resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==}
|
4028 |
+
engines: {node: '>=0.6'}
|
4029 |
+
|
4030 | |
4031 |
+
resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
|
4032 |
+
engines: {node: '>=0.4.x'}
|
4033 |
+
|
4034 | |
4035 |
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
4036 |
|
4037 | |
4038 |
+
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
|
4039 |
+
|
4040 | |
4041 |
+
resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
|
4042 |
+
|
4043 | |
4044 |
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
4045 |
engines: {node: '>= 0.6'}
|
|
|
4066 |
resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
|
4067 |
engines: {node: '>=0.10.0'}
|
4068 |
|
4069 | |
4070 |
+
resolution: {integrity: sha512-aMbK3VF8U+VBICG+rwhE0Rr/eFZaRzmNq3akBRL1TrayIpLXz7Rbok0//kYeWj6SQRsjcQ3f4eRplJicM+oL6w==}
|
4071 |
+
peerDependencies:
|
4072 |
+
react: ^16.14.0 || ^17.0.0 || ^18.0.0
|
4073 |
+
react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0
|
4074 |
+
|
4075 | |
4076 |
resolution: {integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==}
|
4077 |
engines: {node: '>=14.0.0'}
|
|
|
4209 |
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
|
4210 |
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
4211 |
|
4212 | |
4213 |
+
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
|
4214 |
+
|
4215 | |
4216 |
resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==}
|
4217 |
deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.
|
|
|
4282 |
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
|
4283 |
engines: {node: '>= 0.4'}
|
4284 |
|
4285 | |
4286 |
+
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
|
4287 |
+
|
4288 | |
4289 |
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
4290 |
|
4291 | |
4292 |
+
resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
|
4293 |
+
hasBin: true
|
4294 |
+
|
4295 | |
4296 |
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
4297 |
engines: {node: '>=8'}
|
|
|
4389 |
resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==}
|
4390 |
engines: {node: '>=4', npm: '>=6'}
|
4391 |
|
4392 | |
4393 |
+
resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
|
4394 |
+
|
4395 | |
4396 |
+
resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==}
|
4397 |
+
|
4398 | |
4399 |
resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
|
4400 |
|
|
|
4445 |
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
4446 |
engines: {node: '>=8'}
|
4447 |
|
4448 | |
4449 |
+
resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==}
|
4450 |
+
|
4451 | |
4452 |
resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
|
4453 |
|
|
|
4515 | |
4516 |
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
|
4517 |
|
4518 | |
4519 |
+
resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==}
|
4520 |
+
engines: {node: '>=0.6.0'}
|
4521 |
+
|
4522 | |
4523 |
resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==}
|
4524 |
|
|
|
4578 | |
4579 |
resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
|
4580 |
|
4581 | |
4582 |
+
resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==}
|
4583 |
+
|
4584 | |
4585 |
resolution: {integrity: sha512-FKFg7A0To1VU4CH9YmSMON5QphK0BXjSoiC7D9yMh+mEEbXLUP9qJ4hEt1qcjKtzncs1OpcnjZO8NgrlVbZH+g==}
|
4586 |
|
|
|
4719 | |
4720 |
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
4721 |
|
4722 | |
4723 |
+
resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==}
|
4724 |
+
|
4725 | |
4726 |
resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
|
4727 |
peerDependencies:
|
|
|
4778 |
engines: {node: ^18.0.0 || >=20.0.0}
|
4779 |
hasBin: true
|
4780 |
|
4781 | |
4782 |
+
resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==}
|
4783 |
+
peerDependencies:
|
4784 |
+
vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
|
4785 |
+
|
4786 | |
4787 |
+
resolution: {integrity: sha512-6vtG+GwqBoT0yz90LAKKPf0HkiKkX7oCUzdw0Y0Jjv2S4pKyifq2IKTgCEJu5cLYhPku1mrPIjNVvQRmP0RgLQ==}
|
4788 |
+
peerDependencies:
|
4789 |
+
vite: ^5.0.0 || ^4.0.0 || ^3.0.0 || ^2.0.0
|
4790 |
+
|
4791 | |
4792 |
resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==}
|
4793 |
peerDependencies:
|
|
|
4849 |
jsdom:
|
4850 |
optional: true
|
4851 |
|
4852 | |
4853 |
+
resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
|
4854 |
+
|
4855 | |
4856 |
resolution: {integrity: sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==}
|
4857 |
peerDependencies:
|
|
|
4860 |
typescript:
|
4861 |
optional: true
|
4862 |
|
4863 | |
4864 |
+
resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
|
4865 |
+
|
4866 | |
4867 |
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
|
4868 |
|
|
|
5003 |
|
5004 |
snapshots:
|
5005 |
|
5006 |
+
'@ai-sdk/[email protected].30([email protected])':
|
5007 |
+
dependencies:
|
5008 |
+
'@ai-sdk/provider': 0.0.12
|
5009 |
+
'@ai-sdk/provider-utils': 1.0.2([email protected])
|
5010 |
+
zod: 3.23.8
|
5011 |
+
|
5012 |
+
'@ai-sdk/[email protected]([email protected])':
|
5013 |
dependencies:
|
5014 |
+
'@ai-sdk/provider': 0.0.10
|
5015 |
+
eventsource-parser: 1.1.2
|
5016 |
+
nanoid: 3.3.6
|
5017 |
+
secure-json-parse: 2.7.0
|
5018 |
+
optionalDependencies:
|
5019 |
zod: 3.23.8
|
5020 |
|
5021 |
+
'@ai-sdk/[email protected].2([email protected])':
|
5022 |
dependencies:
|
5023 |
+
'@ai-sdk/provider': 0.0.12
|
5024 |
eventsource-parser: 1.1.2
|
5025 |
nanoid: 3.3.6
|
5026 |
secure-json-parse: 2.7.0
|
5027 |
optionalDependencies:
|
5028 |
zod: 3.23.8
|
5029 |
|
5030 |
+
'@ai-sdk/[email protected].10':
|
5031 |
dependencies:
|
5032 |
json-schema: 0.4.0
|
5033 |
|
5034 |
+
'@ai-sdk/provider@0.0.12':
|
5035 |
dependencies:
|
5036 |
+
json-schema: 0.4.0
|
5037 |
+
|
5038 |
+
'@ai-sdk/[email protected]([email protected])([email protected])':
|
5039 |
+
dependencies:
|
5040 |
+
'@ai-sdk/provider-utils': 1.0.2([email protected])
|
5041 |
+
'@ai-sdk/ui-utils': 0.0.14([email protected])
|
5042 |
swr: 2.2.0([email protected])
|
5043 |
optionalDependencies:
|
5044 |
react: 18.3.1
|
5045 |
zod: 3.23.8
|
5046 |
|
5047 |
+
'@ai-sdk/[email protected].16([email protected])':
|
5048 |
dependencies:
|
5049 |
+
'@ai-sdk/ui-utils': 0.0.14([email protected])
|
5050 |
transitivePeerDependencies:
|
5051 |
- zod
|
5052 |
|
5053 |
+
'@ai-sdk/[email protected].17([email protected])([email protected])':
|
5054 |
dependencies:
|
5055 |
+
'@ai-sdk/provider-utils': 1.0.2([email protected])
|
5056 |
+
'@ai-sdk/ui-utils': 0.0.14([email protected])
|
5057 |
sswr: 2.1.0([email protected])
|
5058 |
optionalDependencies:
|
5059 |
svelte: 4.2.18
|
5060 |
transitivePeerDependencies:
|
5061 |
- zod
|
5062 |
|
5063 |
+
'@ai-sdk/[email protected].14([email protected])':
|
5064 |
dependencies:
|
5065 |
+
'@ai-sdk/provider-utils': 1.0.2([email protected])
|
5066 |
secure-json-parse: 2.7.0
|
5067 |
optionalDependencies:
|
5068 |
zod: 3.23.8
|
5069 |
|
5070 |
+
'@ai-sdk/[email protected].17([email protected]([email protected]))([email protected])':
|
5071 |
dependencies:
|
5072 |
+
'@ai-sdk/provider-utils': 0.0.14([email protected])
|
5073 |
+
'@ai-sdk/ui-utils': 0.0.14([email protected])
|
5074 |
swrv: 1.0.4([email protected]([email protected]))
|
5075 |
optionalDependencies:
|
5076 |
vue: 3.4.30([email protected])
|
|
|
5363 |
|
5364 |
'@cloudflare/[email protected]': {}
|
5365 |
|
5366 |
+
'@codemirror/[email protected](@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])':
|
5367 |
+
dependencies:
|
5368 |
+
'@codemirror/language': 6.10.2
|
5369 |
+
'@codemirror/state': 6.4.1
|
5370 |
+
'@codemirror/view': 6.28.4
|
5371 |
+
'@lezer/common': 1.2.1
|
5372 |
+
|
5373 |
+
'@codemirror/[email protected]':
|
5374 |
+
dependencies:
|
5375 |
+
'@codemirror/language': 6.10.2
|
5376 |
+
'@codemirror/state': 6.4.1
|
5377 |
+
'@codemirror/view': 6.28.4
|
5378 |
+
'@lezer/common': 1.2.1
|
5379 |
+
|
5380 |
+
'@codemirror/[email protected](@codemirror/[email protected])':
|
5381 |
+
dependencies:
|
5382 |
+
'@codemirror/autocomplete': 6.17.0(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])
|
5383 |
+
'@codemirror/language': 6.10.2
|
5384 |
+
'@codemirror/state': 6.4.1
|
5385 |
+
'@lezer/common': 1.2.1
|
5386 |
+
'@lezer/css': 1.1.8
|
5387 |
+
transitivePeerDependencies:
|
5388 |
+
- '@codemirror/view'
|
5389 |
+
|
5390 |
+
'@codemirror/[email protected]':
|
5391 |
+
dependencies:
|
5392 |
+
'@codemirror/autocomplete': 6.17.0(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])
|
5393 |
+
'@codemirror/lang-css': 6.2.1(@codemirror/[email protected])
|
5394 |
+
'@codemirror/lang-javascript': 6.2.2
|
5395 |
+
'@codemirror/language': 6.10.2
|
5396 |
+
'@codemirror/state': 6.4.1
|
5397 |
+
'@codemirror/view': 6.28.4
|
5398 |
+
'@lezer/common': 1.2.1
|
5399 |
+
'@lezer/css': 1.1.8
|
5400 |
+
'@lezer/html': 1.3.10
|
5401 |
+
|
5402 |
+
'@codemirror/[email protected]':
|
5403 |
+
dependencies:
|
5404 |
+
'@codemirror/autocomplete': 6.17.0(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])
|
5405 |
+
'@codemirror/language': 6.10.2
|
5406 |
+
'@codemirror/lint': 6.8.1
|
5407 |
+
'@codemirror/state': 6.4.1
|
5408 |
+
'@codemirror/view': 6.28.4
|
5409 |
+
'@lezer/common': 1.2.1
|
5410 |
+
'@lezer/javascript': 1.4.17
|
5411 |
+
|
5412 |
+
'@codemirror/[email protected]':
|
5413 |
+
dependencies:
|
5414 |
+
'@codemirror/language': 6.10.2
|
5415 |
+
'@lezer/json': 1.0.2
|
5416 |
+
|
5417 |
+
'@codemirror/[email protected]':
|
5418 |
+
dependencies:
|
5419 |
+
'@codemirror/autocomplete': 6.17.0(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])(@lezer/[email protected])
|
5420 |
+
'@codemirror/lang-html': 6.4.9
|
5421 |
+
'@codemirror/language': 6.10.2
|
5422 |
+
'@codemirror/state': 6.4.1
|
5423 |
+
'@codemirror/view': 6.28.4
|
5424 |
+
'@lezer/common': 1.2.1
|
5425 |
+
'@lezer/markdown': 1.3.0
|
5426 |
+
|
5427 |
+
'@codemirror/[email protected](@codemirror/[email protected])':
|
5428 |
+
dependencies:
|
5429 |
+
'@codemirror/lang-css': 6.2.1(@codemirror/[email protected])
|
5430 |
+
'@codemirror/language': 6.10.2
|
5431 |
+
'@codemirror/state': 6.4.1
|
5432 |
+
'@lezer/common': 1.2.1
|
5433 |
+
'@lezer/sass': 1.0.6
|
5434 |
+
transitivePeerDependencies:
|
5435 |
+
- '@codemirror/view'
|
5436 |
+
|
5437 |
+
'@codemirror/[email protected]':
|
5438 |
+
dependencies:
|
5439 |
+
'@codemirror/language': 6.10.2
|
5440 |
+
'@lezer/common': 1.2.1
|
5441 |
+
'@lezer/highlight': 1.2.0
|
5442 |
+
'@lezer/lr': 1.4.1
|
5443 |
+
|
5444 |
+
'@codemirror/[email protected]':
|
5445 |
+
dependencies:
|
5446 |
+
'@codemirror/state': 6.4.1
|
5447 |
+
'@codemirror/view': 6.28.4
|
5448 |
+
'@lezer/common': 1.2.1
|
5449 |
+
'@lezer/highlight': 1.2.0
|
5450 |
+
'@lezer/lr': 1.4.1
|
5451 |
+
style-mod: 4.1.2
|
5452 |
+
|
5453 |
+
'@codemirror/[email protected]':
|
5454 |
+
dependencies:
|
5455 |
+
'@codemirror/state': 6.4.1
|
5456 |
+
'@codemirror/view': 6.28.4
|
5457 |
+
crelt: 1.0.6
|
5458 |
+
|
5459 |
+
'@codemirror/[email protected]':
|
5460 |
+
dependencies:
|
5461 |
+
'@codemirror/state': 6.4.1
|
5462 |
+
'@codemirror/view': 6.28.4
|
5463 |
+
crelt: 1.0.6
|
5464 |
+
|
5465 |
+
'@codemirror/[email protected]': {}
|
5466 |
+
|
5467 |
+
'@codemirror/[email protected]':
|
5468 |
+
dependencies:
|
5469 |
+
'@codemirror/state': 6.4.1
|
5470 |
+
style-mod: 4.1.2
|
5471 |
+
w3c-keyname: 2.2.8
|
5472 |
+
|
5473 |
'@commitlint/[email protected](@types/[email protected])([email protected])':
|
5474 |
dependencies:
|
5475 |
'@commitlint/format': 19.3.0
|
|
|
5896 |
|
5897 |
'@jspm/[email protected]': {}
|
5898 |
|
5899 |
+
'@lezer/[email protected]': {}
|
5900 |
+
|
5901 |
+
'@lezer/[email protected]':
|
5902 |
+
dependencies:
|
5903 |
+
'@lezer/common': 1.2.1
|
5904 |
+
'@lezer/highlight': 1.2.0
|
5905 |
+
'@lezer/lr': 1.4.1
|
5906 |
+
|
5907 |
+
'@lezer/[email protected]':
|
5908 |
+
dependencies:
|
5909 |
+
'@lezer/common': 1.2.1
|
5910 |
+
|
5911 |
+
'@lezer/[email protected]':
|
5912 |
+
dependencies:
|
5913 |
+
'@lezer/common': 1.2.1
|
5914 |
+
'@lezer/highlight': 1.2.0
|
5915 |
+
'@lezer/lr': 1.4.1
|
5916 |
+
|
5917 |
+
'@lezer/[email protected]':
|
5918 |
+
dependencies:
|
5919 |
+
'@lezer/common': 1.2.1
|
5920 |
+
'@lezer/highlight': 1.2.0
|
5921 |
+
'@lezer/lr': 1.4.1
|
5922 |
+
|
5923 |
+
'@lezer/[email protected]':
|
5924 |
+
dependencies:
|
5925 |
+
'@lezer/common': 1.2.1
|
5926 |
+
'@lezer/highlight': 1.2.0
|
5927 |
+
'@lezer/lr': 1.4.1
|
5928 |
+
|
5929 |
+
'@lezer/[email protected]':
|
5930 |
+
dependencies:
|
5931 |
+
'@lezer/common': 1.2.1
|
5932 |
+
|
5933 |
+
'@lezer/[email protected]':
|
5934 |
+
dependencies:
|
5935 |
+
'@lezer/common': 1.2.1
|
5936 |
+
'@lezer/highlight': 1.2.0
|
5937 |
+
|
5938 |
+
'@lezer/[email protected]':
|
5939 |
+
dependencies:
|
5940 |
+
'@lezer/common': 1.2.1
|
5941 |
+
'@lezer/highlight': 1.2.0
|
5942 |
+
'@lezer/lr': 1.4.1
|
5943 |
+
|
5944 |
'@mdx-js/[email protected]':
|
5945 |
dependencies:
|
5946 |
'@types/estree-jsx': 1.0.5
|
|
|
6013 |
dependencies:
|
6014 |
which: 3.0.1
|
6015 |
|
6016 |
+
'@opentelemetry/[email protected]': {}
|
6017 |
+
|
6018 |
'@pkgjs/[email protected]':
|
6019 |
optional: true
|
6020 |
|
|
|
6229 |
dependencies:
|
6230 |
web-streams-polyfill: 3.3.3
|
6231 |
|
6232 |
+
'@rollup/[email protected]([email protected])':
|
6233 |
+
dependencies:
|
6234 |
+
'@rollup/pluginutils': 5.1.0([email protected])
|
6235 |
+
estree-walker: 2.0.2
|
6236 |
+
magic-string: 0.30.10
|
6237 |
+
optionalDependencies:
|
6238 |
+
rollup: 4.18.0
|
6239 |
+
|
6240 |
'@rollup/[email protected]([email protected])':
|
6241 |
dependencies:
|
6242 |
'@types/estree': 1.0.5
|
|
|
6759 |
|
6760 |
'@web3-storage/[email protected]': {}
|
6761 |
|
6762 |
+
'@webcontainer/api@1.3.0-internal.1': {}
|
6763 |
|
6764 |
'@xterm/[email protected](@xterm/[email protected])':
|
6765 |
dependencies:
|
|
|
6803 |
clean-stack: 2.2.0
|
6804 |
indent-string: 4.0.0
|
6805 |
|
6806 | |
6807 |
dependencies:
|
6808 |
+
'@ai-sdk/provider': 0.0.12
|
6809 |
+
'@ai-sdk/provider-utils': 1.0.2([email protected])
|
6810 |
+
'@ai-sdk/react': 0.0.22([email protected])([email protected])
|
6811 |
+
'@ai-sdk/solid': 0.0.16([email protected])
|
6812 |
+
'@ai-sdk/svelte': 0.0.17([email protected])([email protected])
|
6813 |
+
'@ai-sdk/ui-utils': 0.0.14([email protected])
|
6814 |
+
'@ai-sdk/vue': 0.0.17([email protected]([email protected]))([email protected])
|
6815 |
+
'@opentelemetry/api': 1.9.0
|
6816 |
eventsource-parser: 1.1.2
|
6817 |
json-schema: 0.4.0
|
6818 |
jsondiffpatch: 0.6.0
|
|
|
6881 |
dependencies:
|
6882 |
printable-characters: 1.0.42
|
6883 |
|
6884 | |
6885 |
+
dependencies:
|
6886 |
+
bn.js: 4.12.0
|
6887 |
+
inherits: 2.0.4
|
6888 |
+
minimalistic-assert: 1.0.1
|
6889 |
+
|
6890 | |
6891 |
+
dependencies:
|
6892 |
+
call-bind: 1.0.7
|
6893 |
+
is-nan: 1.3.2
|
6894 |
+
object-is: 1.1.6
|
6895 |
+
object.assign: 4.1.5
|
6896 |
+
util: 0.12.5
|
6897 |
+
|
6898 | |
6899 |
|
6900 | |
|
|
6928 |
|
6929 | |
6930 |
|
6931 |
+
[email protected]: {}
|
6932 |
+
|
6933 |
+
[email protected]: {}
|
6934 |
+
|
6935 | |
6936 |
dependencies:
|
6937 |
bytes: 3.1.2
|
|
|
6962 |
dependencies:
|
6963 |
fill-range: 7.1.1
|
6964 |
|
6965 |
+
[email protected]: {}
|
6966 |
+
|
6967 | |
6968 |
+
dependencies:
|
6969 |
+
resolve: 1.22.8
|
6970 |
+
|
6971 | |
6972 |
+
dependencies:
|
6973 |
+
buffer-xor: 1.0.3
|
6974 |
+
cipher-base: 1.0.4
|
6975 |
+
create-hash: 1.2.0
|
6976 |
+
evp_bytestokey: 1.0.3
|
6977 |
+
inherits: 2.0.4
|
6978 |
+
safe-buffer: 5.2.1
|
6979 |
+
|
6980 | |
6981 |
+
dependencies:
|
6982 |
+
browserify-aes: 1.2.0
|
6983 |
+
browserify-des: 1.0.2
|
6984 |
+
evp_bytestokey: 1.0.3
|
6985 |
+
|
6986 | |
6987 |
+
dependencies:
|
6988 |
+
cipher-base: 1.0.4
|
6989 |
+
des.js: 1.1.0
|
6990 |
+
inherits: 2.0.4
|
6991 |
+
safe-buffer: 5.2.1
|
6992 |
+
|
6993 | |
6994 |
+
dependencies:
|
6995 |
+
bn.js: 5.2.1
|
6996 |
+
randombytes: 2.1.0
|
6997 |
+
|
6998 | |
6999 |
+
dependencies:
|
7000 |
+
bn.js: 5.2.1
|
7001 |
+
browserify-rsa: 4.1.0
|
7002 |
+
create-hash: 1.2.0
|
7003 |
+
create-hmac: 1.1.7
|
7004 |
+
elliptic: 6.5.6
|
7005 |
+
hash-base: 3.0.4
|
7006 |
+
inherits: 2.0.4
|
7007 |
+
parse-asn1: 5.1.7
|
7008 |
+
readable-stream: 2.3.8
|
7009 |
+
safe-buffer: 5.2.1
|
7010 |
+
|
7011 | |
7012 |
dependencies:
|
7013 |
pako: 0.2.9
|
7014 |
|
7015 | |
7016 |
+
dependencies:
|
7017 |
+
pako: 1.0.11
|
7018 |
+
|
7019 | |
7020 |
dependencies:
|
7021 |
caniuse-lite: 1.0.30001637
|
|
|
7025 |
|
7026 | |
7027 |
|
7028 |
+
[email protected]: {}
|
7029 |
+
|
7030 | |
7031 |
dependencies:
|
7032 |
base64-js: 1.5.1
|
7033 |
ieee754: 1.2.1
|
7034 |
|
7035 |
+
[email protected]: {}
|
7036 |
+
|
7037 | |
7038 |
optional: true
|
7039 |
|
|
|
7126 |
|
7127 | |
7128 |
|
7129 | |
7130 |
+
dependencies:
|
7131 |
+
inherits: 2.0.4
|
7132 |
+
safe-buffer: 5.2.1
|
7133 |
+
|
7134 | |
7135 |
|
7136 | |
|
|
7210 |
|
7211 | |
7212 |
|
7213 |
+
[email protected]: {}
|
7214 |
+
|
7215 |
+
[email protected]: {}
|
7216 |
+
|
7217 | |
7218 |
dependencies:
|
7219 |
safe-buffer: 5.2.1
|
|
|
7263 |
optionalDependencies:
|
7264 |
typescript: 5.5.2
|
7265 |
|
7266 | |
7267 |
+
dependencies:
|
7268 |
+
bn.js: 4.12.0
|
7269 |
+
elliptic: 6.5.6
|
7270 |
+
|
7271 | |
7272 |
+
dependencies:
|
7273 |
+
cipher-base: 1.0.4
|
7274 |
+
inherits: 2.0.4
|
7275 |
+
md5.js: 1.3.5
|
7276 |
+
ripemd160: 2.0.2
|
7277 |
+
sha.js: 2.4.11
|
7278 |
+
|
7279 | |
7280 |
+
dependencies:
|
7281 |
+
cipher-base: 1.0.4
|
7282 |
+
create-hash: 1.2.0
|
7283 |
+
inherits: 2.0.4
|
7284 |
+
ripemd160: 2.0.2
|
7285 |
+
safe-buffer: 5.2.1
|
7286 |
+
sha.js: 2.4.11
|
7287 |
+
|
7288 |
+
[email protected]: {}
|
7289 |
+
|
7290 |
+
[email protected]: {}
|
7291 |
+
|
7292 | |
7293 |
dependencies:
|
7294 |
path-key: 3.1.1
|
7295 |
shebang-command: 2.0.0
|
7296 |
which: 2.0.2
|
7297 |
|
7298 | |
7299 |
+
dependencies:
|
7300 |
+
browserify-cipher: 1.0.1
|
7301 |
+
browserify-sign: 4.2.3
|
7302 |
+
create-ecdh: 4.0.4
|
7303 |
+
create-hash: 1.2.0
|
7304 |
+
create-hmac: 1.1.7
|
7305 |
+
diffie-hellman: 5.0.3
|
7306 |
+
inherits: 2.0.4
|
7307 |
+
pbkdf2: 3.1.2
|
7308 |
+
public-encrypt: 4.0.3
|
7309 |
+
randombytes: 2.1.0
|
7310 |
+
randomfill: 1.0.4
|
7311 |
+
|
7312 | |
7313 |
dependencies:
|
7314 |
mdn-data: 2.0.30
|
|
|
7360 |
es-errors: 1.3.0
|
7361 |
gopd: 1.0.1
|
7362 |
|
7363 | |
7364 |
+
dependencies:
|
7365 |
+
define-data-property: 1.1.4
|
7366 |
+
has-property-descriptors: 1.0.2
|
7367 |
+
object-keys: 1.1.1
|
7368 |
+
|
7369 | |
7370 |
|
7371 | |
7372 |
|
7373 | |
7374 |
|
7375 | |
7376 |
+
dependencies:
|
7377 |
+
inherits: 2.0.4
|
7378 |
+
minimalistic-assert: 1.0.1
|
7379 |
+
|
7380 | |
7381 |
|
7382 | |
|
|
7391 |
|
7392 | |
7393 |
|
7394 | |
7395 |
+
dependencies:
|
7396 |
+
bn.js: 4.12.0
|
7397 |
+
miller-rabin: 4.0.1
|
7398 |
+
randombytes: 2.1.0
|
7399 |
+
|
7400 | |
7401 |
dependencies:
|
7402 |
path-type: 4.0.0
|
7403 |
|
7404 |
+
[email protected]: {}
|
7405 |
+
|
7406 | |
7407 |
dependencies:
|
7408 |
is-obj: 2.0.0
|
|
|
7424 |
|
7425 | |
7426 |
|
7427 | |
7428 |
+
dependencies:
|
7429 |
+
bn.js: 4.12.0
|
7430 |
+
brorand: 1.1.0
|
7431 |
+
hash.js: 1.1.7
|
7432 |
+
hmac-drbg: 1.0.1
|
7433 |
+
inherits: 2.0.4
|
7434 |
+
minimalistic-assert: 1.0.1
|
7435 |
+
minimalistic-crypto-utils: 1.0.1
|
7436 |
+
|
7437 | |
7438 |
|
7439 | |
|
|
7705 |
|
7706 | |
7707 |
|
7708 |
+
[email protected]: {}
|
7709 |
+
|
7710 | |
7711 |
|
7712 | |
7713 |
+
dependencies:
|
7714 |
+
md5.js: 1.3.5
|
7715 |
+
safe-buffer: 5.2.1
|
7716 |
+
|
7717 | |
7718 |
dependencies:
|
7719 |
cross-spawn: 7.0.3
|
|
|
7995 |
dependencies:
|
7996 |
has-symbols: 1.0.3
|
7997 |
|
7998 | |
7999 |
+
dependencies:
|
8000 |
+
inherits: 2.0.4
|
8001 |
+
safe-buffer: 5.2.1
|
8002 |
+
|
8003 | |
8004 |
+
dependencies:
|
8005 |
+
inherits: 2.0.4
|
8006 |
+
readable-stream: 3.6.2
|
8007 |
+
safe-buffer: 5.2.1
|
8008 |
+
|
8009 | |
8010 |
+
dependencies:
|
8011 |
+
inherits: 2.0.4
|
8012 |
+
minimalistic-assert: 1.0.1
|
8013 |
+
|
8014 | |
8015 |
dependencies:
|
8016 |
function-bind: 1.1.2
|
|
|
8110 |
property-information: 6.5.0
|
8111 |
space-separated-tokens: 2.0.2
|
8112 |
|
8113 | |
8114 |
+
dependencies:
|
8115 |
+
hash.js: 1.1.7
|
8116 |
+
minimalistic-assert: 1.0.1
|
8117 |
+
minimalistic-crypto-utils: 1.0.1
|
8118 |
+
|
8119 | |
8120 |
dependencies:
|
8121 |
lru-cache: 7.18.3
|
|
|
8132 |
statuses: 2.0.1
|
8133 |
toidentifier: 1.0.1
|
8134 |
|
8135 |
+
[email protected]: {}
|
8136 |
+
|
8137 | |
8138 |
|
8139 | |
|
|
8228 |
|
8229 | |
8230 |
|
8231 | |
8232 |
+
dependencies:
|
8233 |
+
call-bind: 1.0.7
|
8234 |
+
define-properties: 1.2.1
|
8235 |
+
|
8236 | |
8237 |
|
8238 | |
|
|
8267 |
|
8268 | |
8269 |
|
8270 |
+
[email protected]: {}
|
8271 |
+
|
8272 | |
8273 |
dependencies:
|
8274 |
'@isaacs/cliui': 8.0.2
|
|
|
8417 |
|
8418 | |
8419 |
|
8420 | |
8421 |
+
dependencies:
|
8422 |
+
hash-base: 3.1.0
|
8423 |
+
inherits: 2.0.4
|
8424 |
+
safe-buffer: 5.2.1
|
8425 |
+
|
8426 | |
8427 |
dependencies:
|
8428 |
'@types/mdast': 3.0.15
|
|
|
9110 |
braces: 3.0.3
|
9111 |
picomatch: 2.3.1
|
9112 |
|
9113 | |
9114 |
+
dependencies:
|
9115 |
+
bn.js: 4.12.0
|
9116 |
+
brorand: 1.1.0
|
9117 |
+
|
9118 | |
9119 |
|
9120 | |
|
|
9150 |
- supports-color
|
9151 |
- utf-8-validate
|
9152 |
|
9153 |
+
[email protected]: {}
|
9154 |
+
|
9155 |
+
[email protected]: {}
|
9156 |
+
|
9157 | |
9158 |
dependencies:
|
9159 |
brace-expansion: 1.1.11
|
|
|
9243 |
|
9244 | |
9245 |
|
9246 | |
9247 |
+
dependencies:
|
9248 |
+
assert: 2.1.0
|
9249 |
+
browser-resolve: 2.0.0
|
9250 |
+
browserify-zlib: 0.2.0
|
9251 |
+
buffer: 5.7.1
|
9252 |
+
console-browserify: 1.2.0
|
9253 |
+
constants-browserify: 1.0.0
|
9254 |
+
create-require: 1.1.1
|
9255 |
+
crypto-browserify: 3.12.0
|
9256 |
+
domain-browser: 4.23.0
|
9257 |
+
events: 3.3.0
|
9258 |
+
https-browserify: 1.0.0
|
9259 |
+
isomorphic-timers-promises: 1.0.1
|
9260 |
+
os-browserify: 0.3.0
|
9261 |
+
path-browserify: 1.0.1
|
9262 |
+
pkg-dir: 5.0.0
|
9263 |
+
process: 0.11.10
|
9264 |
+
punycode: 1.4.1
|
9265 |
+
querystring-es3: 0.2.1
|
9266 |
+
readable-stream: 3.6.2
|
9267 |
+
stream-browserify: 3.0.0
|
9268 |
+
stream-http: 3.2.0
|
9269 |
+
string_decoder: 1.3.0
|
9270 |
+
timers-browserify: 2.0.12
|
9271 |
+
tty-browserify: 0.0.1
|
9272 |
+
url: 0.11.3
|
9273 |
+
util: 0.12.5
|
9274 |
+
vm-browserify: 1.1.2
|
9275 |
+
|
9276 | |
9277 |
dependencies:
|
9278 |
hosted-git-info: 6.1.1
|
|
|
9312 |
|
9313 | |
9314 |
|
9315 | |
9316 |
+
dependencies:
|
9317 |
+
call-bind: 1.0.7
|
9318 |
+
define-properties: 1.2.1
|
9319 |
+
|
9320 |
+
[email protected]: {}
|
9321 |
+
|
9322 | |
9323 |
+
dependencies:
|
9324 |
+
call-bind: 1.0.7
|
9325 |
+
define-properties: 1.2.1
|
9326 |
+
has-symbols: 1.0.3
|
9327 |
+
object-keys: 1.1.1
|
9328 |
+
|
9329 | |
9330 |
dependencies:
|
9331 |
destr: 2.0.3
|
|
|
9377 |
strip-ansi: 6.0.1
|
9378 |
wcwidth: 1.0.1
|
9379 |
|
9380 |
+
[email protected]: {}
|
9381 |
+
|
9382 | |
9383 |
|
9384 | |
|
|
9405 |
|
9406 | |
9407 |
|
9408 |
+
[email protected]: {}
|
9409 |
+
|
9410 | |
9411 |
dependencies:
|
9412 |
callsites: 3.1.0
|
9413 |
|
9414 | |
9415 |
+
dependencies:
|
9416 |
+
asn1.js: 4.10.1
|
9417 |
+
browserify-aes: 1.2.0
|
9418 |
+
evp_bytestokey: 1.0.3
|
9419 |
+
hash-base: 3.0.4
|
9420 |
+
pbkdf2: 3.1.2
|
9421 |
+
safe-buffer: 5.2.1
|
9422 |
+
|
9423 | |
9424 |
dependencies:
|
9425 |
'@types/unist': 2.0.10
|
|
|
9446 |
|
9447 | |
9448 |
|
9449 |
+
[email protected]: {}
|
9450 |
+
|
9451 | |
9452 |
|
9453 | |
|
|
9473 |
|
9474 | |
9475 |
|
9476 | |
9477 |
+
dependencies:
|
9478 |
+
create-hash: 1.2.0
|
9479 |
+
create-hmac: 1.1.7
|
9480 |
+
ripemd160: 2.0.2
|
9481 |
+
safe-buffer: 5.2.1
|
9482 |
+
sha.js: 2.4.11
|
9483 |
+
|
9484 | |
9485 |
dependencies:
|
9486 |
buffer-from: 1.1.2
|
|
|
9501 |
|
9502 | |
9503 |
|
9504 | |
9505 |
+
dependencies:
|
9506 |
+
find-up: 5.0.0
|
9507 |
+
|
9508 | |
9509 |
dependencies:
|
9510 |
confbox: 0.1.7
|
|
|
9596 |
|
9597 | |
9598 |
|
9599 |
+
[email protected]: {}
|
9600 |
+
|
9601 | |
9602 |
|
9603 | |
|
|
9612 |
forwarded: 0.2.0
|
9613 |
ipaddr.js: 1.9.1
|
9614 |
|
9615 | |
9616 |
+
dependencies:
|
9617 |
+
bn.js: 4.12.0
|
9618 |
+
browserify-rsa: 4.1.0
|
9619 |
+
create-hash: 1.2.0
|
9620 |
+
parse-asn1: 5.1.7
|
9621 |
+
randombytes: 2.1.0
|
9622 |
+
safe-buffer: 5.2.1
|
9623 |
+
|
9624 | |
9625 |
dependencies:
|
9626 |
end-of-stream: 1.4.4
|
|
|
9637 |
inherits: 2.0.4
|
9638 |
pump: 2.0.1
|
9639 |
|
9640 |
+
[email protected]: {}
|
9641 |
+
|
9642 | |
9643 |
|
9644 | |
9645 |
dependencies:
|
9646 |
side-channel: 1.0.6
|
9647 |
|
9648 | |
9649 |
+
dependencies:
|
9650 |
+
side-channel: 1.0.6
|
9651 |
+
|
9652 |
+
[email protected]: {}
|
9653 |
+
|
9654 | |
9655 |
|
9656 | |
9657 |
+
dependencies:
|
9658 |
+
safe-buffer: 5.2.1
|
9659 |
+
|
9660 | |
9661 |
+
dependencies:
|
9662 |
+
randombytes: 2.1.0
|
9663 |
+
safe-buffer: 5.2.1
|
9664 |
+
|
9665 | |
9666 |
|
9667 | |
|
|
9698 |
|
9699 | |
9700 |
|
9701 | |
9702 |
+
dependencies:
|
9703 |
+
react: 18.3.1
|
9704 |
+
react-dom: 18.3.1([email protected])
|
9705 |
+
|
9706 | |
9707 |
dependencies:
|
9708 |
'@remix-run/router': 1.17.1
|
|
|
9855 |
|
9856 | |
9857 |
|
9858 | |
9859 |
+
dependencies:
|
9860 |
+
hash-base: 3.1.0
|
9861 |
+
inherits: 2.0.4
|
9862 |
+
|
9863 | |
9864 |
dependencies:
|
9865 |
estree-walker: 0.6.1
|
|
|
9970 |
gopd: 1.0.1
|
9971 |
has-property-descriptors: 1.0.2
|
9972 |
|
9973 |
+
[email protected]: {}
|
9974 |
+
|
9975 | |
9976 |
|
9977 | |
9978 |
+
dependencies:
|
9979 |
+
inherits: 2.0.4
|
9980 |
+
safe-buffer: 5.2.1
|
9981 |
+
|
9982 | |
9983 |
dependencies:
|
9984 |
shebang-regex: 3.0.0
|
|
|
10063 |
|
10064 | |
10065 |
|
10066 | |
10067 |
+
dependencies:
|
10068 |
+
inherits: 2.0.4
|
10069 |
+
readable-stream: 3.6.2
|
10070 |
+
|
10071 | |
10072 |
+
dependencies:
|
10073 |
+
builtin-status-codes: 3.0.0
|
10074 |
+
inherits: 2.0.4
|
10075 |
+
readable-stream: 3.6.2
|
10076 |
+
xtend: 4.0.2
|
10077 |
+
|
10078 | |
10079 |
|
10080 | |
|
|
10122 |
|
10123 | |
10124 |
|
10125 |
+
[email protected]: {}
|
10126 |
+
|
10127 | |
10128 |
dependencies:
|
10129 |
inline-style-parser: 0.1.1
|
|
|
10214 |
|
10215 | |
10216 |
|
10217 | |
10218 |
+
dependencies:
|
10219 |
+
setimmediate: 1.0.5
|
10220 |
+
|
10221 | |
10222 |
|
10223 | |
|
|
10256 |
|
10257 | |
10258 |
|
10259 |
+
[email protected]: {}
|
10260 |
+
|
10261 | |
10262 |
|
10263 | |
|
|
10444 |
dependencies:
|
10445 |
punycode: 2.3.1
|
10446 |
|
10447 | |
10448 |
+
dependencies:
|
10449 |
+
punycode: 1.4.1
|
10450 |
+
qs: 6.12.3
|
10451 |
+
|
10452 | |
10453 |
dependencies:
|
10454 |
react: 18.3.1
|
|
|
10543 |
- supports-color
|
10544 |
- terser
|
10545 |
|
10546 | |
10547 |
+
dependencies:
|
10548 |
+
'@rollup/plugin-inject': 5.0.5([email protected])
|
10549 |
+
node-stdlib-browser: 1.2.0
|
10550 |
+
vite: 5.3.1(@types/[email protected])([email protected])
|
10551 |
+
transitivePeerDependencies:
|
10552 |
+
- rollup
|
10553 |
+
|
10554 | |
10555 |
+
dependencies:
|
10556 |
+
vite: 5.3.1(@types/[email protected])([email protected])
|
10557 |
+
|
10558 | |
10559 |
dependencies:
|
10560 |
debug: 4.3.5
|
|
|
10607 |
- supports-color
|
10608 |
- terser
|
10609 |
|
10610 |
+
[email protected]: {}
|
10611 |
+
|
10612 | |
10613 |
dependencies:
|
10614 |
'@vue/compiler-dom': 3.4.30
|
|
|
10619 |
optionalDependencies:
|
10620 |
typescript: 5.5.2
|
10621 |
|
10622 |
+
[email protected]: {}
|
10623 |
+
|
10624 | |
10625 |
dependencies:
|
10626 |
defaults: 1.0.4
|