feat(commands): add PC control packs — volume, apps, file_search, output_device
All four packs are pure Lua (sandbox=full) and call out to PowerShell helpers
where COM / native APIs are needed. No new Rust code, no rebuild required:
post_build.py --sync copies them under target/{debug,release}/resources/.
volume/
- volume_up / volume_down: 5x VK_VOLUME_UP|DOWN via keybd_event
- volume_mute: VK_VOLUME_MUTE
- volume_max: 50x VK_VOLUME_UP (system clamps)
Helper _volume_helper.ps1 P/Invokes user32!keybd_event.
apps/
- open_browser : start "" https://www.google.com (uses system default browser)
- open_notepad : notepad.exe
- open_calculator: calc.exe
- open_explorer : explorer.exe
- open_terminal : wt.exe, falls back to powershell.exe
- open_settings : ms-settings: protocol
- open_task_manager: taskmgr.exe
- lock_screen : rundll32 user32.dll,LockWorkStation
- screenshot : System.Drawing capture to ~/Pictures/jarvis_screenshot_*.png
file_search/
- find file <query> : recursive Get-ChildItem in Desktop/Documents/Downloads
(depth 3, top 5 matches). Strips Russian/English/Ukrainian trigger
prefixes from the recognized phrase, then opens explorer /select on the
first hit and notifies with the total count.
output_device/
- list_output_devices : enumerates active render endpoints via
IMMDeviceEnumerator and notifies friendly names with indices
- next_output_device : cycles the system default render device via the
undocumented IPolicyConfig::SetDefaultEndpoint (eConsole/Multimedia/
Communications). Tested locally — listed 7 devices, current correctly
identified at index 5.
This commit is contained in:
parent
16240609de
commit
9c25108356
22 changed files with 932 additions and 0 deletions
230
resources/commands/apps/command.toml
Normal file
230
resources/commands/apps/command.toml
Normal file
|
|
@ -0,0 +1,230 @@
|
|||
[[commands]]
|
||||
id = "open_browser"
|
||||
type = "lua"
|
||||
script = "open_browser.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"открой браузер",
|
||||
"запусти браузер",
|
||||
"открой хром",
|
||||
"запусти хром",
|
||||
"включи браузер",
|
||||
"браузер открой",
|
||||
"нужен браузер",
|
||||
]
|
||||
en = [
|
||||
"open browser",
|
||||
"launch browser",
|
||||
"open chrome",
|
||||
"launch chrome",
|
||||
"start browser",
|
||||
"i need browser",
|
||||
]
|
||||
ua = [
|
||||
"відкрий браузер",
|
||||
"запусти браузер",
|
||||
"відкрий хром",
|
||||
"запусти хром",
|
||||
"увімкни браузер",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "open_notepad"
|
||||
type = "lua"
|
||||
script = "open_notepad.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"открой блокнот",
|
||||
"запусти блокнот",
|
||||
"открой нотепад",
|
||||
]
|
||||
en = [
|
||||
"open notepad",
|
||||
"launch notepad",
|
||||
]
|
||||
ua = [
|
||||
"відкрий блокнот",
|
||||
"запусти блокнот",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "open_calculator"
|
||||
type = "lua"
|
||||
script = "open_calculator.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"открой калькулятор",
|
||||
"запусти калькулятор",
|
||||
"нужен калькулятор",
|
||||
]
|
||||
en = [
|
||||
"open calculator",
|
||||
"launch calculator",
|
||||
"calculator please",
|
||||
]
|
||||
ua = [
|
||||
"відкрий калькулятор",
|
||||
"запусти калькулятор",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "open_explorer"
|
||||
type = "lua"
|
||||
script = "open_explorer.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"открой проводник",
|
||||
"открой папку",
|
||||
"запусти проводник",
|
||||
"открой файлы",
|
||||
]
|
||||
en = [
|
||||
"open explorer",
|
||||
"open file explorer",
|
||||
"open files",
|
||||
"open folder",
|
||||
]
|
||||
ua = [
|
||||
"відкрий провідник",
|
||||
"відкрий папку",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "open_terminal"
|
||||
type = "lua"
|
||||
script = "open_terminal.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"открой терминал",
|
||||
"запусти терминал",
|
||||
"открой консоль",
|
||||
"запусти консоль",
|
||||
"открой повершелл",
|
||||
]
|
||||
en = [
|
||||
"open terminal",
|
||||
"open powershell",
|
||||
"open console",
|
||||
"launch terminal",
|
||||
]
|
||||
ua = [
|
||||
"відкрий термінал",
|
||||
"відкрий консоль",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "open_settings"
|
||||
type = "lua"
|
||||
script = "open_settings.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"открой настройки",
|
||||
"открой параметры",
|
||||
"запусти настройки",
|
||||
"открой настройки виндоус",
|
||||
]
|
||||
en = [
|
||||
"open settings",
|
||||
"launch settings",
|
||||
"windows settings",
|
||||
]
|
||||
ua = [
|
||||
"відкрий налаштування",
|
||||
"відкрий параметри",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "open_task_manager"
|
||||
type = "lua"
|
||||
script = "open_task_manager.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"открой диспетчер задач",
|
||||
"запусти диспетчер задач",
|
||||
"диспетчер задач",
|
||||
]
|
||||
en = [
|
||||
"open task manager",
|
||||
"launch task manager",
|
||||
"task manager",
|
||||
]
|
||||
ua = [
|
||||
"відкрий диспетчер задач",
|
||||
"диспетчер задач",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "lock_screen"
|
||||
type = "lua"
|
||||
script = "lock_screen.lua"
|
||||
sandbox = "full"
|
||||
timeout = 3000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"заблокируй компьютер",
|
||||
"заблокируй экран",
|
||||
"блокировка экрана",
|
||||
"залочь",
|
||||
]
|
||||
en = [
|
||||
"lock screen",
|
||||
"lock the computer",
|
||||
"lock pc",
|
||||
]
|
||||
ua = [
|
||||
"заблокуй комп'ютер",
|
||||
"заблокуй екран",
|
||||
]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "screenshot"
|
||||
type = "lua"
|
||||
script = "screenshot.lua"
|
||||
sandbox = "full"
|
||||
timeout = 5000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"сделай скриншот",
|
||||
"скриншот",
|
||||
"сними экран",
|
||||
]
|
||||
en = [
|
||||
"take screenshot",
|
||||
"screenshot",
|
||||
"capture screen",
|
||||
]
|
||||
ua = [
|
||||
"зроби скріншот",
|
||||
"знімок екрана",
|
||||
]
|
||||
8
resources/commands/apps/lock_screen.lua
Normal file
8
resources/commands/apps/lock_screen.lua
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
local res = jarvis.system.exec("rundll32.exe user32.dll,LockWorkStation")
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "lock screen failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
9
resources/commands/apps/open_browser.lua
Normal file
9
resources/commands/apps/open_browser.lua
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
local cmd = "start \"\" \"https://www.google.com\""
|
||||
local res = jarvis.system.exec(cmd)
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "open browser failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
8
resources/commands/apps/open_calculator.lua
Normal file
8
resources/commands/apps/open_calculator.lua
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
local res = jarvis.system.exec("start \"\" calc.exe")
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "open calculator failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
8
resources/commands/apps/open_explorer.lua
Normal file
8
resources/commands/apps/open_explorer.lua
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
local res = jarvis.system.exec("start \"\" explorer.exe")
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "open explorer failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
8
resources/commands/apps/open_notepad.lua
Normal file
8
resources/commands/apps/open_notepad.lua
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
local res = jarvis.system.exec("start \"\" notepad.exe")
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "open notepad failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
8
resources/commands/apps/open_settings.lua
Normal file
8
resources/commands/apps/open_settings.lua
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
local res = jarvis.system.exec("start \"\" ms-settings:")
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "open settings failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
8
resources/commands/apps/open_task_manager.lua
Normal file
8
resources/commands/apps/open_task_manager.lua
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
local res = jarvis.system.exec("start \"\" taskmgr.exe")
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "open task manager failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
13
resources/commands/apps/open_terminal.lua
Normal file
13
resources/commands/apps/open_terminal.lua
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
local res = jarvis.system.exec("start \"\" wt.exe")
|
||||
if not res.success then
|
||||
jarvis.log("warn", "wt.exe not found, falling back to powershell")
|
||||
res = jarvis.system.exec("start \"\" powershell.exe")
|
||||
end
|
||||
|
||||
if res.success then
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "open terminal failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
return { chain = false }
|
||||
24
resources/commands/apps/screenshot.lua
Normal file
24
resources/commands/apps/screenshot.lua
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
local ts = jarvis.context.time.year .. jarvis.context.time.month .. jarvis.context.time.day
|
||||
.. "_" .. jarvis.context.time.hour .. jarvis.context.time.minute .. jarvis.context.time.second
|
||||
|
||||
local userprofile = jarvis.system.env("USERPROFILE") or "C:\\Users\\Public"
|
||||
local target = userprofile .. "\\Pictures\\jarvis_screenshot_" .. ts .. ".png"
|
||||
|
||||
local ps = string.format(
|
||||
[[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); $bmp.Save('%s'); $g.Dispose(); $bmp.Dispose()]],
|
||||
target:gsub("\\", "\\\\")
|
||||
)
|
||||
|
||||
local cmd = string.format('powershell -NoProfile -ExecutionPolicy Bypass -Command "%s"', ps:gsub('"', '\\"'))
|
||||
local res = jarvis.system.exec(cmd)
|
||||
|
||||
if res.success then
|
||||
jarvis.log("info", "screenshot saved to " .. target)
|
||||
jarvis.system.notify("Скриншот", target)
|
||||
jarvis.audio.play_ok()
|
||||
else
|
||||
jarvis.log("error", "screenshot failed: " .. tostring(res.stderr))
|
||||
jarvis.audio.play_error()
|
||||
end
|
||||
|
||||
return { chain = false }
|
||||
Loading…
Add table
Add a link
Reference in a new issue