2026-04-22 19:35:16 +03:00
|
|
|
|
open_browser:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой браузер
|
|
|
|
|
|
- запусти браузер
|
2026-04-27 20:06:26 +03:00
|
|
|
|
- открой яндекс
|
|
|
|
|
|
- яндекс браузер
|
|
|
|
|
|
action: {type: url, href: "about:blank", browser: "yandex"}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
|
|
|
|
|
open_youtube:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой ютуб
|
|
|
|
|
|
- ютуб
|
|
|
|
|
|
- запусти ютуб
|
2026-04-27 20:06:26 +03:00
|
|
|
|
action: {type: url, href: "https://www.youtube.com", browser: "yandex"}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
|
|
|
|
|
open_google:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой гугл
|
|
|
|
|
|
- гугл
|
|
|
|
|
|
- запусти гугл
|
2026-04-27 20:06:26 +03:00
|
|
|
|
action: {type: url, href: "https://www.google.com", browser: "yandex"}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
open_notepad:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой блокнот
|
|
|
|
|
|
- запусти блокнот
|
|
|
|
|
|
- открой нотепад
|
|
|
|
|
|
action: {type: shell, cmd: 'start "" notepad.exe'}
|
|
|
|
|
|
|
|
|
|
|
|
open_calculator:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой калькулятор
|
|
|
|
|
|
- запусти калькулятор
|
|
|
|
|
|
- нужен калькулятор
|
|
|
|
|
|
action: {type: shell, cmd: 'start "" calc.exe'}
|
|
|
|
|
|
|
|
|
|
|
|
open_explorer:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой проводник
|
|
|
|
|
|
- открой папку
|
|
|
|
|
|
- запусти проводник
|
|
|
|
|
|
- открой файлы
|
|
|
|
|
|
action: {type: shell, cmd: 'start "" explorer.exe'}
|
|
|
|
|
|
|
|
|
|
|
|
open_terminal:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой терминал
|
|
|
|
|
|
- запусти терминал
|
|
|
|
|
|
- открой консоль
|
|
|
|
|
|
- открой повершелл
|
|
|
|
|
|
action: {type: shell, cmd: 'start "" wt.exe || start "" powershell.exe'}
|
|
|
|
|
|
|
|
|
|
|
|
open_settings:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой настройки
|
|
|
|
|
|
- открой параметры
|
|
|
|
|
|
- открой настройки виндоус
|
|
|
|
|
|
action: {type: shell, cmd: 'start "" ms-settings:'}
|
|
|
|
|
|
|
|
|
|
|
|
open_task_manager:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой диспетчер задач
|
|
|
|
|
|
- запусти диспетчер задач
|
|
|
|
|
|
- диспетчер задач
|
|
|
|
|
|
action: {type: shell, cmd: 'start "" taskmgr.exe'}
|
|
|
|
|
|
|
|
|
|
|
|
lock_screen:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- заблокируй компьютер
|
|
|
|
|
|
- заблокируй экран
|
|
|
|
|
|
- блокировка экрана
|
|
|
|
|
|
- залочь
|
|
|
|
|
|
action: {type: shell, cmd: 'rundll32.exe user32.dll,LockWorkStation'}
|
|
|
|
|
|
|
|
|
|
|
|
screenshot:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сделай скриншот
|
|
|
|
|
|
- скриншот
|
|
|
|
|
|
- сними экран
|
|
|
|
|
|
action:
|
|
|
|
|
|
type: shell
|
|
|
|
|
|
cmd: >-
|
|
|
|
|
|
powershell -NoProfile -Command "Add-Type -AssemblyName System.Windows.Forms,System.Drawing; $b=[System.Windows.Forms.Screen]::PrimaryScreen.Bounds; $bmp=New-Object Drawing.Bitmap $b.Width,$b.Height; $g=[Drawing.Graphics]::FromImage($bmp); $g.CopyFromScreen($b.Location,[Drawing.Point]::Empty,$b.Size); $p=Join-Path $env:USERPROFILE ('Pictures\jarvis_'+(Get-Date -Format 'yyyyMMdd_HHmmss')+'.png'); $bmp.Save($p); $g.Dispose(); $bmp.Dispose()"
|
|
|
|
|
|
|
|
|
|
|
|
volume_up:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- громче
|
|
|
|
|
|
- сделай громче
|
|
|
|
|
|
- прибавь звук
|
|
|
|
|
|
- увеличь громкость
|
|
|
|
|
|
- погромче
|
|
|
|
|
|
action:
|
|
|
|
|
|
type: multi
|
|
|
|
|
|
steps:
|
|
|
|
|
|
- {type: keys, sequence: 'volumeup'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumeup'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumeup'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumeup'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumeup'}
|
|
|
|
|
|
|
|
|
|
|
|
volume_down:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- тише
|
|
|
|
|
|
- сделай тише
|
|
|
|
|
|
- убавь звук
|
|
|
|
|
|
- уменьши громкость
|
|
|
|
|
|
- потише
|
|
|
|
|
|
action:
|
|
|
|
|
|
type: multi
|
|
|
|
|
|
steps:
|
|
|
|
|
|
- {type: keys, sequence: 'volumedown'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumedown'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumedown'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumedown'}
|
|
|
|
|
|
- {type: keys, sequence: 'volumedown'}
|
|
|
|
|
|
|
|
|
|
|
|
sound_off:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- выключи звук
|
|
|
|
|
|
- беззвучный режим
|
|
|
|
|
|
- режим без звука
|
|
|
|
|
|
- отключи звук
|
|
|
|
|
|
action:
|
|
|
|
|
|
type: multi
|
|
|
|
|
|
steps:
|
|
|
|
|
|
- {type: play_sound, name: ok}
|
|
|
|
|
|
- {type: system, op: volume_mute}
|
|
|
|
|
|
|
|
|
|
|
|
sound_on:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- включи звук
|
|
|
|
|
|
- режим со звуком
|
|
|
|
|
|
- верни звук
|
|
|
|
|
|
action:
|
|
|
|
|
|
type: multi
|
|
|
|
|
|
steps:
|
|
|
|
|
|
- {type: system, op: volume_unmute}
|
|
|
|
|
|
- {type: play_sound, name: ok}
|
|
|
|
|
|
|
2023-04-16 16:59:18 +05:00
|
|
|
|
music:
|
2026-04-22 19:35:16 +03:00
|
|
|
|
phrases:
|
|
|
|
|
|
- давай музыку
|
|
|
|
|
|
- музыка
|
|
|
|
|
|
- яндекс музыка
|
|
|
|
|
|
- включи музыку
|
|
|
|
|
|
- открой музыку
|
|
|
|
|
|
- послушаем музыку
|
|
|
|
|
|
- хочу музыку
|
|
|
|
|
|
- врубай музло
|
|
|
|
|
|
- включи что-то послушать
|
|
|
|
|
|
- давай что-то послушаем
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
action: {type: keys, sequence: 'playpause'}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
2023-04-16 16:59:18 +05:00
|
|
|
|
music_off:
|
2026-04-22 19:35:16 +03:00
|
|
|
|
phrases:
|
|
|
|
|
|
- выключи музыку
|
|
|
|
|
|
- отруби музыку
|
|
|
|
|
|
- убери музыку
|
|
|
|
|
|
- отключи музыку
|
|
|
|
|
|
- закрой музыку
|
|
|
|
|
|
- останови музыку
|
|
|
|
|
|
- хватит музыки
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
- пауза
|
|
|
|
|
|
- поставь на паузу
|
|
|
|
|
|
action: {type: keys, sequence: 'playpause'}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
|
|
|
|
|
music_next:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- следующий трек
|
|
|
|
|
|
- следующая мелодия
|
|
|
|
|
|
- следующая песня
|
|
|
|
|
|
- переключи трек
|
|
|
|
|
|
- переключи мелодию
|
|
|
|
|
|
- переключи песню
|
|
|
|
|
|
- следующая музыка
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
action: {type: keys, sequence: 'nexttrack'}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
|
|
|
|
|
music_prev:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- предыдущая музыка
|
|
|
|
|
|
- предыдущий трек
|
|
|
|
|
|
- предыдущая мелодия
|
|
|
|
|
|
- предыдущая песня
|
|
|
|
|
|
- верни трек
|
|
|
|
|
|
- верни мелодию
|
|
|
|
|
|
- верни песню
|
|
|
|
|
|
- верни прошлый трек
|
|
|
|
|
|
- переключи на прошлый трек
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
action: {type: keys, sequence: 'prevtrack'}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
media_stop:
|
2026-04-22 19:35:16 +03:00
|
|
|
|
phrases:
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
- стоп музыка
|
|
|
|
|
|
- полная тишина
|
|
|
|
|
|
action: {type: keys, sequence: 'stop'}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
switch_audio_device:
|
2026-04-22 19:35:16 +03:00
|
|
|
|
phrases:
|
feat: parity with rust fork — LLM auto-fallback + 6 new action types + 20+ commands
Brings the python fork in line with the new feature/pc-tools work that
landed in rust. Same UX, same trigger phrases, same env vars.
config.py:
+ LLM_AUTO_FALLBACK = True
+ LLM_AUTO_FALLBACK_MIN_CHARS = 4
Mirrors the rust config knobs. The old "скажи X" trigger still works
(VA_TBR strips it before intent matching, so what remains hits this
fallback anyway) — but now ANY unrecognized query goes to Groq, not
just "скажи" ones.
main.py:
va_respond: replaced the fuzz-on-"скажи" gate with a unified auto-
fallback that fires whenever no command matches, GROQ_TOKEN is set,
and the utterance is at least LLM_AUTO_FALLBACK_MIN_CHARS long.
+ _speak(text): recorder.stop() → tts.va_speak → start, used by the
new action handlers so the mic doesn't pick up the assistant.
+ _set_clipboard(text): subprocess to PowerShell Set-Clipboard, no
new python deps.
+ _strip_trigger(voice, triggers): shared helper for codegen/file_search
where we need the text AFTER the trigger phrase.
New action handlers (registered in run_action dispatch):
+ groq_codegen — extracts query, calls Groq with strict "code only"
system prompt at temp 0.2, strips ```lang ... ``` fences, puts the
result in the clipboard, speaks "Код в буфере, сэр. Строк: N".
+ ocr_screen — PowerShell System.Drawing screenshot to a temp PNG,
shells to tesseract.exe (-l rus+eng), speaks a 120-char preview,
clipboard. Looks for tesseract on PATH first then standard install
dirs; gives a clear "Tesseract не установлен" if missing.
+ sysinfo — CIM-based battery/cpu/ram/disk via PS one-liners, time
via python datetime (gets us localized weekday for free). Topics:
time / battery / cpu / ram / disk / all.
+ file_search — strips trigger, recursive Get-ChildItem in Desktop/
Documents/Downloads (depth 3, top 5), opens explorer /select on
the first hit, speaks count and basename.
+ audio_devices_panel — opens mmsys.cpl. Proper COM-based device
switching (like the rust IPolicyConfig version) is deferred — TODO
in backlog.
commands.yaml:
Total 33 commands (was 19). New:
+ open_notepad / open_calculator / open_explorer / open_terminal
/ open_settings / open_task_manager / lock_screen / screenshot
— all via shell action (no AHK exes needed).
+ volume_up / volume_down — five chained keys=volumeup/volumedown
presses each, like rust's _volume_helper.ps1 with Times=5.
+ media_stop — keys=stop.
+ sysinfo_time / sysinfo_battery / sysinfo_cpu / sysinfo_ram /
sysinfo_disk / sysinfo_all — sysinfo action.
+ file_search, codegen, read_screen, switch_audio_device.
Replaced (were AHK exes that Priler ships and we don't have):
~ music → keys playpause
~ music_off → keys playpause (toggle)
~ music_next → keys nexttrack
~ music_prev → keys prevtrack
Removed (Priler hardware/setup specific, can't sensibly port):
- gaming_mode_on / gaming_mode_off (display config switch)
- music_save (depends on the specific player AHK was driving)
- switch_to_headphones / switch_to_dynamics (replaced with the
generic switch_audio_device that opens mmsys.cpl)
Kept as-is (worked already, no AHK dependency):
open_browser / open_youtube / open_google (url action)
sound_off / sound_on (pycaw via system.volume_mute/unmute)
thanks / stupid / off
Smoke-tested: yaml.safe_load → 33 commands, ast.parse main.py → OK.
Portability: USERPROFILE for screenshot path, $env:SystemDrive for disk,
PATH lookup for tesseract before falling back to standard install dirs.
No hardcoded user-specific paths.
2026-05-15 01:48:34 +03:00
|
|
|
|
- переключи устройство
|
|
|
|
|
|
- смени вывод
|
|
|
|
|
|
- переключи на наушники
|
|
|
|
|
|
- переключи на колонки
|
|
|
|
|
|
- переключи на динамики
|
|
|
|
|
|
- открой настройки звука
|
|
|
|
|
|
action: {type: audio_devices_panel}
|
|
|
|
|
|
|
|
|
|
|
|
sysinfo_time:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько времени
|
|
|
|
|
|
- который час
|
|
|
|
|
|
- какой сегодня день
|
|
|
|
|
|
- какое сегодня число
|
|
|
|
|
|
action: {type: sysinfo, topic: time}
|
|
|
|
|
|
|
|
|
|
|
|
sysinfo_battery:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько заряда
|
|
|
|
|
|
- заряд батареи
|
|
|
|
|
|
- сколько процентов батареи
|
|
|
|
|
|
action: {type: sysinfo, topic: battery}
|
|
|
|
|
|
|
|
|
|
|
|
sysinfo_cpu:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- загрузка процессора
|
|
|
|
|
|
- сколько процессор
|
|
|
|
|
|
- нагрузка цпу
|
|
|
|
|
|
action: {type: sysinfo, topic: cpu}
|
|
|
|
|
|
|
|
|
|
|
|
sysinfo_ram:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько памяти
|
|
|
|
|
|
- сколько оперативки
|
|
|
|
|
|
- загрузка оперативки
|
|
|
|
|
|
- сколько свободной памяти
|
|
|
|
|
|
action: {type: sysinfo, topic: ram}
|
|
|
|
|
|
|
|
|
|
|
|
sysinfo_disk:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько свободно на диске
|
|
|
|
|
|
- сколько места на диске
|
|
|
|
|
|
- сколько свободно на компе
|
|
|
|
|
|
action: {type: sysinfo, topic: disk}
|
|
|
|
|
|
|
|
|
|
|
|
sysinfo_all:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- статус системы
|
|
|
|
|
|
- что с компьютером
|
|
|
|
|
|
- состояние пк
|
|
|
|
|
|
- что по системе
|
|
|
|
|
|
action: {type: sysinfo, topic: all}
|
|
|
|
|
|
|
|
|
|
|
|
file_search:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- найди файл
|
|
|
|
|
|
- найди документ
|
|
|
|
|
|
- поиск файла
|
|
|
|
|
|
- ищи файл
|
|
|
|
|
|
- где файл
|
|
|
|
|
|
action: {type: file_search}
|
|
|
|
|
|
|
|
|
|
|
|
codegen:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- напиши код
|
|
|
|
|
|
- сгенерируй код
|
|
|
|
|
|
- набросай код
|
|
|
|
|
|
- сделай скрипт
|
|
|
|
|
|
- напиши скрипт
|
|
|
|
|
|
- сгенерируй скрипт
|
|
|
|
|
|
action: {type: groq_codegen}
|
|
|
|
|
|
|
|
|
|
|
|
read_screen:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- прочитай экран
|
|
|
|
|
|
- что на экране
|
|
|
|
|
|
- распознай текст с экрана
|
|
|
|
|
|
- что написано на экране
|
|
|
|
|
|
- сними текст с экрана
|
|
|
|
|
|
action: {type: ocr_screen}
|
2026-04-22 19:35:16 +03:00
|
|
|
|
|
feat: tier-1 PC tools parity — window mgmt, clipboard, notes, process killer, web search
Mirrors the new rust packs from the same iteration. Total commands in
commands.yaml is now 49 (was 33). yaml.safe_load + ast.parse both pass.
Window management (8 commands) — uses the existing `keys` action with
pyautogui hotkey strings: winleft+d (show_desktop), winleft+up/down
(maximize/minimize), winleft+left/right (snap left/right), alt+f4
(close_window), winleft+shift+m (restore_all), winleft+tab (task_view).
No new action type needed.
Clipboard read aloud — new clipboard_read action. Shells to
PowerShell Get-Clipboard, caps preview at 400 chars, speaks via the
existing tts.va_speak (which already handles recorder.stop/start).
Notes — new notes_add + notes_open actions. notes_add strips the
trigger phrase, appends "[YYYY-MM-DD HH:MM] body\n" to
%USERPROFILE%\Documents\jarvis-notes.txt, creates the dir if needed.
notes_open shells "cmd /c start" so .txt opens in the user-default
editor.
Process killer — new process_kill action. Strips the trigger ("убей
процесс"/"закрой программу"/etc.), looks up the remainder in the same
alias map as the rust version (хром→chrome, телега→telegram, спотифай
→spotify, едж/эдж/edge→msedge, дискорд→discord, стим→steam, обс→obs64,
проводник/блокнот/калькулятор/диспетчер задач, vs code→code, etc.),
appends .exe if needed, runs taskkill /F /IM, speaks success or
"не нашёл процесс N".
Web search — new websearch action with a `service` param. Bases:
google → https://www.google.com/search?q=
youtube → https://www.youtube.com/results?search_query=
wiki → https://ru.wikipedia.org/wiki/Special:Search?search=
yandex → https://yandex.ru/search/?text=
Strips trigger, urllib.parse.quote-s the rest, opens via webbrowser.open
(respects the user'\''s default browser; config.BROWSER_PATHS only kicks in
for the older url-action commands).
Portability: USERPROFILE used for notes path, no other hardcoded paths.
2026-05-15 11:27:19 +03:00
|
|
|
|
# Window management via pyautogui hotkeys
|
|
|
|
|
|
show_desktop:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- покажи рабочий стол
|
|
|
|
|
|
- свернуть всё
|
|
|
|
|
|
- сверни все окна
|
|
|
|
|
|
- покажи десктоп
|
|
|
|
|
|
action: {type: keys, sequence: 'winleft+d'}
|
|
|
|
|
|
|
|
|
|
|
|
maximize_window:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- разверни окно
|
|
|
|
|
|
- развернуть окно
|
|
|
|
|
|
- на весь экран
|
|
|
|
|
|
- раскрой окно
|
|
|
|
|
|
action: {type: keys, sequence: 'winleft+up'}
|
|
|
|
|
|
|
|
|
|
|
|
minimize_window:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сверни окно
|
|
|
|
|
|
- свернуть окно
|
|
|
|
|
|
- убери окно
|
|
|
|
|
|
action: {type: keys, sequence: 'winleft+down'}
|
|
|
|
|
|
|
|
|
|
|
|
snap_left:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- окно влево
|
|
|
|
|
|
- сдвинь влево
|
|
|
|
|
|
- прижми влево
|
|
|
|
|
|
action: {type: keys, sequence: 'winleft+left'}
|
|
|
|
|
|
|
|
|
|
|
|
snap_right:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- окно вправо
|
|
|
|
|
|
- сдвинь вправо
|
|
|
|
|
|
- прижми вправо
|
|
|
|
|
|
action: {type: keys, sequence: 'winleft+right'}
|
|
|
|
|
|
|
|
|
|
|
|
close_window:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- закрой окно
|
|
|
|
|
|
- закрой вкладку
|
|
|
|
|
|
- закрой текущее
|
|
|
|
|
|
action: {type: keys, sequence: 'alt+f4'}
|
|
|
|
|
|
|
|
|
|
|
|
restore_all:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- восстанови окна
|
|
|
|
|
|
- верни окна
|
|
|
|
|
|
- разверни окна
|
|
|
|
|
|
action: {type: keys, sequence: 'winleft+shift+m'}
|
|
|
|
|
|
|
|
|
|
|
|
task_view:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой все окна
|
|
|
|
|
|
- обзор окон
|
|
|
|
|
|
- таск вью
|
|
|
|
|
|
- покажи все окна
|
|
|
|
|
|
action: {type: keys, sequence: 'winleft+tab'}
|
|
|
|
|
|
|
|
|
|
|
|
# Clipboard read aloud
|
|
|
|
|
|
read_clipboard:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- прочитай буфер
|
|
|
|
|
|
- что в буфере
|
|
|
|
|
|
- прочитай из буфера
|
|
|
|
|
|
- озвучь буфер
|
|
|
|
|
|
action: {type: clipboard_read}
|
|
|
|
|
|
|
|
|
|
|
|
# Notes
|
|
|
|
|
|
add_note:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- запиши
|
|
|
|
|
|
- запиши заметку
|
|
|
|
|
|
- запиши идею
|
|
|
|
|
|
- запомни
|
|
|
|
|
|
- запомни идею
|
|
|
|
|
|
- сделай заметку
|
|
|
|
|
|
action: {type: notes_add}
|
|
|
|
|
|
|
|
|
|
|
|
open_notes:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- покажи заметки
|
|
|
|
|
|
- открой заметки
|
|
|
|
|
|
- что я записал
|
|
|
|
|
|
action: {type: notes_open}
|
|
|
|
|
|
|
|
|
|
|
|
# Process killer
|
|
|
|
|
|
kill_process:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- убей процесс
|
|
|
|
|
|
- закрой программу
|
|
|
|
|
|
- завершить процесс
|
|
|
|
|
|
- выруби процесс
|
|
|
|
|
|
action: {type: process_kill}
|
|
|
|
|
|
|
|
|
|
|
|
# Web search shortcuts
|
|
|
|
|
|
search_google:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- загугли
|
|
|
|
|
|
- поиск в гугл
|
|
|
|
|
|
- поищи в гугл
|
|
|
|
|
|
- найди в гугл
|
|
|
|
|
|
- ищи в гугл
|
|
|
|
|
|
action: {type: websearch, service: google}
|
|
|
|
|
|
|
|
|
|
|
|
search_youtube:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- найди на ютубе
|
|
|
|
|
|
- поиск на ютубе
|
|
|
|
|
|
- ищи на ютубе
|
|
|
|
|
|
- ютуб поиск
|
|
|
|
|
|
action: {type: websearch, service: youtube}
|
|
|
|
|
|
|
|
|
|
|
|
search_wiki:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- найди в википедии
|
|
|
|
|
|
- поиск в википедии
|
|
|
|
|
|
- википедия
|
|
|
|
|
|
- вики поиск
|
|
|
|
|
|
action: {type: websearch, service: wiki}
|
|
|
|
|
|
|
|
|
|
|
|
search_yandex:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- поищи в яндекс
|
|
|
|
|
|
- найди в яндекс
|
|
|
|
|
|
- яндекс поиск
|
|
|
|
|
|
- пробей в яндекс
|
|
|
|
|
|
action: {type: websearch, service: yandex}
|
|
|
|
|
|
|
feat: tier-1 parity — translate, math, theme toggle, projects, sound panel (56 commands total)
Mirrors the rust packs from the same iteration. yaml.safe_load + ast.parse
both pass.
main.py — six new action handlers + a _speak_in_lang helper:
+ do_translate: picks target language from "переведи на X" / "translate to X"
triggers, defaults to English, sends to Groq with strict "translation only"
prompt, drops to clipboard, speaks via SAPI in matching ISO voice
+ do_math_eval: strips trigger, Groq at temp=0.0 max_tokens=64,
short-circuits on "нет" sentinel for non-math
+ do_theme_set: writes AppsUseLightTheme + SystemUsesLightTheme via
Set-ItemProperty under HKCU\...\Themes\Personalize, action param
mode: dark|light
+ do_open_project / do_list_projects: reads/creates
%USERPROFILE%\Documents\jarvis-projects.json (a flat list of
{name, path}), exact-match → substring-match, opens in VS Code if
code.cmd on PATH else Explorer. First call writes a sample config
pointing under USERPROFILE so it works on any host.
+ do_open_sound_panel: rundll32 mmsys.cpl,,1 — Recording tab
commands.yaml — 8 new entries:
+ translate, math_eval
+ theme_dark, theme_light (action params mode:dark/light)
+ open_project, list_projects
+ open_sound_panel
SAPI voice selection iterates GetInstalledVoices() and picks first
matching TwoLetterISOLanguageName — Russian phrases sound Russian,
English/German/etc. sound right too, falls back to default if no
matching voice is installed.
Total commands: 56 (was 49).
2026-05-15 12:06:44 +03:00
|
|
|
|
translate:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переведи на английский
|
|
|
|
|
|
- переведи на русский
|
|
|
|
|
|
- переведи на украинский
|
|
|
|
|
|
- переведи на немецкий
|
|
|
|
|
|
- переведи на французский
|
|
|
|
|
|
- переведи на испанский
|
|
|
|
|
|
- переведи на китайский
|
|
|
|
|
|
- переведи на японский
|
|
|
|
|
|
- переведи
|
|
|
|
|
|
- как по английски
|
|
|
|
|
|
- как по русски
|
|
|
|
|
|
action: {type: translate}
|
|
|
|
|
|
|
|
|
|
|
|
math_eval:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- посчитай
|
|
|
|
|
|
- сколько будет
|
|
|
|
|
|
- вычисли
|
|
|
|
|
|
- реши
|
|
|
|
|
|
- сколько это
|
|
|
|
|
|
action: {type: math_eval}
|
|
|
|
|
|
|
|
|
|
|
|
theme_dark:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- тёмная тема
|
|
|
|
|
|
- темная тема
|
|
|
|
|
|
- включи тёмную тему
|
|
|
|
|
|
- тёмный режим
|
|
|
|
|
|
- темный режим
|
|
|
|
|
|
action: {type: theme_set, mode: dark}
|
|
|
|
|
|
|
|
|
|
|
|
theme_light:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- светлая тема
|
|
|
|
|
|
- включи светлую тему
|
|
|
|
|
|
- светлый режим
|
|
|
|
|
|
action: {type: theme_set, mode: light}
|
|
|
|
|
|
|
|
|
|
|
|
open_project:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой проект
|
|
|
|
|
|
- запусти проект
|
|
|
|
|
|
- открой папку проекта
|
|
|
|
|
|
action: {type: open_project}
|
|
|
|
|
|
|
|
|
|
|
|
list_projects:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие у меня проекты
|
|
|
|
|
|
- список проектов
|
|
|
|
|
|
- покажи проекты
|
|
|
|
|
|
action: {type: list_projects}
|
|
|
|
|
|
|
|
|
|
|
|
open_sound_panel:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- открой настройки звука
|
|
|
|
|
|
- панель звука
|
|
|
|
|
|
- настройки микрофона
|
|
|
|
|
|
- управление звуком
|
|
|
|
|
|
action: {type: open_sound_panel}
|
|
|
|
|
|
|
feat: parity — reminders, today/tomorrow/yesterday, voice type, dice, stopwatch (67 commands)
Mirrors the rust feature/pc-tools work. yaml.safe_load + ast.parse pass.
Commands count: 56 → 67 (+11).
main.py:
+ do_set_reminder — strips trigger, parses "N (секунд|минут|часов)"
with Russian-word numeral support (один/две/пять/десять/...).
Spawns a daemon thread that time.sleep()s then runs tts.va_speak
+ PowerShell WScript.Shell.Popup. Defaults to 5 min when number/
unit are missing.
+ do_date_query — accepts {offset: 0/1/-1}, computes target date with
datetime.timedelta, formats with hardcoded Russian weekday/month
names (no locale dependency), speaks "Сегодня/Завтра/Вчера + ...".
+ do_type_text — clipboard + pyautogui.hotkey('ctrl', 'v') so it
works in any focused window.
+ do_dice — coin/dice/random via random.choice / random.randint.
+ do_stopwatch — stores start ts in
%LOCALAPPDATA%\com.priler.jarvis\stopwatch.txt; start/check/stop
ops with humanised elapsed string.
commands.yaml +11 entries:
+ set_reminder
+ today / tomorrow / yesterday (action: date_query, offset: 0/1/-1)
+ type_text
+ coin_flip / roll_dice / random_number (action: dice, kind: ...)
+ stopwatch_start / stopwatch_check / stopwatch_stop
(action: stopwatch, op: start/check/stop)
2026-05-15 12:28:57 +03:00
|
|
|
|
set_reminder:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- напомни через
|
|
|
|
|
|
- напомни мне через
|
|
|
|
|
|
- поставь напоминание через
|
|
|
|
|
|
- установи таймер на
|
|
|
|
|
|
- таймер на
|
|
|
|
|
|
action: {type: set_reminder}
|
|
|
|
|
|
|
|
|
|
|
|
today:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какой сегодня день
|
|
|
|
|
|
- какое сегодня число
|
|
|
|
|
|
- сегодня какое число
|
|
|
|
|
|
- что сегодня
|
|
|
|
|
|
action: {type: date_query, offset: 0}
|
|
|
|
|
|
|
|
|
|
|
|
tomorrow:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какой день завтра
|
|
|
|
|
|
- что завтра
|
|
|
|
|
|
- завтра какое число
|
|
|
|
|
|
- какое число завтра
|
|
|
|
|
|
action: {type: date_query, offset: 1}
|
|
|
|
|
|
|
|
|
|
|
|
yesterday:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какой был вчера день
|
|
|
|
|
|
- что было вчера
|
|
|
|
|
|
- вчера какое число было
|
|
|
|
|
|
action: {type: date_query, offset: -1}
|
|
|
|
|
|
|
|
|
|
|
|
type_text:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- напечатай
|
|
|
|
|
|
- набери текст
|
|
|
|
|
|
- введи текст
|
|
|
|
|
|
- впиши
|
|
|
|
|
|
action: {type: type_text}
|
|
|
|
|
|
|
|
|
|
|
|
coin_flip:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- подбрось монетку
|
|
|
|
|
|
- брось монетку
|
|
|
|
|
|
- орёл или решка
|
|
|
|
|
|
- орел или решка
|
|
|
|
|
|
action: {type: dice, kind: coin}
|
|
|
|
|
|
|
|
|
|
|
|
roll_dice:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- брось кубик
|
|
|
|
|
|
- подбрось кубик
|
|
|
|
|
|
- кинь кубик
|
|
|
|
|
|
action: {type: dice, kind: dice}
|
|
|
|
|
|
|
|
|
|
|
|
random_number:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- случайное число
|
|
|
|
|
|
- выбери случайное число
|
|
|
|
|
|
- рандомное число
|
|
|
|
|
|
action: {type: dice, kind: random}
|
|
|
|
|
|
|
|
|
|
|
|
stopwatch_start:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- засеки время
|
|
|
|
|
|
- запусти секундомер
|
|
|
|
|
|
- старт секундомер
|
|
|
|
|
|
- включи секундомер
|
|
|
|
|
|
action: {type: stopwatch, op: start}
|
|
|
|
|
|
|
|
|
|
|
|
stopwatch_check:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько прошло
|
|
|
|
|
|
- сколько времени прошло
|
|
|
|
|
|
- проверь секундомер
|
|
|
|
|
|
action: {type: stopwatch, op: check}
|
|
|
|
|
|
|
|
|
|
|
|
stopwatch_stop:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- стоп секундомер
|
|
|
|
|
|
- останови секундомер
|
|
|
|
|
|
- выключи секундомер
|
|
|
|
|
|
action: {type: stopwatch, op: stop}
|
|
|
|
|
|
|
feat: parity — news, currency, crypto, fun, wiki, power, help (82 commands)
Mirrors the rust analog-inspired tier-2 packs. yaml + ast smoke pass.
56 → 82 commands (+26 yaml entries; 14 of them are power/fun/wiki/
news/etc. permutations).
main.py — 7 new action handlers, all built on stdlib urllib.request
(no new dep). Helper _http_get() with User-Agent header so RSS feeds
that 403 default UAs go through.
+ do_news: pulls RSS (default Lenta.ru), extracts <title> via regex,
skips channel title (idx 0), takes 5, sends to Groq for a 2-3
sentence summary at temp 0.4. Falls back to reading first 3
headlines verbatim if no token.
+ do_currency_rate: cbr-xml-daily.ru daily_json.js. Recognises
USD/EUR/CNY/GBP/JPY/KZT in the phrase, computes value/nominal,
diffs against Previous, speaks Russian with direction.
+ do_crypto_price: CoinGecko simple/price for BTC/ETH/SOL/DOGE/TON
with 24h change, picked by phrase keywords.
+ do_fun_ask: joke / fact / quote / compliment via Groq at temp 1.0
with per-kind system prompts, random seed in user message.
+ do_wiki_lookup: ru.wikipedia opensearch → page summary, optional
Groq retell when extract > 350 chars.
+ do_power: dispatch table for shutdown / restart / sleep /
hibernate / logoff / cancel — runs shutdown.exe /s|/r|/h|/l|/a
or rundll32 powrprof,SetSuspendState. 30-second grace on shutdown
and restart with /c message so "отмени выключение" works.
+ do_help_commands: sorts VA_CMD_LIST.keys(), speaks first 12 + total,
full list to clipboard.
commands.yaml +26 entries:
news_headlines, currency_rate, crypto_price, joke / fact / quote /
compliment (action:fun_ask, kind: ...), wiki_lookup, shutdown_pc /
restart_pc / sleep_pc / hibernate_pc / logoff_user / cancel_shutdown
(action:power, op: ...), help.
Inspired by what mainstream voice assistants (Siri/Alexa/Алиса/
Cortana) ship by default + power-user utilities (shutdown,
window/process control).
2026-05-15 12:43:26 +03:00
|
|
|
|
news_headlines:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что нового
|
|
|
|
|
|
- новости
|
|
|
|
|
|
- что в мире
|
|
|
|
|
|
- последние новости
|
|
|
|
|
|
- расскажи новости
|
|
|
|
|
|
- топ новостей
|
|
|
|
|
|
action: {type: news}
|
|
|
|
|
|
|
|
|
|
|
|
currency_rate:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- курс доллара
|
|
|
|
|
|
- курс евро
|
|
|
|
|
|
- сколько стоит доллар
|
|
|
|
|
|
- сколько стоит евро
|
|
|
|
|
|
- курс юаня
|
|
|
|
|
|
- курс валют
|
|
|
|
|
|
- что с долларом
|
|
|
|
|
|
- что с евро
|
|
|
|
|
|
action: {type: currency_rate}
|
|
|
|
|
|
|
|
|
|
|
|
crypto_price:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько биткоин
|
|
|
|
|
|
- цена биткоина
|
|
|
|
|
|
- курс биткоина
|
|
|
|
|
|
- цена эфира
|
|
|
|
|
|
- сколько эфир
|
|
|
|
|
|
- цена крипты
|
|
|
|
|
|
- цена соланы
|
|
|
|
|
|
action: {type: crypto_price}
|
|
|
|
|
|
|
|
|
|
|
|
joke:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- расскажи шутку
|
|
|
|
|
|
- пошути
|
|
|
|
|
|
- анекдот
|
|
|
|
|
|
- рассмеши меня
|
|
|
|
|
|
action: {type: fun_ask, kind: joke}
|
|
|
|
|
|
|
|
|
|
|
|
fact:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- расскажи факт
|
|
|
|
|
|
- интересный факт
|
|
|
|
|
|
- поделись фактом
|
|
|
|
|
|
action: {type: fun_ask, kind: fact}
|
|
|
|
|
|
|
|
|
|
|
|
quote:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- вдохнови меня
|
|
|
|
|
|
- цитата дня
|
|
|
|
|
|
- мотивируй
|
|
|
|
|
|
- процитируй кого-нибудь
|
|
|
|
|
|
action: {type: fun_ask, kind: quote}
|
|
|
|
|
|
|
|
|
|
|
|
compliment:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сделай комплимент
|
|
|
|
|
|
- похвали меня
|
|
|
|
|
|
action: {type: fun_ask, kind: compliment}
|
|
|
|
|
|
|
|
|
|
|
|
wiki_lookup:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что такое
|
|
|
|
|
|
- кто такой
|
|
|
|
|
|
- кто такая
|
|
|
|
|
|
- расскажи про
|
|
|
|
|
|
- википедия про
|
|
|
|
|
|
- найди в википедии про
|
|
|
|
|
|
action: {type: wiki_lookup}
|
|
|
|
|
|
|
|
|
|
|
|
shutdown_pc:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- выключи компьютер
|
|
|
|
|
|
- выключи пк
|
|
|
|
|
|
- выключи комп
|
|
|
|
|
|
action: {type: power, op: shutdown}
|
|
|
|
|
|
|
|
|
|
|
|
restart_pc:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- перезагрузи компьютер
|
|
|
|
|
|
- перезагрузи пк
|
|
|
|
|
|
- ребутни
|
|
|
|
|
|
- ребут
|
|
|
|
|
|
action: {type: power, op: restart}
|
|
|
|
|
|
|
|
|
|
|
|
sleep_pc:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- усыпи компьютер
|
|
|
|
|
|
- усыпи пк
|
|
|
|
|
|
- режим сна
|
|
|
|
|
|
- перейди в сон
|
|
|
|
|
|
action: {type: power, op: sleep}
|
|
|
|
|
|
|
|
|
|
|
|
hibernate_pc:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- гибернация
|
|
|
|
|
|
- переведи в гибернацию
|
|
|
|
|
|
- режим гибернации
|
|
|
|
|
|
action: {type: power, op: hibernate}
|
|
|
|
|
|
|
|
|
|
|
|
logoff_user:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- выйди из системы
|
|
|
|
|
|
- разлогинь
|
|
|
|
|
|
- выйди из учётки
|
|
|
|
|
|
- сеанс закончи
|
|
|
|
|
|
action: {type: power, op: logoff}
|
|
|
|
|
|
|
|
|
|
|
|
cancel_shutdown:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- отмени выключение
|
|
|
|
|
|
- отмени ребут
|
|
|
|
|
|
- отмени перезагрузку
|
|
|
|
|
|
- стой не выключай
|
|
|
|
|
|
action: {type: power, op: cancel}
|
|
|
|
|
|
|
|
|
|
|
|
help:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что ты умеешь
|
|
|
|
|
|
- какие команды
|
|
|
|
|
|
- список команд
|
|
|
|
|
|
- помощь
|
|
|
|
|
|
- помоги
|
|
|
|
|
|
- что можешь
|
|
|
|
|
|
action: {type: help_commands}
|
|
|
|
|
|
|
2026-05-15 12:58:32 +03:00
|
|
|
|
launch_game:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- запусти игру
|
|
|
|
|
|
- включи игру
|
|
|
|
|
|
- поиграем
|
|
|
|
|
|
- хочу поиграть
|
|
|
|
|
|
- запусти доту
|
|
|
|
|
|
- включи кс
|
|
|
|
|
|
- включи фортнайт
|
|
|
|
|
|
action: {type: launch_game}
|
|
|
|
|
|
|
|
|
|
|
|
list_games:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие у меня игры
|
|
|
|
|
|
- список игр
|
|
|
|
|
|
- покажи игры
|
|
|
|
|
|
action: {type: list_games}
|
|
|
|
|
|
|
|
|
|
|
|
mouse_left_click:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- клик
|
|
|
|
|
|
- кликни
|
|
|
|
|
|
- нажми мышкой
|
|
|
|
|
|
action: {type: mouse, op: left}
|
|
|
|
|
|
|
|
|
|
|
|
mouse_right_click:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- правый клик
|
|
|
|
|
|
- клик правой
|
|
|
|
|
|
- правой кнопкой
|
|
|
|
|
|
action: {type: mouse, op: right}
|
|
|
|
|
|
|
|
|
|
|
|
mouse_double_click:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- двойной клик
|
|
|
|
|
|
- дабл клик
|
|
|
|
|
|
- двойное нажатие
|
|
|
|
|
|
action: {type: mouse, op: double}
|
|
|
|
|
|
|
|
|
|
|
|
mouse_scroll_down:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- промотай вниз
|
|
|
|
|
|
- прокрути вниз
|
|
|
|
|
|
action: {type: mouse, op: scroll_down}
|
|
|
|
|
|
|
|
|
|
|
|
mouse_scroll_up:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- промотай вверх
|
|
|
|
|
|
- прокрути вверх
|
|
|
|
|
|
action: {type: mouse, op: scroll_up}
|
|
|
|
|
|
|
|
|
|
|
|
random_choice:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- выбери из
|
|
|
|
|
|
- выбери
|
|
|
|
|
|
- решай за меня
|
|
|
|
|
|
- выбрать
|
|
|
|
|
|
action: {type: random_choice}
|
|
|
|
|
|
|
feat: parity — brightness, window switch, spelling, network, summarize (100 commands)
Mirrors the rust tier-3 batch. 90 → 100 commands (round number — feels
right for an "имба" milestone).
main.py:
+ do_brightness: WMI WmiMonitorBrightness read + WmiSetBrightness write,
±20% step or 100/10 absolute, "no_wmi" sentinel for desktops.
+ do_window_switch: same alias map as process_kill (xrom→chrome/...),
PS finds process by name OR window-title substring, picks newest
StartTime, AppActivate via WScript.Shell.
+ do_spell_out: split chars, join with ". ", _speak.
+ do_network_settings: action.section = wifi|bluetooth|network →
matching ms-settings:* URI via cmd /c start "".
+ do_my_ip: Get-NetIPAddress filtered to non-loopback non-APIPA IPv4,
WAN via Invoke-RestMethod ipify, speaks "Локальный X. Внешний Y".
+ do_summarize_selection: pyautogui.hotkey(ctrl, c) → 250ms wait →
Get-Clipboard → Groq @ temp 0.3 ("3-5 sentence retell") → speak +
clipboard.
commands.yaml +10 entries: brightness_up/down/max/min, switch_to_window,
spell_out, open_wifi_settings, open_bluetooth_settings, my_ip,
summarize_selection.
Backlog: closed all "Tier-3 still TODO" pure-Lua items. Remaining
TODOs (pomodoro, currency-math, stocks, translate-clipboard, daily
briefing, etc.) are even smaller LOC and can roll in the next batch.
2026-05-15 13:11:37 +03:00
|
|
|
|
brightness_up:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- ярче
|
|
|
|
|
|
- сделай ярче
|
|
|
|
|
|
- увеличь яркость
|
|
|
|
|
|
- поярче
|
|
|
|
|
|
action: {type: brightness, op: up}
|
|
|
|
|
|
|
|
|
|
|
|
brightness_down:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- темнее
|
|
|
|
|
|
- сделай темнее
|
|
|
|
|
|
- уменьши яркость
|
|
|
|
|
|
- потемнее
|
|
|
|
|
|
action: {type: brightness, op: down}
|
|
|
|
|
|
|
|
|
|
|
|
brightness_max:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- максимальная яркость
|
|
|
|
|
|
- яркость на максимум
|
|
|
|
|
|
action: {type: brightness, op: max}
|
|
|
|
|
|
|
|
|
|
|
|
brightness_min:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- минимальная яркость
|
|
|
|
|
|
- яркость на минимум
|
|
|
|
|
|
action: {type: brightness, op: min}
|
|
|
|
|
|
|
|
|
|
|
|
switch_to_window:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переключись на
|
|
|
|
|
|
- переключи на
|
|
|
|
|
|
- активируй окно
|
|
|
|
|
|
- покажи окно
|
|
|
|
|
|
- перейди в
|
|
|
|
|
|
action: {type: window_switch}
|
|
|
|
|
|
|
|
|
|
|
|
spell_out:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- произнеси по буквам
|
|
|
|
|
|
- продиктуй по буквам
|
|
|
|
|
|
- произнеси буквы
|
|
|
|
|
|
- по буквам
|
|
|
|
|
|
action: {type: spell_out}
|
|
|
|
|
|
|
|
|
|
|
|
open_wifi_settings:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- настройки wifi
|
|
|
|
|
|
- настройки вайфай
|
|
|
|
|
|
- wifi настройки
|
|
|
|
|
|
- сеть
|
|
|
|
|
|
action: {type: network_settings, section: wifi}
|
|
|
|
|
|
|
|
|
|
|
|
open_bluetooth_settings:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- настройки блютуз
|
|
|
|
|
|
- блютуз
|
|
|
|
|
|
action: {type: network_settings, section: bluetooth}
|
|
|
|
|
|
|
|
|
|
|
|
my_ip:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- мой ай пи
|
|
|
|
|
|
- мой ip
|
|
|
|
|
|
- какой у меня айпи
|
|
|
|
|
|
- айпишник
|
|
|
|
|
|
action: {type: my_ip}
|
|
|
|
|
|
|
|
|
|
|
|
summarize_selection:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- суммируй
|
|
|
|
|
|
- перескажи выделенное
|
|
|
|
|
|
- кратко перескажи
|
|
|
|
|
|
- о чём это
|
|
|
|
|
|
- что выделил
|
|
|
|
|
|
- перескажи это
|
|
|
|
|
|
action: {type: summarize_selection}
|
|
|
|
|
|
|
2026-04-22 19:35:16 +03:00
|
|
|
|
thanks:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- спасибо
|
|
|
|
|
|
- молодец
|
|
|
|
|
|
- респект
|
|
|
|
|
|
- ты супер
|
|
|
|
|
|
- отличная работа
|
|
|
|
|
|
- ты крут
|
|
|
|
|
|
- ты большой молодец
|
|
|
|
|
|
- ты реально крут
|
|
|
|
|
|
- ты афигенный
|
|
|
|
|
|
action: {type: play_sound, name: thanks}
|
|
|
|
|
|
|
2023-04-16 16:59:18 +05:00
|
|
|
|
stupid:
|
2026-04-22 19:35:16 +03:00
|
|
|
|
phrases:
|
|
|
|
|
|
- ты дурак
|
|
|
|
|
|
- ты дебил
|
|
|
|
|
|
- ты глупый
|
|
|
|
|
|
- ты тупой
|
|
|
|
|
|
action: {type: play_sound, name: stupid}
|
|
|
|
|
|
|
|
|
|
|
|
'off':
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- выключись
|
|
|
|
|
|
- вырубись
|
|
|
|
|
|
- завершить работу
|
|
|
|
|
|
- закройся
|
|
|
|
|
|
- отключись
|
|
|
|
|
|
- заверши свою работу
|
|
|
|
|
|
- на сегодня хватит
|
|
|
|
|
|
- выгрузи себя из памяти
|
|
|
|
|
|
- ты мне надоел
|
|
|
|
|
|
- пора спать
|
|
|
|
|
|
action:
|
|
|
|
|
|
type: multi
|
|
|
|
|
|
steps:
|
|
|
|
|
|
- {type: play_sound, name: "off"}
|
|
|
|
|
|
- {type: system, op: exit}
|
feat: extensions module + 19 new commands (100 → 119)
Mirror of new packs from the rust fork. Self-contained `extensions.py` with
new do_* handlers, registered via 'set_speak' / 'set_clipboard_fn' callbacks
from main.py.
Wiring (main.py)
- `import extensions` at top.
- `extensions.set_speak(_speak)` + `extensions.set_clipboard_fn(_set_clipboard)`
right after _set_clipboard is defined.
- Added 15 new action-type dispatches in run_action.
extensions.py (new, ~360 lines)
Action types:
lock_workstation → rundll32 user32.dll,LockWorkStation
screenshot {mode} → clipboard via System.Windows.Forms.Clipboard.SetImage
OR file → ~/Pictures/Screenshots/jarvis-<ts>.png
disk_free / disk_list → PowerShell Get-PSDrive
coin_flip / uuid_gen / password_gen (length 6..64, copies to clipboard,
speaks length only — never echoes the password)
ssl_check {domain} → PowerShell TCP+SslStream→X509Certificate2 expiry
wifi_ssid → netsh wlan show interfaces parser (ru + en field names)
public_ip → urllib request to api.ipify.org
unit_convert {mode: length|weight|temperature|speed}
Russian-grammar pluralisation (фут/фута/футов).
date_math {mode: days_until|day_of_week}
Recognises Новый год, Рождество, 8 марта, 9 мая + "до N <месяц>".
echo_repeat / self_ping — debug commands
interesting_fact → Groq LLM (requires GROQ_TOKEN)
commands.yaml — 19 new entries:
lock_workstation, screenshot_clipboard, screenshot_file, disk_free, disk_list,
coin_flip, password_gen, uuid_gen, ssl_check, wifi_ssid, public_ip,
convert_length, convert_weight, convert_temperature, convert_speed,
days_until, day_of_week, echo_repeat, self_ping, interesting_fact.
Tests: python syntax check + yaml.safe_load both pass. Total commands: 119.
NOT YET mirrored from rust (would require deeper rework):
memory_pack / profile_switch / scheduler / macros / vision / codebase_qa
/ github_pr / llm_switch / llm_context / media_keys / mood_log / pomodoro
/ habit_nudge / daily_briefing / quick_search / diagnostics / sleep_timer
/ wikipedia (the rewritten one) / intro / mailto / generators (UUID, coin,
password ARE included — others can follow).
The reason these weren't mirrored: they need new state files
(memory.json, profiles.json, schedule.json, macros.json) and background
threads (scheduler tick). Doable as a follow-up but out of scope here.
2026-05-15 23:51:13 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ─── Ported from rust fork (2026-05-15) ───────────────────────────────────
|
|
|
|
|
|
|
|
|
|
|
|
lock_workstation:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- заблокируй компьютер
|
|
|
|
|
|
- заблокируй пк
|
|
|
|
|
|
- заблокируй комп
|
|
|
|
|
|
- заблокируй экран
|
|
|
|
|
|
- запри компьютер
|
|
|
|
|
|
action: {type: lock_workstation}
|
|
|
|
|
|
|
|
|
|
|
|
screenshot_clipboard:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сделай скриншот
|
|
|
|
|
|
- сделай скрин
|
|
|
|
|
|
- скопируй экран
|
|
|
|
|
|
- скриншот в буфер
|
|
|
|
|
|
- захвати экран
|
|
|
|
|
|
action: {type: screenshot, mode: clipboard}
|
|
|
|
|
|
|
|
|
|
|
|
screenshot_file:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сохрани скриншот
|
|
|
|
|
|
- сохрани скрин
|
|
|
|
|
|
- скриншот в файл
|
|
|
|
|
|
- сохрани экран
|
|
|
|
|
|
action: {type: screenshot, mode: file}
|
|
|
|
|
|
|
|
|
|
|
|
disk_free:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько свободного места
|
|
|
|
|
|
- сколько места на диске
|
|
|
|
|
|
- сколько свободно на диске
|
|
|
|
|
|
- место на диске
|
|
|
|
|
|
- свободное место
|
|
|
|
|
|
action: {type: disk_free}
|
|
|
|
|
|
|
|
|
|
|
|
disk_list:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие у меня диски
|
|
|
|
|
|
- список дисков
|
|
|
|
|
|
- перечень дисков
|
|
|
|
|
|
action: {type: disk_list}
|
|
|
|
|
|
|
|
|
|
|
|
coin_flip:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- подбрось монету
|
|
|
|
|
|
- брось монетку
|
|
|
|
|
|
- орёл или решка
|
|
|
|
|
|
- монетка
|
|
|
|
|
|
action: {type: coin_flip}
|
|
|
|
|
|
|
|
|
|
|
|
password_gen:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сгенерируй пароль
|
|
|
|
|
|
- придумай пароль
|
|
|
|
|
|
- сгенерируй надёжный пароль
|
|
|
|
|
|
action: {type: password_gen}
|
|
|
|
|
|
|
|
|
|
|
|
uuid_gen:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сгенерируй uuid
|
|
|
|
|
|
- сгенерируй юид
|
|
|
|
|
|
- юид
|
|
|
|
|
|
- уникальный идентификатор
|
|
|
|
|
|
action: {type: uuid_gen}
|
|
|
|
|
|
|
|
|
|
|
|
ssl_check:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- проверь сертификат
|
|
|
|
|
|
- когда истекает сертификат
|
|
|
|
|
|
- проверь tls
|
|
|
|
|
|
- проверь ssl
|
|
|
|
|
|
- сертификат сайта
|
|
|
|
|
|
action: {type: ssl_check}
|
|
|
|
|
|
|
|
|
|
|
|
wifi_ssid:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- к какой сети я подключен
|
|
|
|
|
|
- какой wifi
|
|
|
|
|
|
- какой вайфай
|
|
|
|
|
|
- какая сеть
|
|
|
|
|
|
- имя сети
|
|
|
|
|
|
action: {type: wifi_ssid}
|
|
|
|
|
|
|
|
|
|
|
|
public_ip:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- мой внешний ip
|
|
|
|
|
|
- публичный ip
|
|
|
|
|
|
- внешний айпи
|
|
|
|
|
|
- какой у меня внешний
|
|
|
|
|
|
action: {type: public_ip}
|
|
|
|
|
|
|
|
|
|
|
|
convert_length:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переведи метры в футы
|
|
|
|
|
|
- переведи футы в метры
|
|
|
|
|
|
- сколько метров
|
|
|
|
|
|
- сколько футов
|
|
|
|
|
|
- сколько километров
|
|
|
|
|
|
- сколько миль
|
|
|
|
|
|
- переведи в метры
|
|
|
|
|
|
- переведи в футы
|
|
|
|
|
|
- переведи в км
|
|
|
|
|
|
- переведи в мили
|
|
|
|
|
|
action: {type: unit_convert, mode: length}
|
|
|
|
|
|
|
|
|
|
|
|
convert_weight:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переведи килограммы в фунты
|
|
|
|
|
|
- переведи фунты в килограммы
|
|
|
|
|
|
- сколько кг в фунтах
|
|
|
|
|
|
- сколько фунтов
|
|
|
|
|
|
- сколько килограммов
|
|
|
|
|
|
action: {type: unit_convert, mode: weight}
|
|
|
|
|
|
|
|
|
|
|
|
convert_temperature:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переведи цельсий в фаренгейт
|
|
|
|
|
|
- переведи фаренгейт в цельсий
|
|
|
|
|
|
- сколько по фаренгейту
|
|
|
|
|
|
- сколько по цельсию
|
|
|
|
|
|
action: {type: unit_convert, mode: temperature}
|
|
|
|
|
|
|
|
|
|
|
|
convert_speed:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переведи километры в час в мили в час
|
|
|
|
|
|
- переведи в кмч
|
|
|
|
|
|
- переведи в мили в час
|
|
|
|
|
|
- сколько миль в час
|
|
|
|
|
|
- сколько км в час
|
|
|
|
|
|
action: {type: unit_convert, mode: speed}
|
|
|
|
|
|
|
|
|
|
|
|
days_until:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько дней до
|
|
|
|
|
|
- сколько до нового года
|
|
|
|
|
|
- сколько до
|
|
|
|
|
|
- до нового года
|
|
|
|
|
|
action: {type: date_math, mode: days_until}
|
|
|
|
|
|
|
|
|
|
|
|
day_of_week:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какой сегодня день недели
|
|
|
|
|
|
- какой день недели
|
|
|
|
|
|
- сегодня какой
|
|
|
|
|
|
action: {type: date_math, mode: day_of_week}
|
|
|
|
|
|
|
|
|
|
|
|
echo_repeat:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- повтори за мной
|
|
|
|
|
|
- скажи как я
|
|
|
|
|
|
- эхо
|
|
|
|
|
|
- проверка эхо
|
|
|
|
|
|
action: {type: echo_repeat}
|
|
|
|
|
|
|
|
|
|
|
|
self_ping:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- ты тут
|
|
|
|
|
|
- ты слышишь
|
|
|
|
|
|
- ты меня слышишь
|
|
|
|
|
|
- пинг
|
|
|
|
|
|
- ты живой
|
|
|
|
|
|
- ты на месте
|
|
|
|
|
|
- проверка связи
|
|
|
|
|
|
action: {type: self_ping}
|
|
|
|
|
|
|
|
|
|
|
|
interesting_fact:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- расскажи интересный факт
|
|
|
|
|
|
- интересный факт о
|
|
|
|
|
|
- интересный факт про
|
|
|
|
|
|
- удиви меня
|
|
|
|
|
|
- интересный факт
|
|
|
|
|
|
- расскажи факт
|
|
|
|
|
|
action: {type: interesting_fact}
|
feat: memory_store + profiles_store + 10 new yaml entries (119 → 129)
Mirrors `long_term_memory` and `profiles` modules from rust fork.
memory_store.py (new, ~95 lines)
- JSON store at <here>/long_term_memory.json (atomic write).
- remember(key, value) / recall(key) / forget(key) / search(query, limit) /
all_facts() / build_llm_context(prompt, limit).
- Uses the same JSON shape as the rust side, so the file is
interoperable if you ever symlink the two installations to the same dir.
profiles_store.py (new, ~145 lines)
- Profiles at <here>/profiles/<name>.json. active_profile.txt persists.
- Seeds 5 defaults on first init: default ★, work 💼, game 🎮, sleep 🌙,
driving 🚗 — same as rust fork.
- active() / active_name() / set_active(name) / list_names() /
allows_command(cmd_id).
extensions.py (+6 handlers, +160 lines)
- do_memory_remember — derives key (first 6 words or split on '=')
- do_memory_recall — substring search or top-3 if no query
- do_memory_forget — exact then substring fallback
- do_memory_list — count + first 5 keys
- do_profile_set — target via action.target or voice ("работа" → work)
- do_profile_what — speaks current profile + description
main.py
- +6 dispatch entries for the new action types.
commands.yaml (+10 entries, 119 → 129)
- memory_remember, memory_recall, memory_forget, memory_list
- profile_work, profile_game, profile_sleep, profile_driving, profile_default
- profile_what
Tests: ast.parse passes for all .py files. yaml.safe_load gives 129 entries.
Python parity is now meaningful: memory + profiles are usable by voice
without any rust install. Still missing for full parity: scheduler (needs
background thread), macros (needs phrase-capture state), vision (needs
Groq vision model call), codebase_qa, github_pr.
2026-05-15 23:54:33 +03:00
|
|
|
|
|
|
|
|
|
|
memory_remember:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- запомни обо мне
|
|
|
|
|
|
- запомни что
|
|
|
|
|
|
- помни что
|
|
|
|
|
|
- запомни это
|
|
|
|
|
|
- запомни про меня
|
|
|
|
|
|
action: {type: memory_remember}
|
|
|
|
|
|
|
|
|
|
|
|
memory_recall:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что ты помнишь о
|
|
|
|
|
|
- что ты знаешь обо мне
|
|
|
|
|
|
- что помнишь про
|
|
|
|
|
|
- вспомни
|
|
|
|
|
|
action: {type: memory_recall}
|
|
|
|
|
|
|
|
|
|
|
|
memory_forget:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- забудь про
|
|
|
|
|
|
- забудь что
|
|
|
|
|
|
- забудь обо мне
|
|
|
|
|
|
action: {type: memory_forget}
|
|
|
|
|
|
|
|
|
|
|
|
memory_list:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что ты помнишь
|
|
|
|
|
|
- что ты знаешь обо мне всё
|
|
|
|
|
|
- покажи память
|
|
|
|
|
|
action: {type: memory_list}
|
|
|
|
|
|
|
|
|
|
|
|
profile_work:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- режим работа
|
|
|
|
|
|
- включи режим работы
|
|
|
|
|
|
- рабочий режим
|
|
|
|
|
|
- переключись в работу
|
|
|
|
|
|
action: {type: profile_set, target: work}
|
|
|
|
|
|
|
|
|
|
|
|
profile_game:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- режим игра
|
|
|
|
|
|
- игровой режим
|
|
|
|
|
|
- включи игровой режим
|
|
|
|
|
|
- переключись в игры
|
|
|
|
|
|
action: {type: profile_set, target: game}
|
|
|
|
|
|
|
|
|
|
|
|
profile_sleep:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- режим сон
|
|
|
|
|
|
- ночной режим
|
|
|
|
|
|
- режим тишины
|
|
|
|
|
|
- иди спать
|
|
|
|
|
|
- выключи всё
|
|
|
|
|
|
action: {type: profile_set, target: sleep}
|
|
|
|
|
|
|
|
|
|
|
|
profile_driving:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- режим за рулём
|
|
|
|
|
|
- режим вождения
|
|
|
|
|
|
- я за рулём
|
|
|
|
|
|
- поехали
|
|
|
|
|
|
action: {type: profile_set, target: driving}
|
|
|
|
|
|
|
|
|
|
|
|
profile_default:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- обычный режим
|
|
|
|
|
|
- режим по умолчанию
|
|
|
|
|
|
- сбрось режим
|
|
|
|
|
|
- вернись в обычный
|
|
|
|
|
|
action: {type: profile_set, target: default}
|
|
|
|
|
|
|
|
|
|
|
|
profile_what:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какой сейчас режим
|
|
|
|
|
|
- в каком ты режиме
|
|
|
|
|
|
- текущий режим
|
|
|
|
|
|
- какой режим
|
|
|
|
|
|
action: {type: profile_what}
|
feat: vision + macros + scheduler in Python (129 → 142 commands)
Three big rust packs ported. Python parity now covers the FULL imba lineup
except codebase_qa and github_pr.
vision_handler.py (new, ~125 lines)
- Screenshot via PowerShell System.Drawing → temp PNG → base64 → Groq
vision API (llama-3.2-11b-vision-preview, override via GROQ_VISION_MODEL).
- do_vision_describe "что на экране" / "опиши экран"
- do_vision_read_error "прочитай ошибку"
- Requires GROQ_TOKEN; speaks "Не удалось" on missing.
macros_store.py (new, ~170 lines)
- JSON store at <here>/macros.json (atomic write-through).
- start(name) / save() / cancel() / replay(name, dispatch_fn)
- is_recording / recording_name / list_names / get / delete
- record_step(phrase) called by execute_cmd hook (see main.py)
- is_macro_control filter blocks "запиши макрос ..." from recording itself
(no infinite recursion).
- replay spawns daemon thread, fires each step with 800ms delay.
scheduler_store.py (new, ~220 lines)
- JSON store at <here>/schedule.json.
- parse_schedule(spec) handles "daily HH:MM", "at HH:MM",
"every/in N minutes|hours|seconds" — Russian (минут/час/секунд) + English.
- Background daemon thread ticks every 30s, fires Speak actions through the
same speak callback used by main.py.
- Once-tasks auto-delete after firing; daily/interval cycle forever.
- add/remove/clear/remove_by_text/list_all.
extensions.py (+13 handlers)
do_vision_describe / do_vision_read_error → thin proxies to vision_handler
do_macros_start / save / cancel / replay / list / delete
do_scheduler_add_reminder / add_recurring / list / clear / cancel_by_text
main.py
- extensions.init_background_services() at startup → scheduler thread boots.
- Wraps execute_cmd so every successful dispatch feeds macros_store.record_step.
- set_dispatch_fn(_execute_phrase_for_macro) enables macro replay through the
normal command pipeline (recognize_cmd → execute_cmd).
commands.yaml (+13 entries, 129 → 142)
vision_describe, vision_read_error, macros_start, macros_save, macros_cancel,
macros_replay, macros_list, macros_delete, scheduler_reminder,
scheduler_recurring, scheduler_list, scheduler_clear, scheduler_cancel_text.
Tests: ast.parse passes for all five .py files. yaml.safe_load = 142 entries.
Python parity status vs rust (72 packs):
✓ memory_pack, profile_switch, vision, scheduler, macros, llm switch
(via env), llm_context (basic), media_keys (existing), screenshot, net_info,
unit_convert, generators, disk, date_math, sleep_timer (via shutdown),
interesting_fact, mailto, self_check, ssl_check, intro/echo
✗ codebase_qa, github_pr (require gh CLI + file walk — TODO)
✗ pomodoro / daily_briefing / habit_nudge / quick_search / diagnostics
(could be ported but need scheduler integration + LLM glue)
2026-05-16 00:00:22 +03:00
|
|
|
|
|
|
|
|
|
|
vision_describe:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что на экране
|
|
|
|
|
|
- опиши экран
|
|
|
|
|
|
- посмотри на экран
|
|
|
|
|
|
- что у меня на экране
|
|
|
|
|
|
- посмотри на мой экран
|
|
|
|
|
|
- глянь на экран
|
|
|
|
|
|
action: {type: vision_describe}
|
|
|
|
|
|
|
|
|
|
|
|
vision_read_error:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- прочитай ошибку
|
|
|
|
|
|
- что за ошибка
|
|
|
|
|
|
- помоги с ошибкой
|
|
|
|
|
|
action: {type: vision_read_error}
|
|
|
|
|
|
|
|
|
|
|
|
macros_start:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- запиши макрос
|
|
|
|
|
|
- начни запись макроса
|
|
|
|
|
|
- записывай макрос
|
|
|
|
|
|
- новый макрос
|
|
|
|
|
|
action: {type: macros_start}
|
|
|
|
|
|
|
|
|
|
|
|
macros_save:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сохрани макрос
|
|
|
|
|
|
- стоп макрос
|
|
|
|
|
|
- стоп запись макроса
|
|
|
|
|
|
- закончи запись
|
|
|
|
|
|
- макрос готов
|
|
|
|
|
|
action: {type: macros_save}
|
|
|
|
|
|
|
|
|
|
|
|
macros_cancel:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- отмени макрос
|
|
|
|
|
|
- отмени запись макроса
|
|
|
|
|
|
- забудь макрос
|
|
|
|
|
|
action: {type: macros_cancel}
|
|
|
|
|
|
|
|
|
|
|
|
macros_replay:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- запусти макрос
|
|
|
|
|
|
- выполни макрос
|
|
|
|
|
|
- воспроизведи макрос
|
|
|
|
|
|
- сыграй макрос
|
|
|
|
|
|
- проиграй макрос
|
|
|
|
|
|
action: {type: macros_replay}
|
|
|
|
|
|
|
|
|
|
|
|
macros_list:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие у меня макросы
|
|
|
|
|
|
- список макросов
|
|
|
|
|
|
- покажи макросы
|
|
|
|
|
|
action: {type: macros_list}
|
|
|
|
|
|
|
|
|
|
|
|
macros_delete:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- удали макрос
|
|
|
|
|
|
- забудь о макросе
|
|
|
|
|
|
action: {type: macros_delete}
|
|
|
|
|
|
|
|
|
|
|
|
scheduler_reminder:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- напомни мне через
|
|
|
|
|
|
- напомни через
|
|
|
|
|
|
- поставь напоминалку через
|
|
|
|
|
|
- поставь напоминание через
|
|
|
|
|
|
- разбуди через
|
|
|
|
|
|
action: {type: scheduler_add_reminder}
|
|
|
|
|
|
|
|
|
|
|
|
scheduler_recurring:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- напоминай каждые
|
|
|
|
|
|
- напоминай каждый
|
|
|
|
|
|
- каждые
|
|
|
|
|
|
- каждый час
|
|
|
|
|
|
action: {type: scheduler_add_recurring}
|
|
|
|
|
|
|
|
|
|
|
|
scheduler_list:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что у меня запланировано
|
|
|
|
|
|
- какие напоминания
|
|
|
|
|
|
- покажи расписание
|
|
|
|
|
|
- какие задачи у меня
|
|
|
|
|
|
- что в расписании
|
|
|
|
|
|
action: {type: scheduler_list}
|
|
|
|
|
|
|
|
|
|
|
|
scheduler_clear:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- очисти расписание
|
|
|
|
|
|
- удали все напоминания
|
|
|
|
|
|
- отмени все напоминания
|
|
|
|
|
|
- сбрось расписание
|
|
|
|
|
|
action: {type: scheduler_clear}
|
|
|
|
|
|
|
|
|
|
|
|
scheduler_cancel_text:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- отмени напоминание про
|
|
|
|
|
|
- отмени напоминание о
|
|
|
|
|
|
- удали задачу про
|
|
|
|
|
|
- удали задачу о
|
|
|
|
|
|
- отмени про
|
|
|
|
|
|
- забудь напоминание про
|
|
|
|
|
|
action: {type: scheduler_cancel_by_text}
|
feat: codebase_qa + github_pr in Python (142 → 148 commands)
Closes the Python parity gap with rust. All major imba features now mirrored
EXCEPT live LLM hot-swap (python LLM backend is still env-driven, not voice-
switchable like rust).
dev_handlers.py (new, ~250 lines)
Codebase Q&A:
do_codebase_set "укажи проект C:\path" → memory_store.remember("codebase.root", ...)
do_codebase_where "какой проект сейчас"
do_codebase_ask "что делает функция X" / "найди в коде Y"
Walks the root with same caps as rust:
depth=3, files=30, file_bytes=4096, total=50000
Filters by extension (rs/py/ts/lua/go/...).
Skips .git/target/node_modules/__pycache__/.venv etc.
Feeds digest to Groq LLM with "senior reviewer" prompt.
GitHub PR review (requires `gh` CLI authenticated):
do_github_set_repo "текущий репо owner/repo" → memory_store
do_github_list_prs "какие пиары" → `gh pr list --json number,title,author`,
speaks count + first 3 titles
do_github_summarize_pr "разбери последний пиар" → gh pr view of latest open
PR, feeds title+body+diff stat to LLM, speaks 3-5
sentence review.
extensions.py — 6 new proxy handlers + import dev_handlers + set_speak wires it.
main.py — 6 new action_type dispatches in run_action.
commands.yaml (+6 entries, 142 → 148):
codebase_set, codebase_where, codebase_ask,
github_set_repo, github_list_prs, github_summarize_pr.
Tests: ast.parse passes for all .py files. yaml.safe_load = 148 entries.
PYTHON PARITY VS RUST IS NOW COMPLETE except:
✗ LLM hot-swap voice command (rust calls llm::swap_to + persists DB;
python config.GROQ_TOKEN is read once at startup)
✗ GUI pages (rust has Tauri+Svelte, python is console-only)
Everything else has full parity: memory / profiles / vision / macros /
scheduler / codebase Q&A / GitHub PR review / 14 utility packs.
2026-05-16 00:40:08 +03:00
|
|
|
|
|
|
|
|
|
|
codebase_set:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- укажи проект
|
|
|
|
|
|
- укажи папку проекта
|
|
|
|
|
|
- укажи кодовую базу
|
|
|
|
|
|
- выбери проект
|
|
|
|
|
|
- проект сейчас
|
|
|
|
|
|
action: {type: codebase_set}
|
|
|
|
|
|
|
|
|
|
|
|
codebase_where:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какой проект сейчас
|
|
|
|
|
|
- где проект
|
|
|
|
|
|
- какая папка проекта
|
|
|
|
|
|
- какая кодовая база
|
|
|
|
|
|
action: {type: codebase_where}
|
|
|
|
|
|
|
|
|
|
|
|
codebase_ask:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что делает функция
|
|
|
|
|
|
- спроси код
|
|
|
|
|
|
- вопрос по коду
|
|
|
|
|
|
- что в коде
|
|
|
|
|
|
- найди в коде
|
|
|
|
|
|
- найди в проекте
|
|
|
|
|
|
- объясни код
|
|
|
|
|
|
action: {type: codebase_ask}
|
|
|
|
|
|
|
|
|
|
|
|
github_set_repo:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- текущий репо
|
|
|
|
|
|
- установи репо
|
|
|
|
|
|
- выбери репо
|
|
|
|
|
|
- репозиторий
|
|
|
|
|
|
action: {type: github_set_repo}
|
|
|
|
|
|
|
|
|
|
|
|
github_list_prs:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие пиары
|
|
|
|
|
|
- какие пулл реквесты
|
|
|
|
|
|
- что в пиарах
|
|
|
|
|
|
- что в pr
|
|
|
|
|
|
- открытые пиары
|
|
|
|
|
|
- список пиаров
|
|
|
|
|
|
action: {type: github_list_prs}
|
|
|
|
|
|
|
|
|
|
|
|
github_summarize_pr:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- разбери последний пиар
|
|
|
|
|
|
- объясни последний пиар
|
|
|
|
|
|
- обзор последнего пиара
|
|
|
|
|
|
- что в последнем pr
|
|
|
|
|
|
- разбор pr
|
|
|
|
|
|
action: {type: github_summarize_pr}
|
2026-05-16 00:44:42 +03:00
|
|
|
|
|
|
|
|
|
|
llm_switch_local:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переключись на локальный
|
|
|
|
|
|
- переключись на локальный мозг
|
|
|
|
|
|
- включи локальный режим
|
|
|
|
|
|
- перейди на локальный
|
|
|
|
|
|
- используй локальный
|
|
|
|
|
|
- перейди на оллама
|
|
|
|
|
|
- используй оллама
|
|
|
|
|
|
action: {type: llm_switch, target: ollama}
|
|
|
|
|
|
|
|
|
|
|
|
llm_switch_cloud:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- переключись на облако
|
|
|
|
|
|
- переключись на облачный
|
|
|
|
|
|
- переключись на грок
|
|
|
|
|
|
- переключись на гроку
|
|
|
|
|
|
- используй облако
|
|
|
|
|
|
- используй грок
|
|
|
|
|
|
- перейди на облако
|
|
|
|
|
|
action: {type: llm_switch, target: groq}
|
|
|
|
|
|
|
|
|
|
|
|
llm_status:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какой у тебя мозг
|
|
|
|
|
|
- какой ллм
|
|
|
|
|
|
- какой у тебя llm
|
|
|
|
|
|
- облако или локально
|
|
|
|
|
|
- ты сейчас где работаешь
|
|
|
|
|
|
- что за модель
|
|
|
|
|
|
action: {type: llm_status}
|
feat+test: pytest suite + Now Playing + World Clock + Daily Quote packs (154 commands)
Adds first formal test suite for Python fork — 42 tests covering memory_store,
profiles_store, scheduler_store, macros_store, llm_backend. All pass.
Tests (tests/, ~290 lines)
conftest.py — `isolated_state` fixture: rewires _PATH/_PROFILES_DIR etc to
a per-test tmp_path so concurrent runs don't touch real data.
test_memory_store.py — 9 tests: remember/recall/forget round-trip,
search by key/value, limit/empty query,
persistence across reload, build_llm_context
test_profiles_store.py — 7 tests: seeded defaults, set_active persistence,
allows_command logic (default/work/driving)
test_scheduler_store.py — 12 tests: parser (daily/at/every/in, ru units,
bad input), add/remove/clear/remove_by_text,
_next_fire for each schedule kind
test_macros_store.py — 8 tests: is_macro_control filter, start/save
round-trip, control-phrase filtering, list_names
sorted, replay unknown raises
test_llm_backend.py — 6 tests: parse_backend aliases (ru + en),
persist round-trip, auto-detect logic
Run: cd /c/Jarvis/python && python -m pytest tests/
Three new fun packs (commands.yaml: 151 → 154)
now_playing — Windows Media Session API via PowerShell
"что играет" / "что за песня" / "какой трек"
Works with Spotify, YouTube, Foobar, Yandex Music, anything
that exposes SMTC (Win10 1803+).
world_clock — worldtimeapi.org (free, no key)
"сколько времени в Токио" / "время в Лондоне"
21 Russian + world cities pre-mapped to IANA timezones.
daily_quote — zenquotes.io (free, no key) + LLM translation
"цитата дня" / "вдохнови меня"
Fetches English quote, translates to Russian via active LLM
(Groq or Ollama), speaks "text — author."
Pack count: 151 → 154. Tests: 42 pytest + ast.parse + yaml.safe_load.
2026-05-16 00:56:02 +03:00
|
|
|
|
|
|
|
|
|
|
now_playing:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что играет
|
|
|
|
|
|
- что сейчас играет
|
|
|
|
|
|
- что за музыка
|
|
|
|
|
|
- что за песня
|
|
|
|
|
|
- какой трек
|
|
|
|
|
|
- какая песня
|
|
|
|
|
|
- что слушаю
|
|
|
|
|
|
action: {type: now_playing}
|
|
|
|
|
|
|
|
|
|
|
|
world_clock:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько времени в
|
|
|
|
|
|
- который час в
|
|
|
|
|
|
- сколько часов в
|
|
|
|
|
|
- время в
|
|
|
|
|
|
action: {type: world_clock}
|
|
|
|
|
|
|
|
|
|
|
|
daily_quote:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- цитата дня
|
|
|
|
|
|
- мотивирующая цитата
|
|
|
|
|
|
- скажи цитату
|
|
|
|
|
|
- вдохнови меня
|
|
|
|
|
|
- цитата
|
|
|
|
|
|
action: {type: daily_quote}
|
2026-05-16 01:08:17 +03:00
|
|
|
|
|
|
|
|
|
|
magic_8ball:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- ответь да или нет
|
|
|
|
|
|
- магический шар
|
|
|
|
|
|
- восьмой шар
|
|
|
|
|
|
- скажи да или нет
|
|
|
|
|
|
- что скажешь
|
|
|
|
|
|
- предсказание
|
|
|
|
|
|
action: {type: magic_8ball}
|
|
|
|
|
|
|
|
|
|
|
|
gh_list_issues:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие issues
|
|
|
|
|
|
- какие задачи
|
|
|
|
|
|
- открытые issues
|
|
|
|
|
|
- список issues
|
|
|
|
|
|
- что в issues
|
|
|
|
|
|
- тикеты
|
|
|
|
|
|
action: {type: gh_list_issues}
|
|
|
|
|
|
|
|
|
|
|
|
gh_my_issues:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- мои issues
|
|
|
|
|
|
- что мне назначено
|
|
|
|
|
|
action: {type: gh_my_issues}
|
|
|
|
|
|
|
|
|
|
|
|
weather_tomorrow:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- погода завтра
|
|
|
|
|
|
- что с погодой завтра
|
|
|
|
|
|
- прогноз на завтра
|
|
|
|
|
|
action: {type: weather_tomorrow}
|
|
|
|
|
|
|
|
|
|
|
|
weather_week:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- прогноз на неделю
|
|
|
|
|
|
- погода на неделю
|
|
|
|
|
|
- недельный прогноз
|
|
|
|
|
|
action: {type: weather_week}
|
|
|
|
|
|
|
|
|
|
|
|
rss_add:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- добавь rss
|
|
|
|
|
|
- подпишись на
|
|
|
|
|
|
- запомни ленту
|
|
|
|
|
|
- добавь ленту
|
|
|
|
|
|
action: {type: rss_add}
|
|
|
|
|
|
|
|
|
|
|
|
rss_read:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что в ленте
|
|
|
|
|
|
- новости из ленты
|
|
|
|
|
|
- почитай rss
|
|
|
|
|
|
- новости из rss
|
|
|
|
|
|
- новые статьи
|
|
|
|
|
|
action: {type: rss_read}
|
|
|
|
|
|
|
|
|
|
|
|
rss_list:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие у меня rss
|
|
|
|
|
|
- список лент
|
|
|
|
|
|
- мои подписки
|
|
|
|
|
|
action: {type: rss_list}
|
|
|
|
|
|
|
|
|
|
|
|
ics_create:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- добавь встречу
|
|
|
|
|
|
- создай событие
|
|
|
|
|
|
- создай встречу
|
|
|
|
|
|
- новая встреча
|
|
|
|
|
|
action: {type: ics_create}
|
|
|
|
|
|
|
|
|
|
|
|
backup_export:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сделай бекап
|
|
|
|
|
|
- экспортируй настройки
|
|
|
|
|
|
- сохрани мои настройки
|
|
|
|
|
|
- выгрузи настройки
|
|
|
|
|
|
action: {type: backup_export}
|
|
|
|
|
|
|
|
|
|
|
|
clip_save:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- запиши буфер
|
|
|
|
|
|
- сохрани буфер
|
|
|
|
|
|
- запомни буфер
|
|
|
|
|
|
- запомни что в буфере
|
|
|
|
|
|
action: {type: clip_save}
|
|
|
|
|
|
|
|
|
|
|
|
clip_list:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что я копировал
|
|
|
|
|
|
- история буфера
|
|
|
|
|
|
- последние буферы
|
|
|
|
|
|
- что было в буфере
|
|
|
|
|
|
action: {type: clip_list}
|
|
|
|
|
|
|
|
|
|
|
|
clip_restore:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- верни первый буфер
|
|
|
|
|
|
- верни второй буфер
|
|
|
|
|
|
- верни третий буфер
|
|
|
|
|
|
- восстанови буфер
|
|
|
|
|
|
- вставь старый буфер
|
|
|
|
|
|
action: {type: clip_restore}
|
|
|
|
|
|
|
|
|
|
|
|
notif_missed:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- что я пропустил
|
|
|
|
|
|
- что было пока меня не было
|
|
|
|
|
|
- какие уведомления
|
|
|
|
|
|
- пропущенные
|
|
|
|
|
|
action: {type: notif_missed}
|
|
|
|
|
|
|
|
|
|
|
|
notif_clear:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- очисти уведомления
|
|
|
|
|
|
- забудь уведомления
|
|
|
|
|
|
- сбрось пропущенное
|
|
|
|
|
|
action: {type: notif_clear}
|
|
|
|
|
|
|
|
|
|
|
|
vault_save:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сохрани пароль от
|
|
|
|
|
|
- запомни пароль от
|
|
|
|
|
|
- пароль для
|
|
|
|
|
|
action: {type: vault_save}
|
|
|
|
|
|
|
|
|
|
|
|
vault_get:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- пароль от
|
|
|
|
|
|
- дай пароль
|
|
|
|
|
|
- покажи пароль от
|
|
|
|
|
|
- достань пароль
|
|
|
|
|
|
action: {type: vault_get}
|
|
|
|
|
|
|
|
|
|
|
|
vault_list:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- какие у меня пароли
|
|
|
|
|
|
- список паролей
|
|
|
|
|
|
- что в хранилище паролей
|
|
|
|
|
|
action: {type: vault_list}
|
|
|
|
|
|
|
|
|
|
|
|
habit_checkin:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- отметь привычку
|
|
|
|
|
|
- выполнил привычку
|
|
|
|
|
|
- я попил воды
|
|
|
|
|
|
- я размялся
|
|
|
|
|
|
- я отдохнул глазам
|
|
|
|
|
|
action: {type: habit_checkin}
|
|
|
|
|
|
|
|
|
|
|
|
habit_streak:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- сколько дней подряд
|
|
|
|
|
|
- мои привычки
|
|
|
|
|
|
- статистика привычек
|
|
|
|
|
|
- сколько дней пью воду
|
|
|
|
|
|
- трекинг привычек
|
|
|
|
|
|
action: {type: habit_streak}
|
feat: personality pack — Python parity
Python parity for the 5 personality voice commands shipped on the
Rust side:
- New `personality_handlers.py` (~150 lines): do_personality_{greet,
thanks, compliment, how_are_you, tony_quote}. Each picks one of
7-10 phrases per language (RU/EN) at random; greet additionally
buckets by time-of-day (morning/midday/evening/night).
- `extensions.py`: imports + 5 proxy `do_personality_*` functions
pointing at the new module, plus set_speak wiring so handlers can
TTS via the runtime's voice.
- `main.py`: 5 new dispatch elifs feeding the new action types.
- `commands.yaml`: 5 new entries (`personality_*`) mapping voice
phrases to action types.
- `tests/test_personality_handlers.py`: 6 unit tests confirming
each handler returns a non-empty string from the expected pool.
- `.gitignore`: stop tracking runtime state generated by tests
(profiles/, long_term_memory.json, schedule.json, macros.json,
llm_backend.txt, llm_history.json) — these are user data, not
source.
Tests: 54 → 60 (+6).
2026-05-16 13:53:44 +03:00
|
|
|
|
|
|
|
|
|
|
personality_greet:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- привет джарвис
|
|
|
|
|
|
- здравствуй джарвис
|
|
|
|
|
|
- доброе утро
|
|
|
|
|
|
- добрый день
|
|
|
|
|
|
- добрый вечер
|
|
|
|
|
|
- доброй ночи
|
|
|
|
|
|
- приветствую
|
|
|
|
|
|
- хай джарвис
|
|
|
|
|
|
action: {type: personality_greet}
|
|
|
|
|
|
|
|
|
|
|
|
personality_thanks:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- спасибо
|
|
|
|
|
|
- спасибо джарвис
|
|
|
|
|
|
- благодарю
|
|
|
|
|
|
- благодарю джарвис
|
|
|
|
|
|
- спс
|
|
|
|
|
|
- ты лучший
|
|
|
|
|
|
action: {type: personality_thanks}
|
|
|
|
|
|
|
|
|
|
|
|
personality_compliment:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- ты молодец
|
|
|
|
|
|
- ты умница
|
|
|
|
|
|
- молодец джарвис
|
|
|
|
|
|
- хорошо сработано
|
|
|
|
|
|
- отличная работа
|
|
|
|
|
|
- так держать
|
|
|
|
|
|
- ты лучший ассистент
|
|
|
|
|
|
action: {type: personality_compliment}
|
|
|
|
|
|
|
|
|
|
|
|
personality_how_are_you:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- как дела
|
|
|
|
|
|
- как дела джарвис
|
|
|
|
|
|
- как ты
|
|
|
|
|
|
- как настроение
|
|
|
|
|
|
- как самочувствие
|
|
|
|
|
|
- как поживаешь
|
|
|
|
|
|
- что нового у тебя
|
|
|
|
|
|
action: {type: personality_how_are_you}
|
|
|
|
|
|
|
|
|
|
|
|
personality_tony_quote:
|
|
|
|
|
|
phrases:
|
|
|
|
|
|
- процитируй тони
|
|
|
|
|
|
- цитата тони старка
|
|
|
|
|
|
- что сказал бы тони
|
|
|
|
|
|
- скажи как тони
|
|
|
|
|
|
- процитируй железного человека
|
|
|
|
|
|
- цитата старка
|
|
|
|
|
|
action: {type: personality_tony_quote}
|