2026-01-04 05:19:47 +05:00
|
|
|
[package]
|
|
|
|
|
name = "jarvis-app"
|
|
|
|
|
version.workspace = true
|
|
|
|
|
authors.workspace = true
|
|
|
|
|
license.workspace = true
|
|
|
|
|
repository.workspace = true
|
|
|
|
|
edition.workspace = true
|
|
|
|
|
|
|
|
|
|
[dependencies]
|
2026-01-05 03:38:04 +05:00
|
|
|
jarvis-core = { path = "../jarvis-core", features = ["intent"] }
|
2026-01-04 05:19:47 +05:00
|
|
|
once_cell.workspace = true
|
|
|
|
|
log.workspace = true
|
|
|
|
|
simple-log = "2.4"
|
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
|
|
|
dotenvy.workspace = true
|
2026-01-04 05:19:47 +05:00
|
|
|
tray-icon = "0.21"
|
|
|
|
|
winit = "0.30"
|
|
|
|
|
image.workspace = true
|
|
|
|
|
platform-dirs.workspace = true
|
|
|
|
|
rand.workspace = true
|
2026-01-05 01:22:45 +05:00
|
|
|
parking_lot.workspace = true
|
|
|
|
|
|
|
|
|
|
tokio = { version = "1", features = ["rt-multi-thread"] }
|
2026-01-04 05:19:47 +05:00
|
|
|
|
|
|
|
|
[target.'cfg(windows)'.dependencies.winit]
|
|
|
|
|
version = "0.30"
|
|
|
|
|
features = []
|
|
|
|
|
|
|
|
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
|
|
|
winapi = { version = "0.3", features = ["winuser"] }
|
2026-05-15 11:58:47 +03:00
|
|
|
winrt-notification.workspace = true
|
2026-01-04 05:19:47 +05:00
|
|
|
|
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
|
|
|
gtk = "0.18"
|
fix(app): embed Common-Controls v6 manifest so TaskDialogIndirect resolves
Symptom: jarvis-app.exe failed to start with a MessageBox saying
"Точка входа в процедуру TaskDialogIndirect не найдена в библиотеке
DLL ... jarvis-app.exe". Loader phase, no log lines ever written.
Cause: tray-icon 0.21 / winit 0.30 transitive Win32 imports include
TaskDialogIndirect from comctl32.dll, which is a Common-Controls v6
API. Without a side-by-side manifest declaring a dependency on
Microsoft.Windows.Common-Controls v6.0.0.0, Windows loads the legacy
v5 comctl32 (which does not export TaskDialogIndirect) and the
loader rejects the exe before main().
jarvis-gui does not hit this because tauri-build embeds its own
manifest as part of the Tauri compile step. jarvis-app had no
manifest at all.
Fix:
- app.manifest: Common-Controls v6 dependency, supportedOS for
Win7..Win11, PerMonitorV2 DPI awareness, UTF-8 active code page,
asInvoker execution level.
- app.manifest.rc: 3-line .rc that embeds the manifest with
CREATEPROCESS_MANIFEST_RESOURCE_ID (1) and RT_MANIFEST (24).
- build.rs: on cfg(windows), embed_resource::compile() compiles the
.rc and links the resulting .res into the exe. rerun-if-changed
on the manifest sources.
- Cargo.toml: target-windows build-dependency on embed-resource 3.
Verified: jarvis-app.exe now runs cleanly through all init steps:
commands parsed, audio init, recorder init found "Микрофон (5-
Fifine Microphone)", IPC server up on ws://127.0.0.1:9712, VAD
already flushing frames.
UTF-8 active code page in the manifest also helps russian-character
fidelity when win32 APIs are invoked from PowerShell helpers.
2026-05-15 13:26:00 +03:00
|
|
|
glib = "0.21.5"
|
|
|
|
|
|
|
|
|
|
[target.'cfg(target_os = "windows")'.build-dependencies]
|
|
|
|
|
embed-resource = "3"
|