frontend fixes & db rewrite with serde

This commit is contained in:
Priler 2026-01-04 09:00:51 +05:00
parent a425d8f834
commit 78eb0c0080
37 changed files with 910 additions and 663 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,15 +1,13 @@
{
"name": "jarvis-app",
"private": true,
"version": "0.0.3",
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "routify -c dev:vite",
"dev:routify": "routify",
"dev:vite": "vite",
"build": "svelte-check && routify -b && vite build",
"dev": "vite",
"build": "svelte-check --ignore '.routify' --no-tsconfig && vite build",
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.json",
"check": "svelte-check --ignore '.routify' --tsconfig ./tsconfig.json",
"tauri": "tauri"
},
"dependencies": {
@ -17,26 +15,27 @@
"@svelteuidev/core": "^0.15.7",
"@svelteuidev/motion": "^0.15.7",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-shell": "^2",
"@tauri-apps/plugin-dialog": "^2",
"@tauri-apps/plugin-fs": "^2",
"@tauri-apps/plugin-shell": "^2",
"howler": "^2.2.4",
"radix-icons-svelte": "^1.2.1",
"worker-timers": "^8.0.27"
},
"devDependencies": {
"@roxi/routify": "^3.6.4",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@sveltejs/vite-plugin-svelte": "^3.1.0",
"@tauri-apps/cli": "^2",
"@tsconfig/svelte": "^5.0.6",
"@types/howler": "^2.2.12",
"@types/node": "^25.0.3",
"sass": "^1.97.1",
"svelte": "^5.46.1",
"svelte-check": "^4.3.5",
"svelte-preprocess": "^6.0.3",
"svelte": "^4.2.18",
"svelte-check": "^3.8.0",
"svelte-preprocess": "^5.1.4",
"tslib": "^2.8.1",
"typescript": "^5.9.3",
"vite": "^7.3.0",
"vite-tsconfig-paths": "^6.0.3"
"vite": "^5.4.0",
"vite-tsconfig-paths": "^4.3.2"
}
}

View file

@ -1,15 +1,15 @@
<!-- src/App.svelte -->
<script>
import { Router } from "@roxi/routify";
import { routes } from "../.routify/routes";
import routes from "../.routify/routes.default.js";
import { SvelteUIProvider } from '@svelteuidev/core';
import Events from "./Events.svelte";
/** START LISTENING **/
import { startListening } from "./functions";
startListening();
// import { startListening } from "./functions";
// startListening();
</script>
<SvelteUIProvider themeObserver='dark' withNormalizeCSS withGlobalStyles>

View file

@ -8,7 +8,7 @@
let assistant_voice_val = "jarvis-og";
import { assistant_voice } from "@/stores"
import { invoke } from '@tauri-apps/api/tauri';
import { invoke } from "@tauri-apps/api/core";
assistant_voice.subscribe(value => {
assistant_voice_val = value;
});
@ -34,11 +34,11 @@
});
await listen('assistant-greet', (event) => {
document.getElementById("arc-reactor").classList.add("active");
document.getElementById("arc-reactor")?.classList.add("active");
});
await listen('assistant-waiting', (event) => {
document.getElementById("arc-reactor").classList.remove("active");
document.getElementById("arc-reactor")?.classList.remove("active");
});
});
</script>

View file

@ -1,5 +1,5 @@
<script>
import { invoke } from "@tauri-apps/api/tauri"
import { invoke } from "@tauri-apps/api/core"
import { tg_official_link, github_repository_link } from "@/stores";

View file

@ -1,5 +1,5 @@
<script lang="ts">
import { invoke } from "@tauri-apps/api/tauri"
import { invoke } from "@tauri-apps/api/core"
import { Dashboard, Gear } from 'radix-icons-svelte'
import {isActive} from '@roxi/routify'

View file

@ -1,6 +1,6 @@
<script>
// IMPORTS
import { invoke } from "@tauri-apps/api/tauri"
import { invoke } from "@tauri-apps/api/core"
import { onMount } from 'svelte'
import { capitalizeFirstLetter } from "@/functions";

View file

@ -2,13 +2,13 @@ import { invoke } from "@tauri-apps/api/core"
import { is_listening, isListening } from "@/stores"
import { clearInterval, clearTimeout, setInterval, setTimeout } from 'worker-timers';
setInterval(() => {
(async () => {
is_listening.set(await invoke("is_listening"));
})().catch(err => {
console.error(err);
});
}, 1000);
// setInterval(() => {
// (async () => {
// is_listening.set(await invoke("is_listening"));
// })().catch(err => {
// console.error(err);
// });
// }, 1000);
export function startListening() {
(async () => {
@ -26,7 +26,7 @@ export function startListening() {
});
}
export function stopListening(callback) {
export function stopListening(callback: () => void) {
(async () => {
invoke('stop_listening')
.then((message) => {
@ -43,11 +43,11 @@ export function stopListening(callback) {
});
}
export function capitalizeFirstLetter(string) {
export function capitalizeFirstLetter(string: string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
export function showInExplorer(path) {
export function showInExplorer(path: any) {
(async () => {
invoke('show_in_folder', {path: path})
.then((message) => {})

View file

@ -7,7 +7,7 @@ import "./css/styles.scss";
// deploy app
import App from "./App.svelte";
const app = new App({
target: document.getElementById("app"),
target: document.getElementById("app")!,
});
export default app;

View file

@ -1,10 +1,10 @@
<script lang="ts">
// IMPORTS
import { invoke } from "@tauri-apps/api/tauri"
import { invoke } from "@tauri-apps/api/core"
import { goto } from '@roxi/routify'
import { onMount } from 'svelte'
import { startListening, stopListening, showInExplorer } from "@/functions";
import { setTimeout } from 'worker-timers';
// import { setTimeout } from 'worker-timers';
import { feedback_link, log_file_path } from "@/stores";
@ -17,7 +17,7 @@
// VARIABLES
let available_microphones = [];
let available_microphones: { label: string; value: number }[] = [];
let settings_saved = false;
let save_button_disabled = false;
@ -70,10 +70,10 @@
let _available_microphones: Array<Number> = await invoke("pv_get_audio_devices");
Object.entries(_available_microphones).forEach(entry => {
const [k, v] = entry;
available_microphones.push({
label: v,
value: k
label: String(v),
value: Number(k)
});
});
@ -134,9 +134,9 @@
<Space h="sm" />
<NativeSelect data={[
{ label: 'Rustpotter', value: 'rustpotter' },
{ label: 'Vosk (медленный)', value: 'vosk' },
{ label: 'Picovoice Porcupine (требует API ключ)', value: 'picovoice' }
{ label: 'Rustpotter', value: 'Rustpotter' },
{ label: 'Vosk (медленный)', value: 'Vosk' },
{ label: 'Picovoice Porcupine (требует API ключ)', value: 'Picovoice' }
]}
label="Распознавание активационной фразы (Wake Word)"
description="Выберите, какая нейросеть будет отвечать за распознавание активационной фразы."

View file

@ -20,5 +20,9 @@
},
},
"include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
"references": [{ "path": "./tsconfig.node.json" }]
"references": [{ "path": "./tsconfig.node.json" }],
"exclude": [
"node_modules",
".routify"
]
}

View file

@ -4,5 +4,6 @@
"module": "ESNext",
"moduleResolution": "Node"
},
"include": ["vite.config.ts"]
"include": ["vite.config.ts"],
"exclude": [".routify"]
}

View file

@ -2,9 +2,9 @@ import { defineConfig } from "vite";
import { svelte } from "@sveltejs/vite-plugin-svelte";
import sveltePreprocess from "svelte-preprocess";
import tsconfigPaths from 'vite-tsconfig-paths'
import routify from '@roxi/routify/vite-plugin'
// https://vitejs.dev/config/
export default defineConfig(async () => ({
export default defineConfig({
plugins: [
svelte({
preprocess: [
@ -20,26 +20,19 @@ export default defineConfig(async () => ({
handler(warning);
},
}),
routify(),
tsconfigPaths()
],
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
// prevent vite from obscuring rust errors
clearScreen: false,
// tauri expects a fixed port, fail if that port is not available
server: {
port: 1420,
strictPort: true,
},
// to make use of `TAURI_DEBUG` and other env variables
// https://tauri.studio/v1/api/config#buildconfig.beforedevcommand
envPrefix: ["VITE_", "TAURI_"],
build: {
// Tauri supports es2021
target: process.env.TAURI_PLATFORM == "windows" ? "chrome105" : "safari13",
// don't minify for debug builds
minify: !process.env.TAURI_DEBUG ? "esbuild" : false,
// produce sourcemaps for debug builds
sourcemap: !!process.env.TAURI_DEBUG,
},
}));
});

View file

@ -1,46 +0,0 @@
// vite.config.ts
import { defineConfig } from "file:///D:/Rust/jarvis-app/gui/node_modules/vite/dist/node/index.js";
import { svelte } from "file:///D:/Rust/jarvis-app/gui/node_modules/@sveltejs/vite-plugin-svelte/src/index.js";
import sveltePreprocess from "file:///D:/Rust/jarvis-app/gui/node_modules/svelte-preprocess/dist/index.js";
import tsconfigPaths from "file:///D:/Rust/jarvis-app/gui/node_modules/vite-tsconfig-paths/dist/index.mjs";
var vite_config_default = defineConfig(async () => ({
plugins: [
svelte({
preprocess: [
sveltePreprocess({
typescript: true
})
],
onwarn: (warning, handler) => {
const { code, frame } = warning;
if (code === "css-unused-selector")
return;
handler(warning);
}
}),
tsconfigPaths()
],
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
// prevent vite from obscuring rust errors
clearScreen: false,
// tauri expects a fixed port, fail if that port is not available
server: {
port: 1420,
strictPort: true
},
// to make use of `TAURI_DEBUG` and other env variables
// https://tauri.studio/v1/api/config#buildconfig.beforedevcommand
envPrefix: ["VITE_", "TAURI_"],
build: {
// Tauri supports es2021
target: process.env.TAURI_PLATFORM == "windows" ? "chrome105" : "safari13",
// don't minify for debug builds
minify: !process.env.TAURI_DEBUG ? "esbuild" : false,
// produce sourcemaps for debug builds
sourcemap: !!process.env.TAURI_DEBUG
}
}));
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxSdXN0XFxcXGphcnZpcy1hcHBcXFxcZ3VpXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJEOlxcXFxSdXN0XFxcXGphcnZpcy1hcHBcXFxcZ3VpXFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9EOi9SdXN0L2phcnZpcy1hcHAvZ3VpL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7IHN2ZWx0ZSB9IGZyb20gXCJAc3ZlbHRlanMvdml0ZS1wbHVnaW4tc3ZlbHRlXCI7XG5pbXBvcnQgc3ZlbHRlUHJlcHJvY2VzcyBmcm9tIFwic3ZlbHRlLXByZXByb2Nlc3NcIjtcbmltcG9ydCB0c2NvbmZpZ1BhdGhzIGZyb20gJ3ZpdGUtdHNjb25maWctcGF0aHMnXG5cbi8vIGh0dHBzOi8vdml0ZWpzLmRldi9jb25maWcvXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoYXN5bmMgKCkgPT4gKHtcbiAgcGx1Z2luczogW1xuICAgIHN2ZWx0ZSh7XG4gICAgICBwcmVwcm9jZXNzOiBbXG4gICAgICAgIHN2ZWx0ZVByZXByb2Nlc3Moe1xuICAgICAgICAgIHR5cGVzY3JpcHQ6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIG9ud2FybjogKHdhcm5pbmcsIGhhbmRsZXIpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCBmcmFtZSB9ID0gd2FybmluZztcbiAgICAgICAgaWYgKGNvZGUgPT09IFwiY3NzLXVudXNlZC1zZWxlY3RvclwiKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGhhbmRsZXIod2FybmluZyk7XG4gICAgICB9LFxuICAgIH0pLFxuICAgIHRzY29uZmlnUGF0aHMoKVxuICBdLFxuXG4gIC8vIFZpdGUgb3B0aW9ucyB0YWlsb3JlZCBmb3IgVGF1cmkgZGV2ZWxvcG1lbnQgYW5kIG9ubHkgYXBwbGllZCBpbiBgdGF1cmkgZGV2YCBvciBgdGF1cmkgYnVpbGRgXG4gIC8vIHByZXZlbnQgdml0ZSBmcm9tIG9ic2N1cmluZyBydXN0IGVycm9yc1xuICBjbGVhclNjcmVlbjogZmFsc2UsXG4gIC8vIHRhdXJpIGV4cGVjdHMgYSBmaXhlZCBwb3J0LCBmYWlsIGlmIHRoYXQgcG9ydCBpcyBub3QgYXZhaWxhYmxlXG4gIHNlcnZlcjoge1xuICAgIHBvcnQ6IDE0MjAsXG4gICAgc3RyaWN0UG9ydDogdHJ1ZSxcbiAgfSxcbiAgLy8gdG8gbWFrZSB1c2Ugb2YgYFRBVVJJX0RFQlVHYCBhbmQgb3RoZXIgZW52IHZhcmlhYmxlc1xuICAvLyBodHRwczovL3RhdXJpLnN0dWRpby92MS9hcGkvY29uZmlnI2J1aWxkY29uZmlnLmJlZm9yZWRldmNvbW1hbmRcbiAgZW52UHJlZml4OiBbXCJWSVRFX1wiLCBcIlRBVVJJX1wiXSxcbiAgYnVpbGQ6IHtcbiAgICAvLyBUYXVyaSBzdXBwb3J0cyBlczIwMjFcbiAgICB0YXJnZXQ6IHByb2Nlc3MuZW52LlRBVVJJX1BMQVRGT1JNID09IFwid2luZG93c1wiID8gXCJjaHJvbWUxMDVcIiA6IFwic2FmYXJpMTNcIixcbiAgICAvLyBkb24ndCBtaW5pZnkgZm9yIGRlYnVnIGJ1aWxkc1xuICAgIG1pbmlmeTogIXByb2Nlc3MuZW52LlRBVVJJX0RFQlVHID8gXCJlc2J1aWxkXCIgOiBmYWxzZSxcbiAgICAvLyBwcm9kdWNlIHNvdXJjZW1hcHMgZm9yIGRlYnVnIGJ1aWxkc1xuICAgIHNvdXJjZW1hcDogISFwcm9jZXNzLmVudi5UQVVSSV9ERUJVRyxcbiAgfSxcbn0pKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBNFAsU0FBUyxvQkFBb0I7QUFDelIsU0FBUyxjQUFjO0FBQ3ZCLE9BQU8sc0JBQXNCO0FBQzdCLE9BQU8sbUJBQW1CO0FBRzFCLElBQU8sc0JBQVEsYUFBYSxhQUFhO0FBQUEsRUFDdkMsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBLE1BQ0wsWUFBWTtBQUFBLFFBQ1YsaUJBQWlCO0FBQUEsVUFDZixZQUFZO0FBQUEsUUFDZCxDQUFDO0FBQUEsTUFDSDtBQUFBLE1BQ0EsUUFBUSxDQUFDLFNBQVMsWUFBWTtBQUM1QixjQUFNLEVBQUUsTUFBTSxNQUFNLElBQUk7QUFDeEIsWUFBSSxTQUFTO0FBQ1Q7QUFFSixnQkFBUSxPQUFPO0FBQUEsTUFDakI7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUNELGNBQWM7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQSxFQUlBLGFBQWE7QUFBQTtBQUFBLEVBRWIsUUFBUTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWTtBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUEsRUFHQSxXQUFXLENBQUMsU0FBUyxRQUFRO0FBQUEsRUFDN0IsT0FBTztBQUFBO0FBQUEsSUFFTCxRQUFRLFFBQVEsSUFBSSxrQkFBa0IsWUFBWSxjQUFjO0FBQUE7QUFBQSxJQUVoRSxRQUFRLENBQUMsUUFBUSxJQUFJLGNBQWMsWUFBWTtBQUFBO0FBQUEsSUFFL0MsV0FBVyxDQUFDLENBQUMsUUFBUSxJQUFJO0FBQUEsRUFDM0I7QUFDRixFQUFFOyIsCiAgIm5hbWVzIjogW10KfQo=