├── .gitignore
├── .vscode
└── extensions.json
├── LICENSE
├── README.md
├── dark.png
├── index.html
├── light.png
├── package-lock.json
├── package.json
├── public
├── aiui.eot
├── aiui.svg
├── aiui.ttf
├── aiui.woff
├── aiui.woff2
├── icon-bg.svg
├── icon.svg
├── lighttoggle.svg
└── logo.svg
├── src
├── App.svelte
├── aiui.css
├── api.ts
├── app.css
├── lib
│ ├── ChatSelector.svelte
│ ├── ErrorModal.svelte
│ ├── IconButton.svelte
│ ├── IconToggle.svelte
│ ├── Messages
│ │ ├── Avatar.svelte
│ │ ├── Message.svelte
│ │ ├── MessageSender.svelte
│ │ └── MessagesPanel.svelte
│ ├── ModelDropdown.svelte
│ ├── PersonaEditor.svelte
│ ├── PromptCreatorModal.svelte
│ ├── PromptSelector.svelte
│ ├── Settings.svelte
│ └── ToggleButton.svelte
├── main.ts
├── utils.ts
└── vite-env.d.ts
├── start.bat
├── svelte.config.js
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["svelte.svelte-vscode"]
3 | }
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 [fullname]
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # A.I.U.I 🤘
2 |
3 | 
4 |
5 | 
6 |
7 | This is AIUI🚀, a simple yet powerful web UI for ~~Ollama🦙~~ (New: added support for OAI-Compatible APIs! (OAI, Kobold...)).
8 | Features:
9 | - 💬Chat
10 | - 💵OAI Compatible
11 | - 🧷Sending images
12 | - 🤪Import Character Cards
13 | - 🚀Prompts
14 | - 🥸Cool UI
15 | - 🤖Send message as AI
16 | - 🗯️Formatting (asterisks, quotes, etc.)
17 | - 🌡️Temperature
18 | - 🧑Persona
19 | - ✅Model selection
20 | - ✏️Message edit/remove/regen
21 | - 💻Multiple saved chats
22 | - 🌍Saved in browser
23 |
24 | Made in Svelte and Vite. I'll probably port it to desktop soon.
25 |
26 | ### News:
27 | - *(2024-8-29):* Added support for Instruction Mode (preview)
28 |
29 | ### Requirements
30 | You'll need:
31 | - [OLLaMA/Kobold/OpenAI Key](https://ollama.com/) (remote or local)
32 | - [NodeJS](https://nodejs.org/) (if running locally)
33 |
34 | ### Installing
35 | `npm install`
36 | `npm run dev`
37 |
38 | Or, use the start.bat file included which will do that for you!
39 | Or, use the deployed [AIUI](https://aiui-delta.vercel.app/) which works with your local models without installing the website!
40 |
41 | ## Usage
42 | 1. For Ollama, activate "Use OLLaMA API". For OAI-Compatible APIs, deactivate it and put you API Key if needed.
43 | 2. Set your API URL, make sure your URL does **NOT** end with `/`. For OAI APIs, make sure you include the `/v1` if the API needs it.
44 | 3. I recommend using Chrome/Hermit when using Android because other browsers like Edge don't seem to scale properly when opening the keyboard. Hermit is the only browser which scales perfectly.
45 |
--------------------------------------------------------------------------------
/dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jxqu3/aiui/719e71091750fb2543b4dbb89130a5ada2a5d053/dark.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | AIUI
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jxqu3/aiui/719e71091750fb2543b4dbb89130a5ada2a5d053/light.png
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aiui",
3 | "version": "0.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "aiui",
9 | "version": "0.0.0",
10 | "devDependencies": {
11 | "@sveltejs/vite-plugin-svelte": "^3.1.1",
12 | "@tsconfig/svelte": "^5.0.4",
13 | "svelte": "^4.2.18",
14 | "svelte-check": "^3.8.5",
15 | "tslib": "^2.6.3",
16 | "typescript": "^5.5.3",
17 | "vite": "^5.4.1"
18 | }
19 | },
20 | "node_modules/@ampproject/remapping": {
21 | "version": "2.3.0",
22 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
23 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
24 | "dev": true,
25 | "license": "Apache-2.0",
26 | "dependencies": {
27 | "@jridgewell/gen-mapping": "^0.3.5",
28 | "@jridgewell/trace-mapping": "^0.3.24"
29 | },
30 | "engines": {
31 | "node": ">=6.0.0"
32 | }
33 | },
34 | "node_modules/@esbuild/aix-ppc64": {
35 | "version": "0.21.5",
36 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
37 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
38 | "cpu": [
39 | "ppc64"
40 | ],
41 | "dev": true,
42 | "license": "MIT",
43 | "optional": true,
44 | "os": [
45 | "aix"
46 | ],
47 | "engines": {
48 | "node": ">=12"
49 | }
50 | },
51 | "node_modules/@esbuild/android-arm": {
52 | "version": "0.21.5",
53 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
54 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
55 | "cpu": [
56 | "arm"
57 | ],
58 | "dev": true,
59 | "license": "MIT",
60 | "optional": true,
61 | "os": [
62 | "android"
63 | ],
64 | "engines": {
65 | "node": ">=12"
66 | }
67 | },
68 | "node_modules/@esbuild/android-arm64": {
69 | "version": "0.21.5",
70 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
71 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
72 | "cpu": [
73 | "arm64"
74 | ],
75 | "dev": true,
76 | "license": "MIT",
77 | "optional": true,
78 | "os": [
79 | "android"
80 | ],
81 | "engines": {
82 | "node": ">=12"
83 | }
84 | },
85 | "node_modules/@esbuild/android-x64": {
86 | "version": "0.21.5",
87 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
88 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
89 | "cpu": [
90 | "x64"
91 | ],
92 | "dev": true,
93 | "license": "MIT",
94 | "optional": true,
95 | "os": [
96 | "android"
97 | ],
98 | "engines": {
99 | "node": ">=12"
100 | }
101 | },
102 | "node_modules/@esbuild/darwin-arm64": {
103 | "version": "0.21.5",
104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
105 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
106 | "cpu": [
107 | "arm64"
108 | ],
109 | "dev": true,
110 | "license": "MIT",
111 | "optional": true,
112 | "os": [
113 | "darwin"
114 | ],
115 | "engines": {
116 | "node": ">=12"
117 | }
118 | },
119 | "node_modules/@esbuild/darwin-x64": {
120 | "version": "0.21.5",
121 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
122 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
123 | "cpu": [
124 | "x64"
125 | ],
126 | "dev": true,
127 | "license": "MIT",
128 | "optional": true,
129 | "os": [
130 | "darwin"
131 | ],
132 | "engines": {
133 | "node": ">=12"
134 | }
135 | },
136 | "node_modules/@esbuild/freebsd-arm64": {
137 | "version": "0.21.5",
138 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
139 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
140 | "cpu": [
141 | "arm64"
142 | ],
143 | "dev": true,
144 | "license": "MIT",
145 | "optional": true,
146 | "os": [
147 | "freebsd"
148 | ],
149 | "engines": {
150 | "node": ">=12"
151 | }
152 | },
153 | "node_modules/@esbuild/freebsd-x64": {
154 | "version": "0.21.5",
155 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
156 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
157 | "cpu": [
158 | "x64"
159 | ],
160 | "dev": true,
161 | "license": "MIT",
162 | "optional": true,
163 | "os": [
164 | "freebsd"
165 | ],
166 | "engines": {
167 | "node": ">=12"
168 | }
169 | },
170 | "node_modules/@esbuild/linux-arm": {
171 | "version": "0.21.5",
172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
173 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
174 | "cpu": [
175 | "arm"
176 | ],
177 | "dev": true,
178 | "license": "MIT",
179 | "optional": true,
180 | "os": [
181 | "linux"
182 | ],
183 | "engines": {
184 | "node": ">=12"
185 | }
186 | },
187 | "node_modules/@esbuild/linux-arm64": {
188 | "version": "0.21.5",
189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
190 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
191 | "cpu": [
192 | "arm64"
193 | ],
194 | "dev": true,
195 | "license": "MIT",
196 | "optional": true,
197 | "os": [
198 | "linux"
199 | ],
200 | "engines": {
201 | "node": ">=12"
202 | }
203 | },
204 | "node_modules/@esbuild/linux-ia32": {
205 | "version": "0.21.5",
206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
207 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
208 | "cpu": [
209 | "ia32"
210 | ],
211 | "dev": true,
212 | "license": "MIT",
213 | "optional": true,
214 | "os": [
215 | "linux"
216 | ],
217 | "engines": {
218 | "node": ">=12"
219 | }
220 | },
221 | "node_modules/@esbuild/linux-loong64": {
222 | "version": "0.21.5",
223 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
224 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
225 | "cpu": [
226 | "loong64"
227 | ],
228 | "dev": true,
229 | "license": "MIT",
230 | "optional": true,
231 | "os": [
232 | "linux"
233 | ],
234 | "engines": {
235 | "node": ">=12"
236 | }
237 | },
238 | "node_modules/@esbuild/linux-mips64el": {
239 | "version": "0.21.5",
240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
241 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
242 | "cpu": [
243 | "mips64el"
244 | ],
245 | "dev": true,
246 | "license": "MIT",
247 | "optional": true,
248 | "os": [
249 | "linux"
250 | ],
251 | "engines": {
252 | "node": ">=12"
253 | }
254 | },
255 | "node_modules/@esbuild/linux-ppc64": {
256 | "version": "0.21.5",
257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
258 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
259 | "cpu": [
260 | "ppc64"
261 | ],
262 | "dev": true,
263 | "license": "MIT",
264 | "optional": true,
265 | "os": [
266 | "linux"
267 | ],
268 | "engines": {
269 | "node": ">=12"
270 | }
271 | },
272 | "node_modules/@esbuild/linux-riscv64": {
273 | "version": "0.21.5",
274 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
275 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
276 | "cpu": [
277 | "riscv64"
278 | ],
279 | "dev": true,
280 | "license": "MIT",
281 | "optional": true,
282 | "os": [
283 | "linux"
284 | ],
285 | "engines": {
286 | "node": ">=12"
287 | }
288 | },
289 | "node_modules/@esbuild/linux-s390x": {
290 | "version": "0.21.5",
291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
292 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
293 | "cpu": [
294 | "s390x"
295 | ],
296 | "dev": true,
297 | "license": "MIT",
298 | "optional": true,
299 | "os": [
300 | "linux"
301 | ],
302 | "engines": {
303 | "node": ">=12"
304 | }
305 | },
306 | "node_modules/@esbuild/linux-x64": {
307 | "version": "0.21.5",
308 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
309 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
310 | "cpu": [
311 | "x64"
312 | ],
313 | "dev": true,
314 | "license": "MIT",
315 | "optional": true,
316 | "os": [
317 | "linux"
318 | ],
319 | "engines": {
320 | "node": ">=12"
321 | }
322 | },
323 | "node_modules/@esbuild/netbsd-x64": {
324 | "version": "0.21.5",
325 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
326 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
327 | "cpu": [
328 | "x64"
329 | ],
330 | "dev": true,
331 | "license": "MIT",
332 | "optional": true,
333 | "os": [
334 | "netbsd"
335 | ],
336 | "engines": {
337 | "node": ">=12"
338 | }
339 | },
340 | "node_modules/@esbuild/openbsd-x64": {
341 | "version": "0.21.5",
342 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
343 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
344 | "cpu": [
345 | "x64"
346 | ],
347 | "dev": true,
348 | "license": "MIT",
349 | "optional": true,
350 | "os": [
351 | "openbsd"
352 | ],
353 | "engines": {
354 | "node": ">=12"
355 | }
356 | },
357 | "node_modules/@esbuild/sunos-x64": {
358 | "version": "0.21.5",
359 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
360 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
361 | "cpu": [
362 | "x64"
363 | ],
364 | "dev": true,
365 | "license": "MIT",
366 | "optional": true,
367 | "os": [
368 | "sunos"
369 | ],
370 | "engines": {
371 | "node": ">=12"
372 | }
373 | },
374 | "node_modules/@esbuild/win32-arm64": {
375 | "version": "0.21.5",
376 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
377 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
378 | "cpu": [
379 | "arm64"
380 | ],
381 | "dev": true,
382 | "license": "MIT",
383 | "optional": true,
384 | "os": [
385 | "win32"
386 | ],
387 | "engines": {
388 | "node": ">=12"
389 | }
390 | },
391 | "node_modules/@esbuild/win32-ia32": {
392 | "version": "0.21.5",
393 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
394 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
395 | "cpu": [
396 | "ia32"
397 | ],
398 | "dev": true,
399 | "license": "MIT",
400 | "optional": true,
401 | "os": [
402 | "win32"
403 | ],
404 | "engines": {
405 | "node": ">=12"
406 | }
407 | },
408 | "node_modules/@esbuild/win32-x64": {
409 | "version": "0.21.5",
410 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
411 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
412 | "cpu": [
413 | "x64"
414 | ],
415 | "dev": true,
416 | "license": "MIT",
417 | "optional": true,
418 | "os": [
419 | "win32"
420 | ],
421 | "engines": {
422 | "node": ">=12"
423 | }
424 | },
425 | "node_modules/@jridgewell/gen-mapping": {
426 | "version": "0.3.5",
427 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
428 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
429 | "dev": true,
430 | "license": "MIT",
431 | "dependencies": {
432 | "@jridgewell/set-array": "^1.2.1",
433 | "@jridgewell/sourcemap-codec": "^1.4.10",
434 | "@jridgewell/trace-mapping": "^0.3.24"
435 | },
436 | "engines": {
437 | "node": ">=6.0.0"
438 | }
439 | },
440 | "node_modules/@jridgewell/resolve-uri": {
441 | "version": "3.1.2",
442 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
443 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
444 | "dev": true,
445 | "license": "MIT",
446 | "engines": {
447 | "node": ">=6.0.0"
448 | }
449 | },
450 | "node_modules/@jridgewell/set-array": {
451 | "version": "1.2.1",
452 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
453 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
454 | "dev": true,
455 | "license": "MIT",
456 | "engines": {
457 | "node": ">=6.0.0"
458 | }
459 | },
460 | "node_modules/@jridgewell/sourcemap-codec": {
461 | "version": "1.5.0",
462 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
463 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
464 | "dev": true,
465 | "license": "MIT"
466 | },
467 | "node_modules/@jridgewell/trace-mapping": {
468 | "version": "0.3.25",
469 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
470 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
471 | "dev": true,
472 | "license": "MIT",
473 | "dependencies": {
474 | "@jridgewell/resolve-uri": "^3.1.0",
475 | "@jridgewell/sourcemap-codec": "^1.4.14"
476 | }
477 | },
478 | "node_modules/@rollup/rollup-android-arm-eabi": {
479 | "version": "4.24.3",
480 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz",
481 | "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==",
482 | "cpu": [
483 | "arm"
484 | ],
485 | "dev": true,
486 | "license": "MIT",
487 | "optional": true,
488 | "os": [
489 | "android"
490 | ]
491 | },
492 | "node_modules/@rollup/rollup-android-arm64": {
493 | "version": "4.24.3",
494 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz",
495 | "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==",
496 | "cpu": [
497 | "arm64"
498 | ],
499 | "dev": true,
500 | "license": "MIT",
501 | "optional": true,
502 | "os": [
503 | "android"
504 | ]
505 | },
506 | "node_modules/@rollup/rollup-darwin-arm64": {
507 | "version": "4.24.3",
508 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz",
509 | "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==",
510 | "cpu": [
511 | "arm64"
512 | ],
513 | "dev": true,
514 | "license": "MIT",
515 | "optional": true,
516 | "os": [
517 | "darwin"
518 | ]
519 | },
520 | "node_modules/@rollup/rollup-darwin-x64": {
521 | "version": "4.24.3",
522 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz",
523 | "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==",
524 | "cpu": [
525 | "x64"
526 | ],
527 | "dev": true,
528 | "license": "MIT",
529 | "optional": true,
530 | "os": [
531 | "darwin"
532 | ]
533 | },
534 | "node_modules/@rollup/rollup-freebsd-arm64": {
535 | "version": "4.24.3",
536 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz",
537 | "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==",
538 | "cpu": [
539 | "arm64"
540 | ],
541 | "dev": true,
542 | "license": "MIT",
543 | "optional": true,
544 | "os": [
545 | "freebsd"
546 | ]
547 | },
548 | "node_modules/@rollup/rollup-freebsd-x64": {
549 | "version": "4.24.3",
550 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz",
551 | "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==",
552 | "cpu": [
553 | "x64"
554 | ],
555 | "dev": true,
556 | "license": "MIT",
557 | "optional": true,
558 | "os": [
559 | "freebsd"
560 | ]
561 | },
562 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
563 | "version": "4.24.3",
564 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz",
565 | "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==",
566 | "cpu": [
567 | "arm"
568 | ],
569 | "dev": true,
570 | "license": "MIT",
571 | "optional": true,
572 | "os": [
573 | "linux"
574 | ]
575 | },
576 | "node_modules/@rollup/rollup-linux-arm-musleabihf": {
577 | "version": "4.24.3",
578 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz",
579 | "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==",
580 | "cpu": [
581 | "arm"
582 | ],
583 | "dev": true,
584 | "license": "MIT",
585 | "optional": true,
586 | "os": [
587 | "linux"
588 | ]
589 | },
590 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
591 | "version": "4.24.3",
592 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz",
593 | "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==",
594 | "cpu": [
595 | "arm64"
596 | ],
597 | "dev": true,
598 | "license": "MIT",
599 | "optional": true,
600 | "os": [
601 | "linux"
602 | ]
603 | },
604 | "node_modules/@rollup/rollup-linux-arm64-musl": {
605 | "version": "4.24.3",
606 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz",
607 | "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==",
608 | "cpu": [
609 | "arm64"
610 | ],
611 | "dev": true,
612 | "license": "MIT",
613 | "optional": true,
614 | "os": [
615 | "linux"
616 | ]
617 | },
618 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
619 | "version": "4.24.3",
620 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz",
621 | "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==",
622 | "cpu": [
623 | "ppc64"
624 | ],
625 | "dev": true,
626 | "license": "MIT",
627 | "optional": true,
628 | "os": [
629 | "linux"
630 | ]
631 | },
632 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
633 | "version": "4.24.3",
634 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz",
635 | "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==",
636 | "cpu": [
637 | "riscv64"
638 | ],
639 | "dev": true,
640 | "license": "MIT",
641 | "optional": true,
642 | "os": [
643 | "linux"
644 | ]
645 | },
646 | "node_modules/@rollup/rollup-linux-s390x-gnu": {
647 | "version": "4.24.3",
648 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz",
649 | "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==",
650 | "cpu": [
651 | "s390x"
652 | ],
653 | "dev": true,
654 | "license": "MIT",
655 | "optional": true,
656 | "os": [
657 | "linux"
658 | ]
659 | },
660 | "node_modules/@rollup/rollup-linux-x64-gnu": {
661 | "version": "4.24.3",
662 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz",
663 | "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==",
664 | "cpu": [
665 | "x64"
666 | ],
667 | "dev": true,
668 | "license": "MIT",
669 | "optional": true,
670 | "os": [
671 | "linux"
672 | ]
673 | },
674 | "node_modules/@rollup/rollup-linux-x64-musl": {
675 | "version": "4.24.3",
676 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz",
677 | "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==",
678 | "cpu": [
679 | "x64"
680 | ],
681 | "dev": true,
682 | "license": "MIT",
683 | "optional": true,
684 | "os": [
685 | "linux"
686 | ]
687 | },
688 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
689 | "version": "4.24.3",
690 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz",
691 | "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==",
692 | "cpu": [
693 | "arm64"
694 | ],
695 | "dev": true,
696 | "license": "MIT",
697 | "optional": true,
698 | "os": [
699 | "win32"
700 | ]
701 | },
702 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
703 | "version": "4.24.3",
704 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz",
705 | "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==",
706 | "cpu": [
707 | "ia32"
708 | ],
709 | "dev": true,
710 | "license": "MIT",
711 | "optional": true,
712 | "os": [
713 | "win32"
714 | ]
715 | },
716 | "node_modules/@rollup/rollup-win32-x64-msvc": {
717 | "version": "4.24.3",
718 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz",
719 | "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==",
720 | "cpu": [
721 | "x64"
722 | ],
723 | "dev": true,
724 | "license": "MIT",
725 | "optional": true,
726 | "os": [
727 | "win32"
728 | ]
729 | },
730 | "node_modules/@sveltejs/vite-plugin-svelte": {
731 | "version": "3.1.2",
732 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz",
733 | "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==",
734 | "dev": true,
735 | "license": "MIT",
736 | "dependencies": {
737 | "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0",
738 | "debug": "^4.3.4",
739 | "deepmerge": "^4.3.1",
740 | "kleur": "^4.1.5",
741 | "magic-string": "^0.30.10",
742 | "svelte-hmr": "^0.16.0",
743 | "vitefu": "^0.2.5"
744 | },
745 | "engines": {
746 | "node": "^18.0.0 || >=20"
747 | },
748 | "peerDependencies": {
749 | "svelte": "^4.0.0 || ^5.0.0-next.0",
750 | "vite": "^5.0.0"
751 | }
752 | },
753 | "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
754 | "version": "2.1.0",
755 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz",
756 | "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==",
757 | "dev": true,
758 | "license": "MIT",
759 | "dependencies": {
760 | "debug": "^4.3.4"
761 | },
762 | "engines": {
763 | "node": "^18.0.0 || >=20"
764 | },
765 | "peerDependencies": {
766 | "@sveltejs/vite-plugin-svelte": "^3.0.0",
767 | "svelte": "^4.0.0 || ^5.0.0-next.0",
768 | "vite": "^5.0.0"
769 | }
770 | },
771 | "node_modules/@tsconfig/svelte": {
772 | "version": "5.0.4",
773 | "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz",
774 | "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==",
775 | "dev": true,
776 | "license": "MIT"
777 | },
778 | "node_modules/@types/estree": {
779 | "version": "1.0.6",
780 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
781 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
782 | "dev": true,
783 | "license": "MIT"
784 | },
785 | "node_modules/@types/pug": {
786 | "version": "2.0.10",
787 | "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz",
788 | "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==",
789 | "dev": true,
790 | "license": "MIT"
791 | },
792 | "node_modules/acorn": {
793 | "version": "8.12.1",
794 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
795 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
796 | "dev": true,
797 | "license": "MIT",
798 | "bin": {
799 | "acorn": "bin/acorn"
800 | },
801 | "engines": {
802 | "node": ">=0.4.0"
803 | }
804 | },
805 | "node_modules/anymatch": {
806 | "version": "3.1.3",
807 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
808 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
809 | "dev": true,
810 | "license": "ISC",
811 | "dependencies": {
812 | "normalize-path": "^3.0.0",
813 | "picomatch": "^2.0.4"
814 | },
815 | "engines": {
816 | "node": ">= 8"
817 | }
818 | },
819 | "node_modules/aria-query": {
820 | "version": "5.3.0",
821 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
822 | "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
823 | "dev": true,
824 | "license": "Apache-2.0",
825 | "dependencies": {
826 | "dequal": "^2.0.3"
827 | }
828 | },
829 | "node_modules/axobject-query": {
830 | "version": "4.1.0",
831 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
832 | "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
833 | "dev": true,
834 | "license": "Apache-2.0",
835 | "engines": {
836 | "node": ">= 0.4"
837 | }
838 | },
839 | "node_modules/balanced-match": {
840 | "version": "1.0.2",
841 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
842 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
843 | "dev": true,
844 | "license": "MIT"
845 | },
846 | "node_modules/binary-extensions": {
847 | "version": "2.3.0",
848 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
849 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
850 | "dev": true,
851 | "license": "MIT",
852 | "engines": {
853 | "node": ">=8"
854 | },
855 | "funding": {
856 | "url": "https://github.com/sponsors/sindresorhus"
857 | }
858 | },
859 | "node_modules/brace-expansion": {
860 | "version": "1.1.11",
861 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
862 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
863 | "dev": true,
864 | "license": "MIT",
865 | "dependencies": {
866 | "balanced-match": "^1.0.0",
867 | "concat-map": "0.0.1"
868 | }
869 | },
870 | "node_modules/braces": {
871 | "version": "3.0.3",
872 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
873 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
874 | "dev": true,
875 | "license": "MIT",
876 | "dependencies": {
877 | "fill-range": "^7.1.1"
878 | },
879 | "engines": {
880 | "node": ">=8"
881 | }
882 | },
883 | "node_modules/buffer-crc32": {
884 | "version": "1.0.0",
885 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
886 | "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
887 | "dev": true,
888 | "license": "MIT",
889 | "engines": {
890 | "node": ">=8.0.0"
891 | }
892 | },
893 | "node_modules/chokidar": {
894 | "version": "3.6.0",
895 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
896 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
897 | "dev": true,
898 | "license": "MIT",
899 | "dependencies": {
900 | "anymatch": "~3.1.2",
901 | "braces": "~3.0.2",
902 | "glob-parent": "~5.1.2",
903 | "is-binary-path": "~2.1.0",
904 | "is-glob": "~4.0.1",
905 | "normalize-path": "~3.0.0",
906 | "readdirp": "~3.6.0"
907 | },
908 | "engines": {
909 | "node": ">= 8.10.0"
910 | },
911 | "funding": {
912 | "url": "https://paulmillr.com/funding/"
913 | },
914 | "optionalDependencies": {
915 | "fsevents": "~2.3.2"
916 | }
917 | },
918 | "node_modules/code-red": {
919 | "version": "1.0.4",
920 | "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
921 | "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
922 | "dev": true,
923 | "license": "MIT",
924 | "dependencies": {
925 | "@jridgewell/sourcemap-codec": "^1.4.15",
926 | "@types/estree": "^1.0.1",
927 | "acorn": "^8.10.0",
928 | "estree-walker": "^3.0.3",
929 | "periscopic": "^3.1.0"
930 | }
931 | },
932 | "node_modules/concat-map": {
933 | "version": "0.0.1",
934 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
935 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
936 | "dev": true,
937 | "license": "MIT"
938 | },
939 | "node_modules/css-tree": {
940 | "version": "2.3.1",
941 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
942 | "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
943 | "dev": true,
944 | "license": "MIT",
945 | "dependencies": {
946 | "mdn-data": "2.0.30",
947 | "source-map-js": "^1.0.1"
948 | },
949 | "engines": {
950 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
951 | }
952 | },
953 | "node_modules/debug": {
954 | "version": "4.3.6",
955 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
956 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
957 | "dev": true,
958 | "license": "MIT",
959 | "dependencies": {
960 | "ms": "2.1.2"
961 | },
962 | "engines": {
963 | "node": ">=6.0"
964 | },
965 | "peerDependenciesMeta": {
966 | "supports-color": {
967 | "optional": true
968 | }
969 | }
970 | },
971 | "node_modules/deepmerge": {
972 | "version": "4.3.1",
973 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
974 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
975 | "dev": true,
976 | "license": "MIT",
977 | "engines": {
978 | "node": ">=0.10.0"
979 | }
980 | },
981 | "node_modules/dequal": {
982 | "version": "2.0.3",
983 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
984 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
985 | "dev": true,
986 | "license": "MIT",
987 | "engines": {
988 | "node": ">=6"
989 | }
990 | },
991 | "node_modules/detect-indent": {
992 | "version": "6.1.0",
993 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
994 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
995 | "dev": true,
996 | "license": "MIT",
997 | "engines": {
998 | "node": ">=8"
999 | }
1000 | },
1001 | "node_modules/es6-promise": {
1002 | "version": "3.3.1",
1003 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
1004 | "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==",
1005 | "dev": true,
1006 | "license": "MIT"
1007 | },
1008 | "node_modules/esbuild": {
1009 | "version": "0.21.5",
1010 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1011 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1012 | "dev": true,
1013 | "hasInstallScript": true,
1014 | "license": "MIT",
1015 | "bin": {
1016 | "esbuild": "bin/esbuild"
1017 | },
1018 | "engines": {
1019 | "node": ">=12"
1020 | },
1021 | "optionalDependencies": {
1022 | "@esbuild/aix-ppc64": "0.21.5",
1023 | "@esbuild/android-arm": "0.21.5",
1024 | "@esbuild/android-arm64": "0.21.5",
1025 | "@esbuild/android-x64": "0.21.5",
1026 | "@esbuild/darwin-arm64": "0.21.5",
1027 | "@esbuild/darwin-x64": "0.21.5",
1028 | "@esbuild/freebsd-arm64": "0.21.5",
1029 | "@esbuild/freebsd-x64": "0.21.5",
1030 | "@esbuild/linux-arm": "0.21.5",
1031 | "@esbuild/linux-arm64": "0.21.5",
1032 | "@esbuild/linux-ia32": "0.21.5",
1033 | "@esbuild/linux-loong64": "0.21.5",
1034 | "@esbuild/linux-mips64el": "0.21.5",
1035 | "@esbuild/linux-ppc64": "0.21.5",
1036 | "@esbuild/linux-riscv64": "0.21.5",
1037 | "@esbuild/linux-s390x": "0.21.5",
1038 | "@esbuild/linux-x64": "0.21.5",
1039 | "@esbuild/netbsd-x64": "0.21.5",
1040 | "@esbuild/openbsd-x64": "0.21.5",
1041 | "@esbuild/sunos-x64": "0.21.5",
1042 | "@esbuild/win32-arm64": "0.21.5",
1043 | "@esbuild/win32-ia32": "0.21.5",
1044 | "@esbuild/win32-x64": "0.21.5"
1045 | }
1046 | },
1047 | "node_modules/estree-walker": {
1048 | "version": "3.0.3",
1049 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
1050 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
1051 | "dev": true,
1052 | "license": "MIT",
1053 | "dependencies": {
1054 | "@types/estree": "^1.0.0"
1055 | }
1056 | },
1057 | "node_modules/fill-range": {
1058 | "version": "7.1.1",
1059 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1060 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1061 | "dev": true,
1062 | "license": "MIT",
1063 | "dependencies": {
1064 | "to-regex-range": "^5.0.1"
1065 | },
1066 | "engines": {
1067 | "node": ">=8"
1068 | }
1069 | },
1070 | "node_modules/fs.realpath": {
1071 | "version": "1.0.0",
1072 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1073 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
1074 | "dev": true,
1075 | "license": "ISC"
1076 | },
1077 | "node_modules/fsevents": {
1078 | "version": "2.3.3",
1079 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1080 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1081 | "dev": true,
1082 | "hasInstallScript": true,
1083 | "license": "MIT",
1084 | "optional": true,
1085 | "os": [
1086 | "darwin"
1087 | ],
1088 | "engines": {
1089 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1090 | }
1091 | },
1092 | "node_modules/glob": {
1093 | "version": "7.2.3",
1094 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1095 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1096 | "deprecated": "Glob versions prior to v9 are no longer supported",
1097 | "dev": true,
1098 | "license": "ISC",
1099 | "dependencies": {
1100 | "fs.realpath": "^1.0.0",
1101 | "inflight": "^1.0.4",
1102 | "inherits": "2",
1103 | "minimatch": "^3.1.1",
1104 | "once": "^1.3.0",
1105 | "path-is-absolute": "^1.0.0"
1106 | },
1107 | "engines": {
1108 | "node": "*"
1109 | },
1110 | "funding": {
1111 | "url": "https://github.com/sponsors/isaacs"
1112 | }
1113 | },
1114 | "node_modules/glob-parent": {
1115 | "version": "5.1.2",
1116 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1117 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1118 | "dev": true,
1119 | "license": "ISC",
1120 | "dependencies": {
1121 | "is-glob": "^4.0.1"
1122 | },
1123 | "engines": {
1124 | "node": ">= 6"
1125 | }
1126 | },
1127 | "node_modules/graceful-fs": {
1128 | "version": "4.2.11",
1129 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1130 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
1131 | "dev": true,
1132 | "license": "ISC"
1133 | },
1134 | "node_modules/inflight": {
1135 | "version": "1.0.6",
1136 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1137 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
1138 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
1139 | "dev": true,
1140 | "license": "ISC",
1141 | "dependencies": {
1142 | "once": "^1.3.0",
1143 | "wrappy": "1"
1144 | }
1145 | },
1146 | "node_modules/inherits": {
1147 | "version": "2.0.4",
1148 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1149 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1150 | "dev": true,
1151 | "license": "ISC"
1152 | },
1153 | "node_modules/is-binary-path": {
1154 | "version": "2.1.0",
1155 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1156 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1157 | "dev": true,
1158 | "license": "MIT",
1159 | "dependencies": {
1160 | "binary-extensions": "^2.0.0"
1161 | },
1162 | "engines": {
1163 | "node": ">=8"
1164 | }
1165 | },
1166 | "node_modules/is-extglob": {
1167 | "version": "2.1.1",
1168 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1169 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1170 | "dev": true,
1171 | "license": "MIT",
1172 | "engines": {
1173 | "node": ">=0.10.0"
1174 | }
1175 | },
1176 | "node_modules/is-glob": {
1177 | "version": "4.0.3",
1178 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1179 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1180 | "dev": true,
1181 | "license": "MIT",
1182 | "dependencies": {
1183 | "is-extglob": "^2.1.1"
1184 | },
1185 | "engines": {
1186 | "node": ">=0.10.0"
1187 | }
1188 | },
1189 | "node_modules/is-number": {
1190 | "version": "7.0.0",
1191 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1192 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1193 | "dev": true,
1194 | "license": "MIT",
1195 | "engines": {
1196 | "node": ">=0.12.0"
1197 | }
1198 | },
1199 | "node_modules/is-reference": {
1200 | "version": "3.0.2",
1201 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
1202 | "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
1203 | "dev": true,
1204 | "license": "MIT",
1205 | "dependencies": {
1206 | "@types/estree": "*"
1207 | }
1208 | },
1209 | "node_modules/kleur": {
1210 | "version": "4.1.5",
1211 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
1212 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
1213 | "dev": true,
1214 | "license": "MIT",
1215 | "engines": {
1216 | "node": ">=6"
1217 | }
1218 | },
1219 | "node_modules/locate-character": {
1220 | "version": "3.0.0",
1221 | "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
1222 | "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
1223 | "dev": true,
1224 | "license": "MIT"
1225 | },
1226 | "node_modules/magic-string": {
1227 | "version": "0.30.11",
1228 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
1229 | "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
1230 | "dev": true,
1231 | "license": "MIT",
1232 | "dependencies": {
1233 | "@jridgewell/sourcemap-codec": "^1.5.0"
1234 | }
1235 | },
1236 | "node_modules/mdn-data": {
1237 | "version": "2.0.30",
1238 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
1239 | "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
1240 | "dev": true,
1241 | "license": "CC0-1.0"
1242 | },
1243 | "node_modules/min-indent": {
1244 | "version": "1.0.1",
1245 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
1246 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
1247 | "dev": true,
1248 | "license": "MIT",
1249 | "engines": {
1250 | "node": ">=4"
1251 | }
1252 | },
1253 | "node_modules/minimatch": {
1254 | "version": "3.1.2",
1255 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1256 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1257 | "dev": true,
1258 | "license": "ISC",
1259 | "dependencies": {
1260 | "brace-expansion": "^1.1.7"
1261 | },
1262 | "engines": {
1263 | "node": "*"
1264 | }
1265 | },
1266 | "node_modules/minimist": {
1267 | "version": "1.2.8",
1268 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
1269 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
1270 | "dev": true,
1271 | "license": "MIT",
1272 | "funding": {
1273 | "url": "https://github.com/sponsors/ljharb"
1274 | }
1275 | },
1276 | "node_modules/mkdirp": {
1277 | "version": "0.5.6",
1278 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
1279 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
1280 | "dev": true,
1281 | "license": "MIT",
1282 | "dependencies": {
1283 | "minimist": "^1.2.6"
1284 | },
1285 | "bin": {
1286 | "mkdirp": "bin/cmd.js"
1287 | }
1288 | },
1289 | "node_modules/mri": {
1290 | "version": "1.2.0",
1291 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
1292 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
1293 | "dev": true,
1294 | "license": "MIT",
1295 | "engines": {
1296 | "node": ">=4"
1297 | }
1298 | },
1299 | "node_modules/ms": {
1300 | "version": "2.1.2",
1301 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1302 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1303 | "dev": true,
1304 | "license": "MIT"
1305 | },
1306 | "node_modules/nanoid": {
1307 | "version": "3.3.7",
1308 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1309 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
1310 | "dev": true,
1311 | "funding": [
1312 | {
1313 | "type": "github",
1314 | "url": "https://github.com/sponsors/ai"
1315 | }
1316 | ],
1317 | "license": "MIT",
1318 | "bin": {
1319 | "nanoid": "bin/nanoid.cjs"
1320 | },
1321 | "engines": {
1322 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1323 | }
1324 | },
1325 | "node_modules/normalize-path": {
1326 | "version": "3.0.0",
1327 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1328 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1329 | "dev": true,
1330 | "license": "MIT",
1331 | "engines": {
1332 | "node": ">=0.10.0"
1333 | }
1334 | },
1335 | "node_modules/once": {
1336 | "version": "1.4.0",
1337 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1338 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1339 | "dev": true,
1340 | "license": "ISC",
1341 | "dependencies": {
1342 | "wrappy": "1"
1343 | }
1344 | },
1345 | "node_modules/path-is-absolute": {
1346 | "version": "1.0.1",
1347 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1348 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1349 | "dev": true,
1350 | "license": "MIT",
1351 | "engines": {
1352 | "node": ">=0.10.0"
1353 | }
1354 | },
1355 | "node_modules/periscopic": {
1356 | "version": "3.1.0",
1357 | "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
1358 | "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
1359 | "dev": true,
1360 | "license": "MIT",
1361 | "dependencies": {
1362 | "@types/estree": "^1.0.0",
1363 | "estree-walker": "^3.0.0",
1364 | "is-reference": "^3.0.0"
1365 | }
1366 | },
1367 | "node_modules/picocolors": {
1368 | "version": "1.1.1",
1369 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1370 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1371 | "dev": true,
1372 | "license": "ISC"
1373 | },
1374 | "node_modules/picomatch": {
1375 | "version": "2.3.1",
1376 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1377 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1378 | "dev": true,
1379 | "license": "MIT",
1380 | "engines": {
1381 | "node": ">=8.6"
1382 | },
1383 | "funding": {
1384 | "url": "https://github.com/sponsors/jonschlinkert"
1385 | }
1386 | },
1387 | "node_modules/postcss": {
1388 | "version": "8.4.47",
1389 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
1390 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
1391 | "dev": true,
1392 | "funding": [
1393 | {
1394 | "type": "opencollective",
1395 | "url": "https://opencollective.com/postcss/"
1396 | },
1397 | {
1398 | "type": "tidelift",
1399 | "url": "https://tidelift.com/funding/github/npm/postcss"
1400 | },
1401 | {
1402 | "type": "github",
1403 | "url": "https://github.com/sponsors/ai"
1404 | }
1405 | ],
1406 | "license": "MIT",
1407 | "dependencies": {
1408 | "nanoid": "^3.3.7",
1409 | "picocolors": "^1.1.0",
1410 | "source-map-js": "^1.2.1"
1411 | },
1412 | "engines": {
1413 | "node": "^10 || ^12 || >=14"
1414 | }
1415 | },
1416 | "node_modules/readdirp": {
1417 | "version": "3.6.0",
1418 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1419 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1420 | "dev": true,
1421 | "license": "MIT",
1422 | "dependencies": {
1423 | "picomatch": "^2.2.1"
1424 | },
1425 | "engines": {
1426 | "node": ">=8.10.0"
1427 | }
1428 | },
1429 | "node_modules/rimraf": {
1430 | "version": "2.7.1",
1431 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1432 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1433 | "deprecated": "Rimraf versions prior to v4 are no longer supported",
1434 | "dev": true,
1435 | "license": "ISC",
1436 | "dependencies": {
1437 | "glob": "^7.1.3"
1438 | },
1439 | "bin": {
1440 | "rimraf": "bin.js"
1441 | }
1442 | },
1443 | "node_modules/rollup": {
1444 | "version": "4.24.3",
1445 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz",
1446 | "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==",
1447 | "dev": true,
1448 | "license": "MIT",
1449 | "dependencies": {
1450 | "@types/estree": "1.0.6"
1451 | },
1452 | "bin": {
1453 | "rollup": "dist/bin/rollup"
1454 | },
1455 | "engines": {
1456 | "node": ">=18.0.0",
1457 | "npm": ">=8.0.0"
1458 | },
1459 | "optionalDependencies": {
1460 | "@rollup/rollup-android-arm-eabi": "4.24.3",
1461 | "@rollup/rollup-android-arm64": "4.24.3",
1462 | "@rollup/rollup-darwin-arm64": "4.24.3",
1463 | "@rollup/rollup-darwin-x64": "4.24.3",
1464 | "@rollup/rollup-freebsd-arm64": "4.24.3",
1465 | "@rollup/rollup-freebsd-x64": "4.24.3",
1466 | "@rollup/rollup-linux-arm-gnueabihf": "4.24.3",
1467 | "@rollup/rollup-linux-arm-musleabihf": "4.24.3",
1468 | "@rollup/rollup-linux-arm64-gnu": "4.24.3",
1469 | "@rollup/rollup-linux-arm64-musl": "4.24.3",
1470 | "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3",
1471 | "@rollup/rollup-linux-riscv64-gnu": "4.24.3",
1472 | "@rollup/rollup-linux-s390x-gnu": "4.24.3",
1473 | "@rollup/rollup-linux-x64-gnu": "4.24.3",
1474 | "@rollup/rollup-linux-x64-musl": "4.24.3",
1475 | "@rollup/rollup-win32-arm64-msvc": "4.24.3",
1476 | "@rollup/rollup-win32-ia32-msvc": "4.24.3",
1477 | "@rollup/rollup-win32-x64-msvc": "4.24.3",
1478 | "fsevents": "~2.3.2"
1479 | }
1480 | },
1481 | "node_modules/sade": {
1482 | "version": "1.8.1",
1483 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
1484 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
1485 | "dev": true,
1486 | "license": "MIT",
1487 | "dependencies": {
1488 | "mri": "^1.1.0"
1489 | },
1490 | "engines": {
1491 | "node": ">=6"
1492 | }
1493 | },
1494 | "node_modules/sander": {
1495 | "version": "0.5.1",
1496 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz",
1497 | "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==",
1498 | "dev": true,
1499 | "license": "MIT",
1500 | "dependencies": {
1501 | "es6-promise": "^3.1.2",
1502 | "graceful-fs": "^4.1.3",
1503 | "mkdirp": "^0.5.1",
1504 | "rimraf": "^2.5.2"
1505 | }
1506 | },
1507 | "node_modules/sorcery": {
1508 | "version": "0.11.1",
1509 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.1.tgz",
1510 | "integrity": "sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==",
1511 | "dev": true,
1512 | "license": "MIT",
1513 | "dependencies": {
1514 | "@jridgewell/sourcemap-codec": "^1.4.14",
1515 | "buffer-crc32": "^1.0.0",
1516 | "minimist": "^1.2.0",
1517 | "sander": "^0.5.0"
1518 | },
1519 | "bin": {
1520 | "sorcery": "bin/sorcery"
1521 | }
1522 | },
1523 | "node_modules/source-map-js": {
1524 | "version": "1.2.1",
1525 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1526 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1527 | "dev": true,
1528 | "license": "BSD-3-Clause",
1529 | "engines": {
1530 | "node": ">=0.10.0"
1531 | }
1532 | },
1533 | "node_modules/strip-indent": {
1534 | "version": "3.0.0",
1535 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
1536 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
1537 | "dev": true,
1538 | "license": "MIT",
1539 | "dependencies": {
1540 | "min-indent": "^1.0.0"
1541 | },
1542 | "engines": {
1543 | "node": ">=8"
1544 | }
1545 | },
1546 | "node_modules/svelte": {
1547 | "version": "4.2.19",
1548 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz",
1549 | "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==",
1550 | "dev": true,
1551 | "license": "MIT",
1552 | "dependencies": {
1553 | "@ampproject/remapping": "^2.2.1",
1554 | "@jridgewell/sourcemap-codec": "^1.4.15",
1555 | "@jridgewell/trace-mapping": "^0.3.18",
1556 | "@types/estree": "^1.0.1",
1557 | "acorn": "^8.9.0",
1558 | "aria-query": "^5.3.0",
1559 | "axobject-query": "^4.0.0",
1560 | "code-red": "^1.0.3",
1561 | "css-tree": "^2.3.1",
1562 | "estree-walker": "^3.0.3",
1563 | "is-reference": "^3.0.1",
1564 | "locate-character": "^3.0.0",
1565 | "magic-string": "^0.30.4",
1566 | "periscopic": "^3.1.0"
1567 | },
1568 | "engines": {
1569 | "node": ">=16"
1570 | }
1571 | },
1572 | "node_modules/svelte-check": {
1573 | "version": "3.8.6",
1574 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.8.6.tgz",
1575 | "integrity": "sha512-ij0u4Lw/sOTREP13BdWZjiXD/BlHE6/e2e34XzmVmsp5IN4kVa3PWP65NM32JAgwjZlwBg/+JtiNV1MM8khu0Q==",
1576 | "dev": true,
1577 | "license": "MIT",
1578 | "dependencies": {
1579 | "@jridgewell/trace-mapping": "^0.3.17",
1580 | "chokidar": "^3.4.1",
1581 | "picocolors": "^1.0.0",
1582 | "sade": "^1.7.4",
1583 | "svelte-preprocess": "^5.1.3",
1584 | "typescript": "^5.0.3"
1585 | },
1586 | "bin": {
1587 | "svelte-check": "bin/svelte-check"
1588 | },
1589 | "peerDependencies": {
1590 | "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0"
1591 | }
1592 | },
1593 | "node_modules/svelte-hmr": {
1594 | "version": "0.16.0",
1595 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz",
1596 | "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==",
1597 | "dev": true,
1598 | "license": "ISC",
1599 | "engines": {
1600 | "node": "^12.20 || ^14.13.1 || >= 16"
1601 | },
1602 | "peerDependencies": {
1603 | "svelte": "^3.19.0 || ^4.0.0"
1604 | }
1605 | },
1606 | "node_modules/svelte-preprocess": {
1607 | "version": "5.1.4",
1608 | "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.4.tgz",
1609 | "integrity": "sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==",
1610 | "dev": true,
1611 | "hasInstallScript": true,
1612 | "license": "MIT",
1613 | "dependencies": {
1614 | "@types/pug": "^2.0.6",
1615 | "detect-indent": "^6.1.0",
1616 | "magic-string": "^0.30.5",
1617 | "sorcery": "^0.11.0",
1618 | "strip-indent": "^3.0.0"
1619 | },
1620 | "engines": {
1621 | "node": ">= 16.0.0"
1622 | },
1623 | "peerDependencies": {
1624 | "@babel/core": "^7.10.2",
1625 | "coffeescript": "^2.5.1",
1626 | "less": "^3.11.3 || ^4.0.0",
1627 | "postcss": "^7 || ^8",
1628 | "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
1629 | "pug": "^3.0.0",
1630 | "sass": "^1.26.8",
1631 | "stylus": "^0.55.0",
1632 | "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0",
1633 | "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0",
1634 | "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0"
1635 | },
1636 | "peerDependenciesMeta": {
1637 | "@babel/core": {
1638 | "optional": true
1639 | },
1640 | "coffeescript": {
1641 | "optional": true
1642 | },
1643 | "less": {
1644 | "optional": true
1645 | },
1646 | "postcss": {
1647 | "optional": true
1648 | },
1649 | "postcss-load-config": {
1650 | "optional": true
1651 | },
1652 | "pug": {
1653 | "optional": true
1654 | },
1655 | "sass": {
1656 | "optional": true
1657 | },
1658 | "stylus": {
1659 | "optional": true
1660 | },
1661 | "sugarss": {
1662 | "optional": true
1663 | },
1664 | "typescript": {
1665 | "optional": true
1666 | }
1667 | }
1668 | },
1669 | "node_modules/to-regex-range": {
1670 | "version": "5.0.1",
1671 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1672 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1673 | "dev": true,
1674 | "license": "MIT",
1675 | "dependencies": {
1676 | "is-number": "^7.0.0"
1677 | },
1678 | "engines": {
1679 | "node": ">=8.0"
1680 | }
1681 | },
1682 | "node_modules/tslib": {
1683 | "version": "2.6.3",
1684 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
1685 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
1686 | "dev": true,
1687 | "license": "0BSD"
1688 | },
1689 | "node_modules/typescript": {
1690 | "version": "5.5.4",
1691 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
1692 | "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
1693 | "dev": true,
1694 | "license": "Apache-2.0",
1695 | "bin": {
1696 | "tsc": "bin/tsc",
1697 | "tsserver": "bin/tsserver"
1698 | },
1699 | "engines": {
1700 | "node": ">=14.17"
1701 | }
1702 | },
1703 | "node_modules/vite": {
1704 | "version": "5.4.10",
1705 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz",
1706 | "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==",
1707 | "dev": true,
1708 | "license": "MIT",
1709 | "dependencies": {
1710 | "esbuild": "^0.21.3",
1711 | "postcss": "^8.4.43",
1712 | "rollup": "^4.20.0"
1713 | },
1714 | "bin": {
1715 | "vite": "bin/vite.js"
1716 | },
1717 | "engines": {
1718 | "node": "^18.0.0 || >=20.0.0"
1719 | },
1720 | "funding": {
1721 | "url": "https://github.com/vitejs/vite?sponsor=1"
1722 | },
1723 | "optionalDependencies": {
1724 | "fsevents": "~2.3.3"
1725 | },
1726 | "peerDependencies": {
1727 | "@types/node": "^18.0.0 || >=20.0.0",
1728 | "less": "*",
1729 | "lightningcss": "^1.21.0",
1730 | "sass": "*",
1731 | "sass-embedded": "*",
1732 | "stylus": "*",
1733 | "sugarss": "*",
1734 | "terser": "^5.4.0"
1735 | },
1736 | "peerDependenciesMeta": {
1737 | "@types/node": {
1738 | "optional": true
1739 | },
1740 | "less": {
1741 | "optional": true
1742 | },
1743 | "lightningcss": {
1744 | "optional": true
1745 | },
1746 | "sass": {
1747 | "optional": true
1748 | },
1749 | "sass-embedded": {
1750 | "optional": true
1751 | },
1752 | "stylus": {
1753 | "optional": true
1754 | },
1755 | "sugarss": {
1756 | "optional": true
1757 | },
1758 | "terser": {
1759 | "optional": true
1760 | }
1761 | }
1762 | },
1763 | "node_modules/vitefu": {
1764 | "version": "0.2.5",
1765 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
1766 | "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==",
1767 | "dev": true,
1768 | "license": "MIT",
1769 | "peerDependencies": {
1770 | "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
1771 | },
1772 | "peerDependenciesMeta": {
1773 | "vite": {
1774 | "optional": true
1775 | }
1776 | }
1777 | },
1778 | "node_modules/wrappy": {
1779 | "version": "1.0.2",
1780 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1781 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1782 | "dev": true,
1783 | "license": "ISC"
1784 | }
1785 | }
1786 | }
1787 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aiui",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview",
10 | "check": "svelte-check --tsconfig ./tsconfig.json && tsc -p tsconfig.node.json"
11 | },
12 | "devDependencies": {
13 | "@sveltejs/vite-plugin-svelte": "^3.1.1",
14 | "@tsconfig/svelte": "^5.0.4",
15 | "svelte": "^4.2.18",
16 | "svelte-check": "^3.8.5",
17 | "tslib": "^2.6.3",
18 | "typescript": "^5.5.3",
19 | "vite": "^5.4.1"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/public/aiui.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jxqu3/aiui/719e71091750fb2543b4dbb89130a5ada2a5d053/public/aiui.eot
--------------------------------------------------------------------------------
/public/aiui.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Copyright (C) 2024 by original authors @ fontello.com
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/public/aiui.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jxqu3/aiui/719e71091750fb2543b4dbb89130a5ada2a5d053/public/aiui.ttf
--------------------------------------------------------------------------------
/public/aiui.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jxqu3/aiui/719e71091750fb2543b4dbb89130a5ada2a5d053/public/aiui.woff
--------------------------------------------------------------------------------
/public/aiui.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jxqu3/aiui/719e71091750fb2543b4dbb89130a5ada2a5d053/public/aiui.woff2
--------------------------------------------------------------------------------
/public/icon-bg.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/public/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/lighttoggle.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/public/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/App.svelte:
--------------------------------------------------------------------------------
1 |
82 |
83 |
84 | {#if $errorStore != ""}
85 | clearError()}>{$errorStore}
86 | {/if}
87 | {#await loadSettings() then _}
88 |
92 |
93 |
100 |
101 |
102 | scrollToBottom(document.getElementById("messages-container"))} bind:chats bind:selectedChat bind:selectedModel/>
103 |
104 |
105 | {#if showChats}
106 |
showChats=!showChats} class="panel-title-button">chat
107 |
chats = [...chats, []]}/>
108 |
109 | {:else}
110 | showChats=!showChats} class="panel-title-button">prompts
111 |
112 |
113 | {/if}
114 |
115 |
116 | {/await}
117 |
118 |
119 |
194 |
--------------------------------------------------------------------------------
/src/aiui.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'aiui';
3 | src: url('/aiui.eot');
4 | src: url('/aiui.eot#iefix') format('embedded-opentype'),
5 | url('/aiui.woff2') format('woff2'),
6 | url('/aiui.woff') format('woff'),
7 | url('/aiui.ttf') format('truetype'),
8 | url('/aiui.svg#aiui') format('svg');
9 | font-weight: normal;
10 | font-style: normal;
11 | }
12 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
13 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
14 | /*
15 | @media screen and (-webkit-min-device-pixel-ratio:0) {
16 | @font-face {
17 | font-family: 'aiui';
18 | src: url('../font/aiui.svg?22987603#aiui') format('svg');
19 | }
20 | }
21 | */
22 | [class^="i-"]:before, [class*=" i-"]:before {
23 | font-family: "aiui";
24 | font-style: normal;
25 | font-weight: normal;
26 | speak: never;
27 |
28 | display: flex;
29 | align-items: center;
30 | justify-content: center;
31 | text-decoration: inherit;
32 | width: 100%;
33 | height: 100%;
34 | text-align: center;
35 |
36 | font-variant: normal;
37 | text-transform: none;
38 |
39 | line-height: 1em;
40 |
41 | -webkit-font-smoothing: antialiased;
42 | -moz-osx-font-smoothing: grayscale;
43 | }
44 |
45 |
46 | .i-edit:before { content: '\e800'; } /* '' */
47 | .i-regen:before { content: '\e801'; } /* '' */
48 | .i-new:before { content: '\e803'; } /* '' */
49 | .i-send:before { content: '\e804'; } /* '' */
50 | .i-send-ai:before { content: '\e805'; } /* '' */
51 | .i-remove:before { content: '\e806'; } /* '' */
52 |
--------------------------------------------------------------------------------
/src/api.ts:
--------------------------------------------------------------------------------
1 | import { errorStore, setError } from "./utils";
2 | import { get, writable } from "svelte/store";
3 |
4 | export let ollamaApi = writable(true);
5 | export let apiKey = writable("YOUR_API_KEY");
6 |
7 | export let instructMode = writable(false);
8 | export let instructTemplate = writable({
9 | systemTag: "<|system|>\\n",
10 | userTag: "<|user|>\\n",
11 | assistantTag: "<|assistant|>\\n"
12 | });
13 |
14 | export let apiUrl = writable("http://127.0.0.1:11434"); // ollama default api url
15 | let isGenerating: boolean = false;
16 |
17 | let aborted = false;
18 |
19 | export let generatingStore: any = writable(isGenerating);
20 |
21 | export let prompts = writable([
22 | {
23 | name: "AI Assistant",
24 | shortDescription: "A simple AI assistant",
25 | prompt: "AI Assistant"
26 | }
27 | ])
28 |
29 | export let options = writable(
30 | {
31 | temperature: 0.7,
32 | max_tokens: 400,
33 | }
34 | )
35 |
36 | export let selectedPrompt = writable(0)
37 |
38 | export function addPrompt(prompt: Prompt) {
39 | prompts.set([...get(prompts), prompt])
40 | }
41 |
42 |
43 | export type Model = {
44 | name: string;
45 | details: {
46 | parameter_size: string;
47 | }
48 | }
49 |
50 | export type Message = {
51 | role: string,
52 | content: string,
53 | images?: string[],
54 | }
55 |
56 | export type Chat = Message[]
57 |
58 | export type Persona = {
59 | name: string,
60 | description: string,
61 | use: boolean
62 | }
63 |
64 | export let persona = writable({
65 | name: "User",
66 | description: "a user",
67 | use: true
68 | })
69 |
70 | export let sysprompt = writable("You are a helpful assistant.")
71 |
72 | export type Prompt = {
73 | name: string,
74 | shortDescription: string,
75 | prompt: string,
76 | }
77 |
78 | export function setApiUrl(url: string) {
79 | if (!url) return;
80 | apiUrl.set(url);
81 | }
82 |
83 | export async function getModelList(): Promise {
84 | if (get(ollamaApi)) {
85 | try {
86 | const response = await fetch(`${get(apiUrl)}/api/tags`);
87 | if (!response.ok) {
88 | throw new Error(`HTTP error! status: ${response.status}`);
89 | }
90 |
91 |
92 | const json = await response.json();
93 | return json["models"];
94 | } catch (error: any) {
95 | return []
96 | }
97 | } else {
98 | try {
99 | const response = await fetch(`${get(apiUrl)}/models`);
100 | if (!response.ok) {
101 | throw new Error(`HTTP error! status: ${response.status}`);
102 | }
103 |
104 | const json = await response.json();
105 | return json["data"].map((model: any) => {
106 | return {
107 | name: model.id,
108 | details: {
109 | parameter_size: "?"
110 | }
111 | }
112 | });
113 | } catch (error: any) {
114 | return [
115 | {
116 | name: "error",
117 | details: {
118 | parameter_size: "?"
119 | }
120 | }
121 | ]
122 | }
123 | }
124 | }
125 |
126 | function parseMessages(messages: Message[]) {
127 | const prompt = get(prompts)[get(selectedPrompt)]
128 | let personaPrompt = `\nUser Persona:\n Name: ${get(persona).name}\nDescription: ${get(persona).description}`
129 |
130 | if (get(persona).use == false) {
131 | personaPrompt = ""
132 | }
133 |
134 | let messagePrompt = `${prompt.prompt.replaceAll("{{char}}", prompt.name).replaceAll("{{user}}", get(persona).name)}`
135 |
136 | const parsed = messages.map((message) => {
137 | if (message.images && message.images.length > 0) {
138 | if (get(ollamaApi)) {
139 | return {
140 | role: message.role,
141 | content: message.content,
142 | images: [
143 | message.images[0].split(",")[1] // OLLaMA API does not accept the Base64 header.
144 | ]
145 | }
146 | } else {
147 | return {
148 | role: message.role,
149 | content: [
150 | {
151 | type: "text",
152 | text: message.content,
153 | },
154 | {
155 | type: "image_url",
156 | image_url: {
157 | url: message.images[0] // OAI API requires the Base64 header.
158 | }
159 | }
160 | ],
161 | }
162 | }
163 | } else {
164 | return {
165 | role: message.role,
166 | content: message.content
167 | }
168 | }
169 | })
170 | return [
171 | {
172 | role: "system",
173 | content: `${get(sysprompt)}${messagePrompt}\n${personaPrompt}`
174 | },
175 | ...parsed
176 | ]
177 | }
178 |
179 | export async function* chatRequest(model: string, messages: Message[]) {
180 | const gotOptions = get(options)
181 |
182 | generatingStore.set(true);
183 | try {
184 | let parsedMessages = parseMessages(messages)
185 | console.log("Request messages:", parsedMessages);
186 | let response: Response;
187 | if (get(ollamaApi)) {
188 | response = await fetch(`${get(apiUrl)}/api/chat`, {
189 | method: 'POST',
190 | headers: {
191 | 'Content-Type': 'application/json'
192 | },
193 | body: JSON.stringify({
194 | model: model,
195 | messages: parsedMessages,
196 | options: gotOptions,
197 | keep_alive: "30m",
198 | })
199 | });
200 | } else {
201 | response = await fetch(`${get(apiUrl)}/chat/completions`, {
202 | method: 'POST',
203 | headers: {
204 | 'Content-Type': 'application/json',
205 | "Authorization": `Bearer ${get(apiKey)}`
206 | },
207 | body: JSON.stringify({
208 | model: model,
209 | messages: parsedMessages,
210 | max_tokens: gotOptions.max_tokens,
211 | temperature: gotOptions.temperature,
212 | stream: true
213 | })
214 | });
215 | }
216 |
217 | // handle errors
218 | if (!response.ok) {
219 | throw new Error(`HTTP error! status: ${response.status}`);
220 | }
221 |
222 | // json streaming
223 | const reader = response.body?.getReader();
224 | const decoder = new TextDecoder();
225 |
226 | let done = false;
227 |
228 | while (!done) {
229 | const { value, done: doneReading } = await reader!.read();
230 | done = doneReading;
231 | generatingStore.set(!done);
232 | const chunkValue: any = decoder.decode(value, {stream: true});
233 |
234 | // send to update message
235 | if(!done) {
236 | if (aborted) {
237 | await reader?.cancel()
238 | aborted = false
239 | break
240 | }
241 | if(get(ollamaApi)) {
242 | const token = JSON.parse(chunkValue)['message']['content'];
243 | if(token) {
244 | yield token
245 | }
246 | } else {
247 | const lines = chunkValue.split('\n');
248 | for (let line of lines) {
249 | const data = line.substring(6).trim()
250 | if (data === '') continue; // Skip empty lines
251 | if (data === '[DONE]') {
252 | done = true; // End of the stream
253 | break;
254 | }
255 | try {
256 | const json = JSON.parse(data)
257 | if (json.choices) {
258 | const text = json.choices[0].delta.content || ''; // Extract the content
259 | yield text; // Handle the streamed data
260 | }
261 | } catch (error) {
262 | console.log(line)
263 | setError(`Error parsing JSON: ${error}`);
264 | }
265 | }
266 | }
267 | }
268 | }
269 | generatingStore.set(false);
270 | } catch (error: any) {
271 | setError("Error generating response: " + error.toString());
272 | }
273 | }
274 |
275 |
276 | function parsePrompt(messages: any[]) {
277 | let prompt = "";
278 | const template = get(instructTemplate)
279 |
280 | messages.forEach((message) => {
281 | if (message.role == "system") {
282 | prompt += template.systemTag.replaceAll("\\n", "\n") + message.content
283 | } else if (message.role == "user") {
284 | prompt += template.userTag.replaceAll("\\n", "\n") + message.content
285 | } else if (message.role == "assistant") {
286 | prompt += template.assistantTag.replaceAll("\\n", "\n") + message.content
287 | }
288 | })
289 | return prompt
290 |
291 | }
292 |
293 |
294 | export async function* instructRequest(model: string, messages: Message[]) {
295 | generatingStore.set(true);
296 | const gotOptions = get(options)
297 | try {
298 | let parsedMessages = parseMessages(messages);
299 | let prompt = parsePrompt(parsedMessages);
300 | console.log("Request prompt:", prompt);
301 | let response: Response;
302 | if (get(ollamaApi)) {
303 | response = await fetch(`${get(apiUrl)}/api/generate`, {
304 | method: 'POST',
305 | headers: {
306 | 'Content-Type': 'application/json'
307 | },
308 | body: JSON.stringify({
309 | model: model,
310 | prompt: prompt,
311 | raw: true,
312 | options: gotOptions,
313 | keep_alive: "30m",
314 | })
315 | });
316 | } else {
317 | response = await fetch(`${get(apiUrl)}/completions`, {
318 | method: 'POST',
319 | headers: {
320 | 'Content-Type': 'application/json',
321 | "Authorization": `Bearer ${get(apiKey)}`
322 | },
323 | body: JSON.stringify({
324 | model: model,
325 | prompt: prompt,
326 | max_tokens: gotOptions.max_tokens,
327 | temperature: gotOptions.temperature,
328 | stream: true
329 | })
330 | });
331 | }
332 |
333 | // handle errors
334 | if (!response.ok) {
335 | throw new Error(`HTTP error! status: ${response.status}`);
336 | }
337 |
338 | // json streaming
339 | const reader = response.body?.getReader();
340 | const decoder = new TextDecoder();
341 |
342 | let done = false;
343 |
344 | while (!done) {
345 | const { value, done: doneReading } = await reader!.read();
346 | done = doneReading;
347 | generatingStore.set(!done);
348 | const chunkValue: any = decoder.decode(value, {stream: true});
349 |
350 | // send to update message
351 | if(!done) {
352 | if (aborted) {
353 | await reader?.cancel()
354 | aborted = false
355 | break
356 | }
357 | if(get(ollamaApi)) {
358 | const token = JSON.parse(chunkValue)['response'];
359 | if(token) {
360 | yield token
361 | }
362 | } else {
363 | const lines = chunkValue.split('\n');
364 | for (let line of lines) {
365 | const data = line.substring(6).trim()
366 | if (data === '') continue; // Skip empty lines
367 | if (data === '[DONE]') {
368 | done = true; // End of the stream
369 | break;
370 | }
371 | try {
372 | const json = JSON.parse(data)
373 | if (json.choices) {
374 | const text = json.choices[0].text || ''; // Extract the content
375 | yield text; // Handle the streamed data
376 | }
377 | } catch (error) {
378 | console.log(line)
379 | setError(`Error parsing JSON: ${error}`);
380 | }
381 | }
382 | }
383 | }
384 | }
385 | generatingStore.set(false);
386 | } catch (error: any) {
387 | setError("Error generating response: " + error.toString());
388 | }
389 | }
390 |
391 |
392 | export function abort() {
393 | aborted = true;
394 | generatingStore.set(false);
395 | }
--------------------------------------------------------------------------------
/src/app.css:
--------------------------------------------------------------------------------
1 | *,
2 | *::before,
3 | *::after {
4 | outline: none;
5 | box-sizing: border-box;
6 | margin: 0;
7 | padding: 0;
8 | font-family: Roboto, sans-serif;
9 | }
10 |
11 | .dark * {
12 | color: var(--fg);
13 | }
14 |
15 | html{
16 | height: 100svh;
17 | margin: 0;
18 | padding: 0;
19 | }
20 |
21 | /*
22 | --- Theme ---
23 | */
24 | :root {
25 | --shadow: 0 0 2rem #0002;
26 |
27 | --radius: 1rem;
28 |
29 | --input-height: 2.5rem;
30 | }
31 |
32 | .dark {
33 | --bg: #050e15;
34 | --panel-bg: #0f1921;
35 | --highlighted-bg: #1a252d;
36 |
37 | --primary: #95c4e8;
38 | --secondary: #85ccd0;
39 | --accent: #00e38f;
40 |
41 | --fg: #cddce7;
42 | --text-lower: #cddce799;
43 | --scrollbar: #cddce722;
44 | --text-lower-inverted: #10192099;
45 | }
46 |
47 | .light {
48 | --bg: hsl(320, 2%, 90%);
49 | --panel-bg: hsl(320.02 3% 94%);
50 | --highlighted-bg: hsl(320.02 47% 100%);
51 |
52 | --primary: #bdd5f9;
53 | --secondary: #dacbf2;
54 | --accent: #73509e;
55 | --fg: #1a1a1a;
56 | --text-lower: #8d868b;
57 | --scrollbar: #8d868b;
58 | --text-lower-inverted: #f0edef99;
59 | }
60 |
61 | body {
62 | position: relative;
63 | width: 100svw;
64 | height: 100svh;
65 | max-height: 100svh;
66 | display: flex;
67 | }
68 |
69 |
70 | main {
71 | position: fixed;
72 | background-color: var(--bg);
73 | overflow: hidden;
74 | display: flex;
75 | flex: 1;
76 | flex-direction: column;
77 | transition: ease-in-out 0.15s;
78 |
79 | height: 100svh;
80 | width: 100%;
81 | }
82 |
83 | /* --- Placeholder --- */
84 |
85 | ::-webkit-input-placeholder {
86 | color: var(--text-lower);
87 | }
88 |
89 | /* --- Scrollbar --- */
90 |
91 | ::-webkit-scrollbar {
92 | width: 0.5rem;
93 | height: 0.5rem;
94 | }
95 | ::-webkit-scrollbar-track {
96 | background-color: transparent;
97 | }
98 | ::-webkit-scrollbar-thumb {
99 | background-color: var(--scrollbar);
100 | border-radius: var(--radius);
101 | }
102 |
103 | /*
104 | --- Modal Styles ---
105 | */
106 |
107 | .modal {
108 | width: 100vw;
109 | height: 100svh;
110 | overflow: hidden;
111 | position: fixed;
112 | top: 0;
113 | left: 0;
114 | z-index: 100;
115 | display: flex;
116 | align-items: center;
117 | justify-content: center;
118 |
119 | background-color: #0008;
120 | backdrop-filter: blur(5px);
121 | transition: ease-in-out 0.15s;
122 | }
123 |
124 | .modal-body {
125 | background-color: var(--panel-bg);
126 | width: 40rem;
127 | word-break: break-all;
128 | max-height: 80svh;
129 | overflow: auto;
130 | min-height: 10svh;
131 | height: max-content;
132 | box-shadow: var(--shadow);
133 | padding: 1rem;
134 | border-radius: var(--radius);
135 | display: flex;
136 | flex-direction: column;
137 | gap: 1rem;
138 |
139 | text-align: center;
140 | }
141 |
142 | .modal-title {
143 | text-align: center;
144 | font-size: 1.333rem;
145 | font-weight: 700;
146 | color: var(--primary);
147 | font-family: monospace;
148 |
149 | margin-bottom: 0.5rem;
150 | font-weight: bold;
151 | }
152 |
153 | .modal-content {
154 | min-height: 5svh;
155 | overflow: auto;
156 | overflow-x: hidden;
157 | color: var(--fg);
158 | }
159 |
160 | .error {
161 | text-transform: uppercase;
162 | }
163 |
164 | .modal-footer {
165 | display: flex;
166 | justify-content: center;
167 | gap: 1rem;
168 | margin-top: 1rem;
169 | }
170 |
171 | .modal-button {
172 | width: 5rem;
173 | height: 2rem;
174 | border: none;
175 | background-color: var(--primary);
176 | border-radius: var(--radius);
177 | cursor: pointer;
178 | color: var(--bg);
179 | }
180 |
181 | .modal-button:hover {
182 | background-color: var(--accent);
183 | }
184 |
185 | .modal-button-secondary {
186 | width: 5rem;
187 | height: 2rem;
188 | border: 3px solid var(--primary);
189 | background-color: transparent;
190 | border-radius: var(--radius);
191 | cursor: pointer;
192 | color: var(--primary);
193 | font-weight: bold;
194 | }
195 |
196 | .modal-button-secondary:hover {
197 | background-color: var(--primary);
198 | color: var(--bg);
199 | font-weight: normal;
200 | }
201 |
202 | .modal-input {
203 | width: 90%;
204 | height: 2rem;
205 | border: none;
206 | margin: 0.5rem;
207 | background-color: var(--bg);
208 | border-radius: var(--radius);
209 | cursor: text;
210 | padding: 0.5rem;
211 | color: var(--text-lower);
212 | }
213 |
214 | .modal-textarea {
215 | width: 90%;
216 | height: 10rem;
217 | resize: vertical;
218 | background-color: var(--bg);
219 | border-radius: var(--radius);
220 | border: 0;
221 | padding: 0.5rem;
222 | margin: .5rem;
223 | overflow-wrap: break-word;
224 | overflow-x: hidden;
225 | }
226 |
227 | .btn {
228 | width: 5rem;
229 | height: 2rem;
230 | border: none;
231 | background-color: var(--primary);
232 | border-radius: var(--radius);
233 | cursor: pointer;
234 | color: var(--bg);
235 | transition: ease-in-out 0.15s;
236 | transition: transform 0.05s;
237 | }
238 |
239 | .btn:hover {
240 | background-color: var(--accent);
241 | }
242 |
243 | .btn:active {
244 | background-color: var(--secondary);
245 | transform: scale(0.9);
246 | }
247 |
248 | button, main, .chat-panel, svg, svg *, ::after, ::before, .message-sender {
249 | transition: ease-in-out 0.15s;
250 | }
251 |
252 | .title {
253 | text-align: center;
254 | font-size: 1.333rem;
255 | font-weight: 700;
256 | color: var(--primary);
257 | }
258 |
259 | .light .title {
260 | color: var(--accent);
261 | }
262 |
263 | .selector-button {
264 | margin: 1rem;
265 | width: 90%;
266 | height: var(--input-height);
267 | border: none;
268 | background-color: var(--panel-bg);
269 | border-radius: var(--radius);
270 | cursor: pointer;
271 | display: flex;
272 | align-items: center;
273 | justify-content: center;
274 | gap: 0.5rem;
275 | color: var(--text-lower);
276 | }
277 |
278 | .selector-button:hover {
279 | background-color: var(--highlighted-bg);
280 | }
281 |
282 | .light .selector-button {
283 | border: 2px solid var(--text-lower);
284 | }
285 |
286 | .light .selector-button * {
287 | color: var(--text-lower) !important;
288 | }
289 |
290 | .selected svg * {
291 | fill: var(--text-lower-inverted) !important
292 | }
293 |
294 | .selected {
295 | background-color: var(--primary);
296 | }
297 |
298 | .light .selected:hover {
299 | background-color: var(--secondary);
300 | }
301 |
302 | .dark .selected:hover {
303 | background-color: var(--accent);
304 | }
305 |
306 | .dark .selected * {
307 | color: var(--bg) !important;
308 | }
309 |
310 | /* --- Text formatting --- */
311 |
312 | p > span {
313 | /* don't collapse whitespace */
314 | white-space: pre;
315 | display: inline-block;
316 | }
317 |
318 | .asterisk {
319 | color: var(--text-lower);
320 | font-style: italic;
321 | }
322 |
323 | .quote {
324 | color: var(--accent);
325 | }
326 |
327 | .code {
328 | background-color: var(--highlighted-bg);
329 | border-radius: var(--radius);
330 | padding: 0.1rem;
331 | color: var(--text-lower);
332 | font-family: monospace;
333 | font-size: 1rem;
334 | }
335 |
336 | .bold {
337 | font-weight: bold;
338 | }
339 |
340 | .header {
341 | font-size: 1.3rem;
342 | }
343 |
344 | .tooltip {
345 | position: relative;
346 | }
347 |
348 | .tooltip[data-tooltip]::after {
349 | content: attr(data-tooltip);
350 | top: -4rem;
351 | width: 0;
352 | display: block;
353 | overflow: hidden;
354 | position: absolute;
355 | transition: ease-in-out 0.15s;
356 | content: attr(data-tooltip);
357 | background: var(--highlighted-bg);
358 | border-radius: var(--radius);
359 | }
360 |
361 | .tooltip[data-tooltip]:hover::after {
362 | padding: 0.5rem;
363 | width: 4rem;
364 | }
365 |
366 | @media screen and (max-aspect-ratio: 1/1) {
367 | *::-webkit-scrollbar {
368 | display: none !important;
369 | }
370 |
371 | .model-dropdown-container {
372 | width: 60% !important;
373 | }
374 |
375 | .model-dropdown-container > button {
376 | width: 5rem !important;
377 | }
378 |
379 | main > .content {
380 | width: 100% !important;
381 | flex: 1;
382 | grid-template-columns: 100vw 100vw 100vw !important;
383 | overflow-x: scroll;
384 | overflow-y: hidden;
385 | scroll-snap-type: x mandatory !important;
386 | scroll-snap-stop: always !important;
387 | scroll-snap-align: start !important;
388 | }
389 |
390 | .content > div {
391 | scroll-snap-align: start;
392 | height: 100% !important;
393 | }
394 |
395 | .messages-container {
396 | height: 100% !important;
397 | }
398 |
399 | .settings-panel {
400 | transition: .1s ease-in-out !important;
401 | width: 100% !important;
402 | min-height: 100% !important;
403 | overflow: scroll;
404 | }
405 |
406 | .title {
407 | margin: 1rem !important;
408 | }
409 |
410 | .chat-panel {
411 | width: 100% !important;
412 | height: 100% !important;
413 | position: relative;
414 | }
415 |
416 | .chats-panel {
417 | width: 100% !important;
418 | height: 100% !important;
419 | overflow: scroll;
420 | }
421 |
422 | .avatar {
423 | width: 3rem !important;
424 | height: 3rem !important;
425 | }
426 | }
--------------------------------------------------------------------------------
/src/lib/ChatSelector.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 | {#each chats as chat, id}
12 | {
13 | selectedChat = id
14 | setSetting('selectedChat', selectedChat)
15 | }}>
16 | {chat[0] ? `"${chat[0].content.slice(0, 15)}..."` : "empty chat"}
17 | {
18 | selectedChat = 0
19 | if(id == 0){
20 | chats[0] = []
21 | return
22 | }
23 | chats.splice(id, 1)
24 | chats = chats
25 | }}/>
26 |
27 | {/each}
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/lib/ErrorModal.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
Error
12 |
13 |
14 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/src/lib/IconButton.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 | dispatch('click')} class="icon-button {classes} {tooltip ? 'tooltip' : ''}">
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/lib/IconToggle.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 |
22 | change()} class="icon-toggle">
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/lib/Messages/Avatar.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 | {#if role == "user"}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | {:else if role == "assistant"}
20 |
21 |
22 |
23 |
24 | {/if}
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/lib/Messages/Message.svelte:
--------------------------------------------------------------------------------
1 |
58 |
59 |
60 |
61 |
62 |
63 |
71 |
72 | {#if !isEditing}
73 |
74 |
75 | {@html formatText(message.content)}
76 |
77 |
78 | {#if generations.length > 1}
79 |
{
80 | if(selectedGeneration < generations.length - 1) {
81 | console.log(selectedGeneration)
82 | selectedGeneration = selectedGeneration + 1
83 | message.content = generations[selectedGeneration]
84 | }
85 | }}>{"<"}
86 |
{
87 | if(selectedGeneration > 0) {
88 | selectedGeneration = selectedGeneration - 1
89 | message.content = generations[selectedGeneration]
90 | }
91 | }}>{">"}
92 |
93 | {generations.length - selectedGeneration}/{generations.length}
94 |
95 | {/if}
96 | {:else}
97 |
98 |
{
99 | isEditing = false
100 | generations[selectedGeneration] = message.content
101 | setStorage("chats", chats)
102 | }}>Save
103 | {/if}
104 | {#if image}
105 |
106 | {/if}
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/src/lib/Messages/MessageSender.svelte:
--------------------------------------------------------------------------------
1 |
89 |
90 |
129 |
130 |
--------------------------------------------------------------------------------
/src/lib/Messages/MessagesPanel.svelte:
--------------------------------------------------------------------------------
1 |
17 |
18 |
19 | {#each chats[selectedChat] as message, id}
20 | {
21 | chats[selectedChat].splice(id, 1)
22 | chats = chats
23 | setStorage("chats", chats)
24 | }}/>
25 | {/each}
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/lib/ModelDropdown.svelte:
--------------------------------------------------------------------------------
1 |
33 |
34 |
35 |
36 |
active = !active}>
37 | {selectedModel}
38 |
39 | {#await refresh() then _}
40 | {#if active}
41 |
42 | {#each modelList as model}
43 | {
44 | selectedModel = model.name
45 | setSetting('model', model.name)
46 | active = false
47 | }} value={model.name}>{model.name} ({model.details.parameter_size})
48 | {/each}
49 |
50 | {/if}
51 | {/await}
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/src/lib/PersonaEditor.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 | {
11 | setSetting('persona', $persona)
12 | }}/>
13 | {#if $persona.use}
14 | setSetting('persona', $persona)} placeholder="Persona name">
15 |
16 | {/if}
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/lib/PromptCreatorModal.svelte:
--------------------------------------------------------------------------------
1 |
69 |
70 | open = true}>
71 |
72 | {#if open}
73 |
89 | {/if}
90 |
--------------------------------------------------------------------------------
/src/lib/PromptSelector.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 | {#if open}
26 |
40 | {/if}
41 |
42 |
43 | {#each $prompts as prompt, id}
44 |
{
45 | $selectedPrompt = id
46 | setSetting('selectedPrompt', $selectedPrompt)
47 | }}>
48 | {prompt.name}
49 | {prompt.shortDescription}
50 |
51 | {
52 | if($selectedPrompt == id)
53 | $selectedPrompt = 0
54 | if(id == 0){
55 | $prompts[0] = {
56 | name: "AI Assistant",
57 | shortDescription: "Your personal assistant",
58 | prompt: "You are {{user}}'s personal assistant"
59 | }
60 | return
61 | }
62 | $prompts = $prompts.filter((_, i) => i != id)
63 | }}/>
64 | {
65 | name = prompt.name
66 | description = prompt.shortDescription
67 | newPrompt = prompt.prompt
68 |
69 | open = true
70 | }}/>
71 |
72 |
73 | {/each}
74 |
75 |
76 |
--------------------------------------------------------------------------------
/src/lib/Settings.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 | API URL
14 | setSetting('apiUrl', $apiUrl)} placeholder="http://127.0.0.1:11434">
15 |
16 |
17 |
18 | setSetting('ollamaApi', $ollamaApi)}/>
19 |
20 |
21 |
22 | Temperature [{$options.temperature}]
23 | setSetting('options', $options)} class="slider" type="range" name="temp" id="temp" min="0" max="3" step="0.1">
24 |
25 |
26 | Max Tokens [{$options.max_tokens}]
27 | setSetting('options', $options)} class="slider" type="range" name="max-tokens" id="max-tokens" min="20" max="4096" step="10">
28 |
29 |
30 |
31 | API KEY
32 | setSetting('apiKey', $apiKey)} placeholder="API KEY">
33 |
34 |
35 |
36 | setSetting('instructMode', $instructMode)}/>
37 |
38 |
39 | {#if $instructMode}
40 |
41 | System Tag
42 | setSetting('instructTemplate', $instructTemplate)} placeholder="<|im_start|>system\n">
43 |
44 |
45 | User Tag
46 | setSetting('instructTemplate', $instructTemplate)} placeholder="<|im_end|>\n<|im_start|>user\n">
47 |
48 |
49 | Assistant Tag
50 | setSetting('instructTemplate', $instructTemplate)} placeholder="<|im_end|>\n<|im_start|>assistant\n">
51 |
52 | {/if}
53 |
54 |
55 | syspromptShow = !syspromptShow} class="settings-button">System Prompt/Jailbreak
56 |
57 | {#if syspromptShow}
58 |
59 |
60 |
System Prompt/Jailbreak
61 |
62 |
63 |
64 |
70 |
71 |
72 | {/if}
73 |
74 |
75 |
128 |
129 |
--------------------------------------------------------------------------------
/src/lib/ToggleButton.svelte:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 | {label}
17 | change()} class="toggle-button {checked ? 'checked' : ''}"/>
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import './app.css'
2 | import './aiui.css'
3 | import App from './App.svelte'
4 |
5 | const app = new App({
6 | target: document.getElementById('app')!,
7 | })
8 |
9 | export default app
10 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | // Error Handling Functionality
2 | import { writable } from 'svelte/store';
3 |
4 | export const errorStore = writable("");
5 |
6 | export function setError(message: string) {
7 | errorStore.set(message);
8 | console.log("error handled: " + message);
9 | }
10 |
11 | export function clearError() {
12 | errorStore.set("");
13 | console.log("error cleared");
14 | }
15 |
16 | // The storage functions with IndexedDB
17 |
18 | export function getStorage(key: string): Promise {
19 | return new Promise((resolve, reject) => {
20 | const request = indexedDB.open("aiui", 1);
21 |
22 | request.onupgradeneeded = (event) => {
23 | const db = (event.target as IDBOpenDBRequest).result;
24 | if (!db.objectStoreNames.contains("chat")) {
25 | db.createObjectStore("chat");
26 | }
27 | };
28 |
29 | request.onerror = (event) => {
30 | reject(event);
31 | };
32 |
33 | request.onsuccess = (event) => {
34 | const db = (event.target as IDBOpenDBRequest).result;
35 | const transaction = db.transaction(["chat"], "readonly");
36 | const objectStore = transaction.objectStore("chat");
37 | const request = objectStore.get(key);
38 |
39 |
40 | request.onerror = (event) => {
41 | reject(event);
42 | };
43 |
44 | request.onsuccess = (event) => {
45 | resolve(request.result);
46 | }
47 | }
48 | })
49 | }
50 |
51 | export function setStorage(key: string, value: any) {
52 | return new Promise((resolve, reject) => {
53 | const request = indexedDB.open("aiui", 1);
54 |
55 | request.onupgradeneeded = (event) => {
56 | const db = (event.target as IDBOpenDBRequest).result;
57 | if (!db.objectStoreNames.contains("chat")) {
58 | db.createObjectStore("chat");
59 | }
60 | };
61 |
62 | request.onerror = (event) => {
63 | reject(event);
64 | }
65 |
66 | request.onsuccess = (event) => {
67 | const db = (event.target as IDBOpenDBRequest).result;
68 | const transaction = db.transaction(["chat"], "readwrite");
69 | const objectStore = transaction.objectStore("chat");
70 | const request = objectStore.put(value, key);
71 |
72 | request.onerror = (event) => {
73 | reject(event);
74 | }
75 |
76 | request.onsuccess = (event) => {
77 | resolve(event);
78 | }
79 | }
80 | })
81 | }
82 |
83 | // localStorage functions for less important settings.
84 |
85 | export function getSetting(key: string, defaultValue: any = null): any | null {
86 | return JSON.parse(localStorage.getItem(key) ?? 'null') ?? defaultValue;
87 | }
88 |
89 | export function setSetting(key: string, value: any) {
90 | localStorage.setItem(key, JSON.stringify(value));
91 | }
92 |
93 | export function fileToBase64(file: File): Promise{
94 | const reader = new FileReader();
95 | reader.readAsDataURL(file);
96 | return new Promise((resolve, reject) => {
97 | reader.onload = () => resolve(reader.result as string);
98 | reader.onerror = e => {
99 | reject(e)
100 | setError("Error reading file: " + e.toString());
101 | };
102 | });
103 | }
104 |
105 | // Text formatting
106 |
107 | function balanceText(input: string) {
108 | // Balancing asterisks
109 | let asteriskCount = (input.match(/\*/g) || []).length;
110 | if (asteriskCount % 2 !== 0) {
111 | input += '*';
112 | }
113 |
114 | // Balancing quotation marks
115 | let quoteCount = (input.match(/"/g) || []).length;
116 | if (quoteCount % 2 !== 0) {
117 | input += '"';
118 | }
119 |
120 | // Balancing backticks
121 | let backtickCount = (input.match(/`/g) || []).length;
122 | if (backtickCount % 2 !== 0) {
123 | input += '`';
124 | }
125 |
126 | return input;
127 | }
128 |
129 | export function formatText(input: string) {
130 | let output = '';
131 | let i = 0;
132 |
133 | input = balanceText(input);
134 |
135 | while (i < input.length) {
136 | if (input[i] === '*') {
137 | if (input[i + 1] === '*') {
138 | let end = input.indexOf('**', i + 2);
139 | if (end !== -1) {
140 | output += `${input.slice(i + 2, end)} `;
141 | i = end + 2; // Move past the closing double asterisks
142 | } else {
143 | output += '**';
144 | i += 2; // Move past the opening double asterisks
145 | }
146 | } else {
147 | let end = input.indexOf('*', i + 1);
148 | if (end !== -1) {
149 | output += `*${input.slice(i + 1, end)}* `;
150 | i = end + 1;
151 | } else {
152 | output += '*';
153 | i++;
154 | }
155 | }
156 | } else if (input[i] === '"') {
157 | let end = input.indexOf('"', i + 1);
158 | if (end !== -1) {
159 | output += `"${input.slice(i + 1, end)}" `;
160 | i = end + 1;
161 | } else {
162 | output += '"';
163 | i++;
164 | }
165 | } else if (input[i] === '#' && input[i + 1] === ' ') {
166 | let end = input.indexOf('\n', i + 1);
167 | if (end !== -1) {
168 | output += ``;
169 | i = end + 1;
170 | } else {
171 | output += '"';
172 | i++;
173 | }
174 | } else if (input[i] === '`') {
175 | let end = input.indexOf('`', i + 1);
176 | if (end !== -1) {
177 | output += `\`${input.slice(i + 1, end)}\` `;
178 | i = end + 1;
179 | } else {
180 | output += '`';
181 | i++;
182 | }
183 | } else {
184 | output += input[i];
185 | i++;
186 | }
187 | }
188 |
189 | return output.trim();
190 | }
191 |
192 | export function scrollToBottom(elem: any) {
193 | setTimeout(() => {
194 | elem.scrollTo(0, elem.scrollHeight);
195 | }, 100);
196 | }
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
--------------------------------------------------------------------------------
/start.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | echo "Installing/Updating requirements. If this fails, install NPM."
3 | call npm install
4 | echo "Running on port 5173..."
5 | call npm run dev --host
6 | pause
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
2 |
3 | export default {
4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
5 | // for more information about preprocessors
6 | preprocess: vitePreprocess(),
7 | }
8 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/svelte/tsconfig.json",
3 | "compilerOptions": {
4 | "target": "ESNext",
5 | "useDefineForClassFields": true,
6 | "module": "ESNext",
7 | "resolveJsonModule": true,
8 | /**
9 | * Typecheck JS in `.svelte` and `.js` files by default.
10 | * Disable checkJs if you'd like to use dynamic types in JS.
11 | * Note that setting allowJs false does not prevent the use
12 | * of JS in `.svelte` files.
13 | */
14 | "allowJs": true,
15 | "checkJs": true,
16 | "isolatedModules": true,
17 | "moduleDetection": "force"
18 | },
19 | "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
20 | "references": [{ "path": "./tsconfig.node.json" }]
21 | }
22 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
5 | "skipLibCheck": true,
6 | "module": "ESNext",
7 | "moduleResolution": "bundler",
8 | "strict": true,
9 | "noEmit": true
10 | },
11 | "include": ["vite.config.ts"]
12 | }
13 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import { svelte } from '@sveltejs/vite-plugin-svelte'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | server: {
7 | host: true,
8 | port: 5173
9 | },
10 | plugins: [svelte()],
11 | })
12 |
--------------------------------------------------------------------------------