2026-01-04 05:19:47 +05:00
|
|
|
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
|
|
|
|
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
|
|
|
|
|
2026-02-18 21:08:48 +05:00
|
|
|
use jarvis_core::{config, db, i18n, voices, DB, SettingsManager};
|
2026-01-04 09:00:51 +05:00
|
|
|
|
2026-01-04 05:19:47 +05:00
|
|
|
#[macro_use]
|
|
|
|
|
extern crate simple_log;
|
|
|
|
|
|
|
|
|
|
mod events;
|
|
|
|
|
|
2026-01-04 09:00:51 +05:00
|
|
|
mod tauri_commands;
|
|
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
|
pub struct AppState {
|
2026-02-18 21:08:48 +05:00
|
|
|
pub settings: SettingsManager,
|
2026-01-04 09:00:51 +05:00
|
|
|
}
|
2026-01-04 05:19:47 +05:00
|
|
|
|
|
|
|
|
fn main() {
|
feat: 5 new packs + dotenvy + regen icon.ico + shortcuts redo
Iron Man icon regenerated from resources/icons/icon.png at sizes
16/24/32/48/64/128/256 via Pillow (make_ico.py committed alongside);
icon.ico is now a clean 83 KB multi-res for sharp display at any
scale instead of whatever placeholder Tauri originally emitted.
dotenvy added to workspace deps. jarvis-app/main.rs and jarvis-gui/
main.rs both walk up from current_exe() looking for dev.env (up to
5 parent levels), so the Desktop shortcut can launch the exe
directly without a wrapper .bat to pre-set GROQ_TOKEN. Falls back
to dotenvy::dotenv() (cwd lookup) if nothing found near the binary.
5 new portable Lua command packs. Bumps total from 21 to 26.
cargo test -p jarvis-core --lib commands::tests still passes 3/3.
reminders/ — set_reminder. Parses "напомни через N (секунд|минут|
часов) <body>" or English equivalents; understands one Russian word
numerals (один, две, пять, десять, пятнадцать, ...) for the count
when speech recognition returns words instead of digits. Defaults to
5 minutes if number/unit missing. Spawns a detached PowerShell that
Start-Sleeps then fires: BurntToast if installed, System.Speech
SAPI (ru-RU voice preference), and a WScript.Shell.Popup as the
guaranteed-visible last resort.
date_query/ — today / tomorrow / yesterday. Single answer.lua keyed
by command_id, computes the offset via PowerShell Get-Date.AddDays()
in ru-RU culture so the weekday/month come out in Russian, then
speaks via SAPI.
voice_type/ — type_text. Strips the trigger, drops the remainder to
clipboard via jarvis.system.clipboard.set, then synthesises Ctrl+V
through user32!keybd_event so it lands in whatever window currently
has focus. Works in any text field (note app, browser, IDE,
Telegram, etc.).
dice/ — coin_flip / roll_dice / random_number. Single roll.lua,
seeds math.random with os.time + jitter, speaks the result. "1-6"
for dice, "1-100" for random.
stopwatch/ — start / check / stop. Uses jarvis.state.get/set
(persisted via jarvis-core's settings DB) to remember the start
timestamp, computes elapsed via jarvis.context.time.timestamp,
formats as "X сек" / "X мин Y сек" / "X ч Y мин Z сек".
All new packs follow the established patterns (sandbox=full, PS-via-
exec helper where needed, USERPROFILE/SystemDrive everywhere, no
hardcoded paths).
2026-05-15 12:28:44 +03:00
|
|
|
load_dotenv_near_exe();
|
|
|
|
|
|
2026-01-04 05:19:47 +05:00
|
|
|
config::init_dirs().expect("Failed to init dirs");
|
feat: 5 new packs + dotenvy + regen icon.ico + shortcuts redo
Iron Man icon regenerated from resources/icons/icon.png at sizes
16/24/32/48/64/128/256 via Pillow (make_ico.py committed alongside);
icon.ico is now a clean 83 KB multi-res for sharp display at any
scale instead of whatever placeholder Tauri originally emitted.
dotenvy added to workspace deps. jarvis-app/main.rs and jarvis-gui/
main.rs both walk up from current_exe() looking for dev.env (up to
5 parent levels), so the Desktop shortcut can launch the exe
directly without a wrapper .bat to pre-set GROQ_TOKEN. Falls back
to dotenvy::dotenv() (cwd lookup) if nothing found near the binary.
5 new portable Lua command packs. Bumps total from 21 to 26.
cargo test -p jarvis-core --lib commands::tests still passes 3/3.
reminders/ — set_reminder. Parses "напомни через N (секунд|минут|
часов) <body>" or English equivalents; understands one Russian word
numerals (один, две, пять, десять, пятнадцать, ...) for the count
when speech recognition returns words instead of digits. Defaults to
5 minutes if number/unit missing. Spawns a detached PowerShell that
Start-Sleeps then fires: BurntToast if installed, System.Speech
SAPI (ru-RU voice preference), and a WScript.Shell.Popup as the
guaranteed-visible last resort.
date_query/ — today / tomorrow / yesterday. Single answer.lua keyed
by command_id, computes the offset via PowerShell Get-Date.AddDays()
in ru-RU culture so the weekday/month come out in Russian, then
speaks via SAPI.
voice_type/ — type_text. Strips the trigger, drops the remainder to
clipboard via jarvis.system.clipboard.set, then synthesises Ctrl+V
through user32!keybd_event so it lands in whatever window currently
has focus. Works in any text field (note app, browser, IDE,
Telegram, etc.).
dice/ — coin_flip / roll_dice / random_number. Single roll.lua,
seeds math.random with os.time + jitter, speaks the result. "1-6"
for dice, "1-100" for random.
stopwatch/ — start / check / stop. Uses jarvis.state.get/set
(persisted via jarvis-core's settings DB) to remember the start
timestamp, computes elapsed via jarvis.context.time.timestamp,
formats as "X сек" / "X мин Y сек" / "X ч Y мин Z сек".
All new packs follow the established patterns (sandbox=full, PS-via-
exec helper where needed, USERPROFILE/SystemDrive everywhere, no
hardcoded paths).
2026-05-15 12:28:44 +03:00
|
|
|
|
2026-01-04 05:19:47 +05:00
|
|
|
// basic logging setup (simpler for GUI)
|
|
|
|
|
simple_log::quick!("info");
|
|
|
|
|
|
2026-02-18 21:08:48 +05:00
|
|
|
// init settings
|
|
|
|
|
let manager = db::init();
|
2026-01-07 05:04:04 +05:00
|
|
|
|
|
|
|
|
// init i18n
|
2026-02-18 21:08:48 +05:00
|
|
|
i18n::init(&manager.lock().language);
|
2026-01-07 05:04:04 +05:00
|
|
|
|
2026-01-07 23:29:46 +05:00
|
|
|
// init voices
|
2026-02-18 21:08:48 +05:00
|
|
|
if let Err(e) = voices::init(&manager.lock().voice, &manager.lock().language) {
|
2026-01-07 23:29:46 +05:00
|
|
|
eprintln!("Failed to init voices: {}", e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// init audio backend
|
|
|
|
|
if let Err(e) = jarvis_core::audio::init() {
|
|
|
|
|
eprintln!("Failed to init audio: {:?}", e);
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-18 21:08:48 +05:00
|
|
|
// set global DB (for core modules that read settings at init time)
|
|
|
|
|
DB.set(manager.arc().clone())
|
2026-01-04 09:00:51 +05:00
|
|
|
.expect("DB already initialized");
|
2026-01-04 05:19:47 +05:00
|
|
|
|
|
|
|
|
tauri::Builder::default()
|
2026-02-18 21:08:48 +05:00
|
|
|
.manage(AppState { settings: manager })
|
2026-01-04 05:19:47 +05:00
|
|
|
.plugin(tauri_plugin_shell::init())
|
|
|
|
|
.plugin(tauri_plugin_dialog::init())
|
|
|
|
|
.plugin(tauri_plugin_fs::init())
|
|
|
|
|
.invoke_handler(tauri::generate_handler![
|
2026-01-04 09:00:51 +05:00
|
|
|
// audio
|
|
|
|
|
tauri_commands::pv_get_audio_devices,
|
|
|
|
|
tauri_commands::pv_get_audio_device_name,
|
|
|
|
|
tauri_commands::play_sound,
|
|
|
|
|
|
|
|
|
|
// db
|
|
|
|
|
tauri_commands::db_read,
|
|
|
|
|
tauri_commands::db_write,
|
|
|
|
|
|
|
|
|
|
// etc
|
|
|
|
|
tauri_commands::get_app_version,
|
|
|
|
|
tauri_commands::get_author_name,
|
|
|
|
|
tauri_commands::get_repository_link,
|
chore(gui): rebrand — strip TG/Boosty/Patreon/feedback-bot, keep CC BY-NC-SA attribution
The previous feature/gui-rebrand-polish work only updated the appInfo store
keys; Footer.svelte, settings, and the commands page were still rendering
upstream's Telegram channel, Boosty/Patreon support links, feedback bot,
and the original author byline. This finishes the job.
Rust side (applies after `cargo build` — currently a no-op until MSVC Build
Tools are reinstalled):
- Cargo.toml: authors = ["Bossiara13"], repository = J.A.R.V.I.S-rust fork.
Original attribution stays in LICENSE.txt per CC BY-NC-SA 4.0; the UI
no longer renders an author byline.
- config.rs: dropped TG_OFFICIAL_LINK / FEEDBACK_LINK / SUPPORT_BOOSTY_LINK
/ SUPPORT_PATREON_LINK. Added UPSTREAM_REPOSITORY_LINK (Priler/jarvis for
the licence attribution), ISSUES_LINK (this fork's GH issues), and
PYTHON_FORK_LINK.
- tauri_commands/etc.rs: dropped get_tg_official_link/get_boosty_link/
get_patreon_link/get_feedback_link. Added get_upstream_link, get_issues_link,
get_python_fork_link. Tidied up the Option<&str> -> String boilerplate
with unwrap_or.
- main.rs: invoke_handler updated to match.
Frontend side (visible only after Rust rebuild — Tauri bundles the dist into
the exe):
- stores.ts: appInfo shape reduced to repositoryLink / upstreamLink /
issuesLink / pythonForkLink / logFilePath. loadAppInfo() uses fetchOr()
with hardcoded fallbacks so the UI still populates correctly when run
against an un-rebuilt binary; fetchRepoOr() additionally overrides
CARGO_PKG_REPOSITORY if it still resolves to upstream's Priler/jarvis.
- Footer.svelte: rewritten — © year + "J.A.R.V.I.S." + repo link + issues
link + small "fork of Priler/jarvis · CC BY-NC-SA 4.0" attribution line.
No author byline (it's in LICENSE.txt).
- routes/settings/index.svelte: feedback link now points to GitHub Issues.
- routes/commands/index.svelte: TG-channel reference replaced with a link
to the Python fork (where the command builder lives) plus a pointer to
resources/commands/ in this repo. Bruh GIF removed.
- locales/{ru,en,ua}.ftl: removed footer-author / footer-telegram /
footer-support, added footer-issues / footer-fork-of, rewrote
commands-wip-* strings, retargeted settings-beta-bot to "GitHub Issues".
Bundle identifier (com.priler.jarvis) kept intact to avoid moving the app
data directory.
2026-05-15 01:09:14 +03:00
|
|
|
tauri_commands::get_upstream_link,
|
|
|
|
|
tauri_commands::get_issues_link,
|
|
|
|
|
tauri_commands::get_python_fork_link,
|
2026-01-04 09:00:51 +05:00
|
|
|
|
|
|
|
|
// fs
|
|
|
|
|
tauri_commands::get_log_file_path,
|
|
|
|
|
tauri_commands::show_in_folder,
|
|
|
|
|
|
|
|
|
|
// sys
|
|
|
|
|
tauri_commands::get_current_ram_usage,
|
|
|
|
|
tauri_commands::get_peak_ram_usage,
|
|
|
|
|
tauri_commands::get_cpu_temp,
|
|
|
|
|
tauri_commands::get_cpu_usage,
|
2026-01-06 23:32:58 +05:00
|
|
|
tauri_commands::get_jarvis_app_stats,
|
|
|
|
|
tauri_commands::is_jarvis_app_running,
|
|
|
|
|
tauri_commands::run_jarvis_app,
|
2026-01-05 03:38:04 +05:00
|
|
|
|
|
|
|
|
// vosk
|
|
|
|
|
tauri_commands::list_vosk_models,
|
2026-01-07 05:04:04 +05:00
|
|
|
|
2026-02-11 07:21:50 +05:00
|
|
|
// gliner
|
|
|
|
|
tauri_commands::list_gliner_models,
|
|
|
|
|
|
2026-01-07 05:04:04 +05:00
|
|
|
// i18n
|
|
|
|
|
tauri_commands::get_translations,
|
|
|
|
|
tauri_commands::translate,
|
|
|
|
|
tauri_commands::get_current_language,
|
|
|
|
|
tauri_commands::set_language,
|
|
|
|
|
tauri_commands::get_supported_languages,
|
2026-01-07 23:29:46 +05:00
|
|
|
|
|
|
|
|
// commands
|
|
|
|
|
tauri_commands::get_commands_count,
|
|
|
|
|
tauri_commands::get_commands_list,
|
|
|
|
|
|
|
|
|
|
// voices
|
|
|
|
|
tauri_commands::list_voices,
|
|
|
|
|
tauri_commands::get_voice,
|
|
|
|
|
tauri_commands::preview_voice,
|
2026-01-04 05:19:47 +05:00
|
|
|
])
|
|
|
|
|
.run(tauri::generate_context!())
|
|
|
|
|
.expect("error while running tauri application");
|
2026-02-18 21:08:48 +05:00
|
|
|
}
|
feat: 5 new packs + dotenvy + regen icon.ico + shortcuts redo
Iron Man icon regenerated from resources/icons/icon.png at sizes
16/24/32/48/64/128/256 via Pillow (make_ico.py committed alongside);
icon.ico is now a clean 83 KB multi-res for sharp display at any
scale instead of whatever placeholder Tauri originally emitted.
dotenvy added to workspace deps. jarvis-app/main.rs and jarvis-gui/
main.rs both walk up from current_exe() looking for dev.env (up to
5 parent levels), so the Desktop shortcut can launch the exe
directly without a wrapper .bat to pre-set GROQ_TOKEN. Falls back
to dotenvy::dotenv() (cwd lookup) if nothing found near the binary.
5 new portable Lua command packs. Bumps total from 21 to 26.
cargo test -p jarvis-core --lib commands::tests still passes 3/3.
reminders/ — set_reminder. Parses "напомни через N (секунд|минут|
часов) <body>" or English equivalents; understands one Russian word
numerals (один, две, пять, десять, пятнадцать, ...) for the count
when speech recognition returns words instead of digits. Defaults to
5 minutes if number/unit missing. Spawns a detached PowerShell that
Start-Sleeps then fires: BurntToast if installed, System.Speech
SAPI (ru-RU voice preference), and a WScript.Shell.Popup as the
guaranteed-visible last resort.
date_query/ — today / tomorrow / yesterday. Single answer.lua keyed
by command_id, computes the offset via PowerShell Get-Date.AddDays()
in ru-RU culture so the weekday/month come out in Russian, then
speaks via SAPI.
voice_type/ — type_text. Strips the trigger, drops the remainder to
clipboard via jarvis.system.clipboard.set, then synthesises Ctrl+V
through user32!keybd_event so it lands in whatever window currently
has focus. Works in any text field (note app, browser, IDE,
Telegram, etc.).
dice/ — coin_flip / roll_dice / random_number. Single roll.lua,
seeds math.random with os.time + jitter, speaks the result. "1-6"
for dice, "1-100" for random.
stopwatch/ — start / check / stop. Uses jarvis.state.get/set
(persisted via jarvis-core's settings DB) to remember the start
timestamp, computes elapsed via jarvis.context.time.timestamp,
formats as "X сек" / "X мин Y сек" / "X ч Y мин Z сек".
All new packs follow the established patterns (sandbox=full, PS-via-
exec helper where needed, USERPROFILE/SystemDrive everywhere, no
hardcoded paths).
2026-05-15 12:28:44 +03:00
|
|
|
|
|
|
|
|
// Pull dev.env into the process env so secrets like GROQ_TOKEN are picked up
|
|
|
|
|
// when the user launches the exe directly (no wrapper .bat required).
|
|
|
|
|
fn load_dotenv_near_exe() {
|
|
|
|
|
if let Ok(exe) = std::env::current_exe() {
|
|
|
|
|
let mut dir = exe.parent().map(|p| p.to_path_buf());
|
|
|
|
|
for _ in 0..5 {
|
|
|
|
|
if let Some(d) = &dir {
|
|
|
|
|
let candidate = d.join("dev.env");
|
|
|
|
|
if candidate.is_file() {
|
|
|
|
|
let _ = dotenvy::from_path(&candidate);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
dir = d.parent().map(|p| p.to_path_buf());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
let _ = dotenvy::dotenv();
|
|
|
|
|
}
|