From c0b893f3e005797c32611ec29fa8cfcce13194b3 Mon Sep 17 00:00:00 2001 From: Tristan Druyen Date: Mon, 24 Mar 2025 16:20:12 +0100 Subject: [PATCH] Remove llama_forge & rm all node/npm/leptos deps --- .dist/lwatch.fish | 13 - Makefile.toml | 72 - darm_test/scripts/collect-maud-classes.rs | 71 - darm_test/style/extracted-classes.txt | 3 - darm_test/style/uno.css | 152 - darm_test/uno.config.ts | 52 - flake.lock | 17 - flake.nix | 25 - llama_forge_rs/.cargo/config.toml.bak | 10 - llama_forge_rs/.cargo/docker-config.toml | 2 - llama_forge_rs/.dockerignore | 4 - llama_forge_rs/.gitignore | 28 - ...1f97035901ae28f7affb59f986ed1c326ec90.json | 12 - ...fc4a59f7bc7a57573ea459f8cd566b56c61f8.json | 38 - ...a45fc58c56b122f0939f6ad941fe8e9094002.json | 12 - ...a6d4005b51d51fb43c348998b25dd0ea20c7e.json | 12 - ...ccaa5eb602fea17ed22f8acc54681e856a338.json | 20 - ...3f2ed7b4c215c0dd3bb5dedf11a12e41e6e99.json | 12 - ...8bee28fd3115dd1c4063219e9a9e83a564681.json | 20 - ...7514a3cbe727d26616a10917899fc1059e4fe.json | 12 - llama_forge_rs/Cargo.toml | 210 - llama_forge_rs/DESIGN_SYSTEM.org | 64 - llama_forge_rs/Dockerfile | 85 - llama_forge_rs/LICENSE.md | 651 --- llama_forge_rs/PLAN.org | 317 -- llama_forge_rs/README.md | 65 - llama_forge_rs/conf/rules.json | 121 - llama_forge_rs/config.yaml | 108 - llama_forge_rs/docker-compose.yml | 16 - llama_forge_rs/end2end/package-lock.json | 109 - llama_forge_rs/end2end/package.json | 13 - llama_forge_rs/end2end/playwright.config.ts | 107 - llama_forge_rs/end2end/tests/example.spec.ts | 12 - .../20240427211512_add_settings.sql | 7 - .../20240427230414_add_backend_process.sql | 7 - llama_forge_rs/public/.gitkeep | 0 llama_forge_rs/public/3dbutton.md | 205 - llama_forge_rs/public/favicon.ico | Bin 15406 -> 0 bytes llama_forge_rs/public/logo.svg | 9 - llama_forge_rs/src/api/backend_settings.rs | 71 - llama_forge_rs/src/api/chat.rs | 33 - llama_forge_rs/src/api/mod.rs | 72 - llama_forge_rs/src/app/components/mod.rs | 24 - llama_forge_rs/src/app/components/svgs.rs | 229 - llama_forge_rs/src/app/error_template.rs | 80 - llama_forge_rs/src/app/mod.rs | 78 - llama_forge_rs/src/app/pages/chat.rs | 350 -- llama_forge_rs/src/app/pages/main.rs | 74 - llama_forge_rs/src/app/pages/mod.rs | 7 - .../src/app/pages/settings/backend.rs | 139 - llama_forge_rs/src/app/pages/settings/mod.rs | 95 - llama_forge_rs/src/lib.rs | 45 - llama_forge_rs/src/main.rs | 124 - .../src/server/backends/llama_chat.rs | 151 - .../src/server/backends/llama_completion.rs | 145 - llama_forge_rs/src/server/backends/mod.rs | 226 - llama_forge_rs/src/server/backends/runner.rs | 93 - llama_forge_rs/src/server/fileserv.rs | 56 - llama_forge_rs/src/server/middleware.rs | 85 - llama_forge_rs/src/server/mod.rs | 167 - llama_forge_rs/style/logo.mini.svg | 9 - llama_forge_rs/style/main.scss | 107 - llama_forge_rs/style/tailwind.css | 14 - llama_forge_rs/tailwind.config.js | 35 - package-lock.json | 3788 ----------------- package.json | 40 - 66 files changed, 9030 deletions(-) delete mode 100755 .dist/lwatch.fish delete mode 100755 darm_test/scripts/collect-maud-classes.rs delete mode 100644 darm_test/style/extracted-classes.txt delete mode 100644 darm_test/style/uno.css delete mode 100644 darm_test/uno.config.ts delete mode 100644 llama_forge_rs/.cargo/config.toml.bak delete mode 100644 llama_forge_rs/.cargo/docker-config.toml delete mode 100644 llama_forge_rs/.dockerignore delete mode 100644 llama_forge_rs/.gitignore delete mode 100644 llama_forge_rs/.sqlx/query-2a4e3b46a4cc97a464a5f6f7ada1f97035901ae28f7affb59f986ed1c326ec90.json delete mode 100644 llama_forge_rs/.sqlx/query-3cf9271b73aa2f27f6d92c05d15fc4a59f7bc7a57573ea459f8cd566b56c61f8.json delete mode 100644 llama_forge_rs/.sqlx/query-669b50cacde18cc979c2726efdda45fc58c56b122f0939f6ad941fe8e9094002.json delete mode 100644 llama_forge_rs/.sqlx/query-69960848ad600a9408df78092bea6d4005b51d51fb43c348998b25dd0ea20c7e.json delete mode 100644 llama_forge_rs/.sqlx/query-ac9673aec5048b46441f7b8de70ccaa5eb602fea17ed22f8acc54681e856a338.json delete mode 100644 llama_forge_rs/.sqlx/query-bbb33dad0c994542680852f2f943f2ed7b4c215c0dd3bb5dedf11a12e41e6e99.json delete mode 100644 llama_forge_rs/.sqlx/query-ddd0377a08bd052c2d2a235a9858bee28fd3115dd1c4063219e9a9e83a564681.json delete mode 100644 llama_forge_rs/.sqlx/query-e4c94a6f9413870a1a8d322cbbf7514a3cbe727d26616a10917899fc1059e4fe.json delete mode 100644 llama_forge_rs/Cargo.toml delete mode 100644 llama_forge_rs/DESIGN_SYSTEM.org delete mode 100644 llama_forge_rs/Dockerfile delete mode 100644 llama_forge_rs/LICENSE.md delete mode 100644 llama_forge_rs/PLAN.org delete mode 100644 llama_forge_rs/README.md delete mode 100644 llama_forge_rs/conf/rules.json delete mode 100644 llama_forge_rs/config.yaml delete mode 100644 llama_forge_rs/docker-compose.yml delete mode 100644 llama_forge_rs/end2end/package-lock.json delete mode 100644 llama_forge_rs/end2end/package.json delete mode 100644 llama_forge_rs/end2end/playwright.config.ts delete mode 100644 llama_forge_rs/end2end/tests/example.spec.ts delete mode 100644 llama_forge_rs/migrations/20240427211512_add_settings.sql delete mode 100644 llama_forge_rs/migrations/20240427230414_add_backend_process.sql delete mode 100644 llama_forge_rs/public/.gitkeep delete mode 100644 llama_forge_rs/public/3dbutton.md delete mode 100644 llama_forge_rs/public/favicon.ico delete mode 100644 llama_forge_rs/public/logo.svg delete mode 100644 llama_forge_rs/src/api/backend_settings.rs delete mode 100644 llama_forge_rs/src/api/chat.rs delete mode 100644 llama_forge_rs/src/api/mod.rs delete mode 100644 llama_forge_rs/src/app/components/mod.rs delete mode 100644 llama_forge_rs/src/app/components/svgs.rs delete mode 100644 llama_forge_rs/src/app/error_template.rs delete mode 100644 llama_forge_rs/src/app/mod.rs delete mode 100644 llama_forge_rs/src/app/pages/chat.rs delete mode 100644 llama_forge_rs/src/app/pages/main.rs delete mode 100644 llama_forge_rs/src/app/pages/mod.rs delete mode 100644 llama_forge_rs/src/app/pages/settings/backend.rs delete mode 100644 llama_forge_rs/src/app/pages/settings/mod.rs delete mode 100644 llama_forge_rs/src/lib.rs delete mode 100644 llama_forge_rs/src/main.rs delete mode 100644 llama_forge_rs/src/server/backends/llama_chat.rs delete mode 100644 llama_forge_rs/src/server/backends/llama_completion.rs delete mode 100644 llama_forge_rs/src/server/backends/mod.rs delete mode 100644 llama_forge_rs/src/server/backends/runner.rs delete mode 100644 llama_forge_rs/src/server/fileserv.rs delete mode 100644 llama_forge_rs/src/server/middleware.rs delete mode 100644 llama_forge_rs/src/server/mod.rs delete mode 100644 llama_forge_rs/style/logo.mini.svg delete mode 100644 llama_forge_rs/style/main.scss delete mode 100644 llama_forge_rs/style/tailwind.css delete mode 100644 llama_forge_rs/tailwind.config.js delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/.dist/lwatch.fish b/.dist/lwatch.fish deleted file mode 100755 index c71a0bc..0000000 --- a/.dist/lwatch.fish +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env fish - -set DIRECTORY_TO_WATCH "./" -set SCRIPT_TO_RUN "leptosfmt ./ && rustywind --write ./" - -while true - # Wait for any change in the directory - inotifywait -e modify,create,delete,move $DIRECTORY_TO_WATCH - - # Run your script - bash -c "$SCRIPT_TO_RUN" - sleep 5 -end diff --git a/Makefile.toml b/Makefile.toml index 4b1bf0f..745b8c7 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -3,9 +3,6 @@ load_cargo_aliases = false [env] CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = true -# leptos repos -LEPTOS_REPOS = "llama_forge_rs" -# # DB_REPOS [tasks.default] @@ -18,57 +15,17 @@ script = "echo test123-${CARGO_MAKE_CRATE_CURRENT_WORKSPACE_MEMBER}" description = "clean the repo and rebuild everything" dependencies = ["clean", "all"] -[tasks.mksitedir] -workspace = false -script = ''' -mkdir -p ./target/site -mkdir -p ../target/site -mkdir -p ./llama_forge_rs/target/site # TODO use env vars and iterate -''' - [tasks.all] description = "rebuild everything" dependencies = [ - "mksitedir", "docset", "check", "clippy", "build", "build-release", "format", - "lformat", - "lbuild", - "lbuild-release", ] -[tasks.lformat] -script = "leptosfmt . && rustywind . --write" - -[tasks.lbuild] -category = "Build" -script = ''' -#!/usr/bin/env fish -set current "$CARGO_MAKE_CRATE_CURRENT_WORKSPACE_MEMBER" -if contains "$LEPTOS_REPOS" $current - cargo leptos build -else - echo $current is not a leptos repo! -end -''' - -[tasks.lbuild-release] -category = "Build" -command = "cargo" -args = ["leptos", "build", "--release"] - -[tasks.lserve] -command = "cargo" -args = ["leptos", "serve"] - -[tasks.lwatch] -command = "cargo" -args = ["leptos", "watch", "--hot-reload"] - [tasks.docset] workspace = false dependencies = ["mksitedir", "make-docset", "cp-docset"] @@ -82,32 +39,3 @@ script = "cargo docset --workspace --no-clean --platform-family redvault-ai && s workspace = false dependencies = ["make-docset"] script = "echo $PWD; cp -r ../target/docset/redvault-ai.docset ~/.local/share/Zeal/Zeal/docsets/" - -[tasks.watch-test] -command = "cargo" -args = [ - "watch", - "--", - "cargo", - "ltest", - "--target-dir", - "target/test", - "--all-features", -] - -[tasks.watch-check] -command = "cargo" -args = ["watch", "--", "cargo", "lcheck", "--all-features"] - -[tasks.lwatch-fmt] -command = "fish" -args = ["./.dist/watch.fish"] - -[tasks.reset-db] -# env = { "CARGO_MAKE_WORKSPACE_SKIP_MEMBERS" = ["vewa_xls_export"] } -script = ''' -DB_FILE=${CARGO_MAKE_CRATE_CURRENT_WORKSPACE_MEMBER}.sqlite3 -rm ../$DB_FILE \ - && touch ../$DB_FILE \ - && cargo sqlx migrate run --database-url="sqlite:../$DB_FILE" -''' diff --git a/darm_test/scripts/collect-maud-classes.rs b/darm_test/scripts/collect-maud-classes.rs deleted file mode 100755 index a84b080..0000000 --- a/darm_test/scripts/collect-maud-classes.rs +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env rust-script -//! This is a regular crate doc comment, but it also contains a partial -//! Cargo manifest. Note the use of a *fenced* code block, and the -//! `cargo` "language". -//! -//! ```cargo -//! [dependencies] -//! regex = "1" -//! walkdir = "2" -//! ``` - -use std::{ - fs::{self, File}, - io::{self, Write}, - path::Path, -}; - -use regex::Regex; -use walkdir::WalkDir; - -fn main() -> io::Result<()> { - // Define the regex pattern to extract classes - let re = Regex::new(r"(?: \.(?P[\w-]+))").expect("Invalid regex pattern"); - - // Define the source directory to scan - let source_dir = "./src"; // Change this to your source directory - - // Define the output file - let output_file = "./style/extracted-classes.txt"; - let mut file = File::create(output_file)?; - - println!("Scanning directory: {}", source_dir); - - // Walk through the directory structure - for entry in WalkDir::new(source_dir) - .into_iter() - .filter_map(|e| e.ok()) - .filter(|e| { - e.file_type().is_file() && e.path().extension().map_or(false, |ext| ext == "rs") - }) - { - let path = entry.path(); - println!("Processing file: {}", path.display()); - let content = fs::read_to_string(path)?; - let mut classes = Vec::new(); - - // Extract all classes using the regex - for cap in re.captures_iter(&content) { - if let Some(tag_match) = cap.name("tag") { - let class = tag_match.as_str().to_string(); - classes.push(class.clone()); - } - } - - // If classes were found, write them to the output file - if !classes.is_empty() { - writeln!( - file, - "class=\"{}\" ", - classes.join(" "), - path.display() - )?; - } - } - - println!( - "Class extraction complete. Output written to {}", - output_file - ); - Ok(()) -} diff --git a/darm_test/style/extracted-classes.txt b/darm_test/style/extracted-classes.txt deleted file mode 100644 index b2f9999..0000000 --- a/darm_test/style/extracted-classes.txt +++ /dev/null @@ -1,3 +0,0 @@ -class="into_response" -class="selector merge_mode into selector merge_mode into container p-4 mx-auto m-4 text-2xl font-bold p-6 bg-white rounded-lg shadow-md m-4 p-2 m-2 w-full rounded-lg border render" -class="into_response into_response with_default_directive from_env_lossy pretty with_env_filter init body size_hint exact map merge merge fallback_service method_not_allowed_fallback layer layer layer layer layer with_state" diff --git a/darm_test/style/uno.css b/darm_test/style/uno.css deleted file mode 100644 index 762b42b..0000000 --- a/darm_test/style/uno.css +++ /dev/null @@ -1,152 +0,0 @@ -/* layer: preflights */ -*,::before,::after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / 0.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: ;}::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / 0.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: ;} -[type='text'], input:where(:not([type])), [type='email'], [type='url'], [type='password'], [type='number'], [type='date'], [type='datetime-local'], [type='month'], [type='search'], [type='tel'], [type='time'], [type='week'], [multiple], textarea, select { appearance: none; -background-color: #fff; -border-color: #6b7280; -border-width: 1px; -border-radius: 0; -padding-top: 0.5rem; -padding-right: 0.75rem; -padding-bottom: 0.5rem; -padding-left: 0.75rem; -font-size: 1rem; -line-height: 1.5rem; ---un-shadow: 0 0 #0000; } -[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { outline: 2px solid transparent; -outline-offset: 2px; ---un-ring-inset: var(--un-empty,/*!*/ /*!*/); ---un-ring-offset-width: 0px; ---un-ring-offset-color: #fff; ---un-ring-color: #2563eb; ---un-ring-offset-shadow: var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color); ---un-ring-shadow: var(--un-ring-inset) 0 0 0 calc(1px + var(--un-ring-offset-width)) var(--un-ring-color); -box-shadow: var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow); -border-color: #2563eb; } -input::placeholder, textarea::placeholder { color: #6b7280; -opacity: 1; } -::-webkit-datetime-edit-fields-wrapper { padding: 0; } -::-webkit-date-and-time-value { min-height: 1.5em; } -::-webkit-date-and-time-value { text-align: inherit; } -::-webkit-datetime-edit { display: inline-flex; } -::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { padding-top: 0; -padding-bottom: 0; } -select { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); -background-position: right 0.5rem center; -background-repeat: no-repeat; -background-size: 1.5em 1.5em; -padding-right: 2.5rem; -print-color-adjust: exact; } -[multiple] { background-image: initial; -background-position: initial; -background-repeat: unset; -background-size: initial; -padding-right: 0.75rem; -print-color-adjust: unset; } -[type='checkbox'], [type='radio'] { appearance: none; -padding: 0; -print-color-adjust: exact; -display: inline-block; -vertical-align: middle; -background-origin: border-box; -user-select: none; -flex-shrink: 0; -height: 1rem; -width: 1rem; -color: #2563eb; -background-color: #fff; -border-color: #6b7280; -border-width: 1px; ---un-shadow: 0 0 #0000; } -[type='checkbox'] { border-radius: 0; } -[type='radio'] { border-radius: 100%; } -[type='checkbox']:focus, [type='radio']:focus { outline: 2px solid transparent; -outline-offset: 2px; ---un-ring-inset: var(--un-empty,/*!*/ /*!*/); ---un-ring-offset-width: 2px; ---un-ring-offset-color: #fff; ---un-ring-color: #2563eb; ---un-ring-offset-shadow: var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color); ---un-ring-shadow: var(--un-ring-inset) 0 0 0 calc(2px + var(--un-ring-offset-width)) var(--un-ring-color); -box-shadow: var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow); } -[type='checkbox']:checked, [type='radio']:checked { border-color: transparent; -background-color: currentColor; -background-size: 100% 100%; -background-position: center; -background-repeat: no-repeat; } -[type='checkbox']:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } -[type='radio']:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); } -[type='checkbox']:checked:hover, [type='checkbox']:checked:focus, [type='radio']:checked:hover, [type='radio']:checked:focus { border-color: transparent; -background-color: currentColor; } -[type='checkbox']:indeterminate { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); -border-color: transparent; -background-color: currentColor; -background-size: 100% 100%; -background-position: center; -background-repeat: no-repeat; } -[type='checkbox']:indeterminate:hover, [type='checkbox']:indeterminate:focus { border-color: transparent; -background-color: currentColor; } -[type='file'] { background: unset; -border-color: inherit; -border-width: 0; -border-radius: 0; -padding: 0; -font-size: unset; -line-height: inherit; } -[type='file']:focus { outline: 1px solid ButtonText , 1px auto -webkit-focus-ring-color; } -/* layer: shortcuts */ -.container{width:100%;} -@media (min-width: 640px){ -.container{max-width:640px;} -} -@media (min-width: 768px){ -.container{max-width:768px;} -} -@media (min-width: 1024px){ -.container{max-width:1024px;} -} -@media (min-width: 1280px){ -.container{max-width:1280px;} -} -@media (min-width: 1536px){ -.container{max-width:1536px;} -} -/* layer: default */ -.static{position:static;} -.m-1{margin:0.25rem;} -.m-2{margin:0.5rem;} -.m-3{margin:0.75rem;} -.m-4{margin:1rem;} -.m-5{margin:1.25rem;} -.m-6{margin:1.5rem;} -.m-7{margin:1.75rem;} -.m-8{margin:2rem;} -.mx-auto{margin-left:auto;margin-right:auto;} -.mb-2{margin-bottom:0.5rem;} -.inline-block{display:inline-block;} -.h1{height:0.25rem;} -.w-full{width:100%;} -.inline-flex{display:inline-flex;} -.flex-shrink{flex-shrink:1;} -.table{display:table;} -.transform{transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotateZ(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z));} -.border{border-width:1px;} -.rounded-lg{border-radius:0.5rem;} -.bg-blue-500{--un-bg-opacity:1;background-color:rgb(59 130 246 / var(--un-bg-opacity)) /* #3b82f6 */;} -.bg-gray-100{--un-bg-opacity:1;background-color:rgb(243 244 246 / var(--un-bg-opacity)) /* #f3f4f6 */;} -.bg-white{--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity)) /* #fff */;} -.p-1{padding:0.25rem;} -.p-2{padding:0.5rem;} -.p-3{padding:0.75rem;} -.p-4{padding:1rem;} -.p-5{padding:1.25rem;} -.p-6{padding:1.5rem;} -.p-7{padding:1.75rem;} -.p-8{padding:2rem;} -.text-2xl{font-size:1.5rem;line-height:2rem;} -.text-white{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity)) /* #fff */;} -.font-bold{font-weight:700;} -.shadow-md{--un-shadow:var(--un-shadow-inset) 0 4px 6px -1px var(--un-shadow-color, rgb(0 0 0 / 0.1)),var(--un-shadow-inset) 0 2px 4px -2px var(--un-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow);} -.outline{outline-style:solid;} -.animated{--une-animated-duration:1s;animation-duration:var(--une-animated-duration);animation-fill-mode:both;} -@keyframes uneBounce { 0%,20%,53%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); transform: translateZ(0) } 40%,43% { transform: translate3d(0,-30px,0) scaleY(1.1) } 40%,43%,70% { animation-timing-function: cubic-bezier(.755,.05,.855,.06) } 70% { transform: translate3d(0,-15px,0) scaleY(1.05) } 80% { transform: translateZ(0) scaleY(.95); transition-timing-function: cubic-bezier(.215,.61,.355,1) } 90% { transform: translate3d(0,-4px,0) scaleY(1.02) } } -.animated-bounce{animation-name:uneBounce;transform-origin:center bottom;} \ No newline at end of file diff --git a/darm_test/uno.config.ts b/darm_test/uno.config.ts deleted file mode 100644 index 418dfd6..0000000 --- a/darm_test/uno.config.ts +++ /dev/null @@ -1,52 +0,0 @@ -// import presetAttributify from '@unocss/preset-attributify' -import { - defineConfig, - presetAttributify, - presetIcons, - presetWind3, - presetTagify, - presetTypography, - transformerDirectives, - transformerVariantGroup, -} from "unocss"; -import { presetForms } from '@julr/unocss-preset-forms'; -import { presetHeroPatterns } from '@julr/unocss-preset-heropatterns'; -import { presetExtra } from 'unocss-preset-extra'; - -export default defineConfig({ - safelist: [ - ...["p-", "m-"].map((v)=> Array.from({ length: 8 }, (_, i: number) => `${v}${i + 1}`)) - ], - content: { - filesystem: [ - "**/*.{html,css,scss,rs}", - "src/**/*.rs", - "*/src/**/*.rs", - "*/style/*.scss", - "**/extracted-classes.txt", - ], - }, - cli: { - entry: { - patterns: [ - "**/*.{html,css,scss,rs}", - "src/**/*.rs", - "*/src/**/*.rs", - "*/style/*.scss", - "**/extracted-classes.txt", - ], - outFile: "./style/uno.css", - }, - }, - presets: [ - presetWind3({}), - presetAttributify({}), - presetTagify({}), - presetIcons({}), - presetHeroPatterns(), - presetTypography({}), - presetForms(), - presetExtra(), - ], - transformers: [transformerDirectives(), transformerVariantGroup()], -}); diff --git a/flake.lock b/flake.lock index 657d4c6..4fbd8b1 100644 --- a/flake.lock +++ b/flake.lock @@ -141,22 +141,6 @@ "type": "github" } }, - "npmlock2nix": { - "flake": false, - "locked": { - "lastModified": 1673447413, - "narHash": "sha256-sJM82Sj8yfQYs9axEmGZ9Evzdv/kDcI9sddqJ45frrU=", - "owner": "nix-community", - "repo": "npmlock2nix", - "rev": "9197bbf397d76059a76310523d45df10d2e4ca81", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "npmlock2nix", - "type": "github" - } - }, "root": { "inputs": { "devshell": "devshell", @@ -164,7 +148,6 @@ "flake-utils": "flake-utils", "llama-cpp": "llama-cpp", "nixpkgs": "nixpkgs_2", - "npmlock2nix": "npmlock2nix", "rust-overlay": "rust-overlay" } }, diff --git a/flake.nix b/flake.nix index a79ec3d..5a1f6fb 100644 --- a/flake.nix +++ b/flake.nix @@ -18,10 +18,6 @@ flake-utils.url = "github:numtide/flake-utils"; flake-parts.url = "github:hercules-ci/flake-parts"; devshell.url = "github:numtide/devshell"; - npmlock2nix = { - url = "github:nix-community/npmlock2nix"; - flake = false; - }; llama-cpp = { url = "github:ggerganov/llama.cpp/b4855"; inputs.nixpkgs.follows = "nixpkgs"; @@ -35,7 +31,6 @@ , rust-overlay , flake-utils , devshell - , npmlock2nix , llama-cpp , ... }: @@ -49,12 +44,6 @@ (final: prev: { customRustToolchain = prev.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; }) - (final: prev: { - nodejs-16_x = prev.nodePackages.nodejs; # needed for npmlock2nix - }) - (final: prev: { - npmlock2nix = import npmlock2nix { pkgs = prev; }; - }) (final: prev: { prev.rocmPackages.clr = prev.rocmPackages.clr.overrideDerivation (oldAttrs: { passthru = { @@ -74,10 +63,6 @@ pkgs = import nixpkgs { inherit system overlays config; }; - customNodeModules = pkgs.npmlock2nix.v2.node_modules { - src = ./.; - nodejs = pkgs.nodejs_23; - }; buildInputs = with pkgs; [ aider-chat harfbuzz @@ -144,7 +129,6 @@ devShells.default = pkgs.mkShell { packages = with pkgs; [ - customNodeModules customRustToolchain self.packages.${system}.myllamacpp aider-chat @@ -162,7 +146,6 @@ cargo-make cargo-generate cargo-udeps - self.packages.${system}.cargo-leptos wasm-bindgen-cli_0_2_100 cargo-outdated cargo-release @@ -173,7 +156,6 @@ # trunk fish inotify-tools - leptosfmt mold # nodejs_20 pkg-config @@ -182,20 +164,13 @@ sqlx-cli unzip rocmPackages.rocminfo - tailwindcss ] ++ buildInputs; buildInputs = buildInputs; shellHook = '' - # setup node-modules - export NPM_LOCAL_PREFIX=${customNodeModules}/node_modules - (ln -s $NPM_LOCAL_PREFIX ./node_modules 2>/dev/null || unlink ./node_modules) && ln -s $NPM_LOCAL_PREFIX ./node_modules 2>/dev/null - # export NIX_LD_LIBRARY_PATH=${pkgs.lib.makeLibraryPath buildInputs}:$NIX_LD_LIBRARY_PATH export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath buildInputs}" - export LEPTOS_SASS_VERSION=1.71.0 - export LEPTOS_TAILWIND_VERSION=3.4.17 export MALLOC_CONF=thp:always,metadata_thp:always ''; }; diff --git a/llama_forge_rs/.cargo/config.toml.bak b/llama_forge_rs/.cargo/config.toml.bak deleted file mode 100644 index e7ac1bc..0000000 --- a/llama_forge_rs/.cargo/config.toml.bak +++ /dev/null @@ -1,10 +0,0 @@ -[unstable] -codegen-backend = true - -[target.x86_64-unknown-linux-gnu] -rustflags = ["-C", "link-arg=-fuse-ld=mold"] -linker = "clang" -codegen-backend = { dev = "cranelift" } - -[profile.server-dev] -codegen-backend = "cranelift" diff --git a/llama_forge_rs/.cargo/docker-config.toml b/llama_forge_rs/.cargo/docker-config.toml deleted file mode 100644 index aafd543..0000000 --- a/llama_forge_rs/.cargo/docker-config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[target.x86_64-unknown-linux-gnu] -rustflags = ["-C", "target-feature=+crt-static"] diff --git a/llama_forge_rs/.dockerignore b/llama_forge_rs/.dockerignore deleted file mode 100644 index c48a281..0000000 --- a/llama_forge_rs/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git/ -target/ -Dockerfile -docker-compose.yml diff --git a/llama_forge_rs/.gitignore b/llama_forge_rs/.gitignore deleted file mode 100644 index 11d2df3..0000000 --- a/llama_forge_rs/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ -pkg - -# These are backup files generated by rustfmt -**/*.rs.bk - -# node e2e test tools and outputs -node_modules -node_modules/ -test-results/ -end2end/playwright-report/ -playwright/.cache/ - -.direnv - -# App artifacts -db.sqlite3* -public/*-result.csv - -# logs - -*.log - -.ape-* -.llamafile/ -llamafile.git diff --git a/llama_forge_rs/.sqlx/query-2a4e3b46a4cc97a464a5f6f7ada1f97035901ae28f7affb59f986ed1c326ec90.json b/llama_forge_rs/.sqlx/query-2a4e3b46a4cc97a464a5f6f7ada1f97035901ae28f7affb59f986ed1c326ec90.json deleted file mode 100644 index da24b07..0000000 --- a/llama_forge_rs/.sqlx/query-2a4e3b46a4cc97a464a5f6f7ada1f97035901ae28f7affb59f986ed1c326ec90.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE backend_process\n SET status == ?\n WHERE id == ?", - "describe": { - "columns": [], - "parameters": { - "Right": 2 - }, - "nullable": [] - }, - "hash": "2a4e3b46a4cc97a464a5f6f7ada1f97035901ae28f7affb59f986ed1c326ec90" -} diff --git a/llama_forge_rs/.sqlx/query-3cf9271b73aa2f27f6d92c05d15fc4a59f7bc7a57573ea459f8cd566b56c61f8.json b/llama_forge_rs/.sqlx/query-3cf9271b73aa2f27f6d92c05d15fc4a59f7bc7a57573ea459f8cd566b56c61f8.json deleted file mode 100644 index 6e9f3c8..0000000 --- a/llama_forge_rs/.sqlx/query-3cf9271b73aa2f27f6d92c05d15fc4a59f7bc7a57573ea459f8cd566b56c61f8.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT version, model_dir, default_model, created_at FROM settings ORDER BY version DESC LIMIT 1", - "describe": { - "columns": [ - { - "name": "version", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "model_dir", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "default_model", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "created_at", - "ordinal": 3, - "type_info": "Datetime" - } - ], - "parameters": { - "Right": 0 - }, - "nullable": [ - false, - false, - false, - false - ] - }, - "hash": "3cf9271b73aa2f27f6d92c05d15fc4a59f7bc7a57573ea459f8cd566b56c61f8" -} diff --git a/llama_forge_rs/.sqlx/query-669b50cacde18cc979c2726efdda45fc58c56b122f0939f6ad941fe8e9094002.json b/llama_forge_rs/.sqlx/query-669b50cacde18cc979c2726efdda45fc58c56b122f0939f6ad941fe8e9094002.json deleted file mode 100644 index a57560b..0000000 --- a/llama_forge_rs/.sqlx/query-669b50cacde18cc979c2726efdda45fc58c56b122f0939f6ad941fe8e9094002.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE backend_process SET status = 'waiting_for_stop' WHERE status != 'finished'", - "describe": { - "columns": [], - "parameters": { - "Right": 0 - }, - "nullable": [] - }, - "hash": "669b50cacde18cc979c2726efdda45fc58c56b122f0939f6ad941fe8e9094002" -} diff --git a/llama_forge_rs/.sqlx/query-69960848ad600a9408df78092bea6d4005b51d51fb43c348998b25dd0ea20c7e.json b/llama_forge_rs/.sqlx/query-69960848ad600a9408df78092bea6d4005b51d51fb43c348998b25dd0ea20c7e.json deleted file mode 100644 index 50a1017..0000000 --- a/llama_forge_rs/.sqlx/query-69960848ad600a9408df78092bea6d4005b51d51fb43c348998b25dd0ea20c7e.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "INSERT INTO backend_process (settings_version, status) VALUES (?, 'waiting_for_start')", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - }, - "hash": "69960848ad600a9408df78092bea6d4005b51d51fb43c348998b25dd0ea20c7e" -} diff --git a/llama_forge_rs/.sqlx/query-ac9673aec5048b46441f7b8de70ccaa5eb602fea17ed22f8acc54681e856a338.json b/llama_forge_rs/.sqlx/query-ac9673aec5048b46441f7b8de70ccaa5eb602fea17ed22f8acc54681e856a338.json deleted file mode 100644 index b0f854c..0000000 --- a/llama_forge_rs/.sqlx/query-ac9673aec5048b46441f7b8de70ccaa5eb602fea17ed22f8acc54681e856a338.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT version FROM settings ORDER BY version DESC LIMIT 1", - "describe": { - "columns": [ - { - "name": "version", - "ordinal": 0, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 0 - }, - "nullable": [ - false - ] - }, - "hash": "ac9673aec5048b46441f7b8de70ccaa5eb602fea17ed22f8acc54681e856a338" -} diff --git a/llama_forge_rs/.sqlx/query-bbb33dad0c994542680852f2f943f2ed7b4c215c0dd3bb5dedf11a12e41e6e99.json b/llama_forge_rs/.sqlx/query-bbb33dad0c994542680852f2f943f2ed7b4c215c0dd3bb5dedf11a12e41e6e99.json deleted file mode 100644 index e8fb920..0000000 --- a/llama_forge_rs/.sqlx/query-bbb33dad0c994542680852f2f943f2ed7b4c215c0dd3bb5dedf11a12e41e6e99.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE backend_process SET status = 'waiting_for_stop'", - "describe": { - "columns": [], - "parameters": { - "Right": 0 - }, - "nullable": [] - }, - "hash": "bbb33dad0c994542680852f2f943f2ed7b4c215c0dd3bb5dedf11a12e41e6e99" -} diff --git a/llama_forge_rs/.sqlx/query-ddd0377a08bd052c2d2a235a9858bee28fd3115dd1c4063219e9a9e83a564681.json b/llama_forge_rs/.sqlx/query-ddd0377a08bd052c2d2a235a9858bee28fd3115dd1c4063219e9a9e83a564681.json deleted file mode 100644 index e2bb9cb..0000000 --- a/llama_forge_rs/.sqlx/query-ddd0377a08bd052c2d2a235a9858bee28fd3115dd1c4063219e9a9e83a564681.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT status FROM backend_process ORDER BY id DESC LIMIT 1", - "describe": { - "columns": [ - { - "name": "status", - "ordinal": 0, - "type_info": "Text" - } - ], - "parameters": { - "Right": 0 - }, - "nullable": [ - false - ] - }, - "hash": "ddd0377a08bd052c2d2a235a9858bee28fd3115dd1c4063219e9a9e83a564681" -} diff --git a/llama_forge_rs/.sqlx/query-e4c94a6f9413870a1a8d322cbbf7514a3cbe727d26616a10917899fc1059e4fe.json b/llama_forge_rs/.sqlx/query-e4c94a6f9413870a1a8d322cbbf7514a3cbe727d26616a10917899fc1059e4fe.json deleted file mode 100644 index 1edaee5..0000000 --- a/llama_forge_rs/.sqlx/query-e4c94a6f9413870a1a8d322cbbf7514a3cbe727d26616a10917899fc1059e4fe.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "INSERT INTO settings (model_dir, default_model) VALUES (?, ?)", - "describe": { - "columns": [], - "parameters": { - "Right": 2 - }, - "nullable": [] - }, - "hash": "e4c94a6f9413870a1a8d322cbbf7514a3cbe727d26616a10917899fc1059e4fe" -} diff --git a/llama_forge_rs/Cargo.toml b/llama_forge_rs/Cargo.toml deleted file mode 100644 index 9f39844..0000000 --- a/llama_forge_rs/Cargo.toml +++ /dev/null @@ -1,210 +0,0 @@ -[package] -name = "llama_forge_rs" -edition.workspace = true -authors.workspace = true -description = "The LLama Forge RS" -license.workspace = true -publish.workspace = true -readme = "README.md" -repository.workspace = true -version.workspace = true - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -llama_proxy_man = { path = "../llama_proxy_man", optional = true } -wasm-bindgen = "=0.2.100" -# TODO Update to 0.7 -leptos = { version = "0.6", features = [ - "serde", - "nightly", - "experimental-islands", -] } -leptos_axum = { version = "0.6", optional = true } -leptos_meta = { version = "0.6", features = ["nightly"] } -leptos_router = { version = "0.6", features = ["nightly"] } -server_fn = { version = "0.6", features = ["rkyv", "multipart"] } -axum = { version = "0.7", features = ["macros"], optional = true } -tokio = { version = "1.37.0", features = ["full"], optional = true } -tower = { version = "0.4", optional = true } -http = "1.1" -tower-http = { version = "0.5", features = [ - "compression-full", - "decompression-full", - "fs", - "trace", -], optional = true } -serde = { version = "1.0.198", features = ["unstable", "rc", "derive"] } -serde_json = { version = "1.0.116" } -sqlx = { version = "0.7.4", features = ["chrono", "macros"] } -tracing = { version = "0.1.40" } -tracing-wasm = { version = "0.2.1" } -tracing-subscriber = { version = "0.3.18", features = [ - "env-filter", - "tracing", - "serde", - "serde_json", -], optional = true } - -anyhow = { version = "1.0.82", features = ["backtrace"] } -cfg-if = "1.0.0" -console_error_panic_hook = "0.1" -once_cell = { version = "1.19.0", optional = true } -thiserror = "1.0.59" -gloo-timers = { version = "0.3.0", features = ["futures"] } -rand = "0.8.5" -web-sys = { version = "0.3.69", features = ["FileList", "File"] } - - -# camt to csv deps -chrono = { version = "0.4.38", features = ["serde", "rkyv"] } -regex = { version = "1.10.4", features = ["use_std"], optional = true } -futures = { version = "0.3.30" } -async-broadcast = { version = "0.7.0", optional = true } -dashmap = { version = "5.5.3", optional = true, features = ["inline", "serde"] } -pin-project-lite = "0.2.14" -strum = { version = "0.26.2", features = ["derive", "strum_macros"] } -uuid = { version = "1.8.0", features = ["v4", "v7", "js", "serde"] } -gloo-net = "0.5.0" -wasm-bindgen-futures = "0.4.42" -reqwest = { version = "0.12.3", optional = true, features = ["json", "stream"] } -reqwest-eventsource = { version = "0.6.0", optional = true } -futures-util = { version = "0.3.30" } -tokio-stream = { version = "0.1.15", features = ["full"], optional = true } -async-trait = "0.1.80" -bytes = "1.6.0" -tao = { version = "0.27.0", optional = true, features = ["serde"] } -wry = { version = "0.39.0", optional = true, features = ["serde", "tracing"] } -winit = { version = "0.29.15", optional = true, features = ["serde"] } -gtk = { version = "0.18.1", optional = true } -x11-dl = { version = "2.21.0", optional = true } -rust-embed = { version = "8.3.0", optional = true } -mime_guess = { version = "2.0.4", optional = true } -tracing-test = "0.2.4" -sysinfo = { version = "0.30.11", optional = true } -derive_more = { version = "0.99.17", features = ["nightly"] } -sqlx-macros = { version = "0.7.4", optional = true, features = [ - "chrono", - "json", - "migrate", - "sqlite", - "uuid", -] } -pulldown-cmark = { version = "0.12.2", features = ["serde"] } -# qdrant-client = "1.11.2" -# swiftide = "0.9.1" - -# TODO Add desktop/gui feature (or maybe server/headless only?) -[features] -default = ["ssr"] -hydrate = ["leptos/hydrate", "leptos_meta/hydrate", "leptos_router/hydrate"] -ssr = [ - "dep:llama_proxy_man", - "dep:async-broadcast", - "dep:axum", - "dep:dashmap", - "dep:leptos_axum", - "dep:gtk", - "dep:once_cell", - "dep:reqwest", - "dep:reqwest-eventsource", - "dep:regex", - "dep:rust-embed", - "dep:mime_guess", - "dep:tao", - "dep:tokio", - "dep:sysinfo", - "dep:tower", - "dep:tokio-stream", - "dep:tower-http", - "dep:tracing-subscriber", - "dep:winit", - "dep:wry", - "dep:x11-dl", - "dep:sqlx-macros", - "sqlx/sqlite", - "sqlx/migrate", - "sqlx/runtime-tokio", - "leptos/ssr", - "leptos_meta/ssr", - "leptos_router/ssr", -] - -[package.metadata.cargo-all-features] -skip_feature_sets = [["ssr", "hydrate"]] - -[package.metadata.leptos] -# The name used by wasm-bindgen/cargo-leptos for the JS/WASM bundle. Defaults to the crate name -output-name = "llama_forge_rs" - -# The site root folder is where cargo-leptos generate all output. WARNING: all content of this folder will be erased on a rebuild. Use it in your server setup. -site-root = "target/site" - -# The site-root relative folder where all compiled output (JS, WASM and CSS) is written -# Defaults to pkg -site-pkg-dir = "pkg" - -# [Optional] The source CSS file. If it ends with .sass or .scss then it will be compiled by dart-sass into CSS. The CSS is optimized by Lightning CSS before being written to //app.css -style-file = "style/main.scss" - -# separate-front-target-dir = true - -tailwind-input-file = "style/tailwind.css" -tailwind-config-file = "./tailwind.config.js" - -# Assets source dir. All files found here will be copied and synchronized to site-root. -# The assets-dir cannot have a sub directory with the same name/path as site-pkg-dir. -# -# Optional. Env: LEPTOS_ASSETS_DIR. -assets-dir = "public" - -# The IP and port (ex: 127.0.0.1:3000) where the server serves the content. Use it in your server setup. -site-addr = "0.0.0.0:3000" - -# The port to use for automatic reload monitoring -reload-port = 3001 - -# [Optional] Command to use when running end2end tests. It will run in the end2end dir. -# [Windows] for non-WSL use "npx.cmd playwright test" -# This binary name can be checked in Powershell with Get-Command npx -end2end-cmd = "npx playwright test" -end2end-dir = "end2end" - -# The browserlist query used for optimizing the CSS. -browserquery = "defaults" - -# Set by cargo-leptos watch when building with that tool. Controls whether autoreload JS will be included in the head -watch = false - -# The environment Leptos will run in, usually either "DEV" or "PROD" -env = "DEV" - -#### -bin-target-triple = "x86_64-unknown-linux-gnu" -# The features to use when compiling the bin target -# -# Optional. Can be over-ridden with the command line parameter --bin-features -bin-features = ["ssr"] -# bin-package = "llama_forge_rs_bin" - -# If the --no-default-features flag should be used when compiling the bin target -# -# Optional. Defaults to false. -bin-default-features = false - -# lib-package = "llama_forge_rs_lib" -# The features to use when compiling the lib target -# -# Optional. Can be over-ridden with the command line parameter --lib-features -lib-features = ["hydrate"] - -# If the --no-default-features flag should be used when compiling the lib target -# -# Optional. Defaults to false. -lib-default-features = false - -# The profile to use for the lib target when compiling for release -# -# Optional. Defaults to "release". -lib-profile-release = "wasm-release" diff --git a/llama_forge_rs/DESIGN_SYSTEM.org b/llama_forge_rs/DESIGN_SYSTEM.org deleted file mode 100644 index ffeeba8..0000000 --- a/llama_forge_rs/DESIGN_SYSTEM.org +++ /dev/null @@ -1,64 +0,0 @@ -* Haptic Design System -** Basic Philosphy - -Simple, Clean, Haptic - -You just wanna touch it ! -Borrow design metaphors from real life appliances, before the age of touchscreens. (Ironic isn't it ?) - -** Ideas -*** 3d components -*** specific purpose: -**** chat? -- receipt printer ????????????????????????? - - how to keep minimal - - endless paper ? textured ? - - which animations are needed ? - - grow "paper" from bottom line-by-line -- how to animate editing past msgs ? -**** casette deck front, with disk in/out -***** ASCII: - ``` - o=blinkenlights - O=eject? - ___________________________________________________________________ - | --------------------------------------- ooo O | - |_________________________________________________________________| - ``` -***** Blinkenlights -- 1 light per model? - - red=error - - blue=ready - - green=loaded - - blinking=busy -*** "Controls" (Write/Input) -**** TextInput ????? - - full paper seems to noisy visual wise ??? - - try "light" paper texture ? (if that exists?) - - segment display might have bad ux/accesibility, expecially for textareas, could be ok for small/short textinput -**** Button Variants -***** Kippschalter -ref: https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fasset.conrad.com%2Fmedia10%2Fisa%2F160267%2Fc3%2F-%2Fde%2Fae5b0377843744940beabc4c1cd5fd514%3Fx%3D360&f=1&nofb=1&ipt=3cce10e16c763da58c31abb0b2c4888906fa9e312cf746696fa3b6573bcd1e16&ipo=images -***** Drehschalter -ref: https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fwww.elektrogrosshandel.ch%2Fthumbor%2FOauclzeS99hWVZgbRjx6of7sEwY%3D%2Ffit-in%2F3600x2700%2Ffilters%3Acachevalid(2020-07-08T19%3A45%3A43)%3Astrip_icc()%3Astrip_exif()%2Feldas%2Fmyassets%2F0251%2F0157_P_0251553.jpg&f=1&nofb=1&ipt=6482091a4de692c0c6fdeebdc5339bd755a810dc6c6488d21cfc8de03f8fa2b8&ipo=images -***** Schiebeschalter -*** Visualization (Read/Output) -**** Lamp/Light -- svg foreground for "lens", simple "ribbed glass" lookalike ? -- svg glühdrat? -- embedded in 3d structure/detent, with fake reflection spread via colored shadow ? - - cutaway side view: - ``` - |\-=wall - . =lens - X = lamp - __ __ - | \__...__/ | - X - ``` -**** Glass Gauge -**** Segment Display: http://www.3quarks.com/en/SegmentDisplay/ -**** Glass Display effect ? -- lens distortion -- light reflection from outside -- for info-dense ui's that might "break" "tactileness" e.g. graphs diff --git a/llama_forge_rs/Dockerfile b/llama_forge_rs/Dockerfile deleted file mode 100644 index a488004..0000000 --- a/llama_forge_rs/Dockerfile +++ /dev/null @@ -1,85 +0,0 @@ -FROM ghcr.io/rust-lang/rust:nightly-bookworm-slim@sha256:a0f43abebdf4b8d3a6e545115af863c77f35b48a63b63b9d174fdb6bbd31315e as build -RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates \ - cmake \ - curl \ - git \ - sqlite3 \ - npm \ - pkg-config \ - clang \ - gcc \ - libssl-dev \ - libatk1.0-dev \ - libwebkit2gtk-4.1-dev \ - libharfbuzz-dev \ - libgtk-3-dev \ - libsoup-3.0-dev \ - libpango1.0-dev \ - libgdk-pixbuf-2.0-dev \ - zlib1g-dev \ - make \ - && rm -rf /var/lib/apt/lists/* - -ENV LANG=C.UTF-8 -ENV LANGUAGE=C.UTF-8 -ENV LC_ALL=C.UTF-8 - -# install leptos build helper cli -COPY rust-toolchain.toml . -RUN cargo --version - -RUN cargo install -f wasm-bindgen-cli --version 0.2.92 -RUN cargo install cargo-leptos --version 0.2.16 --force - -ADD ./package.json ./package.json -ADD ./package-lock.json ./package-lock.json - -RUN npm i -g sass -RUN npm install - -# Build -WORKDIR /build - -# install rust toolchain - -COPY . . -COPY .cargo/docker-config.toml .cargo/config.toml - -ARG BUILD_TYPE -ENV BUILD_TYPE=${BUILD_TYPE:-release} -ENV BUILD_PKG=${BUILD_PKG:-llama_forge_rs} -RUN echo Building $BUILD_TYPE for pkg: $BUILD_PKG -ENV VALID_TYPES="debug release" -RUN if ! echo "${VALID_TYPES}" | grep -wq "${BUILD_TYPE}"; then echo "Invalid BUILD_TYPE value. It should be one of ${VALID_TYPES}." && exit 1; fi -ENV LEPTOS_OUTPUT_NAME=${BUILD_PKG} -ENV LEPTOS_SITE_ADDR="0.0.0.0:3000" -ENV LEPTOS_TAILWIND_VERSION=v3.4.3 -ENV LEPTOS_SASS_VERSION=1.71.0 -ENV LEPTOS_WASM_OPT_VERSION=version_116 -ARG CARGO_BUILD_JOBS -ENV CARGO_BUILD_JOBS=${CARGO_BUILD_JOBS:-4} - -RUN if [ "$BUILD_TYPE" = "release" ]; then \ - cargo leptos build -p $BUILD_PKG --release; \ - elif [ "$BUILD_TYPE" = "debug" ]; then \ - cargo leptos build -p $BUILD_PKG; \ - else \ - echo "Invalid BUILD_TYPE value. It should be either 'release' or 'debug'." && exit 1; \ - fi - -RUN mkdir -p ./out/target \ - && cp -r ./target/site ./out/target/site \ - && cp -r ./target/x86_64-unknown-linux-gnu/$BUILD_TYPE/$BUILD_PKG ./out/server - -RUN chmod +x ./out/server -RUN sqlite3 ./out/db.sqlite3 "VACUUM;" - -FROM gcr.io/distroless/base-debian12@sha256:611d30d7f6d9992c37b1e1a212eefdf1f7c671deb56db3707e24eb01da8c4c2a - -WORKDIR /app -# ADD ./rules.json ./rules.json this should now be provided as a mount -COPY --from=build /build/out ./ - -ENTRYPOINT ["./server"] -CMD [] diff --git a/llama_forge_rs/LICENSE.md b/llama_forge_rs/LICENSE.md deleted file mode 100644 index 4ef32f0..0000000 --- a/llama_forge_rs/LICENSE.md +++ /dev/null @@ -1,651 +0,0 @@ -GNU Affero General Public License -================================= - -_Version 3, 19 November 2007_ -_Copyright © 2007 Free Software Foundation, Inc. <>_ - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -## Preamble - -The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - -The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - -When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - -Developers that use our General Public Licenses protect your rights -with two steps: **(1)** assert copyright on the software, and **(2)** offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - -A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - -The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - -An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - -The precise terms and conditions for copying, distribution and -modification follow. - -## TERMS AND CONDITIONS - -### 0. Definitions - -“This License” refers to version 3 of the GNU Affero General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this -License. Each licensee is addressed as “you”. “Licensees” and -“recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a “modified version” of the -earlier work or a work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based -on the Program. - -To “propagate” a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” -to the extent that it includes a convenient and prominently visible -feature that **(1)** displays an appropriate copyright notice, and **(2)** -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -### 1. Source Code - -The “source code” for a work means the preferred form of the work -for making modifications to it. “Object code” means any non-source -form of a work. - -A “Standard Interface” means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - -The “System Libraries” of an executable work include anything, other -than the work as a whole, that **(a)** is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and **(b)** serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -“Major Component”, in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - -The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - -The Corresponding Source for a work in source code form is that -same work. - -### 2. Basic Permissions - -All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - -### 3. Protecting Users' Legal Rights From Anti-Circumvention Law - -No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - -When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - -### 4. Conveying Verbatim Copies - -You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - -### 5. Conveying Modified Source Versions - -You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - -* **a)** The work must carry prominent notices stating that you modified -it, and giving a relevant date. -* **b)** The work must carry prominent notices stating that it is -released under this License and any conditions added under section 7. -This requirement modifies the requirement in section 4 to -“keep intact all notices”. -* **c)** You must license the entire work, as a whole, under this -License to anyone who comes into possession of a copy. This -License will therefore apply, along with any applicable section 7 -additional terms, to the whole of the work, and all its parts, -regardless of how they are packaged. This License gives no -permission to license the work in any other way, but it does not -invalidate such permission if you have separately received it. -* **d)** If the work has interactive user interfaces, each must display -Appropriate Legal Notices; however, if the Program has interactive -interfaces that do not display Appropriate Legal Notices, your -work need not make them do so. - -A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -“aggregate” if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - -### 6. Conveying Non-Source Forms - -You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - -* **a)** Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by the -Corresponding Source fixed on a durable physical medium -customarily used for software interchange. -* **b)** Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by a -written offer, valid for at least three years and valid for as -long as you offer spare parts or customer support for that product -model, to give anyone who possesses the object code either **(1)** a -copy of the Corresponding Source for all the software in the -product that is covered by this License, on a durable physical -medium customarily used for software interchange, for a price no -more than your reasonable cost of physically performing this -conveying of source, or **(2)** access to copy the -Corresponding Source from a network server at no charge. -* **c)** Convey individual copies of the object code with a copy of the -written offer to provide the Corresponding Source. This -alternative is allowed only occasionally and noncommercially, and -only if you received the object code with such an offer, in accord -with subsection 6b. -* **d)** Convey the object code by offering access from a designated -place (gratis or for a charge), and offer equivalent access to the -Corresponding Source in the same way through the same place at no -further charge. You need not require recipients to copy the -Corresponding Source along with the object code. If the place to -copy the object code is a network server, the Corresponding Source -may be on a different server (operated by you or a third party) -that supports equivalent copying facilities, provided you maintain -clear directions next to the object code saying where to find the -Corresponding Source. Regardless of what server hosts the -Corresponding Source, you remain obligated to ensure that it is -available for as long as needed to satisfy these requirements. -* **e)** Convey the object code using peer-to-peer transmission, provided -you inform other peers where the object code and Corresponding -Source of the work are being offered to the general public at no -charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - -A “User Product” is either **(1)** a “consumer product”, which means any -tangible personal property which is normally used for personal, family, -or household purposes, or **(2)** anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, “normally used” refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - -If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - -The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - -### 7. Additional Terms - -“Additional permissions” are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - -* **a)** Disclaiming warranty or limiting liability differently from the -terms of sections 15 and 16 of this License; or -* **b)** Requiring preservation of specified reasonable legal notices or -author attributions in that material or in the Appropriate Legal -Notices displayed by works containing it; or -* **c)** Prohibiting misrepresentation of the origin of that material, or -requiring that modified versions of such material be marked in -reasonable ways as different from the original version; or -* **d)** Limiting the use for publicity purposes of names of licensors or -authors of the material; or -* **e)** Declining to grant rights under trademark law for use of some -trade names, trademarks, or service marks; or -* **f)** Requiring indemnification of licensors and authors of that -material by anyone who conveys the material (or modified versions of -it) with contractual assumptions of liability to the recipient, for -any liability that these contractual assumptions directly impose on -those licensors and authors. - -All other non-permissive additional terms are considered “further -restrictions” within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - -### 8. Termination - -You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - -However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated **(a)** -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and **(b)** permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - -### 9. Acceptance Not Required for Having Copies - -You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - -### 10. Automatic Licensing of Downstream Recipients - -Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - -An “entity transaction” is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - -### 11. Patents - -A “contributor” is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, “control” includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - -In the following three paragraphs, a “patent license” is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To “grant” such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - -If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either **(1)** cause the Corresponding Source to be so -available, or **(2)** arrange to deprive yourself of the benefit of the -patent license for this particular work, or **(3)** arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. “Knowingly relying” means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - -A patent license is “discriminatory” if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license **(a)** in connection with copies of the covered work -conveyed by you (or copies made from those copies), or **(b)** primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - -### 12. No Surrender of Others' Freedom - -If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - -### 13. Remote Network Interaction; Use with the GNU General Public License - -Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - -Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - -### 14. Revised Versions of this License - -The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License “or any later version” applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - -Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - -### 15. Disclaimer of Warranty - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -### 16. Limitation of Liability - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - -### 17. Interpretation of Sections 15 and 16 - -If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - -_END OF TERMS AND CONDITIONS_ - -## How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the “copyright” line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a “Source” link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - -You should also get your employer (if you work as a programmer) or school, -if any, to sign a “copyright disclaimer” for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -<>. diff --git a/llama_forge_rs/PLAN.org b/llama_forge_rs/PLAN.org deleted file mode 100644 index 7cb2880..0000000 --- a/llama_forge_rs/PLAN.org +++ /dev/null @@ -1,317 +0,0 @@ -#+title: Plan - -* TODO for 0.0.1-rc1 -- [X] processmanager service - - [X] spawn task on app startup - - [X] loop every second - - [X] start processes - - [X] query waiting processes from db - - [X] start them - - [X] change their status to running - - [X] stop finished processes in db & remove from RAM registry - - [X] query status for currently running processes - - [X] stop those that aren't status=running - - [X] set their status to finished -- [ ] must have tweaks - - pass options to model (ngl , path & model) - - gpu/nogpu - - model dropdown (ls *.gguf based) - - size - - markdown formatting with markdown-rs + set inner html - - show small backend starter widget icon /button on chat page - - test faster refresh - - chat persistence - - Config.toml - - package as appimage - - add model mode - - amd/rocm/cuda -- [ ] ideas to investigate before release - - stdout inspection - - visualize setting generation ? [not really useful once settings are per chat?] - -* TODO next steps after 0.0.1-rc1 -- markdown formatting -- chat persistence -- backend logs inspector -- multiple chats -- per chat settings/model etc -- configurable ngl -- custom backends via pwd, command & args -- custom backend templates -- prompt templates -- sampling settings -- chat/completion mode? -- transfer planning into issues - -* Roadmap -0.1 model selection from dir, switch models -- hardcoded ngl -- llamafile in path or ./llamafile only -- one chat -- simple model selection -- llamafile included templates only -0.2 -- hardcoded inbuilt chat templates -- multiple chatrooms - - persist settings - - ngl setting - - persist history - - summaries -- extendended backend settings - - max running? running slots? -- better model selection - - extract GGUF metadata -- model downloader ? - - huggingface /api/models hardcoded to my account as owner - - develop some yalu.toml manifest? ? -- chat templates /completions instead of /chat/completions - -* Design for 0.1 -- Frontend - - settings page - - model dir - - chat settings drawer - - model selection (from dir */*.gguf?) - - chat template (from hardcoded list) - - start/stop -- Backend - - Settings (1) - - model path - - Chat (1) - - Template - - ModelSettigns - - model - - ngl - - BackendProcess (1) - - status: started -> running -> finished - - created from chat & saves its args - - no update, only create&delete -- RunnerBackend - - keep track which processes are running - - start/stop processes when needed - -* TODO for 0.1 -- Settings api - - #[server] fn update_settings - - model_dir -- Chat Api - - #[server] fn update_chat - - ChatTemplate (llama3, chatml, phi) - - model path - - ngl -- BackendProcess api - - #[server] fn start_process - - #[server] fn stop_process - - #[server] fn restart_process ? -- BackendRunner worker -- UI stuff - - settings page with model_dir - - drawer on chat - - settings (model_path & ngl) - - start/stop -- Package for private release - - -* TODO Design for backend runners -** TODO -- implement backendconfig CRUD - - backend tab -- implement starting of a specified backendconfig - - "running" tab ? -- add simple per-start settings - - context & ngl -- add model per-start setting - - needs model settings (ie. download path) - - probably need global app settings somewhere -- better message formatting - - markdown conversion -** Newest Synthesis -- 2 Ressources - - BackendConfig - - includes state needed to start backend - - ie. no runtime options like -ctx -m -ngl etc - - for noparams configs only needed ui is a select dropdown - - (NO PARAMS !!!!) - - shipped llamafile - - llamafile PATH - - llama.cpp server in PATH ? - - (not mvp) - - basic & flexible pwd, cmd, args(prefix) - - templates for default options (can probably just be in the ui code, auto-filling the form ?) - - llama.cpp path prebuilt - - llama.cpp path builder - - no explicit nix support for now! - - BackendProcess - - initialy just start/stop with hardcoded config - - RunTimeConfig - - model - - context etc -** Open Questions -- how to model multiple launched instances ? - - could have different parameters or models loadead -** Synthesis ? -- model backend as ressource - - runner can start stop -- build interactor pattern services ? -** (Maybe) better option runner module seperate as a kind of micro subservice -- only startup fn in main, nothing pub apart from that -- server api code stays like a mostly simple crud app -- start background jobs on startub - - starter/manager - - reads intended backend state from sqlite - - has internal state in struct - - makes internal state agree with db - - starts backends - - stops backends - - etc? -- frontend just reads and writes db via server fns -- other background job for having always up-to-date status for backends ? - - expose status checker via backendapi interface trait -** (Maybe) stupid option -- continue current plan, start on demand via server_fn request -- how to handle only starting a single backend - - some in process registry needed ? - -* MVP -** Backends -- start on demand - - simple start/stop - - as background service - - simple status via /health -- Options - - llamafile - - in $PATH - - as executable file next to binary, (enables creating a zip which "just works") - - llama.cpp - - via nix via path to llama.cpp directory - - via path to binary -- Settings - - context - - gpu layers - - keep model hardcoded for now - -** Chat Prompt Template -- simple template defs to get from chat format (with role) to bare text prompt - - collect some default templates (chatml/llama3) -- migrate to /completions api -- apply to specific models ? - -** Model Selection -- set folder in general settings -- read gguf metadata via gguf crate -- per-model settings (layers? ctx?, vram prediction ?) - -** Inference settings (in chat as modal or sth like that) -- set sampler params in chat settings -** Settings hierarchy ? -- per_chat>per_model>per_backend>global -** Setting types ? -- Model loading - - context - - gpu layers -- Sampling - - temperature -- Prompt template - - -* Settings planning -** Per Backend -*** runner config -- pwd -- cmd -- template for args - - model - - chat template - - infer settings ? ( low prio, should switch to other API, that allows settings these at runtime ) -** Per Model -*** offloading layers ? -** per chat -*** inference settings( runtime ) - -* Settings todo -- start/stop - - start current backend on demand, just start stop on settings page - - disable buttons when backend isn ´t running -- only allow llama-cpp/llamafile launch arguments for now - -* Next steps (teaser) -- [x] finish basic chat - - [x] bigger bubbles (use screen, +flex grow?/maybe even grid?) - - [x] edit history + system prompt - - [x] regenerate latest response - # - save history to db (postponed until multichat) -- [ ] backend page - - [ ] infer sampling settings - - [ ] running settings (gpu layer, context size etc) -- [ ] model page - - [ ] set model dir - - [ ] list by simple filename (& size) - - [ ] offline metadata (README frontmatter yaml, filename, (gguf crate)) -- [ ] chat settings - - [ ] none for now, single model & settigns et is selected on respective pages -* Next steps (private mvp) -- chatrooms -- settings/model/etc per chatroom, multiple settingss ets - -* TODO MVP -- [ ] add test model downloader to nix devshell -- [ ] Backend config via TOML - - just based on llama.cpp /completion for now -- [ ] Basic chat GUI - - basic ui with bubbles - - advanced ui with markdown rendering - - fix incomplete quotes ? -- [ ] Prompt template & parameters via TOML -- [ ] Basic DB stuff - - single room history - - prompt templates via DB - - parameter management via DB (e.g. temperature) -- [ ] Advanced chat UI - - Multiple "Rooms" - - Set prompt & params per room -- [ ] Basic RAG - - select vector db - - qdrant ? chroma ? - -* TODO Advanced features -- [ ] Backends - - Backend Runner - - llamafile - - llama.cpp nix (via cmd templates ?) - - Backend API config? - - Backend Downloader/Installer -- [ ] Inference Param Templates -- [ ] Prompt Templates -- [ ] model library - - [ ] model downloader - - [ ] model selector - - model data extractionf from gguf - - [ ] quant selector - - automatic offloading layer selection based on vram - - [ ] auto-quantize - - vocab selection - - quant checkboxes - - extract progress ETA - - imatrix generation - - dataset downloader ? (or just include a default one?) -- [ ] Better RAG - - [ ] add multiple embedding models - - [ ] add reranking -- [ ] Generic graph based prompt pre/postprocessing via UI, like ComfyUI - - [ ] DSL ? Some existing scripting stuff ? - - [ ] Graph just as visualization, with text-based config - - [ ] Fancy Graph UI - -* TODO Polish -- [ ] Backend Multi-API compat e.g. llama.cpp /completion & /chat/completion - - has different features (chat/completion has hardcoded prompt template) - - support only full featured backends for now - - add chat support here - -* TODO Go public -- Rename to YALU ? -- Polish README.md -- Clean history -- Add some more common backends (ollama ?) -- Sync to github -- Announce on /locallama diff --git a/llama_forge_rs/README.md b/llama_forge_rs/README.md deleted file mode 100644 index f0bd066..0000000 --- a/llama_forge_rs/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Llama Forge RS App - - -![AGPL 3 or later](https://img.shields.io/badge/license-AGPL%203.0%20or%20later-blue) -![🚀 Blazingly fast](https://img.shields.io/badge/%F0%9F%9A%80%20blazingly-fast-brightgreen) -![🪨 Rock Solid](https://img.shields.io/badge/%F0%9F%AA%A8%20rock-solid-violet) -![Zero Bugs🪳](https://img.shields.io/badge/zero-bugs%20%F0%9F%AA%B3-red) -![yes it's](https://img.shields.io/badge/yes%20it's-brightgreen) -![Written in rust😎](https://img.shields.io/badge/written%20in-rust%20%F0%9F%98%8E-orange?logo=rust) - - - -## Overview - -TODO Decide on projekt name, Llama Forge RS ? YALU ? - - -## Dependency Installation - -### Via Nix Flake -```nix -{ - inputs = { - # ... -+ llama-cpp = { -+ url = "git+https://git.vlt81.de/tristan/llama.cpp.git"; -+ }; -+ # TODO Add nix pacakge for app itself - }; - - outputs = { - # .... -+ , llama-cpp - , ... - } @ inputs: - let - # Then just use the package, e.g. for home-manager -+ home.packages = [ inputs.llama-cpp.packages.${system}.rocm ]; -+ # This might be needed for some AMD GPUS -+ home.sessionVariables = { -+ HSA_OVERRIDE_GFX_VERSION = "10.3.0"; -+ }; -} -``` - -## License Notice -TODO Add name hre - -Licensed under AGPL 3 or later, see [./LICENSE.md](./LICENSE.md) - -TODO one-liner project description here -Copyright (C) 2023-2024 Tristan Druyen - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . diff --git a/llama_forge_rs/conf/rules.json b/llama_forge_rs/conf/rules.json deleted file mode 100644 index 7680ccb..0000000 --- a/llama_forge_rs/conf/rules.json +++ /dev/null @@ -1,121 +0,0 @@ -[ - { - "ignore_case": true, - "konto": "600001", - "pattern": "ESF 2311", - "priority": 0, - "werbecode": "000001000028" - }, - { - "ignore_case": true, - "konto": "600002", - "pattern": "Für Frieden", - "priority": 0, - "werbecode": "000001000052" - }, - { - "ignore_case": true, - "konto": "600003", - "pattern": "Fuer Frieden", - "priority": 0, - "werbecode": "000001000052" - }, - { - "ignore_case": true, - "konto": "600004", - "pattern": "r Frieden", - "priority": 0, - "werbecode": "000001000052" - }, - { - "ignore_case": true, - "konto": "600005", - "pattern": "ETH 2307", - "priority": 0, - "werbecode": "000001000061" - }, - { - "ignore_case": true, - "konto": "600006", - "pattern": "TEPCO", - "priority": 0, - "werbecode": "000001000026" - }, - { - "ignore_case": false, - "konto": "600007", - "pattern": "Personal", - "priority": 1, - "werbecode": "000006000006" - }, - { - "ignore_case": false, - "konto": "600008", - "pattern": "Fluchtursachen", - "priority": 2, - "werbecode": "000001000066" - }, - { - "ignore_case": false, - "konto": "600009", - "pattern": "2305", - "priority": 2, - "werbecode": "000001000053" - }, - { - "ignore_case": false, - "konto": "600010", - "pattern": "Planet", - "priority": 2, - "werbecode": "000004000004" - }, - { - "ignore_case": true, - "konto": "600011", - "pattern": "Wasserschad", - "priority": 2, - "werbecode": "000001000063" - }, - { - "ignore_case": true, - "konto": "600012", - "pattern": "Förderbeitrag", - "priority": 3, - "werbecode": "000003000003" - }, - { - "ignore_case": true, - "konto": "600013", - "pattern": "Foerd", - "priority": 3, - "werbecode": "000003000003" - }, - { - "ignore_case": false, - "konto": "600014", - "pattern": "Zustift", - "priority": 4, - "werbecode": "000016000011" - }, - { - "ignore_case": true, - "konto": "600015", - "pattern": "Konzern-Widerstand 2023", - "priority": 7, - "werbecode": "000001000022" - }, - { - "ignore_case": true, - "konto": "600016", - "pattern": "KONZERNKRITIK STAERKEN", - "priority": 8, - "werbecode": "000001000028" - }, - { - "ignore_case": false, - "konto": "600099", - "pattern": "Spende", - "priority": 99, - "werbecode": "000001000021" - } -] \ No newline at end of file diff --git a/llama_forge_rs/config.yaml b/llama_forge_rs/config.yaml deleted file mode 100644 index a19d518..0000000 --- a/llama_forge_rs/config.yaml +++ /dev/null @@ -1,108 +0,0 @@ -system_resources: - ram: 48G - vram: 30G -model_specs: - - name: "tabby-code" - port: 18080 - # internal_port: 28080 # Optional - autostart: true - vram_usage: 26.7G # Coder-32B + draft 0.5B - ram_usage: 3G # Coder-32B + draft 0.5B - # vram_usage: 8.25G # Coder-7B - # ram_usage: 2.6G # Coder-7B - env: - CUDA_VISIBLE_DEVICES: 0 - HSA_OVERRIDE_GFX_VERSION: '11.0.0' - args: - # host: 0.0.0.0 - flash-attn: true - ctx-size: 32768 - model: /media/SanDisk/ai/models_live/Qwen2.5-Coder-32B-Instruct-IQ4_XS.gguf - gpu-layers: 9999 - model-draft: /media/SanDisk/ai/models_live/Qwen2.5-Coder-0.5B-Q8_0.gguf - gpu-layers-draft: 9999 - draft-max: 16 - draft-min: 5 - - name: "tabby-embeddings" - port: 18081 - vram_usage: 0.4G - ram_usage: 2.5G - env: - CUDA_VISIBLE_DEVICES: 0 - HSA_OVERRIDE_GFX_VERSION: '11.0.0' - args: - model: /media/SanDisk/ai/models_live/nomic-embed-text-v1-f32.gguf - gpu-layers: -1 - flash-attn: true - # host: 0.0.0.0 - embeddings: true - - name: "big-chat" - port: 18082 - vram_usage: 26.5G - ram_usage: 2.5G - env: - CUDA_VISIBLE_DEVICES: 0 - HSA_OVERRIDE_GFX_VERSION: '11.0.0' - args: - ctx-size: 16384 - flash-attn: true - model: /media/SanDisk/ai/models_live/Qwen2.5-32B-Instruct-Q5_K_L.gguf - gpu-layers: 9999 - model-draft: /media/SanDisk/ai/models_live/Qwen2.5-0.5B-Instruct-Q8_0.gguf - gpu-layers-draft: 9999 - # draft-max: 16 - # draft-min: 5 - - name: "bigger-chat" - port: 18085 - vram_usage: 29G - ram_usage: 5G - env: - CUDA_VISIBLE_DEVICES: 0 - HSA_OVERRIDE_GFX_VERSION: '11.0.0' - args: - ctx-size: 8192 - flash-attn: true - cache-type-k: q8_0 - cache-type-v: q8_0 - model: /media/SanDisk/ai/models_live/Llama-3.1-Nemotron-70B-Instruct-HF-IQ3_XXS.gguf - gpu-layers: 9999 - model-draft: /media/SanDisk/ai/models_live/Llama-3.2-1B-Instruct-Q8_0.gguf - gpu-layers-draft: 0 - # draft-max: 16 - # draft-min: 5 - - name: "bigger-chat-2" - port: 18083 - vram_usage: 29G - ram_usage: 5G - env: - CUDA_VISIBLE_DEVICES: 0 - HSA_OVERRIDE_GFX_VERSION: '11.0.0' - args: - ctx-size: 8192 - flash-attn: true - cache-type-k: q8_0 - cache-type-v: q8_0 - model: /media/SanDisk/ai/models_live/Llama-3.3-70B-Instruct-IQ3_XXS.gguf - gpu-layers: 9999 - # model-draft: /media/SanDisk/ai/models_live/Llama-3.2-1B-Instruct-Q8_0.gguf - # gpu-layers-draft: 0 - # draft-max: 16 - # draft-min: 5 - - name: "deep-think" - port: 18084 - vram_usage: 29G - ram_usage: 5G - env: - CUDA_VISIBLE_DEVICES: 0 - HSA_OVERRIDE_GFX_VERSION: '11.0.0' - args: - ctx-size: 32768 - flash-attn: true - # cache-type-k: q8_0 - # cache-type-v: q8_0 - model: /media/SanDisk/ai/models_live/QwQ-32B-Preview-IQ4_XS.gguf - gpu-layers: 9999 - # model-draft: /media/SanDisk/ai/models_live/Llama-3.2-1B-Instruct-Q8_0.gguf - # gpu-layers-draft: 0 - # draft-max: 16 - # draft-min: 5 diff --git a/llama_forge_rs/docker-compose.yml b/llama_forge_rs/docker-compose.yml deleted file mode 100644 index dcd1368..0000000 --- a/llama_forge_rs/docker-compose.yml +++ /dev/null @@ -1,16 +0,0 @@ -services: - llama_forge_rs-release: - image: git.vlt81.de/vault81/llama_forge_rs:dev-release - build: - context: . - args: - BUILD_TYPE: release - BUILD_PKG: llama_forge_rs - - llama_forge_rs-debug: - image: git.vlt81.de/vault81/llama_forge_rs:dev-debug - build: - context: . - args: - BUILD_TYPE: debug - BUILD_PKG: llama_forge_rs diff --git a/llama_forge_rs/end2end/package-lock.json b/llama_forge_rs/end2end/package-lock.json deleted file mode 100644 index 931c38f..0000000 --- a/llama_forge_rs/end2end/package-lock.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "name": "end2end", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "end2end", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@playwright/test": "1.43.1" - } - }, - "node_modules/@playwright/test": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", - "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", - "dev": true, - "dependencies": { - "playwright": "1.43.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/playwright": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", - "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", - "dev": true, - "dependencies": { - "playwright-core": "1.43.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", - "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - } - }, - "dependencies": { - "@playwright/test": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", - "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", - "dev": true, - "requires": { - "playwright": "1.43.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "playwright": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", - "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", - "dev": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.43.1" - } - }, - "playwright-core": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", - "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", - "dev": true - } - } -} diff --git a/llama_forge_rs/end2end/package.json b/llama_forge_rs/end2end/package.json deleted file mode 100644 index f2e989f..0000000 --- a/llama_forge_rs/end2end/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "end2end", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": {}, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@playwright/test": "1.43.1" - } -} diff --git a/llama_forge_rs/end2end/playwright.config.ts b/llama_forge_rs/end2end/playwright.config.ts deleted file mode 100644 index e9891c0..0000000 --- a/llama_forge_rs/end2end/playwright.config.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { PlaywrightTestConfig } from "@playwright/test"; -import { devices } from "@playwright/test"; - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -const config: PlaywrightTestConfig = { - testDir: "./tests", - /* Maximum time one test can run for. */ - timeout: 30 * 1000, - expect: { - /** - * Maximum time expect() should wait for the condition to be met. - * For example in `await expect(locator).toHaveText();` - */ - timeout: 5000, - }, - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: "html", - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ - actionTimeout: 0, - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://localhost:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: "on-first-retry", - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: "chromium", - use: { - ...devices["Desktop Chrome"], - }, - }, - - { - name: "firefox", - use: { - ...devices["Desktop Firefox"], - }, - }, - - { - name: "webkit", - use: { - ...devices["Desktop Safari"], - }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { - // ...devices['Pixel 5'], - // }, - // }, - // { - // name: 'Mobile Safari', - // use: { - // ...devices['iPhone 12'], - // }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { - // channel: 'msedge', - // }, - // }, - // { - // name: 'Google Chrome', - // use: { - // channel: 'chrome', - // }, - // }, - ], - - /* Folder for test artifacts such as screenshots, videos, traces, etc. */ - // outputDir: 'test-results/', - - /* Run your local dev server before starting the tests */ - // webServer: { - // command: 'npm run start', - // port: 3000, - // }, -}; - -export default config; diff --git a/llama_forge_rs/end2end/tests/example.spec.ts b/llama_forge_rs/end2end/tests/example.spec.ts deleted file mode 100644 index 64fac90..0000000 --- a/llama_forge_rs/end2end/tests/example.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test("homepage has title and links to intro page", async ({ page }) => { - await page.goto("http://localhost:3000/"); - - await expect(page).toHaveTitle("Welcome to Leptos"); - - await expect(page.locator("h1")).toHaveText("Welcome to Leptos!"); -}); - -// TODO add a simple e2e smoke test here which chats with the model with a simple question -// TODO add a small (<2GB) testing model diff --git a/llama_forge_rs/migrations/20240427211512_add_settings.sql b/llama_forge_rs/migrations/20240427211512_add_settings.sql deleted file mode 100644 index 0be6ec6..0000000 --- a/llama_forge_rs/migrations/20240427211512_add_settings.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Add migration script here -CREATE TABLE IF NOT EXISTS settings ( - version INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - model_dir TEXT NOT NULL, - default_model TEXT NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); diff --git a/llama_forge_rs/migrations/20240427230414_add_backend_process.sql b/llama_forge_rs/migrations/20240427230414_add_backend_process.sql deleted file mode 100644 index c4b3f0f..0000000 --- a/llama_forge_rs/migrations/20240427230414_add_backend_process.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Add migration script here -CREATE TABLE IF NOT EXISTS backend_process ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - settings_version INTEGER, - status TEXT NOT NULL CHECK( status IN ('waiting_for_start', 'running', 'waiting_for_stop', 'finished', 'failed') ), - FOREIGN KEY(settings_version) REFERENCES settings(version) -); diff --git a/llama_forge_rs/public/.gitkeep b/llama_forge_rs/public/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/llama_forge_rs/public/3dbutton.md b/llama_forge_rs/public/3dbutton.md deleted file mode 100644 index 9167c6e..0000000 --- a/llama_forge_rs/public/3dbutton.md +++ /dev/null @@ -1,205 +0,0 @@ -```html -
-
- - - - -
-
-``` - -```scss -body { - width: 100%; - height: 100vh; - margin: 0; - padding: 0; - display: flex; - align-items: center; - justify-content: center; - font-size: 3rem; - background-color: rgb(225, 225, 225); - font-family: "Inter", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - overflow: hidden; -} - -.button { - --cr-shadow-color: rgba(5, 5, 235, 0.75); - --fl-shadow-color: rgba(5, 5, 5, 1); - --str-shadow-color: rgba(5, 5, 5, 0.5); - --shadow-color: rgba(5, 5, 5, 0.25); - --lt-shadow-color: rgba(5, 5, 5, 0.1); - - --cr-highlight-color: rgba(55, 55, 255, 0.25); - --highlight-color: rgba(255, 255, 255, 0.25); - --fl-highlight-color: rgba(255, 255, 255, 1); - - --edge-shadow: 0.15em; - --transition: all 250ms ease; - - all: unset; - cursor: pointer; - position: relative; - border-radius: 999vw; - padding: 1em 1.5em; - -webkit-tap-highlight-color: transparent; - background-color: rgba(0, 0, 0, 0.75); - // outline to in shadow (fixed) [curvature of background surface] - box-shadow: - -0.15em -0.15em 0.15em -0.075em var(--shadow-color), // tl - 0.15em -0.15em 0.15em -0.075em var(--shadow-color), // tr - -0.15em 0.15em 0.15em -0.075em var(--shadow-color), // bl - 0.0375em 0.0375em 0.0675em 0 var(--lt-shadow-color); // br // why different ? (improves perspective shadow feel?) - - &::before, - &::after { - content: ""; - position: absolute; - border-radius: inherit; - transition: var(--transition); - } - - &::before { - z-index: 1; - inset: 0.025em; - // outline shadow perspective - box-shadow: - // 0 0.05em 0.05em -0.01em var(--fl-shadow-color), // perspective gap btm (opt) - // 0 0.01em 0.01em -0.01em var(--str-shadow-color), // perspective gap btm (opt) - 0.15em 0.3em 0.1em -0.01em var(--shadow-color); // button shadow itself - } - - &::after { - z-index: 2; - inset: 0.0125em; - // main button color - background-image: linear-gradient( - 135deg, - rgb(230, 230, 230), - rgb(180, 180, 180) - ); - clip-path: inset(0 round 999vw); - // inline shadows - box-shadow: - // inline-perspective shadow - 0 0 0 0 inset var(--shadow-color), - - // Rounding of the button itself - -0.05em -0.05em 0.05em 0 inset var(--shadow-color), // button bottom - 0 0 0.05em 0.2em inset var(--highlight-color), // button top - -0.075em -0.25em 0.25em 0.1em inset var(--shadow-color); // side - } - - &:hover { - &::before { - // outline shadow perspective - box-shadow: - // 0 0.05em 0.0em -0.01em var(--fl-shadow-color), - //0 0.01em 0.01em -0.01em var(--str-shadow-color), - 0.1em 0.2em 0.066em -0.01em var(--shadow-color); - } - - &::after { - clip-path: inset(clamp(1px, 0.0625em, 2px) round 999vw); - box-shadow: - 0.1em 0.15em 0.05em 0 inset var(--shadow-color), - -0.025em -0.03em 0.05em 0.025em inset var(--shadow-color), - 0 0 0.05em 0.3em inset var(--highlight-color), - -0.075em -0.12em 0.2em 0.1em inset var(--shadow-color); - } - } - - &:active { - &::before { - // outline shadow perspective - box-shadow: none; - } - - &::after { - --shadow-color: rgba(85, 5, 5, 0.75); // red - --highlight-color: rgba(255, 80, 80, 0.25); // red - - box-shadow: - 0.15em 0.175em 0.075em 0 inset var(--shadow-color), - -0.025em -0.03em 0.05em 0.025em inset var(--shadow-color), - 0 0 0.05em 0.4em inset var(--highlight-color), - -0.075em -0.12em 0.2em 0.1em inset var(--shadow-color); - } - } - - span { - --text-gradient: linear-gradient(135deg, rgb(25, 25, 25), rgb(75, 75, 75)); - - position: relative; - z-index: 3; - font-family: inherit; - letter-spacing: -0.05em; - font-weight: 500; - color: transparent; - background-image: var(--text-gradient); - background-clip: text; - transition: transform 250ms ease; - display: block; - text-shadow: rgba(0, 0, 0, 0.1) 0 0 0.1em; - } - - &:hover span { - transform: scale(0.975); - } - - &:active span { - transform: scale(0.95); - } -} -``` - -# interface - -- brainstorm: - - example button equivalent?: - - "3ds hover:3ds-depth-100 active:3ds-depth-200 active:3ds-backlight-red" - - general config: - - "3ds-light-angle-[120deg]" (day night cycle) 🤯 - - "3ds-component-red" - - "3ds-surface-green" - - "3ds-view-angle-[120deg]" ???? (rotatable perspective???) (possible???) - - "3ds-ambient-occlusion" ? - - "3ds-gap-light?" - - "3ds-inline-outline-ratio?" - - "sizes? (increased em size)" - - open questions: - - how to make text work ? 3ds-text required? - - depth levels ? - - make virtual height configurable as well????? - - would need to compute level/ratio when outline shadow disappears - - shrinking looks weird for components that are much wider than they are high and vice-versa - -# Wants -- depth - -- component color -- mounting surface color -- text color ? (needed?) - -- nesting? - -## Shadow types? - -outline-depth-shadow (fixed) - - -inline-depth-shadow -- ambient occlusion(bot+top) + highlight - - -inline-perspective-shadow -outline-perspective-shadow diff --git a/llama_forge_rs/public/favicon.ico b/llama_forge_rs/public/favicon.ico deleted file mode 100644 index 2ba8527cb12f5f28f331b8d361eef560492d4c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 zcmeHOd3aPs5`TblWD*3D%tXPJ#q(n!z$P=3gCjvf#a)E}a;Uf>h{pmVih!a-5LVO` zB?JrzEFicD0wRLo0iPfO372xnkvkzFlRHB)lcTnNZ}KK@US{UKN#b8?e_zkLy1RZ= zT~*y(-6IICgf>E_P6A)M3(wvl2qr-gx_5Ux-_uzT*6_Q&ee1v9B?vzS3&K5IhO2N5 z$9ukLN<`G>$$|GLnga~y%>f}*j%+w@(ixVUb^1_Gjoc;(?TrD3m2)RduFblVN)uy; zQAEd^T{5>-YYH%|Kv{V^cxHMBr1Ik7Frht$imC`rqx@5*| z+OqN!xAjqmaU=qR$uGDMa7p!W9oZ+64($4xDk^FyFQ<_9Z`(;DLnB<;LLJD1<&vnZ zo0(>zIkQTse}qNMb6+i`th54(3pKm8;UAJ<_BULR*Z=m5FU7jiW(&#l+}WkHZ|e@1 z`pm;Q^pCuLUQUrnQ(hPM10pSSHQS=Bf8DqG1&!-B!oQQ|FuzLruL1w(+g<8&znyI? zzX-}?SwUvNjEuT?7uUOy{Fb@xKklpj+jdYM^IK9}NxvLRZd{l9FHEQJ4IO~q%4I0O zAN|*8x^nIU4Giw?f*tmNx=7H)2-Zn?J^B6SgpcW3ZXV_57Sn%Mtfr_=w|sYpAhdJT zcKo6Z*oIOU(az~3$LOEWm9Q)dYWMA}T7L23MVGqrcA%4H)+^`+=j+Hh8CTCnnG2Rh zgcXVW%F8$R9)6}f=NQiLPt8qt3xNUQI>Q*)H1lzk<&n?XR-f}tc&9V0H0lhGqHJ^N zN%h(9-Of2_)!Xk{qdIkU>1%mk%I_Id1!MU*yq&&>)Q+!L^t&-2mW9Xq7g9C@* zl&PKJ&su2L+iku?Te?Pf?k3tUK){Bj_gb&aPo8Ago^XI~mRTd(5{&^tf1)!-lSMha z@$~ae!r(~`=p&|mMxy2EiZQ6FvXb(1avS*`Pj%$)*?vwceGKHmHnl`v&fEQ_Wh+G) zEPQ^3&oV%}%;zF`AM|S%d>pM@1}33PN5*4SewROk_K$n^i8QjaYiRzwG8#OvVIF|{x85wH+?*P*%)woI zR538k@=(E`V;p1UwA|fqSh`$n_t;Sz4T)`_s~pRR4lbmWWSdxa-FqLZ%fLT)Bh?iye?COx~mO1wkn5)HNMg7`8~ z25VJhz&3Z7`M>6luJrEw$Jikft+6SxyIh?)PU1?DfrKMGC z=3T;;omE4H`PWqF8?0*dOA3o9y@~WK`S}{?tIHquEw?v`M^D%Lobpdrp%3}1=-&qk zqAtb1px-1Fy6}E8IUg4s%8B0~P<P5C;de%@n~XnDKF@fr$a+^@$^P|>vlw($aSK2lRtLt~8tRb`I0 znfI!G?K|<5ry*gk>y56rZy0NkK6)))6Mg1=K?7yS9p+#1Ij=W*%5Rt-mlc;#MOnE9 zoi`-+6oj@)`gq2Af!B+9%J#K9V=ji2dj2<_qaLSXOCeqQ&<0zMSb$5mAi;HU=v`v<>NYk}MbD!ewYVB+N-ctzn=l&bTwv)*7 zmY<+Y@SBbtl9PPk$HTR?ln@(T92XjTRj0Mx|Mzl;lW>Su_y^~fh?8(L?oz8h!cCpb zZG-OY=NJ3{>r*`U<(J%#zjFT-a9>u6+23H{=d(utkgqt7@^)C;pkb)fQ|Q=*8*SyT z;otKe+f8fEp)ZacKZDn3TNzs>_Kx+g*c_mr8LBhr8GnoEmAQk#%sR52`bdbW8Ms$!0u2bdt=T-lK3JbDW`F(Urt%Ob2seiN>7U`YN}aOdIiCC;eeufJC#m3S z9#|l2c?G@t*hH5y^76jkv)rs4H+;oiTuY5FQwRMN_7NUqeiD|b&RyxPXQz|3qC(_> zZJMwjC4F!1m2INXqzisQ4X^w=>&(+Ecdu&~IWEMn7f*YcYI&eWI(6hI#f114%aymM zyhlG6{q>XN7(LyGiMAS&qijR%d2rV|>AUT_sE&EKUSTCM26>aKzNxk0?K|utOcxl# zxIOwM#O!!H+QzbX*&p=QuKe4y;bS>&StQOE5AEGg_ubk8{;1yOVAJfE_Js-lL7rr9 z)CEuFIlkApj~uV^zJK7KocjT=4B zJP(}0x}|A7C$$5gIp>KBPZ|A#2Ew;$#g9Fk)r;Q~?G$>x<+JM)J3u>j zi68K=I;ld`JJ?Nq+^_B?C+Q%+x#m{9JF$tbaDeNIep%=^#>KHGtg=L)>m z_J&vaZTs2{qP!4Gdw5u5Kcf}5R4(q}Lebx%(J$7l*Q`Il#pCTM%!`y5y*-~zIVs}D z9;t+(xmV~R65^ZQXe+<5{$QW0O8MT~a{kdFLR)nfRMA9L(YU>x*DTltN#m-2km zC;T`cfb{c`mcx(z7o_a8bYJn8_^dz4Cq!DZ37{P6uF{@#519UWK1{>(9sZB1I^6MmNc39MJ-_|)!S8vO+O3&$MulU3Gc z_W{N*B(yneyl-oN_MKaJ{CZ6dv-~^8uPbLSh&0jfV@EfA{2Dc!_rOyfx`R0T@LonA z<*%O?-aa_Wm-z$s@K(ex7UhM0-?9C=PkYdk&d2n((E4>&(f4D`fOQY%CURMMyJyU` zVeJBAId&StHjw76tnwSqZs3e0683`L{a3k9JYdg#(ZVw4J`&CkV-2LFaDE1Z?CehVy%vZx$tM3tTax8E@2;N^QTrPcI?Ob8uK!DM0_sfE6ks2M?iw zPS4{(k-PF*-oY>S!d9;L+|xdTtLen9B2LvpL4k;#ScB< z$NP_7j~7)5eXuoYEk*dK_rSz9yT_C4B{r~^#^o}-VQI=Y?01|$aa!a7=UEm$|DsQQ zfLK1qmho2@)nwA?$1%T6jwO2HZ({6&;`s|OQOxI4S8*Hw=Qp!b(gNJR%SAj&wGa>^&2@x)Vj zhd^WfzJ^b0O{E^q82Pw({uT`E`MT2WnZ02{E%t*yRPN>?W>0vU^4@Vyh4;mLj918c z*s*papo?<}cQM{5lcgZScx}?usg{mS!KkH9U%@|^_33?{FI{1ss+8kXyFY&5M-e~f zM$){FF;_+z3sNJ)Er~{Beux$fEl{R4|7WKcpEsGtK57f+H0DJ$hI;U;JtF>+lG@sV zQI_;bQ^7XIJ>Bs?C32b1v;am;P4GUqAJ#zOHv}4SmV|xXX6~O9&e_~YCCpbT>s$`! k<4FtN!5 - - - - - - - - diff --git a/llama_forge_rs/src/api/backend_settings.rs b/llama_forge_rs/src/api/backend_settings.rs deleted file mode 100644 index ef58504..0000000 --- a/llama_forge_rs/src/api/backend_settings.rs +++ /dev/null @@ -1,71 +0,0 @@ -use leptos::*; -use leptos_router::*; -use serde::{Deserialize, Serialize}; - -use crate::app::components::{svgs::*, FormControl}; - -#[derive(PartialEq, Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] -pub struct BackendSettings { - version: i64, // auto-increments, the current settings are the highest version - model_dir: String, - default_model: String, - created_at: chrono::NaiveDateTime, -} - -/// Returns the initial default directory for model files. ($PWD/models) -#[server] -async fn default_model_dir() -> Result { - let pwd = std::env::current_dir()?.to_string_lossy().to_string(); - let default_dir = format!("{}/models", pwd); - Ok(default_dir) -} - -/// Fetches the latest backend settings from the database. -#[server] -async fn load_backend_settings() -> Result { - use crate::server::pool; - - tracing::debug!(msg = "Load settings"); - - let pool = pool()?; - - let settings = sqlx::query_as!( - BackendSettings, - "SELECT version, model_dir, default_model, created_at FROM settings ORDER BY version DESC \ - LIMIT 1" - ) - .fetch_optional(&pool) - .await?; - - match settings { - Some(settings) => Ok(settings), - None => Err(ServerFnError::ServerError("Settings not found".to_string())), - } -} - -/// Updates the backend settings with new model directory and default model. -#[server(UpdateSettings)] -async fn update_settings(model_dir: String, default_model: String) -> Result<(), ServerFnError> { - use crate::server::pool; - - tracing::debug!(msg = "Updating settings", ?model_dir, ?default_model); - - let pool = pool()?; - - let result = { - sqlx_macros::expand_query!( - source = "INSERT INTO settings (model_dir, default_model) VALUES (?, ?)", - args = [model_dir, default_model,] - ) - } - .execute(&pool) - .await?; - - if result.rows_affected() == 0 { - return Err(ServerFnError::ServerError( - "Failed to create new settings".to_string(), - )); - } - - Ok(()) -} diff --git a/llama_forge_rs/src/api/chat.rs b/llama_forge_rs/src/api/chat.rs deleted file mode 100644 index 151b2da..0000000 --- a/llama_forge_rs/src/api/chat.rs +++ /dev/null @@ -1,33 +0,0 @@ -use bytes::Bytes; -use leptos::*; -use server_fn::codec::{ByteStream, Streaming}; -use uuid::Uuid; - -use crate::api::{ChannelMessage, ChatMessage}; - -#[server(name=TestServerFn, output = Streaming)] -pub async fn stream_chat(id: Uuid, history: Vec) -> Result { - use tokio::sync::mpsc; - use tokio_stream::{wrappers::ReceiverStream, StreamExt}; - - use crate::server::backends::{llama_chat, ChatService}; - - let (tx, rx) = mpsc::channel::(8); - - let service = llama_chat::LlamaService::new(id); - - let _handle = tokio::spawn(service.chat_request(history, tx)); - - let broadcast_receive_stream = ReceiverStream::new(rx) - .map(|msg| { - tracing::trace!(?msg); - serde_json::to_string(&msg).unwrap() - }) - .map(|string| { - let bytes = Bytes::from(string.as_bytes().to_vec()); - Ok(bytes) - }); - let text_stream = ByteStream::new(broadcast_receive_stream); - - Ok(text_stream) -} diff --git a/llama_forge_rs/src/api/mod.rs b/llama_forge_rs/src/api/mod.rs deleted file mode 100644 index 9ccf76c..0000000 --- a/llama_forge_rs/src/api/mod.rs +++ /dev/null @@ -1,72 +0,0 @@ -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -mod backend_settings; -mod chat; -// pub mod backend_process; -// pub mod backend_settings; -// pub mod chat; - -pub use backend_settings::*; -pub use chat::*; - -#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq)] -pub enum ChatRole { - System, - User, - Assistant, -} - -impl From for String { - fn from(val: ChatRole) -> Self { - match val { - ChatRole::System => "system", - ChatRole::User => "user", - ChatRole::Assistant => "assistand", - } - .to_string() - } -} - -#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq)] -pub struct ChatMessage { - pub id: Uuid, - pub role: ChatRole, - pub content: String, - _meta: String, -} - -impl ChatMessage { - pub fn new(role: ChatRole, content: String) -> Self { - Self { - id: Uuid::now_v7(), - role, - content, - _meta: "".to_string(), - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq)] -pub enum ChannelMessage { - Token(String), - Stop, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Chat { - // sampler_settings: SamplerSettings, - pub id: Uuid, - pub history: Vec, - _meta: String, -} - -impl Chat { - pub fn new(id: Uuid, history: Vec, meta: String) -> Self { - Self { - id, - history, - _meta: meta, - } - } -} diff --git a/llama_forge_rs/src/app/components/mod.rs b/llama_forge_rs/src/app/components/mod.rs deleted file mode 100644 index db00881..0000000 --- a/llama_forge_rs/src/app/components/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -use leptos::*; - -pub mod svgs; - -#[component] -pub fn FormControl(label: &'static str, children: Children) -> impl IntoView { - view! { -
- -
- } -} - -#[component] -pub fn Card(children: Children) -> impl IntoView { - view! { -
-
{children()}
-
- } -} diff --git a/llama_forge_rs/src/app/components/svgs.rs b/llama_forge_rs/src/app/components/svgs.rs deleted file mode 100644 index 2595bdb..0000000 --- a/llama_forge_rs/src/app/components/svgs.rs +++ /dev/null @@ -1,229 +0,0 @@ -use leptos::*; - -#[component] -pub fn SaveSvg() -> impl IntoView { - view! { - - - - - - - - - } -} - -#[component] -pub fn TrashSvg() -> impl IntoView { - view! { - - - - - } -} - -#[component] -pub fn SendSvg() -> impl IntoView { - view! { - - - - - - - - - - - } -} - -#[component] -pub fn RefreshSvg() -> impl IntoView { - view! { - - - - - - - } -} - -#[component] -pub fn HamburgerSvg() -> impl IntoView { - view! { - - - - } -} - -#[component] -pub fn CheckmarkSvg() -> impl IntoView { - view! { - - - - - } -} - -#[component] -pub fn PencilSvg() -> impl IntoView { - view! { - - - - } -} diff --git a/llama_forge_rs/src/app/error_template.rs b/llama_forge_rs/src/app/error_template.rs deleted file mode 100644 index 15aa414..0000000 --- a/llama_forge_rs/src/app/error_template.rs +++ /dev/null @@ -1,80 +0,0 @@ -use http::status::StatusCode; -use leptos::*; -#[cfg(feature = "ssr")] -use leptos_axum::ResponseOptions; -use thiserror::Error; - -use crate::app::{components::Card, pages::Main}; - -#[derive(Clone, Debug, Error)] -pub enum AppError { - #[error("Not Found")] - NotFound, -} -impl AppError { - pub fn status_code(&self) -> StatusCode { - match self { - AppError::NotFound => StatusCode::NOT_FOUND, - } - } -} - -// A basic function to display errors served by the error boundaries. -// Feel free to do more complicated things here than just displaying the error. -#[component] -pub fn ErrorTemplate( - #[prop(optional)] outside_errors: Option, - #[prop(optional)] errors: Option>, -) -> impl IntoView { - let errors = match outside_errors { - Some(e) => create_rw_signal(e), - None => match errors { - Some(e) => e, - None => panic!("No Errors found and we expected errors!"), - }, - }; - // Get Errors from Signal - let errors = errors.get_untracked(); - - // Downcast lets us take a type that implements `std::error::Error` - let errors: Vec = errors - .into_iter() - .filter_map(|(_k, v)| v.downcast_ref::().cloned()) - .collect(); - tracing::error!("Errors: {errors:#?}"); - - // Only the response code for the first error is actually sent from the server - // this may be customized by the specific application - #[cfg(feature = "ssr")] - { - let response = use_context::(); - if let Some(response) = response { - response.set_status(errors[0].status_code()); - } - } - - view! { -
- -

{if errors.len() > 1 { "Errors" } else { "Error" }}

- {error_code.to_string()} -

"Error: " {error_string}

- } - } - /> - -
-
- } -} diff --git a/llama_forge_rs/src/app/mod.rs b/llama_forge_rs/src/app/mod.rs deleted file mode 100644 index 0e3c31e..0000000 --- a/llama_forge_rs/src/app/mod.rs +++ /dev/null @@ -1,78 +0,0 @@ -use std::sync::Arc; - -use leptos::*; -use leptos_meta::*; -use leptos_router::*; - -pub(crate) mod components; -pub(crate) mod error_template; -pub(crate) mod pages; - -use self::{ - error_template::{AppError, ErrorTemplate}, - pages::*, -}; - -#[derive(Clone, Debug, PartialEq)] -pub struct RefreshGen(pub i64); - -#[component] -pub fn TestPage() -> impl IntoView { - view! { -
-
-
- // -
- - -
-
-
- } -} - -#[island] -pub fn App() -> impl IntoView { - let span = tracing::info_span!("app"); - // Provides context that manages stylesheets, titles, meta tags, etc. - provide_meta_context(); - - let refresh_gen = create_rw_signal(RefreshGen(0)); - provide_context(refresh_gen); - provide_context(Arc::new(span)); - - view! { - - - // sets the document title - - - <Router fallback=|| { - let mut outside_errors = Errors::default(); - outside_errors.insert_with_default_key(AppError::NotFound); - view! { <ErrorTemplate outside_errors /> }.into_view() - }> - <main> - <Routes> - <Route path="" view=MainPage> - <Route path="/chat" view=ChatPage /> - <Route path="/test" view=TestPage /> - // TODO make settings page for proxy-man - // <SettingsRoutes/> - </Route> - </Routes> - </main> - </Router> - } -} diff --git a/llama_forge_rs/src/app/pages/chat.rs b/llama_forge_rs/src/app/pages/chat.rs deleted file mode 100644 index b6b44dc..0000000 --- a/llama_forge_rs/src/app/pages/chat.rs +++ /dev/null @@ -1,350 +0,0 @@ -use std::{ - hash::{DefaultHasher, Hash, Hasher}, - ops::Deref, -}; - -use bytes::Bytes; -use leptos::*; -use uuid::Uuid; - -use crate::{ - api::{stream_chat, ChannelMessage, ChatMessage, ChatRole}, - app::components::{svgs::*, Card}, -}; - -#[island] -fn ChatMessageBubble( - msg: RwSignal<ChatMessage>, - history: RwSignal<Vec<RwSignal<ChatMessage>>>, -) -> impl IntoView { - let (edit_mode, set_edit_mode) = create_signal(false); - let _ = create_effect(move |_| tracing::debug!(edit_mode=%edit_mode())); - let role = match msg.get().role { - ChatRole::System => "System", - ChatRole::User => "User", - ChatRole::Assistant => "Assistant", - }; - - let chat_class = match msg.get().role { - ChatRole::System => "chat-start", - ChatRole::Assistant => "chat-start", - ChatRole::User => "chat-end", - }; - - let textarea_ref = NodeRef::<html::P>::new(); - - use pulldown_cmark; - let editable_p = move || { - // TODO Convert back to raw str when editable - let mode = if edit_mode.get() { "true" } else { "false" }; - let msg_str = move || msg.get().content.clone(); - let md_str = move || { - let owned_str = msg_str(); - let parser = pulldown_cmark::Parser::new(&owned_str); - let mut md_output = String::new(); - pulldown_cmark::html::push_html(&mut md_output, parser); - - md_output - }; - - let inner_p = move || { - if edit_mode.get() { - view! { <p inner_html=move || { msg_str() }></p> } - } else { - view! { <p class="prose" inner_html=move || { md_str() }></p> } - } - }; - - view! { - <p node_ref=textarea_ref contenteditable=move || { mode }> - - {inner_p} - </p> - } - }; - - let enter_edit_mode = move |_ev| { - set_edit_mode.set(true); - - textarea_ref().expect("").deref().clone().focus().unwrap(); - }; - - let exit_edit_mode = move |_ev| { - let inner_text = textarea_ref().expect("").deref().clone().inner_text(); - - msg.update(move |msg| msg.content = inner_text); - - set_edit_mode.set(false); - }; - - let trash_message = move || { - let id = msg.get().id; - history.update(move |his| { - his.retain(|elem| elem.get().id != id); - }); - }; - - let edit_button = move || { - if edit_mode() { - view! { - <button - on:click=exit_edit_mode - class="absolute top-2 right-2 btn btn-xs btn-ghost btn-circle" - > - <CheckmarkSvg /> - </button> - } - .into_view() - } else { - view! { - <button - on:click=enter_edit_mode - class="absolute top-2 right-2 btn btn-xs btn-ghost btn-circle" - > - <PencilSvg /> - </button> - } - .into_view() - } - }; - - let trash_button = move || { - if msg().role != ChatRole::System && !edit_mode() { - view! { - <button - on:click=move |_e| trash_message() - class="absolute right-2 bottom-2 btn btn-xs btn-ghost btn-circle" - > - <TrashSvg /> - </button> - } - .into_view() - } else { - "".into_view() - } - }; - - view! { - <div class=format!("chat {chat_class}")> - <div class="chat-header"> - <div class="flex flex-nowrap"> - <p class="grow">{role}</p> - </div> - </div> - <div class="chat-bubble"> - {edit_button} {trash_button} <div class="flex flex-nowrap w-full h-full"> - <div>{editable_p}</div> - // as the edit/trash buttons are absolutely positions this makes sure they dont overlap with text - // TODO move them here ? - <div class="w-6 h-12 shrink-0">""</div> - </div> - </div> - </div> - } -} - -#[component] -pub fn ChatHistory( - history: RwSignal<Vec<RwSignal<ChatMessage>>>, - response: RwSignal<String>, - receiving_response: RwSignal<bool>, -) -> impl IntoView { - use pulldown_cmark; - let md_str = move || { - let owned_str = response(); - let parser = pulldown_cmark::Parser::new(&owned_str); - let mut md_output = String::new(); - pulldown_cmark::html::push_html(&mut md_output, parser); - - md_output - }; - - let streaming_response_elem = move || { - if receiving_response() { - view! { - <div class="chat chat-start"> - <div class="chat-header">"Assistant"</div> - <div class="chat-bubble"> - <span class="prose" inner_html=move || { md_str() }></span> - <span class="loading loading-ball loading-xs"></span> - </div> - </div> - } - .into_view() - } else { - view! { <></> }.into_view() - } - }; - - view! { - <div class="flex flex-col flex-nowrap p-2"> - <For - each=move || history().into_iter() - key=|entry| { - let mut s = DefaultHasher::new(); - entry.get().hash(&mut s); - s.finish() - } - - children=move |msg| { - view! { <ChatMessageBubble msg history /> } - } - /> - - {streaming_response_elem} - </div> - } -} - -#[component] -fn ChatPrompt( - receiving_response: RwSignal<bool>, - history: RwSignal<Vec<RwSignal<ChatMessage>>>, - response: RwSignal<String>, -) -> impl IntoView { - let stream_completion = create_action(move |id: &Uuid| { - use futures_util::StreamExt; - - let id = *id; - let history_inner = history(); - - let handle_stop = move || { - history.update(move |vec| { - let msg = ChatMessage::new(ChatRole::Assistant, response.get_untracked()); - vec.push(create_rw_signal(msg)); - }); - response.set("".to_string()); - receiving_response.set(false); - }; - let handle_token = move |string: String| { - response.update(move |resp| { - resp.push_str(string.as_str()); - }); - }; - - let handle_chunk = move |chunk: Bytes| { - tracing::debug!(?chunk); - let deserializer = serde_json::Deserializer::from_slice(&chunk); - for msg in deserializer.into_iter::<ChannelMessage>() { - tracing::debug!(?msg); - match msg { - Ok(ChannelMessage::Stop) => handle_stop(), - Ok(ChannelMessage::Token(string)) => handle_token(string), - Err(err) => { - tracing::error!(?err); - panic!("Unknown stream errror") - } - }; - } - }; - - async move { - let his_inner = history_inner - .into_iter() - .map(|sig| sig.get()) - .collect::<Vec<_>>(); - let res_stream = stream_chat(id, his_inner).await; - if let Ok(stream) = res_stream { - let mut stream = stream.into_inner(); - - tracing::debug!("Stream start"); - while let Some(Ok(chunk)) = stream.next().await { - handle_chunk(chunk); - } - tracing::debug!("Stream end"); - } - } - }); - - let prompt_input_element: NodeRef<html::Input> = create_node_ref(); - - let submit_chat = move || { - receiving_response.set(true); - - let input = prompt_input_element().expect("<input> should be mounted"); - let value = input.value(); - input.set_value(""); - if !value.is_empty() { - let new_chat_entry = ChatMessage::new(ChatRole::User, value.clone()); - let new_entry_sig = create_rw_signal(new_chat_entry); - history.update(move |hist| hist.push(new_entry_sig)); - } - stream_completion.dispatch(Uuid::now_v7()); - }; - let submit_on_enter = move |ev: web_sys::KeyboardEvent| { - const ENTER_KEY: u32 = 13; - let key_code = ev.key_code(); - let shift_key = ev.shift_key(); - if key_code == ENTER_KEY && !shift_key { - submit_chat() - } - }; - - let refresh_last_message = move |ev: web_sys::MouseEvent| { - ev.prevent_default(); - receiving_response.set(true); - - history.update(move |hist| { - hist.pop(); - }); - - stream_completion.dispatch(Uuid::now_v7()); - }; - - view! { - <div class="flex-nowrap justify-around p-2 card-actions"> - <input - class="w-full input grow input-bordered input-primary" - type="text" - placeholder="Type here" - node_ref=prompt_input_element - on:keyup=submit_on_enter - /> - - <button - type="submit" - class="btn btn-primary" - class:btn-disabled=receiving_response - on:click=move |ev| { - ev.prevent_default(); - submit_chat() - } - > - - <SendSvg /> - </button> - <button - on:click=refresh_last_message - class="btn btn-ghost" - class:btn-disabled=move || { - receiving_response() - || history().last().unwrap().get().role != ChatRole::Assistant - } - > - - <RefreshSvg /> - </button> - </div> - } -} - -#[component] -pub fn ChatPage() -> impl IntoView { - let initial_history = vec![create_rw_signal(ChatMessage::new( - ChatRole::System, - "You are an helpful AI-based assistant.".to_string(), - ))]; - - let history = create_rw_signal(initial_history); - let response = create_rw_signal("".to_string()); - let receiving_response = create_rw_signal(false); - - view! { - <Card> - <div class="flex flex-col justify-between h-full"> - <ChatHistory receiving_response history response /> - <ChatPrompt receiving_response history response /> - </div> - </Card> - } -} diff --git a/llama_forge_rs/src/app/pages/main.rs b/llama_forge_rs/src/app/pages/main.rs deleted file mode 100644 index 2b35b38..0000000 --- a/llama_forge_rs/src/app/pages/main.rs +++ /dev/null @@ -1,74 +0,0 @@ -use leptos::*; -// use leptos_meta::*; -use leptos_router::*; - -use crate::app::components::svgs::HamburgerSvg; - -#[component] -fn Navbar() -> impl IntoView { - view! { - <div class="navbar bg-base-100"> - <div class="navbar-start"> - <div class="dropdown"> - <div tabindex="0" role="button" class="btn btn-ghost btn-circle"> - <HamburgerSvg /> - </div> - <ul - tabindex="0" - class="p-2 mt-3 w-52 border-2 shadow menu menu-sm dropdown-content z-[1] bg-base-100 rounded-box border-base-200" - > - <li> - <a href="/chat">"Chat"</a> - </li> - <li> - <a href="/settings/backend">"Settings"</a> - </li> - <li> - <a href="/test">"Test"</a> - </li> - </ul> - </div> - </div> - <div class="navbar-center"> - <a class="text-xl btn btn-ghost">"LLama Forge RS🦙🔨🦀"</a> - </div> - - <div class="navbar-end"> - <button class="btn btn-ghost btn-circle"> - <img class="w-12 h-12" src="/logo.svg" /> - </button> - </div> - </div> - } -} - -#[component] -fn Footer() -> impl IntoView { - view! { - <footer class="items-center p-2 footer bg-neutral text-neutral-content"> - <nav class="grid-flow-col gap-2 md:justify-self-end md:place-self-center"> - <a href="/about">"About"</a> - </nav> - </footer> - } -} - -#[component] -pub fn Main(children: Children) -> impl IntoView { - view! { - <div class="flex flex-col w-screen h-screen"> - <Navbar /> - <div class="grid place-items-center p-4 grow">{children()}</div> - // <Footer/> - </div> - } -} - -#[component] -pub fn MainPage() -> impl IntoView { - view! { - <Main> - <Outlet /> - </Main> - } -} diff --git a/llama_forge_rs/src/app/pages/mod.rs b/llama_forge_rs/src/app/pages/mod.rs deleted file mode 100644 index c533abe..0000000 --- a/llama_forge_rs/src/app/pages/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod chat; -mod main; -pub mod settings; - -pub use chat::*; -pub use main::*; -pub use settings::*; diff --git a/llama_forge_rs/src/app/pages/settings/backend.rs b/llama_forge_rs/src/app/pages/settings/backend.rs deleted file mode 100644 index c7aac1a..0000000 --- a/llama_forge_rs/src/app/pages/settings/backend.rs +++ /dev/null @@ -1,139 +0,0 @@ -use leptos::*; -use leptos_router::*; -use serde::{Deserialize, Serialize}; - -use crate::app::components::{svgs::*, FormControl}; - -#[derive(PartialEq, Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] -pub struct BackendSettings { - version: i64, // auto-increments, the current settings are the highest version - model_dir: String, - default_model: String, - created_at: chrono::NaiveDateTime, -} - -/// Returns the initial default directory for model files. ($PWD/models) -#[server] -async fn default_model_dir() -> Result<String, ServerFnError> { - let pwd = std::env::current_dir()?.to_string_lossy().to_string(); - let default_dir = format!("{}/models", pwd); - Ok(default_dir) -} - -/// Fetches the latest backend settings from the database. -#[server] -async fn load_backend_settings() -> Result<BackendSettings, ServerFnError> { - use crate::server::pool; - - tracing::debug!(msg = "Load settings"); - - let pool = pool()?; - - let settings = sqlx::query_as!( - BackendSettings, - "SELECT version, model_dir, default_model, created_at FROM settings ORDER BY version DESC \ - LIMIT 1" - ) - .fetch_optional(&pool) - .await?; - - match settings { - Some(settings) => Ok(settings), - None => Err(ServerFnError::ServerError("Settings not found".to_string())), - } -} - -/// Updates the backend settings with new model directory and default model. -#[server(UpdateSettings)] -async fn update_settings(model_dir: String, default_model: String) -> Result<(), ServerFnError> { - use crate::server::pool; - - tracing::debug!(msg = "Updating settings", ?model_dir, ?default_model); - - let pool = pool()?; - - let result = { - sqlx_macros::expand_query!( - source = "INSERT INTO settings (model_dir, default_model) VALUES (?, ?)", - args = [model_dir, default_model,] - ) - } - .execute(&pool) - .await?; - - if result.rows_affected() == 0 { - return Err(ServerFnError::ServerError( - "Failed to create new settings".to_string(), - )); - } - - Ok(()) -} - -/// A form component for updating the backend settings.<|im_end|> -#[component] -pub fn SettingsForm() -> impl IntoView { - let update_settings_action = create_server_action::<UpdateSettings>(); - let backend_settings_res = create_local_resource( - || (), - |_| async move { - let settings = load_backend_settings().await; - match settings { - Ok(settings) => settings, - Err(_) => { - let default_dir = default_model_dir().await.unwrap_or("".to_string()); - BackendSettings { - version: 1, - model_dir: default_dir, - default_model: "meta-llama-3-8b-instruct-imat-IQ3_XXS.gguf".to_string(), - created_at: chrono::Utc::now().naive_utc(), - } - } - } - }, - ); - - let model_dir = move || { - if let Some(setting) = backend_settings_res.get() { - setting.model_dir.to_string() - } else { - "loading".to_string() - } - }; - - let default_model = move || { - if let Some(setting) = backend_settings_res.get() { - setting.default_model.to_string() - } else { - "loading".to_string() - } - }; - - view! { - <ActionForm action=update_settings_action> - <FormControl label="Default Model"> - <input - type="text" - name="default_model" - placeholder="meta-llama-3-8b-instruct-imat-IQ3_XXS.gguf" - value=default_model - class="grow max-w-[75%] input input-xs input-bordered" - /> - </FormControl> - <FormControl label="model_dir"> - <input - type="text" - name="model_dir" - placeholder="/opt/ai/models" - value=model_dir - class="grow max-w-[75%] input input-xs input-bordered" - /> - </FormControl> - <div class="w-full form-control"> - <button class="btn btn-primary" type="submit"> - <SaveSvg /> - </button> - </div> - </ActionForm> - } -} diff --git a/llama_forge_rs/src/app/pages/settings/mod.rs b/llama_forge_rs/src/app/pages/settings/mod.rs deleted file mode 100644 index 7d5bc47..0000000 --- a/llama_forge_rs/src/app/pages/settings/mod.rs +++ /dev/null @@ -1,95 +0,0 @@ -use leptos::*; -use leptos_router::*; - -use crate::app::{components::svgs::*, RefreshGen}; - -mod backend; - -use backend::SettingsForm; - -#[component] -fn TabButton(path: &'static str, label: &'static str) -> impl IntoView { - let current_path = use_location().pathname; - view! { - <a role="tab" class="tab" class:tab-active=move || current_path.get() == path href=path> - {label} - </a> - } -} - -#[component] -fn TabCard(children: Children) -> impl IntoView { - view! { - <div class="rounded-none !rounded-b-lg !rounded-tr-lg overflow-y-scroll flex-col-reverse shadow-xl max-h-[85dvh] size-full bg-base-300 card"> - <div class="card-body">{children()}</div> - </div> - } -} - -#[component] -fn BackendSettingsPage() -> impl IntoView { - view! { - <div class="flex justify-around"> - <div class="flex flex-col p-4 w-1/3"> - <p>"WIP"</p> - // <ProcessForm /> - </div> - <div class="flex flex-col p-4 w-2/3"> - <SettingsForm /> - </div> - </div> - } -} - -#[component] -fn ModelSettingsPage() -> impl IntoView { - view! { - <div> - <p>"modellist here"</p> - <p>"TODO"</p> - </div> - } -} - -#[component] -fn SettingsPage() -> impl IntoView { - let gen = use_context::<RwSignal<RefreshGen>>().expect("to have found the setter provided"); - - let increment_gen = move |_ev| { - gen.update(|gen| *gen = RefreshGen(gen.0 + 1)); - }; - - view! { - <div class="flex flex-col size-full"> - <div class="flex justify-between"> - <div - role="tablist" - class="shadow-xl border-b-2 border-base-200 bg-base-300 rounded-none !rounded-t-lg shrink tabs tabs-boxed" - > - <TabButton path="/settings/backend" label="Backend" /> - <TabButton path="/settings/model" label="Model" /> - </div> - <div class="shadow-xl border-b-2 border-base-200 bg-base-300 rounded-none !rounded-t-lg shrink tabs tabs-boxed"> - <button class="btn btn-sm" on:click=increment_gen> - <RefreshSvg /> - </button> - </div> - </div> - <div class="grow"> - <TabCard> - <Outlet /> - </TabCard> - </div> - </div> - } -} - -#[component(transparent)] -pub fn SettingsRoutes() -> impl IntoView { - view! { - <Route path="/settings" view=SettingsPage> - <Route path="/backend" view=BackendSettingsPage /> - <Route path="/model" view=ModelSettingsPage /> - </Route> - } -} diff --git a/llama_forge_rs/src/lib.rs b/llama_forge_rs/src/lib.rs deleted file mode 100644 index 1db6b0d..0000000 --- a/llama_forge_rs/src/lib.rs +++ /dev/null @@ -1,45 +0,0 @@ -#![feature(ascii_char)] -#![feature(ascii_char_variants)] -// #![feature(async_closure)] -#![feature(exit_status_error)] -#![feature(rustc_private)] -#![feature(fn_traits)] -#![recursion_limit = "1024"] -// TODO Remove pre 0.1 release, its just very annoying when prototyping and moving alot of stuff -#![allow(dead_code)] -#![allow(unused_imports)] -pub mod api; -pub mod app; -#[cfg(feature = "ssr")] -pub mod server; - -#[wasm_bindgen::prelude::wasm_bindgen] -pub fn hydrate() { - use cfg_if::cfg_if; - use tracing::Level; - use tracing_wasm::WASMLayerConfigBuilder; - - use crate::app::*; - - console_error_panic_hook::set_once(); - cfg_if! { - if #[cfg(debug_assertions)] { - let conf = WASMLayerConfigBuilder::new() - .set_max_level(Level::DEBUG) - .build(); - } else { - let conf = WASMLayerConfigBuilder::new() - .set_max_level(Level::INFO) - .build(); - } - } - tracing_wasm::set_as_global_default_with_config(conf); - - tracing::debug!("Hello, world!"); - - let body = leptos::leptos_dom::document() - .body() - .expect("body element to exist"); - - leptos::mount_to(body, App) -} diff --git a/llama_forge_rs/src/main.rs b/llama_forge_rs/src/main.rs deleted file mode 100644 index 69bd62f..0000000 --- a/llama_forge_rs/src/main.rs +++ /dev/null @@ -1,124 +0,0 @@ -#![feature(rustc_private)] -#![feature(fn_traits)] - -#[cfg(feature = "ssr")] -fn setup_tracing() { - use tracing::level_filters::LevelFilter; - use tracing_subscriber::EnvFilter; - - cfg_if::cfg_if! { - if #[cfg(debug_assertions)] { - let env_filter = EnvFilter::builder() - .with_default_directive(LevelFilter::TRACE.into()) - // .parse_lossy("debug,llama_forge_rs=debug"); - .parse_lossy("info,llama_forge_rs=debug"); - } else { - let env_filter = EnvFilter::builder() - .with_default_directive(LevelFilter::INFO.into()) - .parse_lossy("warn,llama_forge_rs=info"); - } - } - - tracing_subscriber::fmt() - .pretty() - .with_env_filter(env_filter) - .init(); -} - -#[cfg(feature = "ssr")] -fn wry_main() -> wry::Result<()> { - use tao::{ - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoopBuilder}, - platform::unix::EventLoopBuilderExtUnix, - window::WindowBuilder, - }; - use wry::WebViewBuilder; - - tracing::debug!("Hello from wry main"); - - let event_loop = EventLoopBuilder::new().with_any_thread(true).build(); - let window = WindowBuilder::new() - .with_min_inner_size(tao::dpi::LogicalSize::new(800, 600)) - .with_title("Llama Forge RS") - .build(&event_loop) - .unwrap(); - - let builder = { - use tao::platform::unix::WindowExtUnix; - use wry::WebViewBuilderExtUnix; - let vbox = window.default_vbox().unwrap(); - WebViewBuilder::new_gtk(vbox) - }; - - let _webview = builder.with_url("http://localhost:3000/chat").build()?; - - event_loop.run(move |event, _, control_flow| { - *control_flow = ControlFlow::Wait; - - if let Event::WindowEvent { - event: WindowEvent::CloseRequested, - .. - } = event - { - *control_flow = ControlFlow::Exit - } - }); -} - -#[cfg(feature = "ssr")] -#[tokio::main] -async fn main() -> anyhow::Result<()> { - use std::future::IntoFuture; - - use leptos::*; - use llama_forge_rs::server::app; - use tracing; - - setup_tracing(); - - tracing::debug!("Hello from async_main"); - - let conf = get_configuration(None).await.unwrap(); - // TODO Add figment + app Config struct and convert into leptos /tokio conf - let leptos_options = conf.leptos_options; - let addr = leptos_options.site_addr; - - // TODO Pass through endpoint ip address of conf to llama.cpp & make llama.cpp port configurable - tracing::info!( - "[MOP] listening on http://{} :{} (app) :{} (llama.cpp)", - &addr.ip(), - &addr.port(), - 8080 - ); - let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); - - let serve = axum::serve(listener, app(leptos_options).await.into_make_service()).into_future(); - - let proxy_man_fut = async move { - use llama_proxy_man::{config::AppConfig, start_server}; - let config = AppConfig::default_figment(); - start_server(config).await?; - - Ok::<(), anyhow::Error>(()) - }; - - let (serve_res, backend_res, wry_res) = tokio::try_join!( - tokio::spawn(serve), - tokio::task::spawn_blocking(wry_main), - tokio::spawn(proxy_man_fut), - )?; - - serve_res?; - backend_res?; - wry_res?; - - Ok(()) -} - -#[cfg(not(feature = "ssr"))] -pub fn main() { - // no client-side main function - // unless we want this to work with e.g., Trunk for a purely client-side app - // see lib.rs for hydration function instead -} diff --git a/llama_forge_rs/src/server/backends/llama_chat.rs b/llama_forge_rs/src/server/backends/llama_chat.rs deleted file mode 100644 index 7a859f3..0000000 --- a/llama_forge_rs/src/server/backends/llama_chat.rs +++ /dev/null @@ -1,151 +0,0 @@ -use async_trait::async_trait; -use futures::StreamExt; -use reqwest::Client; -use reqwest_eventsource::{Event, EventSource}; -use serde::{Deserialize, Serialize}; -use tokio::sync::mpsc; -use uuid::Uuid; - -use super::ChatService; -use crate::api::{ChannelMessage, Chat, ChatMessage}; - -#[derive(Serialize, Debug)] -struct LlamaChatCompletionRequest { - stream: bool, - model: String, - messages: Vec<LlamaChatMessage>, -} - -impl From<Chat> for LlamaChatCompletionRequest { - fn from(value: Chat) -> Self { - Self { - stream: true, - model: "default".to_string(), - messages: value.history.into_iter().map(|e| e.into()).collect(), - } - } -} - -#[derive(Serialize, Debug)] -struct LlamaChatMessage { - role: String, - content: String, -} - -impl From<ChatMessage> for LlamaChatMessage { - fn from(chat_message: ChatMessage) -> Self { - Self { - role: chat_message.role.into(), - content: chat_message.content, - } - } -} - -#[derive(Deserialize, Debug)] -struct LlamaChatDelta { - content: Option<String>, -} - -#[derive(Deserialize, Debug)] -struct LlamaChatChoice { - finish_reason: Option<String>, - index: i64, - delta: Option<LlamaChatDelta>, -} - -#[derive(Deserialize, Debug)] -struct LlamaChatResponse { - id: String, - created: i64, // TODO Make DateTime (from unix) - model: String, - choices: Vec<LlamaChatChoice>, - object: String, -} - -pub struct LlamaService { - id: Uuid, -} - -impl LlamaService { - pub fn new(id: Uuid) -> Self { - Self { - id, - } - } -} - -#[tracing::instrument(level = "debug")] -async fn do_chat_request(chat: Chat, sender: mpsc::Sender<ChannelMessage>) -> anyhow::Result<()> { - let client = Client::new(); - let request_body: LlamaChatCompletionRequest = chat.into(); - - let request_builder = client - // # .post("http://localhost:8080/v1/chat/completions") - .post("http://100.64.0.3:18080/v1/chat/completions") - .header("Content-Type", "application/json") - .json(&request_body); - - let mut es = EventSource::new(request_builder)?; - - while let Some(event) = es.next().await { - match event { - Ok(Event::Open) => tracing::debug!("Connection Open!"), - Ok(Event::Message(event)) => match event.event.as_str() { - "message" => { - let data = event.data; - tracing::debug!(?data); - if data == "[DONE]" { - sender - .send(ChannelMessage::Stop) - .await - .expect("channel fail"); - - es.close(); - break; - } - - let response: LlamaChatResponse = serde_json::from_str(&data).expect("no json"); - - for choice in response.choices.into_iter() { - if let Some(delta) = choice.delta { - let content = delta.content; - if let Some(content_str) = content { - let mut string = content_str.clone(); - tracing::debug!("STRING: {}", string); - if string == "\n" { - string = "<br>".to_string() - } - let msg = ChannelMessage::Token(string); - tracing::debug!(?msg); - sender.send(msg.clone()).await.expect("sender fail"); - } - } - } - } - _ => { - todo! {} - } - }, - Err(err) => { - tracing::debug!("Error: {}", err); - sender - .send(ChannelMessage::Stop) - .await - .expect("channel fail"); - // sender.send("STOP".to_string()).await.expect("sender fail"); - es.close(); - } - } - } - - Ok(()) -} - -#[async_trait] -impl ChatService for LlamaService { - #[tracing::instrument(level = "debug", skip(self))] - async fn chat_request(self, history: Vec<ChatMessage>, rx: mpsc::Sender<ChannelMessage>) { - let chat = Chat::new(self.id, history, "".to_string()); - do_chat_request(chat, rx).await.expect("chat reqest error"); - } -} diff --git a/llama_forge_rs/src/server/backends/llama_completion.rs b/llama_forge_rs/src/server/backends/llama_completion.rs deleted file mode 100644 index 473bd1e..0000000 --- a/llama_forge_rs/src/server/backends/llama_completion.rs +++ /dev/null @@ -1,145 +0,0 @@ -use std::{io, io::Write}; - -use futures::StreamExt; -use reqwest::Client; -use reqwest_eventsource::{Event, EventSource}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Serialize, Deserialize)] -struct CompletionRequest { - stream: bool, - n_predict: i32, - temperature: f32, - stop: Vec<String>, - repeat_last_n: i32, - repeat_penalty: f32, - top_k: i32, - top_p: f32, - min_p: f32, - tfs_z: f32, - typical_p: f32, - presence_penalty: f32, - frequency_penalty: f32, - mirostat: f32, - mirostat_tau: f32, - mirostat_eta: f32, - grammar: String, - n_probs: i32, - image_data: Vec<String>, - ignore_eos: bool, - cache_prompt: bool, - api_key: String, - slot_id: i32, - prompt: String, -} - -impl Default for CompletionRequest { - fn default() -> Self { - CompletionRequest { - stream: true, - n_predict: 2048, - temperature: 0.7, - stop: vec![ - "<|im_end|>".to_string(), - "<dummy00001>".to_string(), - "</s>".to_string(), - "Llama:".to_string(), - "User:".to_string(), - ], - repeat_last_n: 64, - repeat_penalty: 1.1, - top_k: 40, - top_p: 0.95, - min_p: 0.05, - tfs_z: 1.0, - typical_p: 1.0, - presence_penalty: 0.0, - frequency_penalty: 0.0, - mirostat: 0.0, - mirostat_tau: 5.0, - mirostat_eta: 0.1, - grammar: "".to_string(), - n_probs: 0, - ignore_eos: false, - image_data: vec![], - cache_prompt: true, - api_key: "".to_string(), - slot_id: -1, - prompt: concat!( - "<|im_start|>system\n", - "You are a helpful assistant.", - "<|im_end|>\n", - "<|im_start|>user\n", - "What is quantum entanglement ?", - "<|im_end|>\n", - "<|im_start|>assistant\n" - ) - .to_string(), - } - } -} - -#[derive(Debug, Serialize, Deserialize)] -struct CompletionResponse { - id_slot: i64, - content: String, - stop: bool, - multimodal: Option<bool>, - // Only in stop response at stream end - // TODO Add all fields - model: Option<String>, // Path to model - tokens_predicted: Option<i64>, - tokens_evaluated: Option<i64>, - tokens_cached: Option<i64>, - timings: Option<CompletionTimings>, -} - -#[derive(Debug, Serialize, Deserialize)] -struct CompletionTimings { - prompt_n: i64, - prompt_ms: f64, - prompt_per_token_ms: f64, - prompt_per_second: f64, - predicted_n: i64, - predicted_ms: f64, - predicted_per_token_ms: f64, - predicted_per_second: f64, -} - -pub async fn do_completion_request() -> Result<(), Box<dyn std::error::Error>> { - let client = Client::new(); - - let request_body = CompletionRequest::default(); - - let request_builder = client - .post("http://100.64.0.3:18080/completion") - .header("Accept", "text/event-stream") - .header("Content-Type", "application/json") - .header("User-Agent", "llama_forge_rs") - .json(&request_body); - - let mut es = EventSource::new(request_builder)?; - - while let Some(event) = es.next().await { - match event { - Ok(Event::Open) => tracing::debug!("Connection Open!"), - Ok(Event::Message(event)) => match event.event.as_str() { - "message" => { - let data = event.data; - let response: CompletionResponse = serde_json::from_str(&data).unwrap(); - print!("{}", response.content); - io::stdout().flush().unwrap(); - } - _ => { - todo! {} - } - }, - Err(err) => { - tracing::debug!("Error: {}", err); - es.close(); - } - } - } - - Ok(()) -} diff --git a/llama_forge_rs/src/server/backends/mod.rs b/llama_forge_rs/src/server/backends/mod.rs deleted file mode 100644 index 1702465..0000000 --- a/llama_forge_rs/src/server/backends/mod.rs +++ /dev/null @@ -1,226 +0,0 @@ -use async_trait::async_trait; -use serde::{Deserialize, Serialize}; -use tokio::sync::mpsc; - -use crate::api::{ChannelMessage, ChatMessage}; -pub mod llama_chat; -pub mod llama_completion; -pub mod runner; - -// struct SamplerSettings { -// temp: i64, -// top_k: i64, -// top_p: i64, -// // ... -// } - -#[async_trait] -pub trait ChatService: Sized { - async fn chat_request(self, history: Vec<ChatMessage>, rx: mpsc::Sender<ChannelMessage>); -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub enum BackendServiceStatus { - Started, - Stopped, -} - -use std::sync::Arc; - -use sysinfo::{Signal, System}; -use tokio::{sync::Mutex, task::JoinHandle}; - -use super::backends::runner::{Runner, RunnerArgs}; - -fn kill_child_procs(child_str: &'static str) { - let mut system = System::new(); - system.refresh_processes(); - - let current_pid = sysinfo::get_current_pid().unwrap(); - let current_process = system.process(current_pid).unwrap(); - - terminate_child_processes(child_str, &system, current_process); -} - -fn collect_ape_child_processes( - child_str: &'static str, - system: &System, - pid: sysinfo::Pid, -) -> Vec<sysinfo::Pid> { - let mut child_pids = Vec::new(); - - for process in system.processes().values() { - if let Some(parent_pid) = process.parent() { - if process.name().contains(child_str) && is_ancestor(system, parent_pid, pid) { - tracing::debug!(msg = "Found process to kill", ?process); - child_pids.push(process.pid()); - } - } - } - child_pids.sort(); - child_pids.reverse(); - - child_pids -} - -fn is_ancestor(system: &System, pid: sysinfo::Pid, ancestor_pid: sysinfo::Pid) -> bool { - if pid == ancestor_pid { - return true; - } - - if let Some(process) = system.process(pid) { - if let Some(parent_pid) = process.parent() { - return is_ancestor(system, parent_pid, ancestor_pid); - } - } - - false -} - -fn terminate_child_processes(child_str: &'static str, system: &System, process: &sysinfo::Process) { - let child_pids = collect_ape_child_processes(child_str, system, process.pid()); - - for child_pid in child_pids { - if let Some(child_process) = system.process(child_pid) { - // terminate_child_processes(system, child_process); - if let Some(res) = child_process.kill_with(Signal::Term) { - tracing::debug!( - "Sent SIGTERM to child process with PID: {} {}", - child_pid, - res - ); - } else { - tracing::debug!( - "Failed to send SIGTERM to child process with PID: {}", - child_pid - ); - } - } - } -} - -#[derive(Debug, Clone)] -pub struct BackendService { - status: Arc<Mutex<BackendServiceStatus>>, - task_handle: Arc<Mutex<Option<JoinHandle<anyhow::Result<()>>>>>, -} - -impl Default for BackendService { - fn default() -> Self { - Self::new() - } -} - -impl BackendService { - pub fn new() -> Self { - Self { - status: Arc::new(Mutex::new(BackendServiceStatus::Stopped)), - task_handle: Arc::new(Mutex::new(None)), - } - } - - #[tracing::instrument(level = "debug")] - pub async fn start(&self) -> anyhow::Result<()> { - let mut status = self.status.clone().lock_owned().await; - let mut task_handle = self.task_handle.clone().lock_owned().await; - - if task_handle.is_none() && *status == BackendServiceStatus::Stopped { - let args = RunnerArgs::new( - 4096, - 9999, - // "./models/phi-3-mini-4k-instruct-imat-Q8_0.gguf".to_string(), - "./models/meta-llama-3-8b-instruct-imat-IQ3_XXS.gguf".to_string(), - ); - let starter_fut = Runner::new_llama_server_bin(args).run(); - *task_handle = Some(tokio::task::spawn(starter_fut)); - *status = BackendServiceStatus::Started; - } - - Ok(()) - } - - #[tracing::instrument(level = "debug")] - pub async fn stop(&self) -> anyhow::Result<()> { - let mut status = self.status.clone().lock_owned().await; - let mut task_handle = self.task_handle.clone().lock_owned().await; - - if task_handle.is_some() && *status == BackendServiceStatus::Started { - tracing::warn!(msg = "Aborting Process", ?task_handle); - task_handle.as_mut().unwrap().abort(); - - // FIXME - // this is an ugly workaround as we are starting llamafile in a bash shell which somehow does not propagate systerm correctly - // we should probably keep track of our child process pids and selectively kill stuff - tracing::warn!(msg = "Killing Childs", ?task_handle); - kill_child_procs(".ape-"); - kill_child_procs("llama-server"); - - *task_handle = None; - *status = BackendServiceStatus::Stopped; - } - - Ok(()) - } - - pub async fn status(&self) -> BackendServiceStatus { - self.status.lock().await.clone() - } -} - -#[cfg(test)] -mod tests { - use std::time::Duration; - - use tokio::{sync::mpsc, time::sleep}; - use uuid::Uuid; - - use crate::{ - api::{ChannelMessage, ChatMessage, ChatRole}, - server::backends::{ - llama_chat::LlamaService, - BackendService, - BackendServiceStatus, - ChatService, - }, - }; - - #[tracing_test::traced_test] - #[tokio::test] - async fn it_can_be_started_then_queried_and_then_stopped() { - let service_handle = BackendService::new(); - - assert_eq!(service_handle.status().await, BackendServiceStatus::Stopped); - - service_handle.start().await; - assert_eq!(service_handle.status().await, BackendServiceStatus::Started); - - let history = vec![ - ChatMessage::new( - ChatRole::System, - "You are an helpful AI-based assistant.".to_string(), - ), - ChatMessage::new(ChatRole::User, "What is 2+2 ?".to_string()), - ]; - - let (tx, mut rx) = mpsc::channel::<ChannelMessage>(1); - let llama_service = LlamaService::new(Uuid::now_v7()); - sleep(Duration::from_secs(30)).await; - let chat_req = llama_service.chat_request(history, tx); - tokio::task::spawn(chat_req); - sleep(Duration::from_millis(1000)).await; - - let mut response = String::new(); - while let Some(msg) = rx.recv().await { - if let ChannelMessage::Token(token) = msg { - response.push_str(token.as_str()); - } - } - - tracing::debug!("response: {}", response); - assert!(response.contains('4')); - - service_handle.stop().await.expect("Stop failed"); - - assert_eq!(service_handle.status().await, BackendServiceStatus::Stopped); - } -} diff --git a/llama_forge_rs/src/server/backends/runner.rs b/llama_forge_rs/src/server/backends/runner.rs deleted file mode 100644 index fde575e..0000000 --- a/llama_forge_rs/src/server/backends/runner.rs +++ /dev/null @@ -1,93 +0,0 @@ -use std::ffi::OsStr; - -use serde::{Deserialize, Serialize}; -use tokio::process::Command; - -pub struct RunnerArgs { - ctx_size: i64, - gpu_layers: i64, - model_path: String, -} - -impl RunnerArgs { - pub fn new(ctx_size: i64, gpu_layers: i64, model_path: String) -> Self { - Self { - ctx_size, - gpu_layers, - model_path, - } - } -} - -impl From<RunnerArgs> for Vec<String> { - fn from(value: RunnerArgs) -> Self { - vec![ - "--n-gpu-layers".to_string(), - value.gpu_layers.to_string(), - "--ctx-size".to_string(), - value.ctx_size.to_string(), - // "--host".to_string(), - // "0.0.0.0".to_string(), - "-m".to_string(), - value.model_path, - ] - } -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct Runner { - pwd: Option<String>, - cmd: String, - args: Vec<String>, -} - -impl Runner { - // FIXME does not exit properly when it is killed - pub fn new_llamafile_bin(runner_args: RunnerArgs) -> Self { - Self { - pwd: None, - cmd: "bash".to_string(), - args: vec![ - format!( - "{}/llamafile", - std::env::current_dir().unwrap().to_string_lossy() - ) - .as_str(), - "--nobrowser", - ] - .into_iter() - .map(|str| str.to_string()) - .chain(Into::<Vec<String>>::into(runner_args)) - .collect(), - } - } - - pub fn new_llama_server_bin(runner_args: RunnerArgs) -> Self { - Self { - pwd: None, - cmd: "llama-server".to_string(), - args: runner_args.into(), - } - } - - #[tracing::instrument(level = "debug")] - pub async fn run(self) -> anyhow::Result<()> { - let test = OsStr::new(self.cmd.as_str()); - - let pwd = self - .pwd - .unwrap_or(std::env::current_dir()?.to_string_lossy().to_string()); - tracing::debug!(cmd=?test, ?pwd); - - let mut handle = Command::new(test) - .env("HSA_OVERRIDE_GFX_VERSION", "11.0.0") - .args(self.args.clone()) - .current_dir(pwd) - .kill_on_drop(true) - .spawn()?; - - handle.wait().await?.exit_ok()?; - - Ok(()) - } -} diff --git a/llama_forge_rs/src/server/fileserv.rs b/llama_forge_rs/src/server/fileserv.rs deleted file mode 100644 index 356de52..0000000 --- a/llama_forge_rs/src/server/fileserv.rs +++ /dev/null @@ -1,56 +0,0 @@ -use axum::{ - body::Body, - extract::State, - http::{header, Request, Response, StatusCode, Uri}, - response::{IntoResponse, Response as AxumResponse}, -}; -use leptos::{provide_context, view}; -use rust_embed::RustEmbed; - -use crate::{app::App, server::AppState}; - -#[derive(RustEmbed)] -#[folder = "../target/site"] -struct SiteAsset; - -pub struct StaticFile<T>(pub T); - -impl<T> IntoResponse for StaticFile<T> -where - T: Into<String>, -{ - fn into_response(self) -> Response<Body> { - let path = self.0.into(); - - match SiteAsset::get(path.as_str()) { - Some(content) => { - let mime = mime_guess::from_path(path).first_or_octet_stream(); - ([(header::CONTENT_TYPE, mime.as_ref())], content.data).into_response() - } - None => (StatusCode::NOT_FOUND, "404 Not Found").into_response(), - } - } -} - -pub async fn file_and_error_handler( - uri: Uri, - State(app_state): State<AppState>, - req: Request<Body>, -) -> AxumResponse { - let path = uri.path().trim_start_matches('/').to_string(); - let embed_res = StaticFile(path.clone()).into_response(); - if embed_res.status().is_success() { - tracing::debug!(msg = "Found asset", ?path); - embed_res - } else { - tracing::debug!(msg = "No Asset Found, Forwarding to leptos", ?path); - let handler = leptos_axum::render_app_to_stream_with_context( - app_state.leptos_options.to_owned(), - move || { - provide_context(app_state.pool.clone()); - }, - move || view! { <App /> }, - ); - handler(req).await.into_response() - } -} diff --git a/llama_forge_rs/src/server/middleware.rs b/llama_forge_rs/src/server/middleware.rs deleted file mode 100644 index 9d913e1..0000000 --- a/llama_forge_rs/src/server/middleware.rs +++ /dev/null @@ -1,85 +0,0 @@ -use std::{ - future::Future, - pin::Pin, - sync::Arc, - task::{Context, Poll}, -}; - -use axum::{body::Body, http::Request}; -use pin_project_lite::pin_project; -use tower::{Layer, Service}; -use tracing::Span; -use uuid::Uuid; // Make sure to include `uuid` crate in your Cargo.toml - -#[derive(Debug, Clone, Default)] -pub struct LoggingLayer; - -impl<S> Layer<S> for LoggingLayer { - type Service = LoggingService<S>; - - fn layer(&self, inner: S) -> Self::Service { - LoggingService { - inner, - } - } -} - -#[derive(Clone, Debug)] -pub struct LoggingService<T> { - inner: T, -} - -impl<T> Service<Request<Body>> for LoggingService<T> -where - T: Service<Request<Body>>, -{ - type Error = T::Error; - type Future = LoggingServiceFuture<T::Future>; - type Response = T::Response; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, req: Request<Body>) -> Self::Future { - let request_uuid = Uuid::now_v7(); // Generate UUID v7 - - let span = - tracing::debug_span!("request", ?request_uuid, method=?req.method(), uri=?req.uri()); - tracing::debug!(msg = "request started", uuid=?request_uuid); - - LoggingServiceFuture { - inner: self.inner.call(req), - uuid: Arc::new(request_uuid), // Store UUID in an Arc for shared ownership - span: Arc::new(span), - } - } -} - -pin_project! { - #[derive(Clone, Debug)] - pub struct LoggingServiceFuture<T> { - #[pin] - inner: T, - uuid: Arc<Uuid>, // Shared state between LoggingService and LoggingServiceFuture - span: Arc<Span>, - } -} - -impl<T> Future for LoggingServiceFuture<T> -where - T: Future, -{ - type Output = T::Output; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { - let this = self.project(); - match this.inner.poll(cx) { - Poll::Pending => Poll::Pending, - Poll::Ready(output) => { - tracing::debug!(msg = "request finished", uuid=?this.uuid); - Poll::Ready(output) - } - } - } -} diff --git a/llama_forge_rs/src/server/mod.rs b/llama_forge_rs/src/server/mod.rs deleted file mode 100644 index 42485b3..0000000 --- a/llama_forge_rs/src/server/mod.rs +++ /dev/null @@ -1,167 +0,0 @@ -use std::str::FromStr; - -use axum::{ - body::Body, - extract::{DefaultBodyLimit, FromRef, Path, State}, - http::Request, - response::IntoResponse, - routing::get, - Extension, - Router, -}; -use leptos::*; -use leptos_axum::{generate_route_list, handle_server_fns_with_context, LeptosRoutes}; -use leptos_router::RouteListing; -use sqlx::{ - sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions, SqliteSynchronous}, - ConnectOptions, - SqlitePool, -}; -use tower::Layer; -use tower_http::{ - compression::CompressionLayer, - trace::{ - DefaultMakeSpan, - DefaultOnEos, - DefaultOnFailure, - DefaultOnRequest, - DefaultOnResponse, - TraceLayer, - }, - CompressionLevel, -}; -use tracing::Level; - -use self::fileserv::file_and_error_handler; -use crate::{ - app::*, - server::middleware::{LoggingLayer, LoggingService}, -}; - -pub mod backends; -mod fileserv; -mod middleware; - -pub fn pool() -> Result<SqlitePool, ServerFnError> { - use_context::<SqlitePool>().ok_or_else(|| ServerFnError::ServerError("Pool missing.".into())) -} - -#[derive(FromRef, Debug, Clone)] -pub struct AppState { - pub leptos_options: LeptosOptions, - pub pool: SqlitePool, - pub routes: Vec<RouteListing>, -} - -pub async fn server_fn_handler( - State(app_state): State<AppState>, - path: Path<String>, - request: Request<Body>, -) -> impl IntoResponse { - tracing::debug!("handling server_fn {:?}", path); - - handle_server_fns_with_context( - move || { - provide_context(app_state.pool.clone()); - }, - request, - ) - .await -} - -pub async fn leptos_routes_handler( - State(app_state): State<AppState>, - req: Request<Body>, -) -> impl IntoResponse { - tracing::debug!("handling leptos_route: {:?}", req); - - let handler = leptos_axum::render_route_with_context( - app_state.leptos_options.clone(), - app_state.routes.clone(), - move || { - provide_context(app_state.pool.clone()); - }, - App, - ); - let response = handler(req).await; - - tracing::debug!("leptos_route response: {:?}", response); - response -} - -pub async fn app(leptos_options: LeptosOptions) -> Router { - async fn new_pool() -> Result<SqlitePool, Box<dyn std::error::Error>> { - // TODO Save this in xdg_config_dir /data dir - let db_options = SqliteConnectOptions::from_str("sqlite:db.sqlite3")? - .create_if_missing(true) - .optimize_on_close(true, None) - .journal_mode(SqliteJournalMode::Wal) - .synchronous(SqliteSynchronous::Normal) - .disable_statement_logging() - .busy_timeout(std::time::Duration::from_secs(16)) - .statement_cache_capacity(512) - .to_owned(); - - tracing::debug!( - msg = "Connectiong to db", - conn_str = ?db_options.to_url_lossy() - ); - - let pool = SqlitePoolOptions::new().connect_with(db_options).await?; - - sqlx::migrate!() - .run(&pool) - .await - .expect("could not run SQLx migrations"); - - Ok(pool) - } - - let routes = generate_route_list(App); - - let pool = new_pool().await.expect("pool err"); - - // // TODO move this out of server(pool has to be moved out too) - // FIXME: Should proxy_man move here ? - // let task = run_starter_task(pool.clone()); - // tokio::task::spawn(task); - - let app_state = AppState { - leptos_options, - // stream_registry: Arc::default(), - pool: pool.clone(), - routes: routes.clone(), - }; - - const MAX_BODY_LIMIT: usize = 16 * 1024 * 1024; // 16 MB - - tracing::debug!("routes: {:?}", routes); - - // build our application with a route - Router::new() - .route( - "/api/*fn_name", - get(server_fn_handler).post(server_fn_handler), - ) - .leptos_routes_with_handler(routes, get(leptos_routes_handler)) - .fallback(file_and_error_handler) - .with_state(app_state) - .layer(Extension(pool)) - .layer( - // Todo Readd gzip & deflate and add compress_when which skips them if response is a stream - CompressionLayer::new() - .no_gzip() - .no_deflate() - .quality(CompressionLevel::Fastest), - ) - .layer( - TraceLayer::new_for_http() - .make_span_with(DefaultMakeSpan::new().include_headers(true)) - .on_request(DefaultOnRequest::new().level(Level::INFO)) - .on_response(DefaultOnResponse::new().level(Level::INFO)) - .on_eos(DefaultOnEos::new().level(Level::DEBUG)) - .on_failure(DefaultOnFailure::new().level(Level::ERROR)), - ) - .layer(DefaultBodyLimit::max(MAX_BODY_LIMIT)) - .layer(LoggingLayer) -} diff --git a/llama_forge_rs/style/logo.mini.svg b/llama_forge_rs/style/logo.mini.svg deleted file mode 100644 index ee019df..0000000 --- a/llama_forge_rs/style/logo.mini.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg class="looka-1j8o68f" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"> - <path d="m94.04 198.39-75.58-44a11.96 12.06 0 0 1-5.96-10.41V56.03a11.96 12.06 0 0 1 5.96-10.46L94.04 1.62a11.96 12.06 0 0 1 11.96 0l75.54 43.99a11.96 12.06 0 0 1 5.96 10.45v87.92a11.96 12.06 0 0 1-5.96 10.45L106 198.4a11.96 12.06 0 0 1-11.96 0z" fill="#fd7014"/> - <g fill="#222831"> - <path d="M88.98 76.07H91v-6.15c0-2.26-1.82-4.1-4.06-4.1h-6.1v2.05h2.6a4.08 4.08 0 0 0 3.5 6.15 4 4 0 0 0 2.03-.57zm-2.03-4.1c-1.13 0-2.04-.92-2.04-2.05s.91-2.05 2.04-2.05 2.03.92 2.03 2.05-.91 2.05-2.03 2.05zm18.32 3.07c0-3.07-3.29-3.07-5.11-3.07s-5.11 0-5.11 3.07c0 2.37.6 4.13 5.1 4.13s5.12-1.76 5.12-4.13zm-8.19 0c0-.66.46-1.02 3.08-1.02s3.07.36 3.07 1.02c0 .93.6 2.08-3.07 2.08s-3.08-1.15-3.08-2.08zm3.08 6.16c-4.68 0-11.18 5.15-11.18 10.24 0 4.82 4.6 7.2 11.18 7.2s11.18-2.38 11.18-7.2c0-5.09-6.5-10.25-11.18-10.25zm7.99 7c-.62.74-2.08 2.21-3.93 2.21-1.9 0-2.77-.95-3.05-1.32v-5.74c2.45.48 5.39 2.5 6.98 4.85zm-9-4.85v5.74c-.29.38-1.16 1.32-3.06 1.32-1.85 0-3.3-1.48-3.92-2.21 1.59-2.35 4.52-4.37 6.97-4.85zm1 13.24c-4.4 0-9.14-.93-9.14-5.15 0-.42.08-.84.2-1.27 1.01 1.02 2.7 2.29 4.88 2.29a5.8 5.8 0 0 0 4.07-1.47 5.8 5.8 0 0 0 4.06 1.47c2.18 0 3.87-1.27 4.89-2.29.12.43.2.85.2 1.27 0 4.22-4.75 5.15-9.15 5.15z"/> - <path d="M120.24 56.57c2.23-2.15 5.33-5.9 5.33-10.2 0-6.4-2.12-9.66-2.2-9.8l-.48-.71-.79.35c-6.32 2.83-9.84 8.38-11.55 11.98-3.01-1.21-6.5-1.83-10.4-1.83s-7.37.62-10.39 1.83c-1.7-3.6-5.23-9.15-11.55-11.98l-.78-.35-.48.71c-.09.14-2.2 3.4-2.2 9.8 0 4.3 3.1 8.05 5.33 10.2-2.78 4.8-2.3 10.12-2.3 13.35 0 16-2.1 24.88-3.01 29.51l2 .4c.93-4.72 3.03-13.74 3.03-29.9 0-4.05-.14-11.59 5.53-16.65l.42-.37-.09-.55c-.73-4.7-2.84-9.09-4.57-12.05 3.9 3.01 6.14 7.11 7.23 9.63l.41.95.94-.43a25 25 0 0 1 10.49-2.05c4 0 7.53.69 10.48 2.05l.94.43.42-.95c1.08-2.52 3.32-6.62 7.22-9.63-1.73 2.96-3.84 7.34-4.57 12.05l-.08.55.41.37c5.67 5.06 5.53 12.6 5.53 16.64 0 16.17 2.1 25.2 3.04 29.91l2-.4c-.92-4.63-3-13.5-3-29.5 0-3.24.47-8.55-2.31-13.36zm-39.02-1.74c-1.95-1.93-4.44-5.06-4.44-8.47 0-3.4.66-5.8 1.19-7.2 1.57 2.37 4.6 7.46 5.6 12.98-.9.85-1.67 1.75-2.35 2.69zm41.13-15.67c.53 1.4 1.18 3.8 1.18 7.2 0 3.4-2.49 6.54-4.43 8.47a19.19 19.19 0 0 0-2.35-2.7c1-5.5 4.02-10.6 5.6-12.97z"/> - <path d="M109.3 69.92v6.15h2.04v-2.62a4 4 0 0 0 2.03.57 4.09 4.09 0 0 0 3.5-6.15h2.6v-2.04h-6.1a4.09 4.09 0 0 0-4.07 4.1zm6.1 0c0 1.13-.9 2.05-2.03 2.05s-2.03-.92-2.03-2.05.9-2.05 2.03-2.05 2.03.92 2.03 2.05z"/> - </g> - <path d="M69.19 112.8v1.38h-4.76v-7.17h1.6v5.79zm5.78 0v1.38h-4.75v-7.17h1.6v5.79zm5.79 1.38q-.11-.37-.25-.76t-.27-.79h-2.78l-.27.79q-.14.39-.25.76h-1.66l.76-2.14q.36-.99.7-1.85t.68-1.65.7-1.53h1.52q.35.75.69 1.53t.68 1.65.7 1.85.76 2.14zm-1.92-5.54-.15.42-.24.62-.3.78-.32.89h2.03l-.32-.9q-.15-.42-.3-.77t-.24-.62-.16-.42zm6.45-1.63q.18.34.42.85t.5 1.08.53 1.2.48 1.15l.48-1.15.52-1.2q.26-.59.5-1.08t.43-.85h1.46q.1.72.19 1.6t.15 1.84.12 1.92.1 1.81h-1.56l-.08-2.27q-.05-1.23-.16-2.49l-.4.97-.45 1.05-.43 1.01-.35.82h-1.12l-.35-.82-.42-1-.45-1.06-.41-.97q-.1 1.26-.15 2.49t-.09 2.27H83.2l.1-1.8.12-1.93q.06-.96.16-1.84t.19-1.6zm12.08 7.17q-.11-.37-.25-.76t-.27-.79h-2.77l-.28.79q-.14.39-.25.76H91.9l.76-2.14q.36-.99.7-1.85t.68-1.65.7-1.53h1.52l.7 1.53q.34.78.67 1.65t.7 1.85.77 2.14zm-1.92-5.54-.15.42-.24.62-.3.78-.31.89h2.02l-.32-.9q-.15-.42-.3-.77t-.23-.62-.17-.42zm7.02 5.54v-7.17h4.77v1.36h-3.16v1.5h2.81v1.35h-2.81v2.96zm7.24-3.59q0 .53.13.96t.37.73.6.47.8.16q.43 0 .79-.16t.6-.47.36-.73.13-.96-.13-.95-.37-.74-.6-.47-.79-.16q-.45 0-.8.17t-.59.47-.37.74-.13.94zm5.43 0q0 .92-.27 1.62t-.74 1.17-1.13.71-1.4.24q-.73 0-1.37-.24t-1.13-.7-.76-1.18-.28-1.62.29-1.62.77-1.17 1.13-.71 1.35-.24q.73 0 1.38.24t1.13.7.76 1.18.27 1.62zm3.42-3.66q1.6 0 2.46.57t.85 1.79q0 .76-.34 1.23t-1 .74q.22.27.46.61t.46.73.45.78.4.8h-1.8l-.4-.7-.4-.71q-.2-.35-.42-.65t-.4-.55h-.8v2.61h-1.6v-7.06q.52-.1 1.08-.15t1-.04zm.1 1.38h-.32q-.14 0-.26.03v1.94h.45q.9 0 1.3-.22t.39-.78q0-.53-.4-.75t-1.16-.22zm8.14-.06q-1.12 0-1.62.63t-.5 1.71q0 .53.13.96t.37.74.61.48.86.17h.46q.2 0 .33-.05v-2.5h1.6v3.56q-.28.11-.92.24t-1.57.13q-.8 0-1.45-.25t-1.12-.72-.7-1.17-.26-1.59q0-.9.28-1.59t.76-1.17 1.13-.73 1.4-.25q.5 0 .9.06t.7.16.48.18.27.15l-.46 1.29q-.33-.18-.75-.3t-.93-.14zm3.74 5.93v-7.17h4.8v1.36h-3.2v1.4h2.84v1.33h-2.84v1.73h3.44v1.35zm-53.31 4.29q9.83 0 15.06 3.53t5.23 10.95q0 4.64-2.11 7.53t-6.08 4.54q1.32 1.65 2.77 3.78t2.87 4.45 2.74 4.82 2.45 4.93H89.14l-2.43-4.39q-1.23-2.23-2.52-4.32t-2.55-3.97-2.52-3.4h-4.85V163h-9.83v-43.4q3.2-.63 6.64-.88t6.15-.26zm.56 8.45q-1.07 0-1.92.06t-1.6.13v11.94h2.77q5.54 0 7.94-1.4t2.4-4.76q0-3.24-2.43-4.6t-7.16-1.37zm40.59 28.52q2.08 0 3.43-.35t2.17-.95 1.14-1.43.31-1.85q0-2.15-2.01-3.58t-6.93-3.08q-2.15-.77-4.29-1.75t-3.84-2.48-2.78-3.62-1.07-5.18 1.14-5.49 3.21-4.16 5.04-2.64 6.68-.92q4.41 0 7.63.96t5.29 2.1l-2.84 7.8q-1.82-.95-4.06-1.68t-5.39-.73q-3.53 0-5.07.99t-1.54 3.01q0 1.2.56 2.03t1.6 1.5 2.4 1.2 3 1.12q3.4 1.27 5.92 2.5t4.2 2.9 2.48 3.87.82 5.4q0 6.16-4.29 9.56t-12.91 3.4q-2.9 0-5.23-.35t-4.13-.86-3.09-1.08-2.17-1.08l2.77-7.88q1.95 1.08 4.82 1.94t7.03.86z" fill="#393939"/> -</svg> diff --git a/llama_forge_rs/style/main.scss b/llama_forge_rs/style/main.scss deleted file mode 100644 index 805f966..0000000 --- a/llama_forge_rs/style/main.scss +++ /dev/null @@ -1,107 +0,0 @@ -@use 'tailwind'; - -@layer components { - .btn-example { - @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded; - } -} - -@layer utilities { - .dev-body { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - display: flex; - align-items: center; - justify-content: center; - font-size: 3rem; - background-color: rgb(225, 225, 225); - font-family: "Inter", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - overflow: hidden; - } - - .s3d { - --shadow-color: rgba(5, 5, 5, 0.25); - --lt-shadow-color: rgba(5, 5, 5, 0.1); - --highlight-color: rgba(255, 255, 255, 0.25); - --btn-raw-color: 230, 230, 230; - --light-angle: 135deg; - --radius: 999vw; - // --radius: 5em; - - - border-radius: var(--radius); - - // all: unset; - position: relative; - padding: 1em 1.5em; - background-color: rgba(0, 0, 0, 0.75); // tiny gap - box-shadow: - -0.15em -0.15em 0.15em -0.075em var(--shadow-color), // tl - 0.15em -0.15em 0.15em -0.075em var(--shadow-color), // tr - -0.15em 0.15em 0.15em -0.075em var(--shadow-color), // bl - 0.0375em 0.0375em 0.0675em 0 var(--lt-shadow-color); // br // why different ? (improves perspective shadow feel?) - - &::before, &::after { - content: ""; - border-radius: var(--radius); - position: absolute; - // border-radius: inherit; - transition: all 250ms ease; - } - - &::before { - z-index: 1; - inset: 0.025em; - box-shadow: 0.15em 0.3em 0.1em -0.01em var(--shadow-color); - } - - &::after { - z-index: 2; - inset: 0.0125em; - // main button color - // TODO var it & use darken etc - background-image: linear-gradient( - var(--light-angle), - rgb(var(--btn-raw-color)), - rgba(var(--btn-raw-color), 0.7), - ); - clip-path: inset(0 round var(--radius)); - // inline shadows - box-shadow: - // inline-perspective shadow - 0 0 0 0 inset var(--shadow-color), - // Rounding of the button itself - -0.05em -0.05em 0.05em 0 inset var(--shadow-color), // button bottom - 0 0 0.05em 0.2em inset var(--highlight-color), // button top - -0.075em -0.25em 0.25em 0.1em inset var(--shadow-color); // side - } - - span { - --text-gradient: linear-gradient(135deg, rgb(25, 25, 25), rgb(75, 75, 75)); - - position: relative; - z-index: 3; - font-family: inherit; - letter-spacing: -0.05em; - font-weight: 500; - color: transparent; - background-image: var(--text-gradient); - background-clip: text; - transition: transform 250ms ease; - display: block; - text-shadow: rgba(0, 0, 0, 0.1) 0 0 0.1em; - } - - // &:hover span { - // transform: scale(0.975); - // } - - // &:active span { - // transform: scale(0.95); - // } - } -} diff --git a/llama_forge_rs/style/tailwind.css b/llama_forge_rs/style/tailwind.css deleted file mode 100644 index a450e90..0000000 --- a/llama_forge_rs/style/tailwind.css +++ /dev/null @@ -1,14 +0,0 @@ -@config "../tailwind.config.js"; -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer components { - .debug-border { - @apply border border-rose-500; - } -} - -leptos-island { - display: contents; -} diff --git a/llama_forge_rs/tailwind.config.js b/llama_forge_rs/tailwind.config.js deleted file mode 100644 index bd27f1f..0000000 --- a/llama_forge_rs/tailwind.config.js +++ /dev/null @@ -1,35 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - "./**/**.rs", - "./public/*.html", - ], - safelist: [ - "backdrop-blur-sm", - ], - theme: { - extend: { - animation: { - 'bounce-twice': 'bounce 1s 1.5', - }, - width: { - '128': '32rem', - '192': '48rem', - '256': '64rem', - } - }, - }, - darkMode: 'class', - plugins: [require("@tailwindcss/typography"), require("daisyui")], - daisyui: { - // fd7014 (logo color) - themes: ["halloween"], // false: only light + dark | true: all themes | array: specific themes like this ["light", "dark", "cupcake"] - darkTheme: "halloween", // name of one of the included themes for dark mode - base: true, // applies background color and foreground color for root element by default - styled: true, // include daisyUI colors and design decisions for all components - utils: true, // adds responsive and modifier utility classes - prefix: "", // prefix for daisyUI classnames (components, modifiers and responsive class names. Not colors) - logs: false, - themeRoot: ":root", // The element that receives theme color CSS variables - }, -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 000d3ea..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3788 +0,0 @@ -{ - "name": "redvault-ai", - "version": "0.1.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "redvault-ai", - "version": "0.1.1", - "license": "AGPL", - "devDependencies": { - "@julr/unocss-preset-forms": "^1.0.0", - "@julr/unocss-preset-heropatterns": "^2.0.0", - "@starfederation/datastar": "^1.0.0-beta.9", - "@unocss/extractor-arbitrary-variants": "^66.1.0-beta.6", - "@unocss/inspector": "^66.1.0-beta.6", - "@unocss/preset-wind4": "^66.1.0-beta.6", - "@unocss/reset": "^66.0.0", - "animate.css": "^4.1.1", - "daisyui": "^5.0.9", - "sass": "^1.85.0", - "tailwindcss": "^4.0.15", - "typescript": "^5.7.3", - "unocss": "^66.0.0", - "unocss-preset-extra": "^0.5.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz", - "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "package-manager-detector": "^0.2.8", - "tinyexec": "^0.3.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.26.10" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", - "@iconify/types": "^2.0.0", - "debug": "^4.4.0", - "globals": "^15.14.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "mlly": "^1.7.4" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@julr/unocss-preset-forms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@julr/unocss-preset-forms/-/unocss-preset-forms-1.0.0.tgz", - "integrity": "sha512-A0Q40kazPG7CblrXyMNMBYpOPyUncmNTS+65XzaCCEZ8r5v+W5qEp+cI0SKG/XwCsw0aE8zeaB3IvETJLGkWgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/Julien-R44" - }, - "peerDependencies": { - "unocss": "^0.31.0 || ^65.0.0" - } - }, - "node_modules/@julr/unocss-preset-heropatterns": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@julr/unocss-preset-heropatterns/-/unocss-preset-heropatterns-2.0.0.tgz", - "integrity": "sha512-iVb+GX2HLK7Zm7zMBlaqzy3qro3jHVQNL3dSKbcbJpCFXCIqhmsDV+l+a0shFxeJVezr2isrB4B7eDQaceczMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/preset-mini": "^65.4.3", - "unocss": "^65.4.3" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/Julien-R44" - }, - "peerDependencies": { - "unocss": ">= 0.31.13" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/astro": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-65.5.0.tgz", - "integrity": "sha512-z0uLbOQhINYpd57p0p/fpVeBY1+Rv0t4GQQUMF00tH8tpIHGUdyHH9aE/yGZaeLI2onmaShTDgIVXT+7fR9fMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "@unocss/reset": "65.5.0", - "@unocss/vite": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/cli": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-65.5.0.tgz", - "integrity": "sha512-RZvAlu7vWIyeQr1TqFb5JsL95MWmDfopX9EaScUy5zuMjE05kvlPj4kM5y39N3XIpEDYWqI7WdwwrPqU45UraQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@unocss/config": "65.5.0", - "@unocss/core": "65.5.0", - "@unocss/preset-uno": "65.5.0", - "cac": "^6.7.14", - "chokidar": "^3.6.0", - "colorette": "^2.0.20", - "consola": "^3.4.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "tinyglobby": "^0.2.10", - "unplugin-utils": "^0.2.4" - }, - "bin": { - "unocss": "bin/unocss.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/config": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-65.5.0.tgz", - "integrity": "sha512-XK9Y3Z1m3oPXQl5pVOYk6+pltsk70RHFvsAtTyFd5G5kAHzQS/em4/lL6/0IubU7rn2j+9eHeCVOiWXW9lnvYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "unconfig": "~7.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/core": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-65.5.0.tgz", - "integrity": "sha512-XYWdS09M2XOjZNDotGhI2TIW/6duLNiyssopwjCbv4AlPklF0bZI86SKI55syYDBt6GRadoQbuvUkhSiTV/hzQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/inspector": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-65.5.0.tgz", - "integrity": "sha512-dhAijjVblrAUqHjqB2p4JhNTpRo85BTi6SLbG+ePwGsIL9oxNXtN57O2mzp1mSEKS1C+QjHmRV7u+gh8Bj93Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "@unocss/rule-utils": "65.5.0", - "colorette": "^2.0.20", - "gzip-size": "^6.0.0", - "sirv": "^3.0.0", - "vue-flow-layout": "^0.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/postcss": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-65.5.0.tgz", - "integrity": "sha512-mSGLX0KgygPhICZlUrjLgDJsEkgtrTjkDRI4skC7ZB/2pwQaESg8M3vhtWK/6XK+WGriUowfd5n6F6cfX3c2eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/config": "65.5.0", - "@unocss/core": "65.5.0", - "@unocss/rule-utils": "65.5.0", - "css-tree": "^3.1.0", - "postcss": "^8.5.2", - "tinyglobby": "^0.2.10" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/preset-attributify": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-65.5.0.tgz", - "integrity": "sha512-l3xQK6Om5fNknck04OZy3X7+k0EmVTEzF6BBMCYVaT2ZtCLhlznVt7tEg4ESLuXIZfx/+jd2sW3E3UY/EJ8rUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/preset-icons": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-65.5.0.tgz", - "integrity": "sha512-lSwMNtj4nufpQDBFoioAM9S6hP8028lA9fLFM3Vw+KmI10/3TaZyOaCXJVH5UdsfNWexGGo/Qo+K1YFWfXLZ8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@iconify/utils": "^2.3.0", - "@unocss/core": "65.5.0", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/preset-tagify": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-65.5.0.tgz", - "integrity": "sha512-m0CfBawgf4VQlbaijgeWXG6vXEOt4VsNIk1NLUyRM0GBMiOB3usb1tPLWJtRpje6p+bR+k4rpe4LsPMHhKtFfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/preset-typography": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-65.5.0.tgz", - "integrity": "sha512-lokYOVF/y1Zt1QufxrD/oJe4aUCK6hHPlisSJRReyKXuGUrBR9yWiIZfINqhkj3kMO6zzN23QiaA5E5cpUkDPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "@unocss/preset-mini": "65.5.0", - "@unocss/rule-utils": "65.5.0" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/preset-uno": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-65.5.0.tgz", - "integrity": "sha512-aVlSjzBc7IqNFgfu06qyP+CBRRGMNQLoQtZteRwa/vsUcTqGLzo7KhvkDazPEKpurmurXiymrvujTHInW0IooQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "@unocss/preset-mini": "65.5.0", - "@unocss/preset-wind": "65.5.0", - "@unocss/rule-utils": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/preset-web-fonts": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-65.5.0.tgz", - "integrity": "sha512-zWPsQiMSCoP61J8DX++3Z8Ncs20a3rdBb3uI7bDzHdf9MZEIhKzYYchpYO9Dfw7pzclECeuKhq5IjPjM1lmPUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/preset-wind": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-65.5.0.tgz", - "integrity": "sha512-3krOUZ5qC2J3JGheZsTDNbzqr9qYJw9GP1yEcfeE6K3qVcZnf+3DyJ0i1PuaM5SusOA0MBsHmCU49rLKurdyoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "@unocss/preset-mini": "65.5.0", - "@unocss/rule-utils": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/reset": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-65.5.0.tgz", - "integrity": "sha512-jADqiBAfOO9aZNpnsmxc7WX7vIIxyalcmCJ7fwdyPRmFhxZZ5ZoSYsHDt0Wfn/W2BRQkLjXWL0956nXH0lz79Q==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/rule-utils": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-65.5.0.tgz", - "integrity": "sha512-xT4N0EY1dl1mqY5gTKD0H/Fg6xApe7xbfNTUwctOu02DMeJhqv9BTqfoAihH/hzGSI69+FtzVtz7hUxTypfehA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^65.5.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/transformer-attributify-jsx": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-65.5.0.tgz", - "integrity": "sha512-ZWSGKw52h8nJSO1DaYGccjjNaBifl4LKJ4U0YpjaF2LDLA5BLBapUtyjTS7ffl6p7GZNokA6VUGL+MXPw+oDXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/transformer-compile-class": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-65.5.0.tgz", - "integrity": "sha512-7QMtWhUVKkSYFCDzinR8PPubhLFA+KVJMoHCTX1KTw/lQ5Zt7/FiwLX5zepc50K3074dPgR3hWn5PpK+CZeq7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/transformer-directives": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-65.5.0.tgz", - "integrity": "sha512-IsUd7L28bRAoN5fyWyNzHu7HOa1yjPqTU/QZfUEViJXApOEKUZ4anBSyU0lPU+59kMneg40xOvCBR70qNMCw4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "@unocss/rule-utils": "65.5.0", - "css-tree": "^3.1.0" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/transformer-variant-group": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-65.5.0.tgz", - "integrity": "sha512-I0ibbLRGI/9+BJy0yybxtmoYPIwGPMfwQDAvChhFXmokJG1YMpeJqPBI7fypHfbk/iO00W5lOGQ4XiIfsHfiHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/@unocss/vite": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-65.5.0.tgz", - "integrity": "sha512-v2rFIrBaWGQmSJeKv7us+2OMos2RqdZYpf/seOpf4MFHrmjjiFQ1ZWkTqFyNfUxAwj6VID5frVJhxJfZuEhhug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@unocss/config": "65.5.0", - "@unocss/core": "65.5.0", - "@unocss/inspector": "65.5.0", - "chokidar": "^3.6.0", - "magic-string": "^0.30.17", - "tinyglobby": "^0.2.10", - "unplugin-utils": "^0.2.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@julr/unocss-preset-heropatterns/node_modules/unocss": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-65.5.0.tgz", - "integrity": "sha512-dLTW89YK+5KCcB3vG/wxiwdpejkLLmZlK9hjWmP52sdeUFcmywc+/khD2/nid7or8dL3YCv1gwoyvnA7JRCwjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/astro": "65.5.0", - "@unocss/cli": "65.5.0", - "@unocss/core": "65.5.0", - "@unocss/postcss": "65.5.0", - "@unocss/preset-attributify": "65.5.0", - "@unocss/preset-icons": "65.5.0", - "@unocss/preset-mini": "65.5.0", - "@unocss/preset-tagify": "65.5.0", - "@unocss/preset-typography": "65.5.0", - "@unocss/preset-uno": "65.5.0", - "@unocss/preset-web-fonts": "65.5.0", - "@unocss/preset-wind": "65.5.0", - "@unocss/transformer-attributify-jsx": "65.5.0", - "@unocss/transformer-compile-class": "65.5.0", - "@unocss/transformer-directives": "65.5.0", - "@unocss/transformer-variant-group": "65.5.0", - "@unocss/vite": "65.5.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@unocss/webpack": "65.5.0", - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "@unocss/webpack": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", - "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", - "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", - "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", - "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", - "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", - "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", - "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", - "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", - "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", - "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", - "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", - "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", - "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", - "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", - "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", - "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", - "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", - "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", - "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", - "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@starfederation/datastar": { - "version": "1.0.0-beta.9", - "resolved": "https://registry.npmjs.org/@starfederation/datastar/-/datastar-1.0.0-beta.9.tgz", - "integrity": "sha512-KFNUahHd3zqraw2d0+UAHA2Qv7791KFdo4NmNzAmt2DrHk1jZ/AYNh3/nDImAVpDt3fXej7kFa1kcj7Yk4Uojg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@unocss/astro": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-66.0.0.tgz", - "integrity": "sha512-GBhXT6JPqXjDXoJZTXhySk83NgOt0UigChqrUUdG4x7Z+DVYkDBION8vZUJjw0OdIaxNQ4euGWu4GDsMF6gQQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/reset": "66.0.0", - "@unocss/vite": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/@unocss/astro/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/cli": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-66.0.0.tgz", - "integrity": "sha512-KVQiskoOjVkLVpNaG6WpLa4grPplrZROYZJVIUYSTqZyZRFNSvjttHcsCwpoWUEUdEombPtVZl8FrXePjY5IiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@unocss/config": "66.0.0", - "@unocss/core": "66.0.0", - "@unocss/preset-uno": "66.0.0", - "cac": "^6.7.14", - "chokidar": "^3.6.0", - "colorette": "^2.0.20", - "consola": "^3.4.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "tinyglobby": "^0.2.10", - "unplugin-utils": "^0.2.4" - }, - "bin": { - "unocss": "bin/unocss.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/cli/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/cli/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@unocss/config": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.0.0.tgz", - "integrity": "sha512-nFRGop/guBa4jLkrgXjaRDm5JPz4x3YpP10m5IQkHpHwlnHUVn1L9smyPl04ohYWhYn9ZcAHgR28Ih2jwta8hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "unconfig": "~7.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/config/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/core": { - "version": "66.1.0-beta.6", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.1.0-beta.6.tgz", - "integrity": "sha512-TQLxpBZPl6m4HhS6/FMr0Vbn22tGWgbGPyfJyjTSYY/LTug42aIUPnTQnqFSRwGiUnBfp3+oAhG/t/lZ6U74tw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "66.1.0-beta.6", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.1.0-beta.6.tgz", - "integrity": "sha512-jUI5Ncppngy8NKv8p9ubUi0FAw6Vcrx7hC7aWaqEFdfA2cDGpR5XHyWJozkT7BbfZs+SnA76b6qwuEtcXwYTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.1.0-beta.6" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/inspector": { - "version": "66.1.0-beta.6", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.1.0-beta.6.tgz", - "integrity": "sha512-YjK017dGMtN8Q067d9n9aCKFXGB8jD13PomKmKOWs3YfmPQE1qQjqQUXH4Zf/jhGMvaB72BHevqctLRHguHfww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.1.0-beta.6", - "@unocss/rule-utils": "66.1.0-beta.6", - "colorette": "^2.0.20", - "gzip-size": "^6.0.0", - "sirv": "^3.0.1", - "vue-flow-layout": "^0.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/postcss": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-66.0.0.tgz", - "integrity": "sha512-6bi+ujzh8I1PJwtmHX71LH8z/H9+vPxeYD4XgFihyU1k4Y6MVhjr7giGjLX4yP27IP+NsVyotD22V7by/dBVEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/config": "66.0.0", - "@unocss/core": "66.0.0", - "@unocss/rule-utils": "66.0.0", - "css-tree": "^3.1.0", - "postcss": "^8.5.2", - "tinyglobby": "^0.2.10" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/@unocss/postcss/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/postcss/node_modules/@unocss/rule-utils": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.0.0.tgz", - "integrity": "sha512-UJ51YHbwxYTGyj35ugsPlOT4gaa7tCbXdywZ3m5Nn0JgywwIqGmBFyiN9ZjHBHfJuDxmmPd6lxojoBscih/WMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^66.0.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-attributify": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-66.0.0.tgz", - "integrity": "sha512-eYsOgmcDoiIgGAepIwRX+DKGYxc/wm0r4JnDuZdz29AB+A6oY/FGHS1BVt4rq9ny4B5PofP4p6Rty+vwD9rigw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-attributify/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-icons": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-66.0.0.tgz", - "integrity": "sha512-6ObwTvEGuPBbKWRoMMiDioHtwwQTFI5oojFLJ32Y8tW6TdXvBLkO88d7qpgQxEjgVt4nJrqF1WEfR4niRgBm0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@iconify/utils": "^2.3.0", - "@unocss/core": "66.0.0", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-icons/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-mini": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-65.5.0.tgz", - "integrity": "sha512-oD2INmEgTOxmFsVceflv4Zs67vz9PRbpg3+CMsJLWgfX4UdQ1H4jZms72+g3N1hhXBvOFwvGvqGaMnrVMRk54g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0", - "@unocss/extractor-arbitrary-variants": "65.5.0", - "@unocss/rule-utils": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-mini/node_modules/@unocss/core": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-65.5.0.tgz", - "integrity": "sha512-XYWdS09M2XOjZNDotGhI2TIW/6duLNiyssopwjCbv4AlPklF0bZI86SKI55syYDBt6GRadoQbuvUkhSiTV/hzQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-mini/node_modules/@unocss/extractor-arbitrary-variants": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-65.5.0.tgz", - "integrity": "sha512-7K3gftOdkv9jbWvbkExTcx6/FDP2Xk/NSsOYTvR9oITLnLjmdQvp+9276WSnNfKF3frBl8ZcqpkC2EsuL2Yutw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "65.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-mini/node_modules/@unocss/rule-utils": { - "version": "65.5.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-65.5.0.tgz", - "integrity": "sha512-xT4N0EY1dl1mqY5gTKD0H/Fg6xApe7xbfNTUwctOu02DMeJhqv9BTqfoAihH/hzGSI69+FtzVtz7hUxTypfehA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^65.5.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-tagify": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-66.0.0.tgz", - "integrity": "sha512-GGYGyWxaevh0jN0NoATVO1Qe7DFXM3ykLxchlXmG6/zy963pZxItg/njrKnxE9la4seCdxpFH7wQBa68imwwdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-tagify/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-typography": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-66.0.0.tgz", - "integrity": "sha512-apjckP5nPU5mtaHTCzz5u/dK9KJWwJ2kOFCVk0+a/KhUWmnqnzmjRYZlEuWxxr5QxTdCW+9cIoRDSA0lYZS5tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/preset-mini": "66.0.0", - "@unocss/rule-utils": "66.0.0" - } - }, - "node_modules/@unocss/preset-typography/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-typography/node_modules/@unocss/extractor-arbitrary-variants": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.0.0.tgz", - "integrity": "sha512-vlkOIOuwBfaFBJcN6o7+obXjigjOlzVFN/jT6pG1WXbQDTRZ021jeF3i9INdb9D/0cQHSeDvNgi1TJ5oUxfiow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-typography/node_modules/@unocss/preset-mini": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.0.0.tgz", - "integrity": "sha512-d62eACnuKtR0dwCFOQXgvw5VLh5YSyK56xCzpHkh0j0GstgfDLfKTys0T/XVAAvdSvAy/8A8vhSNJ4PlIc9V2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/extractor-arbitrary-variants": "66.0.0", - "@unocss/rule-utils": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-typography/node_modules/@unocss/rule-utils": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.0.0.tgz", - "integrity": "sha512-UJ51YHbwxYTGyj35ugsPlOT4gaa7tCbXdywZ3m5Nn0JgywwIqGmBFyiN9ZjHBHfJuDxmmPd6lxojoBscih/WMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^66.0.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-uno": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-66.0.0.tgz", - "integrity": "sha512-qgoZ/hzTI32bQvcyjcwvv1X/dbPlmQNehzgjUaL7QFT0q0/CN/SRpysfzoQ8DLl2se9T+YCOS9POx3KrpIiYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/preset-wind3": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-uno/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-web-fonts": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-66.0.0.tgz", - "integrity": "sha512-9MzfDc6AJILN4Kq7Z91FfFbizBOYgw3lJd2UwqIs3PDYWG5iH5Zv5zhx6jelZVqEW5uWcIARYEEg2m4stZO1ZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-web-fonts/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-66.0.0.tgz", - "integrity": "sha512-FtvGpHnGC7FiyKJavPnn5y9lsaoWRhXlujCqlT5Bw63kKhMNr0ogKySBpenUhJOhWhVM0OQXn2nZ3GZRxW2qpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/preset-wind3": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind3": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind3/-/preset-wind3-66.0.0.tgz", - "integrity": "sha512-WAGRmpi1sb2skvYn9DBQUvhfqrJ+VmQmn5ZGsT2ewvsk7HFCvVLAMzZeKrrTQepeNBRhg6HzFDDi8yg6yB5c9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/preset-mini": "66.0.0", - "@unocss/rule-utils": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind3/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind3/node_modules/@unocss/extractor-arbitrary-variants": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.0.0.tgz", - "integrity": "sha512-vlkOIOuwBfaFBJcN6o7+obXjigjOlzVFN/jT6pG1WXbQDTRZ021jeF3i9INdb9D/0cQHSeDvNgi1TJ5oUxfiow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind3/node_modules/@unocss/preset-mini": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.0.0.tgz", - "integrity": "sha512-d62eACnuKtR0dwCFOQXgvw5VLh5YSyK56xCzpHkh0j0GstgfDLfKTys0T/XVAAvdSvAy/8A8vhSNJ4PlIc9V2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/extractor-arbitrary-variants": "66.0.0", - "@unocss/rule-utils": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind3/node_modules/@unocss/rule-utils": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.0.0.tgz", - "integrity": "sha512-UJ51YHbwxYTGyj35ugsPlOT4gaa7tCbXdywZ3m5Nn0JgywwIqGmBFyiN9ZjHBHfJuDxmmPd6lxojoBscih/WMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^66.0.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind4": { - "version": "66.1.0-beta.6", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.1.0-beta.6.tgz", - "integrity": "sha512-8OuBpnPbwId4/6sZe4j52+2shnyY/A3/y7RvhRow2xMgvEPBpJdkGHDDE+igwXF3Bhpd7FZS93NpyMLLX42imA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.1.0-beta.6", - "@unocss/extractor-arbitrary-variants": "66.1.0-beta.6", - "@unocss/rule-utils": "66.1.0-beta.6" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/reset": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-66.0.0.tgz", - "integrity": "sha512-YLFz/5yT7mFJC8JSmIUA5+bS3CBCJbtztOw+8rWzjQr/BEVSGuihWUUpI2Df6VVxXIXxKanZR6mIl59yvf+GEA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/rule-utils": { - "version": "66.1.0-beta.6", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.1.0-beta.6.tgz", - "integrity": "sha512-9RxYUGq96Ro+5XbevFlzKKwtROIv9c6VZbG+i34pMaw8ALFsCj34iGFvBs4ohTf03XkCCyMlr2f2KdFc9cj/Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^66.1.0-beta.6", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-attributify-jsx": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.0.0.tgz", - "integrity": "sha512-jS7szFXXC6RjTv9wo0NACskf618w981bkbyQ5izRO7Ha47sNpHhHDpaltnG7SR9qV4cCtGalOw4onVMHsRKwRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-attributify-jsx/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-compile-class": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-66.0.0.tgz", - "integrity": "sha512-ytUIE0nAcHRMACuTXkHp8auZ483DXrOZw99jk3FJ+aFjpD/pVSFmX14AWJ7bqPFObxb4SLFs6KhQma30ESC22A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-compile-class/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-directives": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-66.0.0.tgz", - "integrity": "sha512-utcg7m2Foi7uHrU5WHadNuJ0a3qWG8tZNkQMi+m0DQpX6KWfuDtDn0zDZ1X+z5lmiB3WGSJERRrsvZbj1q50Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/rule-utils": "66.0.0", - "css-tree": "^3.1.0" - } - }, - "node_modules/@unocss/transformer-directives/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-directives/node_modules/@unocss/rule-utils": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.0.0.tgz", - "integrity": "sha512-UJ51YHbwxYTGyj35ugsPlOT4gaa7tCbXdywZ3m5Nn0JgywwIqGmBFyiN9ZjHBHfJuDxmmPd6lxojoBscih/WMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^66.0.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-variant-group": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-66.0.0.tgz", - "integrity": "sha512-1BLjNWtAnR1JAcQGw0TS+nGrVoB9aznzvVZRoTx23dtRr3btvgKPHb8LrD48eD/p8Dtw9j3WfuxMDKXKegKDLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-variant-group/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/vite": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-66.0.0.tgz", - "integrity": "sha512-IVcPX8xL+2edyXKt4tp9yu5A6gcbPVCsspfcL0XgziCr01kS+4qSoZ90F3IUs3hXc/AyO5eCpRtGFMPLpOjXQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@unocss/config": "66.0.0", - "@unocss/core": "66.0.0", - "@unocss/inspector": "66.0.0", - "chokidar": "^3.6.0", - "magic-string": "^0.30.17", - "tinyglobby": "^0.2.10", - "unplugin-utils": "^0.2.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/@unocss/vite/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/vite/node_modules/@unocss/inspector": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.0.0.tgz", - "integrity": "sha512-mkIxieVm0kMOKw+E4ABpIerihYMdjgq9A92RD5h2+W/ebpxTEw5lTTK1xcMLiAlmOrVYMQKjpgPeu3vQmDyGZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/rule-utils": "66.0.0", - "colorette": "^2.0.20", - "gzip-size": "^6.0.0", - "sirv": "^3.0.0", - "vue-flow-layout": "^0.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/vite/node_modules/@unocss/rule-utils": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.0.0.tgz", - "integrity": "sha512-UJ51YHbwxYTGyj35ugsPlOT4gaa7tCbXdywZ3m5Nn0JgywwIqGmBFyiN9ZjHBHfJuDxmmPd6lxojoBscih/WMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^66.0.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/vite/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/vite/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "vue": "3.5.13" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/animate.css": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz", - "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.1.tgz", - "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/daisyui": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.0.9.tgz", - "integrity": "sha512-RsaehHh45f+0shWgZZaOY09/8eOae2voRsqJCD71j9yrnYgcke0Nj5ys0ZxrW4SPcc4+q96kWyJu0Z8P1zZdoA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/saadeghi/daisyui?sponsor=1" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/destr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", - "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/exsolve": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", - "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/local-pkg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", - "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.0.1", - "quansync": "^0.2.8" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-fetch-native": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ofetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", - "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", - "dev": true, - "license": "MIT", - "dependencies": { - "destr": "^2.0.3", - "node-fetch-native": "^1.6.4", - "ufo": "^1.5.4" - } - }, - "node_modules/package-manager-detector": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "quansync": "^0.2.7" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", - "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.1", - "exsolve": "^1.0.1", - "pathe": "^2.0.3" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rollup": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", - "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.37.0", - "@rollup/rollup-android-arm64": "4.37.0", - "@rollup/rollup-darwin-arm64": "4.37.0", - "@rollup/rollup-darwin-x64": "4.37.0", - "@rollup/rollup-freebsd-arm64": "4.37.0", - "@rollup/rollup-freebsd-x64": "4.37.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", - "@rollup/rollup-linux-arm-musleabihf": "4.37.0", - "@rollup/rollup-linux-arm64-gnu": "4.37.0", - "@rollup/rollup-linux-arm64-musl": "4.37.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-musl": "4.37.0", - "@rollup/rollup-linux-s390x-gnu": "4.37.0", - "@rollup/rollup-linux-x64-gnu": "4.37.0", - "@rollup/rollup-linux-x64-musl": "4.37.0", - "@rollup/rollup-win32-arm64-msvc": "4.37.0", - "@rollup/rollup-win32-ia32-msvc": "4.37.0", - "@rollup/rollup-win32-x64-msvc": "4.37.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/sass": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", - "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tailwindcss": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.15.tgz", - "integrity": "sha512-6ZMg+hHdMJpjpeCCFasX7K+U615U9D+7k5/cDK/iRwl6GptF24+I/AbKgOnXhVKePzrEyIXutLv36n4cRsq3Sg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.0.0.tgz", - "integrity": "sha512-G5CJSoG6ZTxgzCJblEfgpdRK2tos9+UdD2WtecDUVfImzQ0hFjwpH5RVvGMhP4pRpC9ML7NrC4qBsBl0Ttj35A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/utils": "^8.1.0", - "defu": "^6.1.4", - "jiti": "^2.4.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unocss": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-66.0.0.tgz", - "integrity": "sha512-SHstiv1s7zGPSjzOsADzlwRhQM+6817+OqQE3Fv+N/nn2QLNx1bi3WXybFfz5tWkzBtyTZlwdPmeecsIs1yOCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/astro": "66.0.0", - "@unocss/cli": "66.0.0", - "@unocss/core": "66.0.0", - "@unocss/postcss": "66.0.0", - "@unocss/preset-attributify": "66.0.0", - "@unocss/preset-icons": "66.0.0", - "@unocss/preset-mini": "66.0.0", - "@unocss/preset-tagify": "66.0.0", - "@unocss/preset-typography": "66.0.0", - "@unocss/preset-uno": "66.0.0", - "@unocss/preset-web-fonts": "66.0.0", - "@unocss/preset-wind": "66.0.0", - "@unocss/preset-wind3": "66.0.0", - "@unocss/transformer-attributify-jsx": "66.0.0", - "@unocss/transformer-compile-class": "66.0.0", - "@unocss/transformer-directives": "66.0.0", - "@unocss/transformer-variant-group": "66.0.0", - "@unocss/vite": "66.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@unocss/webpack": "66.0.0", - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "@unocss/webpack": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/unocss-preset-extra": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/unocss-preset-extra/-/unocss-preset-extra-0.5.3.tgz", - "integrity": "sha512-rRosBmJ3S8/97o/l4J1lc3AJnSGMSD1FgDs4bvUWmrz2OQvPheuZluL8xULEd5MGwHjw4vAwYkue114pnVelzA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "unocss": ">= 0.31.0 < 1" - } - }, - "node_modules/unocss/node_modules/@unocss/core": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.0.0.tgz", - "integrity": "sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unocss/node_modules/@unocss/extractor-arbitrary-variants": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.0.0.tgz", - "integrity": "sha512-vlkOIOuwBfaFBJcN6o7+obXjigjOlzVFN/jT6pG1WXbQDTRZ021jeF3i9INdb9D/0cQHSeDvNgi1TJ5oUxfiow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unocss/node_modules/@unocss/preset-mini": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.0.0.tgz", - "integrity": "sha512-d62eACnuKtR0dwCFOQXgvw5VLh5YSyK56xCzpHkh0j0GstgfDLfKTys0T/XVAAvdSvAy/8A8vhSNJ4PlIc9V2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "66.0.0", - "@unocss/extractor-arbitrary-variants": "66.0.0", - "@unocss/rule-utils": "66.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unocss/node_modules/@unocss/rule-utils": { - "version": "66.0.0", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.0.0.tgz", - "integrity": "sha512-UJ51YHbwxYTGyj35ugsPlOT4gaa7tCbXdywZ3m5Nn0JgywwIqGmBFyiN9ZjHBHfJuDxmmPd6lxojoBscih/WMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/core": "^66.0.0", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin-utils": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz", - "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vite": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", - "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-flow-layout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vue-flow-layout/-/vue-flow-layout-0.1.1.tgz", - "integrity": "sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "vue": "^3.4.37" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 2ad7857..0000000 --- a/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "redvault-ai", - "description": "", - "version": "0.1.1", - "author": "Tristan Druyen <tristan@vault81.mozmail.com>", - "license": "AGPL", - "type": "module", - "scripts": { - "watch-unocss": "cd ./darm_test && unocss --watch", - "watch-bundle": "npm run build-bundle; sleep 5; npm run watch-bundle", - "build-unocss": "cd ./darm_test && unocss", - "build-bundle": "cd ./darm_test && sass -scompressed style/main.scss > public/styles.min.css", - "watch-all": "npm run watch-unocss & npm run watch-bundle", - "build-all": "npm run build-unocss && npm run build-bundle" - }, - "devDependencies": { - "@julr/unocss-preset-forms": "^1.0.0", - "@julr/unocss-preset-heropatterns": "^2.0.0", - "@starfederation/datastar": "^1.0.0-beta.9", - "@unocss/extractor-arbitrary-variants": "^66.1.0-beta.6", - "@unocss/inspector": "^66.1.0-beta.6", - "@unocss/preset-wind4": "^66.1.0-beta.6", - "@unocss/reset": "^66.0.0", - "animate.css": "^4.1.1", - "daisyui": "^5.0.9", - "sass": "^1.85.0", - "tailwindcss": "^4.0.15", - "typescript": "^5.7.3", - "unocss": "^66.0.0", - "unocss-preset-extra": "^0.5.3" - }, - "overrides": { - "@julr/unocss-preset-forms": { - "unocss": "$unocss" - }, - "unocss-preset-extra": { - "unocss": "$unocss" - } - } -}